1 1.9 andvar /* $NetBSD: isp_library.c,v 1.9 2021/10/21 13:21:54 andvar Exp $ */ 2 1.1 mjacob /* 3 1.1 mjacob * Copyright (c) 2006-2007 by Matthew Jacob 4 1.1 mjacob * All rights reserved. 5 1.1 mjacob * 6 1.1 mjacob * Redistribution and use in source and binary forms, with or without 7 1.1 mjacob * modification, are permitted provided that the following conditions 8 1.1 mjacob * are met: 9 1.1 mjacob * 10 1.1 mjacob * 1. Redistributions of source code must retain the above copyright 11 1.1 mjacob * notice, this list of conditions and the following disclaimer. 12 1.1 mjacob * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 mjacob * notice, this list of conditions and the following disclaimer in the 14 1.1 mjacob * documentation and/or other materials provided with the distribution. 15 1.1 mjacob * 16 1.1 mjacob * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 1.1 mjacob * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 1.1 mjacob * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 1.1 mjacob * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 20 1.1 mjacob * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 1.1 mjacob * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 1.1 mjacob * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 1.1 mjacob * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 1.1 mjacob * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 1.1 mjacob * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 1.1 mjacob * SUCH DAMAGE. 27 1.1 mjacob */ 28 1.1 mjacob /* 29 1.1 mjacob * Qlogic Host Adapter Internal Library Functions 30 1.1 mjacob */ 31 1.1 mjacob #ifdef __NetBSD__ 32 1.1 mjacob #include <sys/cdefs.h> 33 1.9 andvar __KERNEL_RCSID(0, "$NetBSD: isp_library.c,v 1.9 2021/10/21 13:21:54 andvar Exp $"); 34 1.1 mjacob #include <dev/ic/isp_netbsd.h> 35 1.1 mjacob #endif 36 1.1 mjacob #ifdef __FreeBSD__ 37 1.1 mjacob #include <sys/cdefs.h> 38 1.1 mjacob __FBSDID("$FreeBSD$"); 39 1.1 mjacob #include <dev/isp/isp_freebsd.h> 40 1.1 mjacob #endif 41 1.1 mjacob #ifdef __OpenBSD__ 42 1.1 mjacob #include <dev/ic/isp_openbsd.h> 43 1.1 mjacob #endif 44 1.1 mjacob #ifdef __linux__ 45 1.1 mjacob #include "isp_linux.h" 46 1.1 mjacob #endif 47 1.1 mjacob #ifdef __svr4__ 48 1.1 mjacob #include "isp_solaris.h" 49 1.1 mjacob #endif 50 1.1 mjacob 51 1.3 mjacob const char *isp_class3_roles[4] = { 52 1.3 mjacob "None", "Target", "Initiator", "Target/Initiator" 53 1.3 mjacob }; 54 1.3 mjacob 55 1.4 mjacob /* 56 1.4 mjacob * Command shipping- finish off first queue entry and do dma mapping and additional segments as needed. 57 1.4 mjacob * 58 1.4 mjacob * Called with the first queue entry at least partially filled out. 59 1.4 mjacob */ 60 1.4 mjacob int 61 1.4 mjacob isp_send_cmd(ispsoftc_t *isp, void *fqe, void *segp, uint32_t nsegs, uint32_t totalcnt, isp_ddir_t ddir) 62 1.4 mjacob { 63 1.4 mjacob uint8_t storage[QENTRY_LEN]; 64 1.4 mjacob uint8_t type, nqe; 65 1.4 mjacob uint32_t seg, curseg, seglim, nxt, nxtnxt, ddf; 66 1.4 mjacob ispds_t *dsp = NULL; 67 1.4 mjacob ispds64_t *dsp64 = NULL; 68 1.4 mjacob void *qe0, *qe1; 69 1.4 mjacob 70 1.4 mjacob qe0 = isp_getrqentry(isp); 71 1.4 mjacob if (qe0 == NULL) { 72 1.4 mjacob return (CMD_EAGAIN); 73 1.4 mjacob } 74 1.4 mjacob nxt = ISP_NXT_QENTRY(isp->isp_reqidx, RQUEST_QUEUE_LEN(isp)); 75 1.4 mjacob 76 1.4 mjacob type = ((isphdr_t *)fqe)->rqs_entry_type; 77 1.4 mjacob nqe = 1; 78 1.4 mjacob 79 1.4 mjacob /* 80 1.4 mjacob * If we have no data to transmit, just copy the first IOCB and start it up. 81 1.4 mjacob */ 82 1.4 mjacob if (ddir == ISP_NOXFR) { 83 1.4 mjacob if (type == RQSTYPE_T2RQS || type == RQSTYPE_T3RQS) { 84 1.4 mjacob ddf = CT2_NO_DATA; 85 1.4 mjacob } else { 86 1.4 mjacob ddf = 0; 87 1.4 mjacob } 88 1.4 mjacob goto copy_and_sync; 89 1.4 mjacob } 90 1.4 mjacob 91 1.4 mjacob /* 92 1.4 mjacob * First figure out how many pieces of data to transfer and what kind and how many we can put into the first queue entry. 93 1.4 mjacob */ 94 1.4 mjacob switch (type) { 95 1.4 mjacob case RQSTYPE_REQUEST: 96 1.4 mjacob ddf = (ddir == ISP_TO_DEVICE)? REQFLAG_DATA_OUT : REQFLAG_DATA_IN; 97 1.4 mjacob dsp = ((ispreq_t *)fqe)->req_dataseg; 98 1.4 mjacob seglim = ISP_RQDSEG; 99 1.4 mjacob break; 100 1.4 mjacob case RQSTYPE_CMDONLY: 101 1.4 mjacob ddf = (ddir == ISP_TO_DEVICE)? REQFLAG_DATA_OUT : REQFLAG_DATA_IN; 102 1.4 mjacob seglim = 0; 103 1.4 mjacob break; 104 1.4 mjacob case RQSTYPE_T2RQS: 105 1.4 mjacob ddf = (ddir == ISP_TO_DEVICE)? REQFLAG_DATA_OUT : REQFLAG_DATA_IN; 106 1.4 mjacob dsp = ((ispreqt2_t *)fqe)->req_dataseg; 107 1.4 mjacob seglim = ISP_RQDSEG_T2; 108 1.4 mjacob break; 109 1.4 mjacob case RQSTYPE_A64: 110 1.4 mjacob ddf = (ddir == ISP_TO_DEVICE)? REQFLAG_DATA_OUT : REQFLAG_DATA_IN; 111 1.4 mjacob dsp64 = ((ispreqt3_t *)fqe)->req_dataseg; 112 1.4 mjacob seglim = ISP_RQDSEG_T3; 113 1.4 mjacob break; 114 1.4 mjacob case RQSTYPE_T3RQS: 115 1.4 mjacob ddf = (ddir == ISP_TO_DEVICE)? REQFLAG_DATA_OUT : REQFLAG_DATA_IN; 116 1.4 mjacob dsp64 = ((ispreqt3_t *)fqe)->req_dataseg; 117 1.4 mjacob seglim = ISP_RQDSEG_T3; 118 1.4 mjacob break; 119 1.4 mjacob case RQSTYPE_T7RQS: 120 1.4 mjacob ddf = (ddir == ISP_TO_DEVICE)? FCP_CMND_DATA_WRITE : FCP_CMND_DATA_READ; 121 1.4 mjacob dsp64 = &((ispreqt7_t *)fqe)->req_dataseg; 122 1.4 mjacob seglim = 1; 123 1.4 mjacob break; 124 1.4 mjacob default: 125 1.4 mjacob return (CMD_COMPLETE); 126 1.4 mjacob } 127 1.4 mjacob 128 1.4 mjacob if (seglim > nsegs) { 129 1.4 mjacob seglim = nsegs; 130 1.4 mjacob } 131 1.4 mjacob 132 1.4 mjacob for (seg = curseg = 0; curseg < seglim; curseg++) { 133 1.4 mjacob if (dsp64) { 134 1.4 mjacob XS_GET_DMA64_SEG(dsp64++, segp, seg++); 135 1.4 mjacob } else { 136 1.4 mjacob XS_GET_DMA_SEG(dsp++, segp, seg++); 137 1.4 mjacob } 138 1.4 mjacob } 139 1.4 mjacob 140 1.4 mjacob 141 1.4 mjacob /* 142 1.4 mjacob * Second, start building additional continuation segments as needed. 143 1.4 mjacob */ 144 1.4 mjacob while (seg < nsegs) { 145 1.4 mjacob nxtnxt = ISP_NXT_QENTRY(nxt, RQUEST_QUEUE_LEN(isp)); 146 1.4 mjacob if (nxtnxt == isp->isp_reqodx) { 147 1.4 mjacob return (CMD_EAGAIN); 148 1.4 mjacob } 149 1.4 mjacob ISP_MEMZERO(storage, QENTRY_LEN); 150 1.4 mjacob qe1 = ISP_QUEUE_ENTRY(isp->isp_rquest, nxt); 151 1.4 mjacob nxt = nxtnxt; 152 1.4 mjacob if (dsp64) { 153 1.4 mjacob ispcontreq64_t *crq = (ispcontreq64_t *) storage; 154 1.4 mjacob seglim = ISP_CDSEG64; 155 1.4 mjacob crq->req_header.rqs_entry_type = RQSTYPE_A64_CONT; 156 1.4 mjacob crq->req_header.rqs_entry_count = 1; 157 1.4 mjacob dsp64 = crq->req_dataseg; 158 1.4 mjacob } else { 159 1.4 mjacob ispcontreq_t *crq = (ispcontreq_t *) storage; 160 1.4 mjacob seglim = ISP_CDSEG; 161 1.4 mjacob crq->req_header.rqs_entry_type = RQSTYPE_DATASEG; 162 1.4 mjacob crq->req_header.rqs_entry_count = 1; 163 1.4 mjacob dsp = crq->req_dataseg; 164 1.4 mjacob } 165 1.4 mjacob if (seg + seglim > nsegs) { 166 1.4 mjacob seglim = nsegs - seg; 167 1.4 mjacob } 168 1.4 mjacob for (curseg = 0; curseg < seglim; curseg++) { 169 1.4 mjacob if (dsp64) { 170 1.4 mjacob XS_GET_DMA64_SEG(dsp64++, segp, seg++); 171 1.4 mjacob } else { 172 1.4 mjacob XS_GET_DMA_SEG(dsp++, segp, seg++); 173 1.4 mjacob } 174 1.4 mjacob } 175 1.4 mjacob if (dsp64) { 176 1.4 mjacob isp_put_cont64_req(isp, (ispcontreq64_t *)storage, qe1); 177 1.4 mjacob } else { 178 1.4 mjacob isp_put_cont_req(isp, (ispcontreq_t *)storage, qe1); 179 1.4 mjacob } 180 1.4 mjacob if (isp->isp_dblev & ISP_LOGDEBUG1) { 181 1.4 mjacob isp_print_bytes(isp, "additional queue entry", QENTRY_LEN, storage); 182 1.4 mjacob } 183 1.4 mjacob nqe++; 184 1.4 mjacob } 185 1.4 mjacob 186 1.4 mjacob copy_and_sync: 187 1.4 mjacob ((isphdr_t *)fqe)->rqs_entry_count = nqe; 188 1.4 mjacob switch (type) { 189 1.4 mjacob case RQSTYPE_REQUEST: 190 1.4 mjacob ((ispreq_t *)fqe)->req_flags |= ddf; 191 1.4 mjacob /* 192 1.4 mjacob * This is historical and not clear whether really needed. 193 1.4 mjacob */ 194 1.4 mjacob if (nsegs == 0) { 195 1.4 mjacob nsegs = 1; 196 1.4 mjacob } 197 1.4 mjacob ((ispreq_t *)fqe)->req_seg_count = nsegs; 198 1.4 mjacob isp_put_request(isp, fqe, qe0); 199 1.4 mjacob break; 200 1.4 mjacob case RQSTYPE_CMDONLY: 201 1.4 mjacob ((ispreq_t *)fqe)->req_flags |= ddf; 202 1.4 mjacob /* 203 1.4 mjacob * This is historical and not clear whether really needed. 204 1.4 mjacob */ 205 1.4 mjacob if (nsegs == 0) { 206 1.4 mjacob nsegs = 1; 207 1.4 mjacob } 208 1.4 mjacob ((ispextreq_t *)fqe)->req_seg_count = nsegs; 209 1.4 mjacob isp_put_extended_request(isp, fqe, qe0); 210 1.4 mjacob break; 211 1.4 mjacob case RQSTYPE_T2RQS: 212 1.4 mjacob ((ispreqt2_t *)fqe)->req_flags |= ddf; 213 1.4 mjacob ((ispreqt2_t *)fqe)->req_seg_count = nsegs; 214 1.4 mjacob ((ispreqt2_t *)fqe)->req_totalcnt = totalcnt; 215 1.4 mjacob if (ISP_CAP_2KLOGIN(isp)) { 216 1.4 mjacob isp_put_request_t2e(isp, fqe, qe0); 217 1.4 mjacob } else { 218 1.4 mjacob isp_put_request_t2(isp, fqe, qe0); 219 1.4 mjacob } 220 1.4 mjacob break; 221 1.4 mjacob case RQSTYPE_A64: 222 1.4 mjacob case RQSTYPE_T3RQS: 223 1.4 mjacob ((ispreqt3_t *)fqe)->req_flags |= ddf; 224 1.4 mjacob ((ispreqt3_t *)fqe)->req_seg_count = nsegs; 225 1.4 mjacob ((ispreqt3_t *)fqe)->req_totalcnt = totalcnt; 226 1.4 mjacob if (ISP_CAP_2KLOGIN(isp)) { 227 1.4 mjacob isp_put_request_t3e(isp, fqe, qe0); 228 1.4 mjacob } else { 229 1.4 mjacob isp_put_request_t3(isp, fqe, qe0); 230 1.4 mjacob } 231 1.4 mjacob break; 232 1.4 mjacob case RQSTYPE_T7RQS: 233 1.4 mjacob ((ispreqt7_t *)fqe)->req_alen_datadir = ddf; 234 1.4 mjacob ((ispreqt7_t *)fqe)->req_seg_count = nsegs; 235 1.4 mjacob ((ispreqt7_t *)fqe)->req_dl = totalcnt; 236 1.4 mjacob isp_put_request_t7(isp, fqe, qe0); 237 1.4 mjacob break; 238 1.4 mjacob default: 239 1.4 mjacob return (CMD_COMPLETE); 240 1.4 mjacob } 241 1.4 mjacob if (isp->isp_dblev & ISP_LOGDEBUG1) { 242 1.4 mjacob isp_print_bytes(isp, "first queue entry", QENTRY_LEN, fqe); 243 1.4 mjacob } 244 1.4 mjacob ISP_ADD_REQUEST(isp, nxt); 245 1.4 mjacob return (CMD_QUEUED); 246 1.4 mjacob } 247 1.4 mjacob 248 1.1 mjacob int 249 1.6 mjacob isp_allocate_xs(ispsoftc_t *isp, XS_T *xs, uint32_t *handlep) 250 1.1 mjacob { 251 1.6 mjacob isp_hdl_t *hdp; 252 1.1 mjacob 253 1.6 mjacob hdp = isp->isp_xffree; 254 1.6 mjacob if (hdp == NULL) { 255 1.1 mjacob return (-1); 256 1.1 mjacob } 257 1.6 mjacob isp->isp_xffree = hdp->cmd; 258 1.6 mjacob hdp->cmd = xs; 259 1.6 mjacob hdp->handle = (hdp - isp->isp_xflist); 260 1.6 mjacob hdp->handle |= (ISP_HANDLE_INITIATOR << ISP_HANDLE_USAGE_SHIFT); 261 1.6 mjacob hdp->handle |= (isp->isp_seqno++ << ISP_HANDLE_SEQ_SHIFT); 262 1.6 mjacob *handlep = hdp->handle; 263 1.1 mjacob return (0); 264 1.1 mjacob } 265 1.1 mjacob 266 1.1 mjacob XS_T * 267 1.1 mjacob isp_find_xs(ispsoftc_t *isp, uint32_t handle) 268 1.1 mjacob { 269 1.6 mjacob if (!ISP_VALID_INI_HANDLE(isp, handle)) { 270 1.6 mjacob isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle); 271 1.1 mjacob return (NULL); 272 1.1 mjacob } 273 1.6 mjacob return (isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].cmd); 274 1.1 mjacob } 275 1.1 mjacob 276 1.1 mjacob uint32_t 277 1.1 mjacob isp_find_handle(ispsoftc_t *isp, XS_T *xs) 278 1.1 mjacob { 279 1.6 mjacob uint32_t i, foundhdl = ISP_HANDLE_FREE; 280 1.6 mjacob 281 1.1 mjacob if (xs != NULL) { 282 1.1 mjacob for (i = 0; i < isp->isp_maxcmds; i++) { 283 1.6 mjacob if (isp->isp_xflist[i].cmd != xs) { 284 1.6 mjacob continue; 285 1.1 mjacob } 286 1.6 mjacob foundhdl = isp->isp_xflist[i].handle; 287 1.6 mjacob break; 288 1.1 mjacob } 289 1.1 mjacob } 290 1.6 mjacob return (foundhdl); 291 1.1 mjacob } 292 1.1 mjacob 293 1.1 mjacob uint32_t 294 1.6 mjacob isp_handle_index(ispsoftc_t *isp, uint32_t handle) 295 1.1 mjacob { 296 1.6 mjacob if (!ISP_VALID_HANDLE(isp, handle)) { 297 1.8 martin int cmd = handle & ISP_HANDLE_CMD_MASK; 298 1.8 martin if (cmd > isp->isp_maxcmds) 299 1.8 martin cmd = 0; 300 1.8 martin isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x (isp_seqno: %d," 301 1.8 martin " isp_xflist[%d].handle = 0x%x)", __func__, 302 1.8 martin handle, isp->isp_seqno, cmd, isp->isp_xflist[cmd].handle); 303 1.6 mjacob return (ISP_BAD_HANDLE_INDEX); 304 1.6 mjacob } else { 305 1.6 mjacob return (handle & ISP_HANDLE_CMD_MASK); 306 1.6 mjacob } 307 1.1 mjacob } 308 1.1 mjacob 309 1.1 mjacob void 310 1.1 mjacob isp_destroy_handle(ispsoftc_t *isp, uint32_t handle) 311 1.1 mjacob { 312 1.6 mjacob if (!ISP_VALID_INI_HANDLE(isp, handle)) { 313 1.6 mjacob isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle); 314 1.6 mjacob } else { 315 1.6 mjacob isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].handle = ISP_HANDLE_FREE; 316 1.6 mjacob isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].cmd = isp->isp_xffree; 317 1.6 mjacob isp->isp_xffree = &isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)]; 318 1.1 mjacob } 319 1.1 mjacob } 320 1.1 mjacob 321 1.4 mjacob /* 322 1.4 mjacob * Make sure we have space to put something on the request queue. 323 1.4 mjacob * Return a pointer to that entry if we do. A side effect of this 324 1.4 mjacob * function is to update the output index. The input index 325 1.4 mjacob * stays the same. 326 1.4 mjacob */ 327 1.4 mjacob void * 328 1.4 mjacob isp_getrqentry(ispsoftc_t *isp) 329 1.1 mjacob { 330 1.4 mjacob isp->isp_reqodx = ISP_READ(isp, isp->isp_rqstoutrp); 331 1.4 mjacob if (ISP_NXT_QENTRY(isp->isp_reqidx, RQUEST_QUEUE_LEN(isp)) == isp->isp_reqodx) { 332 1.4 mjacob return (NULL); 333 1.4 mjacob } 334 1.4 mjacob return (ISP_QUEUE_ENTRY(isp->isp_rquest, isp->isp_reqidx)); 335 1.1 mjacob } 336 1.1 mjacob 337 1.1 mjacob #define TBA (4 * (((QENTRY_LEN >> 2) * 3) + 1) + 1) 338 1.1 mjacob void 339 1.4 mjacob isp_print_qentry(ispsoftc_t *isp, const char *msg, int idx, void *arg) 340 1.1 mjacob { 341 1.1 mjacob char buf[TBA]; 342 1.1 mjacob int amt, i, j; 343 1.1 mjacob uint8_t *ptr = arg; 344 1.1 mjacob 345 1.1 mjacob isp_prt(isp, ISP_LOGALL, "%s index %d=>", msg, idx); 346 1.1 mjacob for (buf[0] = 0, amt = i = 0; i < 4; i++) { 347 1.1 mjacob buf[0] = 0; 348 1.4 mjacob ISP_SNPRINTF(buf, TBA, " "); 349 1.1 mjacob for (j = 0; j < (QENTRY_LEN >> 2); j++) { 350 1.4 mjacob ISP_SNPRINTF(buf, TBA, "%s %02x", buf, ptr[amt++] & 0xff); 351 1.1 mjacob } 352 1.7 mjacob isp_prt(isp, ISP_LOGALL, "%s", buf); 353 1.1 mjacob } 354 1.1 mjacob } 355 1.1 mjacob 356 1.1 mjacob void 357 1.1 mjacob isp_print_bytes(ispsoftc_t *isp, const char *msg, int amt, void *arg) 358 1.1 mjacob { 359 1.1 mjacob char buf[128]; 360 1.1 mjacob uint8_t *ptr = arg; 361 1.1 mjacob int off; 362 1.1 mjacob 363 1.1 mjacob if (msg) 364 1.1 mjacob isp_prt(isp, ISP_LOGALL, "%s:", msg); 365 1.1 mjacob off = 0; 366 1.1 mjacob buf[0] = 0; 367 1.1 mjacob while (off < amt) { 368 1.1 mjacob int j, to; 369 1.1 mjacob to = off; 370 1.1 mjacob for (j = 0; j < 16; j++) { 371 1.4 mjacob ISP_SNPRINTF(buf, 128, "%s %02x", buf, ptr[off++] & 0xff); 372 1.4 mjacob if (off == amt) { 373 1.1 mjacob break; 374 1.4 mjacob } 375 1.1 mjacob } 376 1.1 mjacob isp_prt(isp, ISP_LOGALL, "0x%08x:%s", to, buf); 377 1.1 mjacob buf[0] = 0; 378 1.1 mjacob } 379 1.1 mjacob } 380 1.1 mjacob 381 1.1 mjacob /* 382 1.1 mjacob * Do the common path to try and ensure that link is up, we've scanned 383 1.1 mjacob * the fabric (if we're on a fabric), and that we've synchronized this 384 1.1 mjacob * all with our own database and done the appropriate logins. 385 1.1 mjacob * 386 1.1 mjacob * We repeatedly check for firmware state and loop state after each 387 1.1 mjacob * action because things may have changed while we were doing this. 388 1.1 mjacob * Any failure or change of state causes us to return a nonzero value. 389 1.1 mjacob * 390 1.1 mjacob * We assume we enter here with any locks held. 391 1.1 mjacob */ 392 1.1 mjacob 393 1.1 mjacob int 394 1.3 mjacob isp_fc_runstate(ispsoftc_t *isp, int chan, int tval) 395 1.1 mjacob { 396 1.1 mjacob fcparam *fcp; 397 1.1 mjacob 398 1.3 mjacob fcp = FCPARAM(isp, chan); 399 1.3 mjacob if (fcp->role == ISP_ROLE_NONE) { 400 1.1 mjacob return (0); 401 1.1 mjacob } 402 1.4 mjacob if (fcp->isp_fwstate < FW_READY || fcp->isp_loopstate < LOOP_PDB_RCVD) { 403 1.3 mjacob if (isp_control(isp, ISPCTL_FCLINK_TEST, chan, tval) != 0) { 404 1.4 mjacob isp_prt(isp, ISP_LOGSANCFG, "isp_fc_runstate: linktest failed for channel %d", chan); 405 1.1 mjacob return (-1); 406 1.1 mjacob } 407 1.4 mjacob if (fcp->isp_fwstate != FW_READY || fcp->isp_loopstate < LOOP_PDB_RCVD) { 408 1.4 mjacob isp_prt(isp, ISP_LOGSANCFG, "isp_fc_runstate: f/w not ready for channel %d", chan); 409 1.1 mjacob return (-1); 410 1.1 mjacob } 411 1.1 mjacob } 412 1.3 mjacob 413 1.3 mjacob if ((fcp->role & ISP_ROLE_INITIATOR) == 0) { 414 1.1 mjacob return (0); 415 1.1 mjacob } 416 1.3 mjacob 417 1.3 mjacob if (isp_control(isp, ISPCTL_SCAN_LOOP, chan) != 0) { 418 1.4 mjacob isp_prt(isp, ISP_LOGSANCFG, "isp_fc_runstate: scan loop fails on channel %d", chan); 419 1.1 mjacob return (LOOP_PDB_RCVD); 420 1.1 mjacob } 421 1.3 mjacob if (isp_control(isp, ISPCTL_SCAN_FABRIC, chan) != 0) { 422 1.4 mjacob isp_prt(isp, ISP_LOGSANCFG, "isp_fc_runstate: scan fabric fails on channel %d", chan); 423 1.1 mjacob return (LOOP_LSCAN_DONE); 424 1.1 mjacob } 425 1.3 mjacob if (isp_control(isp, ISPCTL_PDB_SYNC, chan) != 0) { 426 1.4 mjacob isp_prt(isp, ISP_LOGSANCFG, "isp_fc_runstate: pdb_sync fails on channel %d", chan); 427 1.1 mjacob return (LOOP_FSCAN_DONE); 428 1.1 mjacob } 429 1.1 mjacob if (fcp->isp_fwstate != FW_READY || fcp->isp_loopstate != LOOP_READY) { 430 1.4 mjacob isp_prt(isp, ISP_LOGSANCFG, "isp_fc_runstate: f/w not ready again on channel %d", chan); 431 1.1 mjacob return (-1); 432 1.1 mjacob } 433 1.1 mjacob return (0); 434 1.1 mjacob } 435 1.1 mjacob 436 1.1 mjacob /* 437 1.3 mjacob * Fibre Channel Support routines 438 1.1 mjacob */ 439 1.1 mjacob void 440 1.3 mjacob isp_dump_portdb(ispsoftc_t *isp, int chan) 441 1.1 mjacob { 442 1.3 mjacob fcparam *fcp = FCPARAM(isp, chan); 443 1.1 mjacob int i; 444 1.1 mjacob 445 1.1 mjacob for (i = 0; i < MAX_FC_TARG; i++) { 446 1.1 mjacob char mb[4]; 447 1.1 mjacob const char *dbs[8] = { 448 1.1 mjacob "NIL ", 449 1.1 mjacob "PROB", 450 1.1 mjacob "DEAD", 451 1.1 mjacob "CHGD", 452 1.1 mjacob "NEW ", 453 1.1 mjacob "PVLD", 454 1.1 mjacob "ZOMB", 455 1.1 mjacob "VLD " 456 1.1 mjacob }; 457 1.1 mjacob const char *roles[4] = { 458 1.1 mjacob " UNK", " TGT", " INI", "TINI" 459 1.1 mjacob }; 460 1.1 mjacob fcportdb_t *lp = &fcp->portdb[i]; 461 1.1 mjacob 462 1.4 mjacob if (lp->state == FC_PORTDB_STATE_NIL && lp->target_mode == 0) { 463 1.1 mjacob continue; 464 1.1 mjacob } 465 1.4 mjacob if (lp->dev_map_idx) { 466 1.4 mjacob ISP_SNPRINTF(mb, sizeof (mb), "%3d", ((int) lp->dev_map_idx) - 1); 467 1.1 mjacob } else { 468 1.4 mjacob ISP_SNPRINTF(mb, sizeof (mb), "---"); 469 1.1 mjacob } 470 1.4 mjacob isp_prt(isp, ISP_LOGALL, "Chan %d [%d]: hdl 0x%x %s al%d tgt %s %s 0x%06x =>%s 0x%06x; WWNN 0x%08x%08x WWPN 0x%08x%08x", 471 1.4 mjacob chan, i, lp->handle, dbs[lp->state], lp->autologin, mb, roles[lp->roles], lp->portid, roles[lp->new_roles], lp->new_portid, 472 1.4 mjacob (uint32_t) (lp->node_wwn >> 32), (uint32_t) (lp->node_wwn), (uint32_t) (lp->port_wwn >> 32), (uint32_t) (lp->port_wwn)); 473 1.4 mjacob } 474 1.4 mjacob } 475 1.4 mjacob 476 1.4 mjacob const char * 477 1.4 mjacob isp_fc_fw_statename(int state) 478 1.4 mjacob { 479 1.4 mjacob switch (state) { 480 1.4 mjacob case FW_CONFIG_WAIT: return "Config Wait"; 481 1.4 mjacob case FW_WAIT_AL_PA: return "Waiting for AL_PA"; 482 1.4 mjacob case FW_WAIT_LOGIN: return "Wait Login"; 483 1.4 mjacob case FW_READY: return "Ready"; 484 1.4 mjacob case FW_LOSS_OF_SYNC: return "Loss Of Sync"; 485 1.4 mjacob case FW_ERROR: return "Error"; 486 1.4 mjacob case FW_REINIT: return "Re-Init"; 487 1.4 mjacob case FW_NON_PART: return "Nonparticipating"; 488 1.4 mjacob default: return "?????"; 489 1.4 mjacob } 490 1.4 mjacob } 491 1.4 mjacob 492 1.4 mjacob const char * 493 1.4 mjacob isp_fc_loop_statename(int state) 494 1.4 mjacob { 495 1.4 mjacob switch (state) { 496 1.4 mjacob case LOOP_NIL: return "NIL"; 497 1.4 mjacob case LOOP_LIP_RCVD: return "LIP Received"; 498 1.4 mjacob case LOOP_PDB_RCVD: return "PDB Received"; 499 1.4 mjacob case LOOP_SCANNING_LOOP: return "Scanning"; 500 1.4 mjacob case LOOP_LSCAN_DONE: return "Loop Scan Done"; 501 1.4 mjacob case LOOP_SCANNING_FABRIC: return "Scanning Fabric"; 502 1.4 mjacob case LOOP_FSCAN_DONE: return "Fabric Scan Done"; 503 1.4 mjacob case LOOP_SYNCING_PDB: return "Syncing PDB"; 504 1.4 mjacob case LOOP_READY: return "Ready"; 505 1.4 mjacob default: return "?????"; 506 1.4 mjacob } 507 1.4 mjacob } 508 1.4 mjacob 509 1.4 mjacob const char * 510 1.4 mjacob isp_fc_toponame(fcparam *fcp) 511 1.4 mjacob { 512 1.4 mjacob 513 1.4 mjacob if (fcp->isp_fwstate != FW_READY) { 514 1.4 mjacob return "Unavailable"; 515 1.4 mjacob } 516 1.4 mjacob switch (fcp->isp_topo) { 517 1.4 mjacob case TOPO_NL_PORT: return "Private Loop"; 518 1.4 mjacob case TOPO_FL_PORT: return "FL Port"; 519 1.4 mjacob case TOPO_N_PORT: return "N-Port to N-Port"; 520 1.4 mjacob case TOPO_F_PORT: return "F Port"; 521 1.4 mjacob case TOPO_PTP_STUB: return "F Port (no FLOGI_ACC response)"; 522 1.4 mjacob default: return "?????"; 523 1.4 mjacob } 524 1.4 mjacob } 525 1.4 mjacob 526 1.4 mjacob /* 527 1.4 mjacob * Change Roles 528 1.4 mjacob */ 529 1.4 mjacob int 530 1.4 mjacob isp_fc_change_role(ispsoftc_t *isp, int chan, int new_role) 531 1.4 mjacob { 532 1.4 mjacob fcparam *fcp = FCPARAM(isp, chan); 533 1.4 mjacob 534 1.4 mjacob if (chan >= isp->isp_nchan) { 535 1.4 mjacob isp_prt(isp, ISP_LOGWARN, "%s: bad channel %d", __func__, chan); 536 1.4 mjacob return (ENXIO); 537 1.4 mjacob } 538 1.4 mjacob if (chan == 0) { 539 1.4 mjacob #ifdef ISP_TARGET_MODE 540 1.4 mjacob isp_del_all_wwn_entries(isp, chan); 541 1.4 mjacob #endif 542 1.4 mjacob isp_clear_commands(isp); 543 1.4 mjacob 544 1.4 mjacob isp_reset(isp, 0); 545 1.4 mjacob if (isp->isp_state != ISP_RESETSTATE) { 546 1.4 mjacob isp_prt(isp, ISP_LOGERR, "%s: cannot reset card", __func__); 547 1.4 mjacob return (EIO); 548 1.4 mjacob } 549 1.4 mjacob fcp->role = new_role; 550 1.4 mjacob isp_init(isp); 551 1.4 mjacob if (isp->isp_state != ISP_INITSTATE) { 552 1.4 mjacob isp_prt(isp, ISP_LOGERR, "%s: cannot init card", __func__); 553 1.4 mjacob return (EIO); 554 1.4 mjacob } 555 1.4 mjacob isp->isp_state = ISP_RUNSTATE; 556 1.4 mjacob return (0); 557 1.4 mjacob } else if (ISP_CAP_MULTI_ID(isp)) { 558 1.4 mjacob mbreg_t mbs; 559 1.4 mjacob vp_modify_t *vp; 560 1.4 mjacob uint8_t qe[QENTRY_LEN], *scp; 561 1.4 mjacob 562 1.4 mjacob ISP_MEMZERO(qe, QENTRY_LEN); 563 1.4 mjacob /* Acquire Scratch */ 564 1.4 mjacob 565 1.4 mjacob if (FC_SCRATCH_ACQUIRE(isp, chan)) { 566 1.4 mjacob return (EBUSY); 567 1.4 mjacob } 568 1.4 mjacob scp = fcp->isp_scratch; 569 1.4 mjacob 570 1.4 mjacob /* 571 1.4 mjacob * Build a VP MODIFY command in memory 572 1.4 mjacob */ 573 1.4 mjacob vp = (vp_modify_t *) qe; 574 1.4 mjacob vp->vp_mod_hdr.rqs_entry_type = RQSTYPE_VP_MODIFY; 575 1.4 mjacob vp->vp_mod_hdr.rqs_entry_count = 1; 576 1.4 mjacob vp->vp_mod_cnt = 1; 577 1.4 mjacob vp->vp_mod_idx0 = chan; 578 1.4 mjacob vp->vp_mod_cmd = VP_MODIFY_ENA; 579 1.4 mjacob vp->vp_mod_ports[0].options = ICB2400_VPOPT_ENABLED; 580 1.4 mjacob if (new_role & ISP_ROLE_INITIATOR) { 581 1.4 mjacob vp->vp_mod_ports[0].options |= ICB2400_VPOPT_INI_ENABLE; 582 1.4 mjacob } 583 1.4 mjacob if ((new_role & ISP_ROLE_TARGET) == 0) { 584 1.4 mjacob vp->vp_mod_ports[0].options |= ICB2400_VPOPT_TGT_DISABLE; 585 1.4 mjacob } 586 1.4 mjacob MAKE_NODE_NAME_FROM_WWN(vp->vp_mod_ports[0].wwpn, fcp->isp_wwpn); 587 1.4 mjacob MAKE_NODE_NAME_FROM_WWN(vp->vp_mod_ports[0].wwnn, fcp->isp_wwnn); 588 1.4 mjacob isp_put_vp_modify(isp, vp, (vp_modify_t *) scp); 589 1.4 mjacob 590 1.4 mjacob /* 591 1.4 mjacob * Build a EXEC IOCB A64 command that points to the VP MODIFY command 592 1.4 mjacob */ 593 1.4 mjacob MBSINIT(&mbs, MBOX_EXEC_COMMAND_IOCB_A64, MBLOGALL, 0); 594 1.4 mjacob mbs.param[1] = QENTRY_LEN; 595 1.4 mjacob mbs.param[2] = DMA_WD1(fcp->isp_scdma); 596 1.4 mjacob mbs.param[3] = DMA_WD0(fcp->isp_scdma); 597 1.4 mjacob mbs.param[6] = DMA_WD3(fcp->isp_scdma); 598 1.4 mjacob mbs.param[7] = DMA_WD2(fcp->isp_scdma); 599 1.7 mjacob MEMORYBARRIER(isp, SYNC_SFORDEV, 0, 2 * QENTRY_LEN, chan); 600 1.4 mjacob isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs); 601 1.4 mjacob if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 602 1.4 mjacob FC_SCRATCH_RELEASE(isp, chan); 603 1.4 mjacob return (EIO); 604 1.4 mjacob } 605 1.7 mjacob MEMORYBARRIER(isp, SYNC_SFORCPU, QENTRY_LEN, QENTRY_LEN, chan); 606 1.4 mjacob isp_get_vp_modify(isp, (vp_modify_t *)&scp[QENTRY_LEN], vp); 607 1.4 mjacob 608 1.4 mjacob #ifdef ISP_TARGET_MODE 609 1.4 mjacob isp_del_all_wwn_entries(isp, chan); 610 1.4 mjacob #endif 611 1.4 mjacob /* 612 1.4 mjacob * Release Scratch 613 1.4 mjacob */ 614 1.4 mjacob FC_SCRATCH_RELEASE(isp, chan); 615 1.4 mjacob 616 1.4 mjacob if (vp->vp_mod_status != VP_STS_OK) { 617 1.4 mjacob isp_prt(isp, ISP_LOGERR, "%s: VP_MODIFY of Chan %d failed with status %d", __func__, chan, vp->vp_mod_status); 618 1.4 mjacob return (EIO); 619 1.4 mjacob } 620 1.4 mjacob fcp->role = new_role; 621 1.4 mjacob return (0); 622 1.4 mjacob } else { 623 1.4 mjacob return (EINVAL); 624 1.1 mjacob } 625 1.1 mjacob } 626 1.1 mjacob 627 1.1 mjacob void 628 1.4 mjacob isp_clear_commands(ispsoftc_t *isp) 629 1.4 mjacob { 630 1.6 mjacob uint32_t tmp; 631 1.6 mjacob isp_hdl_t *hdp; 632 1.4 mjacob #ifdef ISP_TARGET_MODE 633 1.4 mjacob isp_notify_t notify; 634 1.4 mjacob #endif 635 1.4 mjacob 636 1.4 mjacob for (tmp = 0; isp->isp_xflist && tmp < isp->isp_maxcmds; tmp++) { 637 1.6 mjacob XS_T *xs; 638 1.6 mjacob 639 1.6 mjacob hdp = &isp->isp_xflist[tmp]; 640 1.6 mjacob if (hdp->handle == ISP_HANDLE_FREE) { 641 1.4 mjacob continue; 642 1.4 mjacob } 643 1.6 mjacob xs = hdp->cmd; 644 1.4 mjacob if (XS_XFRLEN(xs)) { 645 1.6 mjacob ISP_DMAFREE(isp, xs, hdp->handle); 646 1.4 mjacob XS_SET_RESID(xs, XS_XFRLEN(xs)); 647 1.4 mjacob } else { 648 1.4 mjacob XS_SET_RESID(xs, 0); 649 1.4 mjacob } 650 1.6 mjacob hdp->handle = 0; 651 1.6 mjacob hdp->cmd = NULL; 652 1.4 mjacob XS_SETERR(xs, HBA_BUSRESET); 653 1.4 mjacob isp_done(xs); 654 1.4 mjacob } 655 1.4 mjacob #ifdef ISP_TARGET_MODE 656 1.4 mjacob for (tmp = 0; isp->isp_tgtlist && tmp < isp->isp_maxcmds; tmp++) { 657 1.4 mjacob uint8_t local[QENTRY_LEN]; 658 1.6 mjacob hdp = &isp->isp_tgtlist[tmp]; 659 1.6 mjacob if (hdp->handle == ISP_HANDLE_FREE) { 660 1.4 mjacob continue; 661 1.4 mjacob } 662 1.6 mjacob ISP_DMAFREE(isp, hdp->cmd, hdp->handle); 663 1.4 mjacob ISP_MEMZERO(local, QENTRY_LEN); 664 1.4 mjacob if (IS_24XX(isp)) { 665 1.4 mjacob ct7_entry_t *ctio = (ct7_entry_t *) local; 666 1.6 mjacob ctio->ct_syshandle = hdp->handle; 667 1.4 mjacob ctio->ct_nphdl = CT_HBA_RESET; 668 1.4 mjacob ctio->ct_header.rqs_entry_type = RQSTYPE_CTIO7; 669 1.4 mjacob } else if (IS_FC(isp)) { 670 1.4 mjacob ct2_entry_t *ctio = (ct2_entry_t *) local; 671 1.6 mjacob ctio->ct_syshandle = hdp->handle; 672 1.4 mjacob ctio->ct_status = CT_HBA_RESET; 673 1.4 mjacob ctio->ct_header.rqs_entry_type = RQSTYPE_CTIO2; 674 1.4 mjacob } else { 675 1.4 mjacob ct_entry_t *ctio = (ct_entry_t *) local; 676 1.6 mjacob ctio->ct_syshandle = hdp->handle; 677 1.5 mbalmer ctio->ct_status = CT_HBA_RESET & 0xff; 678 1.4 mjacob ctio->ct_header.rqs_entry_type = RQSTYPE_CTIO; 679 1.4 mjacob } 680 1.4 mjacob isp_async(isp, ISPASYNC_TARGET_ACTION, local); 681 1.4 mjacob } 682 1.4 mjacob for (tmp = 0; tmp < isp->isp_nchan; tmp++) { 683 1.4 mjacob ISP_MEMZERO(¬ify, sizeof (isp_notify_t)); 684 1.4 mjacob notify.nt_ncode = NT_HBA_RESET; 685 1.4 mjacob notify.nt_hba = isp; 686 1.4 mjacob notify.nt_wwn = INI_ANY; 687 1.4 mjacob notify.nt_nphdl = NIL_HANDLE; 688 1.4 mjacob notify.nt_sid = PORT_ANY; 689 1.4 mjacob notify.nt_did = PORT_ANY; 690 1.4 mjacob notify.nt_tgt = TGT_ANY; 691 1.4 mjacob notify.nt_channel = tmp; 692 1.4 mjacob notify.nt_lun = LUN_ANY; 693 1.4 mjacob notify.nt_tagval = TAG_ANY; 694 1.4 mjacob isp_async(isp, ISPASYNC_TARGET_NOTIFY, ¬ify); 695 1.4 mjacob } 696 1.4 mjacob #endif 697 1.4 mjacob } 698 1.4 mjacob 699 1.4 mjacob void 700 1.1 mjacob isp_shutdown(ispsoftc_t *isp) 701 1.1 mjacob { 702 1.1 mjacob if (IS_FC(isp)) { 703 1.1 mjacob if (IS_24XX(isp)) { 704 1.1 mjacob ISP_WRITE(isp, BIU2400_ICR, 0); 705 1.1 mjacob ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_PAUSE); 706 1.1 mjacob } else { 707 1.1 mjacob ISP_WRITE(isp, BIU_ICR, 0); 708 1.1 mjacob ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE); 709 1.1 mjacob ISP_WRITE(isp, BIU2100_CSR, BIU2100_FPM0_REGS); 710 1.1 mjacob ISP_WRITE(isp, FPM_DIAG_CONFIG, FPM_SOFT_RESET); 711 1.1 mjacob ISP_WRITE(isp, BIU2100_CSR, BIU2100_FB_REGS); 712 1.1 mjacob ISP_WRITE(isp, FBM_CMD, FBMCMD_FIFO_RESET_ALL); 713 1.1 mjacob ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS); 714 1.1 mjacob } 715 1.1 mjacob } else { 716 1.1 mjacob ISP_WRITE(isp, BIU_ICR, 0); 717 1.1 mjacob ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE); 718 1.1 mjacob } 719 1.1 mjacob } 720 1.1 mjacob 721 1.1 mjacob /* 722 1.1 mjacob * Functions to move stuff to a form that the QLogic RISC engine understands 723 1.1 mjacob * and functions to move stuff back to a form the processor understands. 724 1.1 mjacob * 725 1.1 mjacob * Each platform is required to provide the 8, 16 and 32 bit 726 1.1 mjacob * swizzle and unswizzle macros (ISP_IOX{PUT|GET}_{8,16,32}) 727 1.1 mjacob * 728 1.1 mjacob * The assumption is that swizzling and unswizzling is mostly done 'in place' 729 1.1 mjacob * (with a few exceptions for efficiency). 730 1.1 mjacob */ 731 1.1 mjacob 732 1.4 mjacob #define ISP_IS_SBUS(isp) (ISP_SBUS_SUPPORTED && (isp)->isp_bustype == ISP_BT_SBUS) 733 1.1 mjacob 734 1.1 mjacob #define ASIZE(x) (sizeof (x) / sizeof (x[0])) 735 1.1 mjacob /* 736 1.1 mjacob * Swizzle/Copy Functions 737 1.1 mjacob */ 738 1.1 mjacob void 739 1.1 mjacob isp_put_hdr(ispsoftc_t *isp, isphdr_t *hpsrc, isphdr_t *hpdst) 740 1.1 mjacob { 741 1.1 mjacob if (ISP_IS_SBUS(isp)) { 742 1.4 mjacob ISP_IOXPUT_8(isp, hpsrc->rqs_entry_type, &hpdst->rqs_entry_count); 743 1.4 mjacob ISP_IOXPUT_8(isp, hpsrc->rqs_entry_count, &hpdst->rqs_entry_type); 744 1.4 mjacob ISP_IOXPUT_8(isp, hpsrc->rqs_seqno, &hpdst->rqs_flags); 745 1.4 mjacob ISP_IOXPUT_8(isp, hpsrc->rqs_flags, &hpdst->rqs_seqno); 746 1.4 mjacob } else { 747 1.4 mjacob ISP_IOXPUT_8(isp, hpsrc->rqs_entry_type, &hpdst->rqs_entry_type); 748 1.4 mjacob ISP_IOXPUT_8(isp, hpsrc->rqs_entry_count, &hpdst->rqs_entry_count); 749 1.4 mjacob ISP_IOXPUT_8(isp, hpsrc->rqs_seqno, &hpdst->rqs_seqno); 750 1.4 mjacob ISP_IOXPUT_8(isp, hpsrc->rqs_flags, &hpdst->rqs_flags); 751 1.1 mjacob } 752 1.1 mjacob } 753 1.1 mjacob 754 1.1 mjacob void 755 1.1 mjacob isp_get_hdr(ispsoftc_t *isp, isphdr_t *hpsrc, isphdr_t *hpdst) 756 1.1 mjacob { 757 1.1 mjacob if (ISP_IS_SBUS(isp)) { 758 1.4 mjacob ISP_IOXGET_8(isp, &hpsrc->rqs_entry_type, hpdst->rqs_entry_count); 759 1.4 mjacob ISP_IOXGET_8(isp, &hpsrc->rqs_entry_count, hpdst->rqs_entry_type); 760 1.4 mjacob ISP_IOXGET_8(isp, &hpsrc->rqs_seqno, hpdst->rqs_flags); 761 1.4 mjacob ISP_IOXGET_8(isp, &hpsrc->rqs_flags, hpdst->rqs_seqno); 762 1.4 mjacob } else { 763 1.4 mjacob ISP_IOXGET_8(isp, &hpsrc->rqs_entry_type, hpdst->rqs_entry_type); 764 1.4 mjacob ISP_IOXGET_8(isp, &hpsrc->rqs_entry_count, hpdst->rqs_entry_count); 765 1.4 mjacob ISP_IOXGET_8(isp, &hpsrc->rqs_seqno, hpdst->rqs_seqno); 766 1.4 mjacob ISP_IOXGET_8(isp, &hpsrc->rqs_flags, hpdst->rqs_flags); 767 1.1 mjacob } 768 1.1 mjacob } 769 1.1 mjacob 770 1.1 mjacob int 771 1.1 mjacob isp_get_response_type(ispsoftc_t *isp, isphdr_t *hp) 772 1.1 mjacob { 773 1.1 mjacob uint8_t type; 774 1.1 mjacob if (ISP_IS_SBUS(isp)) { 775 1.1 mjacob ISP_IOXGET_8(isp, &hp->rqs_entry_count, type); 776 1.1 mjacob } else { 777 1.1 mjacob ISP_IOXGET_8(isp, &hp->rqs_entry_type, type); 778 1.1 mjacob } 779 1.1 mjacob return ((int)type); 780 1.1 mjacob } 781 1.1 mjacob 782 1.1 mjacob void 783 1.1 mjacob isp_put_request(ispsoftc_t *isp, ispreq_t *rqsrc, ispreq_t *rqdst) 784 1.1 mjacob { 785 1.1 mjacob int i; 786 1.1 mjacob isp_put_hdr(isp, &rqsrc->req_header, &rqdst->req_header); 787 1.1 mjacob ISP_IOXPUT_32(isp, rqsrc->req_handle, &rqdst->req_handle); 788 1.1 mjacob if (ISP_IS_SBUS(isp)) { 789 1.1 mjacob ISP_IOXPUT_8(isp, rqsrc->req_lun_trn, &rqdst->req_target); 790 1.1 mjacob ISP_IOXPUT_8(isp, rqsrc->req_target, &rqdst->req_lun_trn); 791 1.1 mjacob } else { 792 1.1 mjacob ISP_IOXPUT_8(isp, rqsrc->req_lun_trn, &rqdst->req_lun_trn); 793 1.1 mjacob ISP_IOXPUT_8(isp, rqsrc->req_target, &rqdst->req_target); 794 1.1 mjacob } 795 1.1 mjacob ISP_IOXPUT_16(isp, rqsrc->req_cdblen, &rqdst->req_cdblen); 796 1.1 mjacob ISP_IOXPUT_16(isp, rqsrc->req_flags, &rqdst->req_flags); 797 1.1 mjacob ISP_IOXPUT_16(isp, rqsrc->req_time, &rqdst->req_time); 798 1.1 mjacob ISP_IOXPUT_16(isp, rqsrc->req_seg_count, &rqdst->req_seg_count); 799 1.1 mjacob for (i = 0; i < ASIZE(rqsrc->req_cdb); i++) { 800 1.1 mjacob ISP_IOXPUT_8(isp, rqsrc->req_cdb[i], &rqdst->req_cdb[i]); 801 1.1 mjacob } 802 1.1 mjacob for (i = 0; i < ISP_RQDSEG; i++) { 803 1.4 mjacob ISP_IOXPUT_32(isp, rqsrc->req_dataseg[i].ds_base, &rqdst->req_dataseg[i].ds_base); 804 1.4 mjacob ISP_IOXPUT_32(isp, rqsrc->req_dataseg[i].ds_count, &rqdst->req_dataseg[i].ds_count); 805 1.1 mjacob } 806 1.1 mjacob } 807 1.1 mjacob 808 1.1 mjacob void 809 1.1 mjacob isp_put_marker(ispsoftc_t *isp, isp_marker_t *src, isp_marker_t *dst) 810 1.1 mjacob { 811 1.1 mjacob int i; 812 1.1 mjacob isp_put_hdr(isp, &src->mrk_header, &dst->mrk_header); 813 1.1 mjacob ISP_IOXPUT_32(isp, src->mrk_handle, &dst->mrk_handle); 814 1.1 mjacob if (ISP_IS_SBUS(isp)) { 815 1.1 mjacob ISP_IOXPUT_8(isp, src->mrk_reserved0, &dst->mrk_target); 816 1.1 mjacob ISP_IOXPUT_8(isp, src->mrk_target, &dst->mrk_reserved0); 817 1.1 mjacob } else { 818 1.1 mjacob ISP_IOXPUT_8(isp, src->mrk_reserved0, &dst->mrk_reserved0); 819 1.1 mjacob ISP_IOXPUT_8(isp, src->mrk_target, &dst->mrk_target); 820 1.1 mjacob } 821 1.1 mjacob ISP_IOXPUT_16(isp, src->mrk_modifier, &dst->mrk_modifier); 822 1.1 mjacob ISP_IOXPUT_16(isp, src->mrk_flags, &dst->mrk_flags); 823 1.1 mjacob ISP_IOXPUT_16(isp, src->mrk_lun, &dst->mrk_lun); 824 1.1 mjacob for (i = 0; i < ASIZE(src->mrk_reserved1); i++) { 825 1.4 mjacob ISP_IOXPUT_8(isp, src->mrk_reserved1[i], &dst->mrk_reserved1[i]); 826 1.1 mjacob } 827 1.1 mjacob } 828 1.1 mjacob 829 1.1 mjacob void 830 1.4 mjacob isp_put_marker_24xx(ispsoftc_t *isp, isp_marker_24xx_t *src, isp_marker_24xx_t *dst) 831 1.1 mjacob { 832 1.1 mjacob int i; 833 1.1 mjacob isp_put_hdr(isp, &src->mrk_header, &dst->mrk_header); 834 1.1 mjacob ISP_IOXPUT_32(isp, src->mrk_handle, &dst->mrk_handle); 835 1.1 mjacob ISP_IOXPUT_16(isp, src->mrk_nphdl, &dst->mrk_nphdl); 836 1.1 mjacob ISP_IOXPUT_8(isp, src->mrk_modifier, &dst->mrk_modifier); 837 1.1 mjacob ISP_IOXPUT_8(isp, src->mrk_reserved0, &dst->mrk_reserved0); 838 1.1 mjacob ISP_IOXPUT_8(isp, src->mrk_reserved1, &dst->mrk_reserved1); 839 1.1 mjacob ISP_IOXPUT_8(isp, src->mrk_vphdl, &dst->mrk_vphdl); 840 1.1 mjacob ISP_IOXPUT_8(isp, src->mrk_reserved2, &dst->mrk_reserved2); 841 1.1 mjacob for (i = 0; i < ASIZE(src->mrk_lun); i++) { 842 1.1 mjacob ISP_IOXPUT_8(isp, src->mrk_lun[i], &dst->mrk_lun[i]); 843 1.1 mjacob } 844 1.1 mjacob for (i = 0; i < ASIZE(src->mrk_reserved3); i++) { 845 1.4 mjacob ISP_IOXPUT_8(isp, src->mrk_reserved3[i], &dst->mrk_reserved3[i]); 846 1.1 mjacob } 847 1.1 mjacob } 848 1.1 mjacob 849 1.1 mjacob void 850 1.1 mjacob isp_put_request_t2(ispsoftc_t *isp, ispreqt2_t *src, ispreqt2_t *dst) 851 1.1 mjacob { 852 1.1 mjacob int i; 853 1.1 mjacob isp_put_hdr(isp, &src->req_header, &dst->req_header); 854 1.1 mjacob ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle); 855 1.1 mjacob ISP_IOXPUT_8(isp, src->req_lun_trn, &dst->req_lun_trn); 856 1.1 mjacob ISP_IOXPUT_8(isp, src->req_target, &dst->req_target); 857 1.1 mjacob ISP_IOXPUT_16(isp, src->req_scclun, &dst->req_scclun); 858 1.1 mjacob ISP_IOXPUT_16(isp, src->req_flags, &dst->req_flags); 859 1.1 mjacob ISP_IOXPUT_16(isp, src->req_reserved, &dst->req_reserved); 860 1.1 mjacob ISP_IOXPUT_16(isp, src->req_time, &dst->req_time); 861 1.1 mjacob ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count); 862 1.1 mjacob for (i = 0; i < ASIZE(src->req_cdb); i++) { 863 1.1 mjacob ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]); 864 1.1 mjacob } 865 1.1 mjacob ISP_IOXPUT_32(isp, src->req_totalcnt, &dst->req_totalcnt); 866 1.1 mjacob for (i = 0; i < ISP_RQDSEG_T2; i++) { 867 1.4 mjacob ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base); 868 1.4 mjacob ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count); 869 1.1 mjacob } 870 1.1 mjacob } 871 1.1 mjacob 872 1.1 mjacob void 873 1.1 mjacob isp_put_request_t2e(ispsoftc_t *isp, ispreqt2e_t *src, ispreqt2e_t *dst) 874 1.1 mjacob { 875 1.1 mjacob int i; 876 1.1 mjacob isp_put_hdr(isp, &src->req_header, &dst->req_header); 877 1.1 mjacob ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle); 878 1.1 mjacob ISP_IOXPUT_16(isp, src->req_target, &dst->req_target); 879 1.1 mjacob ISP_IOXPUT_16(isp, src->req_scclun, &dst->req_scclun); 880 1.1 mjacob ISP_IOXPUT_16(isp, src->req_flags, &dst->req_flags); 881 1.1 mjacob ISP_IOXPUT_16(isp, src->req_reserved, &dst->req_reserved); 882 1.1 mjacob ISP_IOXPUT_16(isp, src->req_time, &dst->req_time); 883 1.1 mjacob ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count); 884 1.1 mjacob for (i = 0; i < ASIZE(src->req_cdb); i++) { 885 1.1 mjacob ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]); 886 1.1 mjacob } 887 1.1 mjacob ISP_IOXPUT_32(isp, src->req_totalcnt, &dst->req_totalcnt); 888 1.1 mjacob for (i = 0; i < ISP_RQDSEG_T2; i++) { 889 1.4 mjacob ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base); 890 1.4 mjacob ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count); 891 1.1 mjacob } 892 1.1 mjacob } 893 1.1 mjacob 894 1.1 mjacob void 895 1.1 mjacob isp_put_request_t3(ispsoftc_t *isp, ispreqt3_t *src, ispreqt3_t *dst) 896 1.1 mjacob { 897 1.1 mjacob int i; 898 1.1 mjacob isp_put_hdr(isp, &src->req_header, &dst->req_header); 899 1.1 mjacob ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle); 900 1.1 mjacob ISP_IOXPUT_8(isp, src->req_lun_trn, &dst->req_lun_trn); 901 1.1 mjacob ISP_IOXPUT_8(isp, src->req_target, &dst->req_target); 902 1.1 mjacob ISP_IOXPUT_16(isp, src->req_scclun, &dst->req_scclun); 903 1.1 mjacob ISP_IOXPUT_16(isp, src->req_flags, &dst->req_flags); 904 1.1 mjacob ISP_IOXPUT_16(isp, src->req_reserved, &dst->req_reserved); 905 1.1 mjacob ISP_IOXPUT_16(isp, src->req_time, &dst->req_time); 906 1.1 mjacob ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count); 907 1.1 mjacob for (i = 0; i < ASIZE(src->req_cdb); i++) { 908 1.1 mjacob ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]); 909 1.1 mjacob } 910 1.1 mjacob ISP_IOXPUT_32(isp, src->req_totalcnt, &dst->req_totalcnt); 911 1.1 mjacob for (i = 0; i < ISP_RQDSEG_T3; i++) { 912 1.4 mjacob ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base); 913 1.4 mjacob ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_basehi, &dst->req_dataseg[i].ds_basehi); 914 1.4 mjacob ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count); 915 1.1 mjacob } 916 1.1 mjacob } 917 1.1 mjacob 918 1.1 mjacob void 919 1.1 mjacob isp_put_request_t3e(ispsoftc_t *isp, ispreqt3e_t *src, ispreqt3e_t *dst) 920 1.1 mjacob { 921 1.1 mjacob int i; 922 1.1 mjacob isp_put_hdr(isp, &src->req_header, &dst->req_header); 923 1.1 mjacob ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle); 924 1.1 mjacob ISP_IOXPUT_16(isp, src->req_target, &dst->req_target); 925 1.1 mjacob ISP_IOXPUT_16(isp, src->req_scclun, &dst->req_scclun); 926 1.1 mjacob ISP_IOXPUT_16(isp, src->req_flags, &dst->req_flags); 927 1.1 mjacob ISP_IOXPUT_16(isp, src->req_reserved, &dst->req_reserved); 928 1.1 mjacob ISP_IOXPUT_16(isp, src->req_time, &dst->req_time); 929 1.1 mjacob ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count); 930 1.1 mjacob for (i = 0; i < ASIZE(src->req_cdb); i++) { 931 1.1 mjacob ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]); 932 1.1 mjacob } 933 1.1 mjacob ISP_IOXPUT_32(isp, src->req_totalcnt, &dst->req_totalcnt); 934 1.1 mjacob for (i = 0; i < ISP_RQDSEG_T3; i++) { 935 1.4 mjacob ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base); 936 1.4 mjacob ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_basehi, &dst->req_dataseg[i].ds_basehi); 937 1.4 mjacob ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count); 938 1.1 mjacob } 939 1.1 mjacob } 940 1.1 mjacob 941 1.1 mjacob void 942 1.1 mjacob isp_put_extended_request(ispsoftc_t *isp, ispextreq_t *src, ispextreq_t *dst) 943 1.1 mjacob { 944 1.1 mjacob int i; 945 1.1 mjacob isp_put_hdr(isp, &src->req_header, &dst->req_header); 946 1.1 mjacob ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle); 947 1.1 mjacob if (ISP_IS_SBUS(isp)) { 948 1.1 mjacob ISP_IOXPUT_8(isp, src->req_lun_trn, &dst->req_target); 949 1.1 mjacob ISP_IOXPUT_8(isp, src->req_target, &dst->req_lun_trn); 950 1.1 mjacob } else { 951 1.1 mjacob ISP_IOXPUT_8(isp, src->req_lun_trn, &dst->req_lun_trn); 952 1.1 mjacob ISP_IOXPUT_8(isp, src->req_target, &dst->req_target); 953 1.1 mjacob } 954 1.1 mjacob ISP_IOXPUT_16(isp, src->req_cdblen, &dst->req_cdblen); 955 1.1 mjacob ISP_IOXPUT_16(isp, src->req_flags, &dst->req_flags); 956 1.1 mjacob ISP_IOXPUT_16(isp, src->req_time, &dst->req_time); 957 1.1 mjacob ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count); 958 1.1 mjacob for (i = 0; i < ASIZE(src->req_cdb); i++) { 959 1.1 mjacob ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]); 960 1.1 mjacob } 961 1.1 mjacob } 962 1.1 mjacob 963 1.1 mjacob void 964 1.1 mjacob isp_put_request_t7(ispsoftc_t *isp, ispreqt7_t *src, ispreqt7_t *dst) 965 1.1 mjacob { 966 1.1 mjacob int i; 967 1.1 mjacob uint32_t *a, *b; 968 1.1 mjacob 969 1.1 mjacob isp_put_hdr(isp, &src->req_header, &dst->req_header); 970 1.1 mjacob ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle); 971 1.1 mjacob ISP_IOXPUT_16(isp, src->req_nphdl, &dst->req_nphdl); 972 1.1 mjacob ISP_IOXPUT_16(isp, src->req_time, &dst->req_time); 973 1.1 mjacob ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count); 974 1.1 mjacob ISP_IOXPUT_16(isp, src->req_reserved, &dst->req_reserved); 975 1.1 mjacob a = (uint32_t *) src->req_lun; 976 1.1 mjacob b = (uint32_t *) dst->req_lun; 977 1.1 mjacob for (i = 0; i < (ASIZE(src->req_lun) >> 2); i++ ) { 978 1.2 mjacob *b++ = ISP_SWAP32(isp, *a++); 979 1.1 mjacob } 980 1.1 mjacob ISP_IOXPUT_8(isp, src->req_alen_datadir, &dst->req_alen_datadir); 981 1.1 mjacob ISP_IOXPUT_8(isp, src->req_task_management, &dst->req_task_management); 982 1.1 mjacob ISP_IOXPUT_8(isp, src->req_task_attribute, &dst->req_task_attribute); 983 1.1 mjacob ISP_IOXPUT_8(isp, src->req_crn, &dst->req_crn); 984 1.1 mjacob a = (uint32_t *) src->req_cdb; 985 1.1 mjacob b = (uint32_t *) dst->req_cdb; 986 1.2 mjacob for (i = 0; i < (ASIZE(src->req_cdb) >> 2); i++) { 987 1.2 mjacob *b++ = ISP_SWAP32(isp, *a++); 988 1.1 mjacob } 989 1.1 mjacob ISP_IOXPUT_32(isp, src->req_dl, &dst->req_dl); 990 1.1 mjacob ISP_IOXPUT_16(isp, src->req_tidlo, &dst->req_tidlo); 991 1.1 mjacob ISP_IOXPUT_8(isp, src->req_tidhi, &dst->req_tidhi); 992 1.1 mjacob ISP_IOXPUT_8(isp, src->req_vpidx, &dst->req_vpidx); 993 1.4 mjacob ISP_IOXPUT_32(isp, src->req_dataseg.ds_base, &dst->req_dataseg.ds_base); 994 1.4 mjacob ISP_IOXPUT_32(isp, src->req_dataseg.ds_basehi, &dst->req_dataseg.ds_basehi); 995 1.4 mjacob ISP_IOXPUT_32(isp, src->req_dataseg.ds_count, &dst->req_dataseg.ds_count); 996 1.1 mjacob } 997 1.1 mjacob 998 1.1 mjacob void 999 1.3 mjacob isp_put_24xx_tmf(ispsoftc_t *isp, isp24xx_tmf_t *src, isp24xx_tmf_t *dst) 1000 1.3 mjacob { 1001 1.3 mjacob int i; 1002 1.3 mjacob uint32_t *a, *b; 1003 1.3 mjacob 1004 1.3 mjacob isp_put_hdr(isp, &src->tmf_header, &dst->tmf_header); 1005 1.3 mjacob ISP_IOXPUT_32(isp, src->tmf_handle, &dst->tmf_handle); 1006 1.3 mjacob ISP_IOXPUT_16(isp, src->tmf_nphdl, &dst->tmf_nphdl); 1007 1.3 mjacob ISP_IOXPUT_16(isp, src->tmf_delay, &dst->tmf_delay); 1008 1.3 mjacob ISP_IOXPUT_16(isp, src->tmf_timeout, &dst->tmf_timeout); 1009 1.3 mjacob for (i = 0; i < ASIZE(src->tmf_reserved0); i++) { 1010 1.4 mjacob ISP_IOXPUT_8(isp, src->tmf_reserved0[i], &dst->tmf_reserved0[i]); 1011 1.3 mjacob } 1012 1.3 mjacob a = (uint32_t *) src->tmf_lun; 1013 1.3 mjacob b = (uint32_t *) dst->tmf_lun; 1014 1.3 mjacob for (i = 0; i < (ASIZE(src->tmf_lun) >> 2); i++ ) { 1015 1.3 mjacob *b++ = ISP_SWAP32(isp, *a++); 1016 1.3 mjacob } 1017 1.3 mjacob ISP_IOXPUT_32(isp, src->tmf_flags, &dst->tmf_flags); 1018 1.3 mjacob for (i = 0; i < ASIZE(src->tmf_reserved1); i++) { 1019 1.4 mjacob ISP_IOXPUT_8(isp, src->tmf_reserved1[i], &dst->tmf_reserved1[i]); 1020 1.3 mjacob } 1021 1.3 mjacob ISP_IOXPUT_16(isp, src->tmf_tidlo, &dst->tmf_tidlo); 1022 1.3 mjacob ISP_IOXPUT_8(isp, src->tmf_tidhi, &dst->tmf_tidhi); 1023 1.3 mjacob ISP_IOXPUT_8(isp, src->tmf_vpidx, &dst->tmf_vpidx); 1024 1.3 mjacob for (i = 0; i < ASIZE(src->tmf_reserved2); i++) { 1025 1.4 mjacob ISP_IOXPUT_8(isp, src->tmf_reserved2[i], &dst->tmf_reserved2[i]); 1026 1.3 mjacob } 1027 1.3 mjacob } 1028 1.3 mjacob 1029 1.3 mjacob void 1030 1.1 mjacob isp_put_24xx_abrt(ispsoftc_t *isp, isp24xx_abrt_t *src, isp24xx_abrt_t *dst) 1031 1.1 mjacob { 1032 1.1 mjacob int i; 1033 1.1 mjacob isp_put_hdr(isp, &src->abrt_header, &dst->abrt_header); 1034 1.1 mjacob ISP_IOXPUT_32(isp, src->abrt_handle, &dst->abrt_handle); 1035 1.1 mjacob ISP_IOXPUT_16(isp, src->abrt_nphdl, &dst->abrt_nphdl); 1036 1.1 mjacob ISP_IOXPUT_16(isp, src->abrt_options, &dst->abrt_options); 1037 1.1 mjacob ISP_IOXPUT_32(isp, src->abrt_cmd_handle, &dst->abrt_cmd_handle); 1038 1.1 mjacob for (i = 0; i < ASIZE(src->abrt_reserved); i++) { 1039 1.4 mjacob ISP_IOXPUT_8(isp, src->abrt_reserved[i], &dst->abrt_reserved[i]); 1040 1.1 mjacob } 1041 1.1 mjacob ISP_IOXPUT_16(isp, src->abrt_tidlo, &dst->abrt_tidlo); 1042 1.1 mjacob ISP_IOXPUT_8(isp, src->abrt_tidhi, &dst->abrt_tidhi); 1043 1.1 mjacob ISP_IOXPUT_8(isp, src->abrt_vpidx, &dst->abrt_vpidx); 1044 1.1 mjacob for (i = 0; i < ASIZE(src->abrt_reserved1); i++) { 1045 1.4 mjacob ISP_IOXPUT_8(isp, src->abrt_reserved1[i], &dst->abrt_reserved1[i]); 1046 1.1 mjacob } 1047 1.1 mjacob } 1048 1.1 mjacob 1049 1.1 mjacob void 1050 1.1 mjacob isp_put_cont_req(ispsoftc_t *isp, ispcontreq_t *src, ispcontreq_t *dst) 1051 1.1 mjacob { 1052 1.1 mjacob int i; 1053 1.1 mjacob isp_put_hdr(isp, &src->req_header, &dst->req_header); 1054 1.1 mjacob for (i = 0; i < ISP_CDSEG; i++) { 1055 1.4 mjacob ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base); 1056 1.4 mjacob ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count); 1057 1.1 mjacob } 1058 1.1 mjacob } 1059 1.1 mjacob 1060 1.1 mjacob void 1061 1.1 mjacob isp_put_cont64_req(ispsoftc_t *isp, ispcontreq64_t *src, ispcontreq64_t *dst) 1062 1.1 mjacob { 1063 1.1 mjacob int i; 1064 1.1 mjacob isp_put_hdr(isp, &src->req_header, &dst->req_header); 1065 1.1 mjacob for (i = 0; i < ISP_CDSEG64; i++) { 1066 1.4 mjacob ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base); 1067 1.4 mjacob ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_basehi, &dst->req_dataseg[i].ds_basehi); 1068 1.4 mjacob ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count); 1069 1.1 mjacob } 1070 1.1 mjacob } 1071 1.1 mjacob 1072 1.1 mjacob void 1073 1.1 mjacob isp_get_response(ispsoftc_t *isp, ispstatusreq_t *src, ispstatusreq_t *dst) 1074 1.1 mjacob { 1075 1.1 mjacob int i; 1076 1.1 mjacob isp_get_hdr(isp, &src->req_header, &dst->req_header); 1077 1.1 mjacob ISP_IOXGET_32(isp, &src->req_handle, dst->req_handle); 1078 1.1 mjacob ISP_IOXGET_16(isp, &src->req_scsi_status, dst->req_scsi_status); 1079 1.4 mjacob ISP_IOXGET_16(isp, &src->req_completion_status, dst->req_completion_status); 1080 1.1 mjacob ISP_IOXGET_16(isp, &src->req_state_flags, dst->req_state_flags); 1081 1.1 mjacob ISP_IOXGET_16(isp, &src->req_status_flags, dst->req_status_flags); 1082 1.1 mjacob ISP_IOXGET_16(isp, &src->req_time, dst->req_time); 1083 1.1 mjacob ISP_IOXGET_16(isp, &src->req_sense_len, dst->req_sense_len); 1084 1.1 mjacob ISP_IOXGET_32(isp, &src->req_resid, dst->req_resid); 1085 1.1 mjacob for (i = 0; i < 8; i++) { 1086 1.4 mjacob ISP_IOXGET_8(isp, &src->req_response[i], dst->req_response[i]); 1087 1.1 mjacob } 1088 1.1 mjacob for (i = 0; i < 32; i++) { 1089 1.4 mjacob ISP_IOXGET_8(isp, &src->req_sense_data[i], dst->req_sense_data[i]); 1090 1.1 mjacob } 1091 1.1 mjacob } 1092 1.1 mjacob 1093 1.1 mjacob void 1094 1.4 mjacob isp_get_24xx_response(ispsoftc_t *isp, isp24xx_statusreq_t *src, isp24xx_statusreq_t *dst) 1095 1.1 mjacob { 1096 1.1 mjacob int i; 1097 1.2 mjacob uint32_t *s, *d; 1098 1.2 mjacob 1099 1.1 mjacob isp_get_hdr(isp, &src->req_header, &dst->req_header); 1100 1.1 mjacob ISP_IOXGET_32(isp, &src->req_handle, dst->req_handle); 1101 1.4 mjacob ISP_IOXGET_16(isp, &src->req_completion_status, dst->req_completion_status); 1102 1.1 mjacob ISP_IOXGET_16(isp, &src->req_oxid, dst->req_oxid); 1103 1.1 mjacob ISP_IOXGET_32(isp, &src->req_resid, dst->req_resid); 1104 1.1 mjacob ISP_IOXGET_16(isp, &src->req_reserved0, dst->req_reserved0); 1105 1.1 mjacob ISP_IOXGET_16(isp, &src->req_state_flags, dst->req_state_flags); 1106 1.1 mjacob ISP_IOXGET_16(isp, &src->req_reserved1, dst->req_reserved1); 1107 1.1 mjacob ISP_IOXGET_16(isp, &src->req_scsi_status, dst->req_scsi_status); 1108 1.1 mjacob ISP_IOXGET_32(isp, &src->req_fcp_residual, dst->req_fcp_residual); 1109 1.1 mjacob ISP_IOXGET_32(isp, &src->req_sense_len, dst->req_sense_len); 1110 1.1 mjacob ISP_IOXGET_32(isp, &src->req_response_len, dst->req_response_len); 1111 1.2 mjacob s = (uint32_t *)src->req_rsp_sense; 1112 1.2 mjacob d = (uint32_t *)dst->req_rsp_sense; 1113 1.2 mjacob for (i = 0; i < (ASIZE(src->req_rsp_sense) >> 2); i++) { 1114 1.2 mjacob d[i] = ISP_SWAP32(isp, s[i]); 1115 1.1 mjacob } 1116 1.1 mjacob } 1117 1.1 mjacob 1118 1.1 mjacob void 1119 1.1 mjacob isp_get_24xx_abrt(ispsoftc_t *isp, isp24xx_abrt_t *src, isp24xx_abrt_t *dst) 1120 1.1 mjacob { 1121 1.1 mjacob int i; 1122 1.1 mjacob isp_get_hdr(isp, &src->abrt_header, &dst->abrt_header); 1123 1.1 mjacob ISP_IOXGET_32(isp, &src->abrt_handle, dst->abrt_handle); 1124 1.1 mjacob ISP_IOXGET_16(isp, &src->abrt_nphdl, dst->abrt_nphdl); 1125 1.1 mjacob ISP_IOXGET_16(isp, &src->abrt_options, dst->abrt_options); 1126 1.1 mjacob ISP_IOXGET_32(isp, &src->abrt_cmd_handle, dst->abrt_cmd_handle); 1127 1.2 mjacob for (i = 0; i < ASIZE(src->abrt_reserved); i++) { 1128 1.4 mjacob ISP_IOXGET_8(isp, &src->abrt_reserved[i], dst->abrt_reserved[i]); 1129 1.1 mjacob } 1130 1.1 mjacob ISP_IOXGET_16(isp, &src->abrt_tidlo, dst->abrt_tidlo); 1131 1.1 mjacob ISP_IOXGET_8(isp, &src->abrt_tidhi, dst->abrt_tidhi); 1132 1.1 mjacob ISP_IOXGET_8(isp, &src->abrt_vpidx, dst->abrt_vpidx); 1133 1.2 mjacob for (i = 0; i < ASIZE(src->abrt_reserved1); i++) { 1134 1.4 mjacob ISP_IOXGET_8(isp, &src->abrt_reserved1[i], dst->abrt_reserved1[i]); 1135 1.1 mjacob } 1136 1.1 mjacob } 1137 1.1 mjacob 1138 1.1 mjacob 1139 1.1 mjacob void 1140 1.6 mjacob isp_get_rio1(ispsoftc_t *isp, isp_rio1_t *r1src, isp_rio1_t *r1dst) 1141 1.6 mjacob { 1142 1.6 mjacob const int lim = sizeof (r1dst->req_handles) / sizeof (r1dst->req_handles[0]); 1143 1.6 mjacob int i; 1144 1.6 mjacob isp_get_hdr(isp, &r1src->req_header, &r1dst->req_header); 1145 1.6 mjacob if (r1dst->req_header.rqs_seqno > lim) { 1146 1.6 mjacob r1dst->req_header.rqs_seqno = lim; 1147 1.6 mjacob } 1148 1.6 mjacob for (i = 0; i < r1dst->req_header.rqs_seqno; i++) { 1149 1.6 mjacob ISP_IOXGET_32(isp, &r1src->req_handles[i], r1dst->req_handles[i]); 1150 1.6 mjacob } 1151 1.6 mjacob while (i < lim) { 1152 1.6 mjacob r1dst->req_handles[i++] = 0; 1153 1.6 mjacob } 1154 1.6 mjacob } 1155 1.6 mjacob 1156 1.6 mjacob void 1157 1.1 mjacob isp_get_rio2(ispsoftc_t *isp, isp_rio2_t *r2src, isp_rio2_t *r2dst) 1158 1.1 mjacob { 1159 1.6 mjacob const int lim = sizeof (r2dst->req_handles) / sizeof (r2dst->req_handles[0]); 1160 1.1 mjacob int i; 1161 1.6 mjacob 1162 1.1 mjacob isp_get_hdr(isp, &r2src->req_header, &r2dst->req_header); 1163 1.6 mjacob if (r2dst->req_header.rqs_seqno > lim) { 1164 1.6 mjacob r2dst->req_header.rqs_seqno = lim; 1165 1.1 mjacob } 1166 1.1 mjacob for (i = 0; i < r2dst->req_header.rqs_seqno; i++) { 1167 1.4 mjacob ISP_IOXGET_16(isp, &r2src->req_handles[i], r2dst->req_handles[i]); 1168 1.1 mjacob } 1169 1.6 mjacob while (i < lim) { 1170 1.1 mjacob r2dst->req_handles[i++] = 0; 1171 1.1 mjacob } 1172 1.1 mjacob } 1173 1.1 mjacob 1174 1.1 mjacob void 1175 1.1 mjacob isp_put_icb(ispsoftc_t *isp, isp_icb_t *src, isp_icb_t *dst) 1176 1.1 mjacob { 1177 1.1 mjacob int i; 1178 1.1 mjacob if (ISP_IS_SBUS(isp)) { 1179 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_version, &dst->icb_reserved0); 1180 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_reserved0, &dst->icb_version); 1181 1.1 mjacob } else { 1182 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_version, &dst->icb_version); 1183 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_reserved0, &dst->icb_reserved0); 1184 1.1 mjacob } 1185 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_fwoptions, &dst->icb_fwoptions); 1186 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_maxfrmlen, &dst->icb_maxfrmlen); 1187 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_maxalloc, &dst->icb_maxalloc); 1188 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_execthrottle, &dst->icb_execthrottle); 1189 1.1 mjacob if (ISP_IS_SBUS(isp)) { 1190 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_retry_count, &dst->icb_retry_delay); 1191 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_retry_delay, &dst->icb_retry_count); 1192 1.1 mjacob } else { 1193 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_retry_count, &dst->icb_retry_count); 1194 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_retry_delay, &dst->icb_retry_delay); 1195 1.1 mjacob } 1196 1.1 mjacob for (i = 0; i < 8; i++) { 1197 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_portname[i], &dst->icb_portname[i]); 1198 1.1 mjacob } 1199 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_hardaddr, &dst->icb_hardaddr); 1200 1.1 mjacob if (ISP_IS_SBUS(isp)) { 1201 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_iqdevtype, &dst->icb_logintime); 1202 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_logintime, &dst->icb_iqdevtype); 1203 1.1 mjacob } else { 1204 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_iqdevtype, &dst->icb_iqdevtype); 1205 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_logintime, &dst->icb_logintime); 1206 1.1 mjacob } 1207 1.1 mjacob for (i = 0; i < 8; i++) { 1208 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_nodename[i], &dst->icb_nodename[i]); 1209 1.1 mjacob } 1210 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_rqstout, &dst->icb_rqstout); 1211 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_rspnsin, &dst->icb_rspnsin); 1212 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_rqstqlen, &dst->icb_rqstqlen); 1213 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_rsltqlen, &dst->icb_rsltqlen); 1214 1.1 mjacob for (i = 0; i < 4; i++) { 1215 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_rqstaddr[i], &dst->icb_rqstaddr[i]); 1216 1.1 mjacob } 1217 1.1 mjacob for (i = 0; i < 4; i++) { 1218 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_respaddr[i], &dst->icb_respaddr[i]); 1219 1.1 mjacob } 1220 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_lunenables, &dst->icb_lunenables); 1221 1.1 mjacob if (ISP_IS_SBUS(isp)) { 1222 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_ccnt, &dst->icb_icnt); 1223 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_icnt, &dst->icb_ccnt); 1224 1.1 mjacob } else { 1225 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_ccnt, &dst->icb_ccnt); 1226 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_icnt, &dst->icb_icnt); 1227 1.1 mjacob } 1228 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_lunetimeout, &dst->icb_lunetimeout); 1229 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_reserved1, &dst->icb_reserved1); 1230 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_xfwoptions, &dst->icb_xfwoptions); 1231 1.1 mjacob if (ISP_IS_SBUS(isp)) { 1232 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_racctimer, &dst->icb_idelaytimer); 1233 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_idelaytimer, &dst->icb_racctimer); 1234 1.1 mjacob } else { 1235 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_racctimer, &dst->icb_racctimer); 1236 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_idelaytimer, &dst->icb_idelaytimer); 1237 1.1 mjacob } 1238 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_zfwoptions, &dst->icb_zfwoptions); 1239 1.1 mjacob } 1240 1.1 mjacob 1241 1.1 mjacob void 1242 1.1 mjacob isp_put_icb_2400(ispsoftc_t *isp, isp_icb_2400_t *src, isp_icb_2400_t *dst) 1243 1.1 mjacob { 1244 1.1 mjacob int i; 1245 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_version, &dst->icb_version); 1246 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_reserved0, &dst->icb_reserved0); 1247 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_maxfrmlen, &dst->icb_maxfrmlen); 1248 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_execthrottle, &dst->icb_execthrottle); 1249 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_xchgcnt, &dst->icb_xchgcnt); 1250 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_hardaddr, &dst->icb_hardaddr); 1251 1.1 mjacob for (i = 0; i < 8; i++) { 1252 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_portname[i], &dst->icb_portname[i]); 1253 1.1 mjacob } 1254 1.1 mjacob for (i = 0; i < 8; i++) { 1255 1.1 mjacob ISP_IOXPUT_8(isp, src->icb_nodename[i], &dst->icb_nodename[i]); 1256 1.1 mjacob } 1257 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_rspnsin, &dst->icb_rspnsin); 1258 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_rqstout, &dst->icb_rqstout); 1259 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_retry_count, &dst->icb_retry_count); 1260 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_priout, &dst->icb_priout); 1261 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_rsltqlen, &dst->icb_rsltqlen); 1262 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_rqstqlen, &dst->icb_rqstqlen); 1263 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_ldn_nols, &dst->icb_ldn_nols); 1264 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_prqstqlen, &dst->icb_prqstqlen); 1265 1.1 mjacob for (i = 0; i < 4; i++) { 1266 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_rqstaddr[i], &dst->icb_rqstaddr[i]); 1267 1.1 mjacob } 1268 1.1 mjacob for (i = 0; i < 4; i++) { 1269 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_respaddr[i], &dst->icb_respaddr[i]); 1270 1.1 mjacob } 1271 1.1 mjacob for (i = 0; i < 4; i++) { 1272 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_priaddr[i], &dst->icb_priaddr[i]); 1273 1.1 mjacob } 1274 1.1 mjacob for (i = 0; i < 4; i++) { 1275 1.4 mjacob ISP_IOXPUT_16(isp, src->icb_reserved1[i], &dst->icb_reserved1[i]); 1276 1.1 mjacob } 1277 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_atio_in, &dst->icb_atio_in); 1278 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_atioqlen, &dst->icb_atioqlen); 1279 1.1 mjacob for (i = 0; i < 4; i++) { 1280 1.4 mjacob ISP_IOXPUT_16(isp, src->icb_atioqaddr[i], &dst->icb_atioqaddr[i]); 1281 1.1 mjacob } 1282 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_idelaytimer, &dst->icb_idelaytimer); 1283 1.1 mjacob ISP_IOXPUT_16(isp, src->icb_logintime, &dst->icb_logintime); 1284 1.1 mjacob ISP_IOXPUT_32(isp, src->icb_fwoptions1, &dst->icb_fwoptions1); 1285 1.1 mjacob ISP_IOXPUT_32(isp, src->icb_fwoptions2, &dst->icb_fwoptions2); 1286 1.1 mjacob ISP_IOXPUT_32(isp, src->icb_fwoptions3, &dst->icb_fwoptions3); 1287 1.1 mjacob for (i = 0; i < 12; i++) { 1288 1.4 mjacob ISP_IOXPUT_16(isp, src->icb_reserved2[i], &dst->icb_reserved2[i]); 1289 1.1 mjacob } 1290 1.1 mjacob } 1291 1.1 mjacob 1292 1.1 mjacob void 1293 1.3 mjacob isp_put_icb_2400_vpinfo(ispsoftc_t *isp, isp_icb_2400_vpinfo_t *src, isp_icb_2400_vpinfo_t *dst) 1294 1.3 mjacob { 1295 1.3 mjacob ISP_IOXPUT_16(isp, src->vp_count, &dst->vp_count); 1296 1.3 mjacob ISP_IOXPUT_16(isp, src->vp_global_options, &dst->vp_global_options); 1297 1.3 mjacob } 1298 1.3 mjacob 1299 1.3 mjacob void 1300 1.3 mjacob isp_put_vp_port_info(ispsoftc_t *isp, vp_port_info_t *src, vp_port_info_t *dst) 1301 1.3 mjacob { 1302 1.3 mjacob int i; 1303 1.3 mjacob ISP_IOXPUT_16(isp, src->vp_port_status, &dst->vp_port_status); 1304 1.3 mjacob ISP_IOXPUT_8(isp, src->vp_port_options, &dst->vp_port_options); 1305 1.3 mjacob ISP_IOXPUT_8(isp, src->vp_port_loopid, &dst->vp_port_loopid); 1306 1.3 mjacob for (i = 0; i < 8; i++) { 1307 1.3 mjacob ISP_IOXPUT_8(isp, src->vp_port_portname[i], &dst->vp_port_portname[i]); 1308 1.3 mjacob } 1309 1.3 mjacob for (i = 0; i < 8; i++) { 1310 1.3 mjacob ISP_IOXPUT_8(isp, src->vp_port_nodename[i], &dst->vp_port_nodename[i]); 1311 1.3 mjacob } 1312 1.3 mjacob /* we never *put* portid_lo/portid_hi */ 1313 1.3 mjacob } 1314 1.3 mjacob 1315 1.3 mjacob void 1316 1.3 mjacob isp_get_vp_port_info(ispsoftc_t *isp, vp_port_info_t *src, vp_port_info_t *dst) 1317 1.3 mjacob { 1318 1.3 mjacob int i; 1319 1.3 mjacob ISP_IOXGET_16(isp, &src->vp_port_status, dst->vp_port_status); 1320 1.3 mjacob ISP_IOXGET_8(isp, &src->vp_port_options, dst->vp_port_options); 1321 1.3 mjacob ISP_IOXGET_8(isp, &src->vp_port_loopid, dst->vp_port_loopid); 1322 1.3 mjacob for (i = 0; i < ASIZE(src->vp_port_portname); i++) { 1323 1.3 mjacob ISP_IOXGET_8(isp, &src->vp_port_portname[i], dst->vp_port_portname[i]); 1324 1.3 mjacob } 1325 1.3 mjacob for (i = 0; i < ASIZE(src->vp_port_nodename); i++) { 1326 1.3 mjacob ISP_IOXGET_8(isp, &src->vp_port_nodename[i], dst->vp_port_nodename[i]); 1327 1.3 mjacob } 1328 1.3 mjacob ISP_IOXGET_16(isp, &src->vp_port_portid_lo, dst->vp_port_portid_lo); 1329 1.3 mjacob ISP_IOXGET_16(isp, &src->vp_port_portid_hi, dst->vp_port_portid_hi); 1330 1.3 mjacob } 1331 1.3 mjacob 1332 1.3 mjacob void 1333 1.3 mjacob isp_put_vp_ctrl_info(ispsoftc_t *isp, vp_ctrl_info_t *src, vp_ctrl_info_t *dst) 1334 1.3 mjacob { 1335 1.3 mjacob int i; 1336 1.3 mjacob isp_put_hdr(isp, &src->vp_ctrl_hdr, &dst->vp_ctrl_hdr); 1337 1.3 mjacob ISP_IOXPUT_32(isp, src->vp_ctrl_handle, &dst->vp_ctrl_handle); 1338 1.3 mjacob ISP_IOXPUT_16(isp, src->vp_ctrl_index_fail, &dst->vp_ctrl_index_fail); 1339 1.3 mjacob ISP_IOXPUT_16(isp, src->vp_ctrl_status, &dst->vp_ctrl_status); 1340 1.3 mjacob ISP_IOXPUT_16(isp, src->vp_ctrl_command, &dst->vp_ctrl_command); 1341 1.3 mjacob ISP_IOXPUT_16(isp, src->vp_ctrl_vp_count, &dst->vp_ctrl_vp_count); 1342 1.3 mjacob for (i = 0; i < ASIZE(src->vp_ctrl_idmap); i++) { 1343 1.3 mjacob ISP_IOXPUT_16(isp, src->vp_ctrl_idmap[i], &dst->vp_ctrl_idmap[i]); 1344 1.3 mjacob } 1345 1.3 mjacob for (i = 0; i < ASIZE(src->vp_ctrl_reserved); i++) { 1346 1.7 mjacob ISP_IOXPUT_8(isp, src->vp_ctrl_reserved[i], &dst->vp_ctrl_reserved[i]); 1347 1.3 mjacob } 1348 1.3 mjacob } 1349 1.3 mjacob 1350 1.3 mjacob void 1351 1.3 mjacob isp_get_vp_ctrl_info(ispsoftc_t *isp, vp_ctrl_info_t *src, vp_ctrl_info_t *dst) 1352 1.3 mjacob { 1353 1.3 mjacob int i; 1354 1.3 mjacob isp_get_hdr(isp, &src->vp_ctrl_hdr, &dst->vp_ctrl_hdr); 1355 1.3 mjacob ISP_IOXGET_32(isp, &src->vp_ctrl_handle, dst->vp_ctrl_handle); 1356 1.3 mjacob ISP_IOXGET_16(isp, &src->vp_ctrl_index_fail, dst->vp_ctrl_index_fail); 1357 1.3 mjacob ISP_IOXGET_16(isp, &src->vp_ctrl_status, dst->vp_ctrl_status); 1358 1.3 mjacob ISP_IOXGET_16(isp, &src->vp_ctrl_command, dst->vp_ctrl_command); 1359 1.3 mjacob ISP_IOXGET_16(isp, &src->vp_ctrl_vp_count, dst->vp_ctrl_vp_count); 1360 1.3 mjacob for (i = 0; i < ASIZE(src->vp_ctrl_idmap); i++) { 1361 1.3 mjacob ISP_IOXGET_16(isp, &src->vp_ctrl_idmap[i], dst->vp_ctrl_idmap[i]); 1362 1.3 mjacob } 1363 1.3 mjacob for (i = 0; i < ASIZE(src->vp_ctrl_reserved); i++) { 1364 1.3 mjacob ISP_IOXGET_8(isp, &src->vp_ctrl_reserved[i], dst->vp_ctrl_reserved[i]); 1365 1.3 mjacob } 1366 1.3 mjacob } 1367 1.3 mjacob 1368 1.3 mjacob void 1369 1.3 mjacob isp_put_vp_modify(ispsoftc_t *isp, vp_modify_t *src, vp_modify_t *dst) 1370 1.3 mjacob { 1371 1.3 mjacob int i, j; 1372 1.3 mjacob isp_put_hdr(isp, &src->vp_mod_hdr, &dst->vp_mod_hdr); 1373 1.3 mjacob ISP_IOXPUT_32(isp, src->vp_mod_hdl, &dst->vp_mod_hdl); 1374 1.3 mjacob ISP_IOXPUT_16(isp, src->vp_mod_reserved0, &dst->vp_mod_reserved0); 1375 1.3 mjacob ISP_IOXPUT_16(isp, src->vp_mod_status, &dst->vp_mod_status); 1376 1.3 mjacob ISP_IOXPUT_8(isp, src->vp_mod_cmd, &dst->vp_mod_cmd); 1377 1.3 mjacob ISP_IOXPUT_8(isp, src->vp_mod_cnt, &dst->vp_mod_cnt); 1378 1.3 mjacob ISP_IOXPUT_8(isp, src->vp_mod_idx0, &dst->vp_mod_idx0); 1379 1.3 mjacob ISP_IOXPUT_8(isp, src->vp_mod_idx1, &dst->vp_mod_idx1); 1380 1.3 mjacob for (i = 0; i < ASIZE(src->vp_mod_ports); i++) { 1381 1.3 mjacob ISP_IOXPUT_8(isp, src->vp_mod_ports[i].options, &dst->vp_mod_ports[i].options); 1382 1.3 mjacob ISP_IOXPUT_8(isp, src->vp_mod_ports[i].loopid, &dst->vp_mod_ports[i].loopid); 1383 1.3 mjacob ISP_IOXPUT_16(isp, src->vp_mod_ports[i].reserved1, &dst->vp_mod_ports[i].reserved1); 1384 1.3 mjacob for (j = 0; j < ASIZE(src->vp_mod_ports[i].wwpn); j++) { 1385 1.3 mjacob ISP_IOXPUT_8(isp, src->vp_mod_ports[i].wwpn[j], &dst->vp_mod_ports[i].wwpn[j]); 1386 1.3 mjacob } 1387 1.3 mjacob for (j = 0; j < ASIZE(src->vp_mod_ports[i].wwnn); j++) { 1388 1.3 mjacob ISP_IOXPUT_8(isp, src->vp_mod_ports[i].wwnn[j], &dst->vp_mod_ports[i].wwnn[j]); 1389 1.3 mjacob } 1390 1.3 mjacob } 1391 1.3 mjacob for (i = 0; i < ASIZE(src->vp_mod_reserved2); i++) { 1392 1.3 mjacob ISP_IOXPUT_8(isp, src->vp_mod_reserved2[i], &dst->vp_mod_reserved2[i]); 1393 1.3 mjacob } 1394 1.3 mjacob } 1395 1.3 mjacob 1396 1.3 mjacob void 1397 1.3 mjacob isp_get_vp_modify(ispsoftc_t *isp, vp_modify_t *src, vp_modify_t *dst) 1398 1.3 mjacob { 1399 1.3 mjacob int i, j; 1400 1.3 mjacob isp_get_hdr(isp, &src->vp_mod_hdr, &dst->vp_mod_hdr); 1401 1.3 mjacob ISP_IOXGET_32(isp, &src->vp_mod_hdl, dst->vp_mod_hdl); 1402 1.3 mjacob ISP_IOXGET_16(isp, &src->vp_mod_reserved0, dst->vp_mod_reserved0); 1403 1.3 mjacob ISP_IOXGET_16(isp, &src->vp_mod_status, dst->vp_mod_status); 1404 1.3 mjacob ISP_IOXGET_8(isp, &src->vp_mod_cmd, dst->vp_mod_cmd); 1405 1.3 mjacob ISP_IOXGET_8(isp, &src->vp_mod_cnt, dst->vp_mod_cnt); 1406 1.3 mjacob ISP_IOXGET_8(isp, &src->vp_mod_idx0, dst->vp_mod_idx0); 1407 1.3 mjacob ISP_IOXGET_8(isp, &src->vp_mod_idx1, dst->vp_mod_idx1); 1408 1.3 mjacob for (i = 0; i < ASIZE(src->vp_mod_ports); i++) { 1409 1.3 mjacob ISP_IOXGET_8(isp, &src->vp_mod_ports[i].options, dst->vp_mod_ports[i].options); 1410 1.3 mjacob ISP_IOXGET_8(isp, &src->vp_mod_ports[i].loopid, dst->vp_mod_ports[i].loopid); 1411 1.3 mjacob ISP_IOXGET_16(isp, &src->vp_mod_ports[i].reserved1, dst->vp_mod_ports[i].reserved1); 1412 1.3 mjacob for (j = 0; j < ASIZE(src->vp_mod_ports[i].wwpn); j++) { 1413 1.3 mjacob ISP_IOXGET_8(isp, &src->vp_mod_ports[i].wwpn[j], dst->vp_mod_ports[i].wwpn[j]); 1414 1.3 mjacob } 1415 1.3 mjacob for (j = 0; j < ASIZE(src->vp_mod_ports[i].wwnn); j++) { 1416 1.3 mjacob ISP_IOXGET_8(isp, &src->vp_mod_ports[i].wwnn[j], dst->vp_mod_ports[i].wwnn[j]); 1417 1.3 mjacob } 1418 1.3 mjacob } 1419 1.3 mjacob for (i = 0; i < ASIZE(src->vp_mod_reserved2); i++) { 1420 1.3 mjacob ISP_IOXGET_8(isp, &src->vp_mod_reserved2[i], dst->vp_mod_reserved2[i]); 1421 1.3 mjacob } 1422 1.3 mjacob } 1423 1.3 mjacob 1424 1.3 mjacob void 1425 1.1 mjacob isp_get_pdb_21xx(ispsoftc_t *isp, isp_pdb_21xx_t *src, isp_pdb_21xx_t *dst) 1426 1.1 mjacob { 1427 1.1 mjacob int i; 1428 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_options, dst->pdb_options); 1429 1.1 mjacob ISP_IOXGET_8(isp, &src->pdb_mstate, dst->pdb_mstate); 1430 1.1 mjacob ISP_IOXGET_8(isp, &src->pdb_sstate, dst->pdb_sstate); 1431 1.1 mjacob for (i = 0; i < 4; i++) { 1432 1.4 mjacob ISP_IOXGET_8(isp, &src->pdb_hardaddr_bits[i], dst->pdb_hardaddr_bits[i]); 1433 1.1 mjacob } 1434 1.1 mjacob for (i = 0; i < 4; i++) { 1435 1.4 mjacob ISP_IOXGET_8(isp, &src->pdb_portid_bits[i], dst->pdb_portid_bits[i]); 1436 1.1 mjacob } 1437 1.1 mjacob for (i = 0; i < 8; i++) { 1438 1.1 mjacob ISP_IOXGET_8(isp, &src->pdb_nodename[i], dst->pdb_nodename[i]); 1439 1.1 mjacob } 1440 1.1 mjacob for (i = 0; i < 8; i++) { 1441 1.1 mjacob ISP_IOXGET_8(isp, &src->pdb_portname[i], dst->pdb_portname[i]); 1442 1.1 mjacob } 1443 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_execthrottle, dst->pdb_execthrottle); 1444 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_exec_count, dst->pdb_exec_count); 1445 1.1 mjacob ISP_IOXGET_8(isp, &src->pdb_retry_count, dst->pdb_retry_count); 1446 1.1 mjacob ISP_IOXGET_8(isp, &src->pdb_retry_delay, dst->pdb_retry_delay); 1447 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_resalloc, dst->pdb_resalloc); 1448 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_curalloc, dst->pdb_curalloc); 1449 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_qhead, dst->pdb_qhead); 1450 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_qtail, dst->pdb_qtail); 1451 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_tl_next, dst->pdb_tl_next); 1452 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_tl_last, dst->pdb_tl_last); 1453 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_features, dst->pdb_features); 1454 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_pconcurrnt, dst->pdb_pconcurrnt); 1455 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_roi, dst->pdb_roi); 1456 1.1 mjacob ISP_IOXGET_8(isp, &src->pdb_target, dst->pdb_target); 1457 1.1 mjacob ISP_IOXGET_8(isp, &src->pdb_initiator, dst->pdb_initiator); 1458 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_rdsiz, dst->pdb_rdsiz); 1459 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_ncseq, dst->pdb_ncseq); 1460 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_noseq, dst->pdb_noseq); 1461 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_labrtflg, dst->pdb_labrtflg); 1462 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_lstopflg, dst->pdb_lstopflg); 1463 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_sqhead, dst->pdb_sqhead); 1464 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_sqtail, dst->pdb_sqtail); 1465 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_ptimer, dst->pdb_ptimer); 1466 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_nxt_seqid, dst->pdb_nxt_seqid); 1467 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_fcount, dst->pdb_fcount); 1468 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_prli_len, dst->pdb_prli_len); 1469 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_prli_svc0, dst->pdb_prli_svc0); 1470 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_prli_svc3, dst->pdb_prli_svc3); 1471 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_loopid, dst->pdb_loopid); 1472 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_il_ptr, dst->pdb_il_ptr); 1473 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_sl_ptr, dst->pdb_sl_ptr); 1474 1.1 mjacob } 1475 1.1 mjacob 1476 1.1 mjacob void 1477 1.1 mjacob isp_get_pdb_24xx(ispsoftc_t *isp, isp_pdb_24xx_t *src, isp_pdb_24xx_t *dst) 1478 1.1 mjacob { 1479 1.1 mjacob int i; 1480 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_flags, dst->pdb_flags); 1481 1.1 mjacob ISP_IOXGET_8(isp, &src->pdb_curstate, dst->pdb_curstate); 1482 1.1 mjacob ISP_IOXGET_8(isp, &src->pdb_laststate, dst->pdb_laststate); 1483 1.1 mjacob for (i = 0; i < 4; i++) { 1484 1.4 mjacob ISP_IOXGET_8(isp, &src->pdb_hardaddr_bits[i], dst->pdb_hardaddr_bits[i]); 1485 1.1 mjacob } 1486 1.1 mjacob for (i = 0; i < 4; i++) { 1487 1.4 mjacob ISP_IOXGET_8(isp, &src->pdb_portid_bits[i], dst->pdb_portid_bits[i]); 1488 1.1 mjacob } 1489 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_retry_timer, dst->pdb_retry_timer); 1490 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_handle, dst->pdb_handle); 1491 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_rcv_dsize, dst->pdb_rcv_dsize); 1492 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_reserved0, dst->pdb_reserved0); 1493 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_prli_svc0, dst->pdb_prli_svc0); 1494 1.1 mjacob ISP_IOXGET_16(isp, &src->pdb_prli_svc3, dst->pdb_prli_svc3); 1495 1.1 mjacob for (i = 0; i < 8; i++) { 1496 1.1 mjacob ISP_IOXGET_8(isp, &src->pdb_nodename[i], dst->pdb_nodename[i]); 1497 1.1 mjacob } 1498 1.1 mjacob for (i = 0; i < 8; i++) { 1499 1.1 mjacob ISP_IOXGET_8(isp, &src->pdb_portname[i], dst->pdb_portname[i]); 1500 1.1 mjacob } 1501 1.1 mjacob for (i = 0; i < 24; i++) { 1502 1.4 mjacob ISP_IOXGET_8(isp, &src->pdb_reserved1[i], dst->pdb_reserved1[i]); 1503 1.1 mjacob } 1504 1.1 mjacob } 1505 1.1 mjacob 1506 1.1 mjacob /* 1507 1.1 mjacob * PLOGI/LOGO IOCB canonicalization 1508 1.1 mjacob */ 1509 1.1 mjacob 1510 1.1 mjacob void 1511 1.1 mjacob isp_get_plogx(ispsoftc_t *isp, isp_plogx_t *src, isp_plogx_t *dst) 1512 1.1 mjacob { 1513 1.1 mjacob int i; 1514 1.1 mjacob isp_get_hdr(isp, &src->plogx_header, &dst->plogx_header); 1515 1.1 mjacob ISP_IOXGET_32(isp, &src->plogx_handle, dst->plogx_handle); 1516 1.1 mjacob ISP_IOXGET_16(isp, &src->plogx_status, dst->plogx_status); 1517 1.1 mjacob ISP_IOXGET_16(isp, &src->plogx_nphdl, dst->plogx_nphdl); 1518 1.1 mjacob ISP_IOXGET_16(isp, &src->plogx_flags, dst->plogx_flags); 1519 1.1 mjacob ISP_IOXGET_16(isp, &src->plogx_vphdl, dst->plogx_vphdl); 1520 1.1 mjacob ISP_IOXGET_16(isp, &src->plogx_portlo, dst->plogx_portlo); 1521 1.1 mjacob ISP_IOXGET_16(isp, &src->plogx_rspsz_porthi, dst->plogx_rspsz_porthi); 1522 1.1 mjacob for (i = 0; i < 11; i++) { 1523 1.4 mjacob ISP_IOXGET_16(isp, &src->plogx_ioparm[i].lo16, dst->plogx_ioparm[i].lo16); 1524 1.4 mjacob ISP_IOXGET_16(isp, &src->plogx_ioparm[i].hi16, dst->plogx_ioparm[i].hi16); 1525 1.1 mjacob } 1526 1.1 mjacob } 1527 1.1 mjacob 1528 1.1 mjacob void 1529 1.1 mjacob isp_put_plogx(ispsoftc_t *isp, isp_plogx_t *src, isp_plogx_t *dst) 1530 1.1 mjacob { 1531 1.1 mjacob int i; 1532 1.1 mjacob isp_put_hdr(isp, &src->plogx_header, &dst->plogx_header); 1533 1.1 mjacob ISP_IOXPUT_32(isp, src->plogx_handle, &dst->plogx_handle); 1534 1.1 mjacob ISP_IOXPUT_16(isp, src->plogx_status, &dst->plogx_status); 1535 1.1 mjacob ISP_IOXPUT_16(isp, src->plogx_nphdl, &dst->plogx_nphdl); 1536 1.1 mjacob ISP_IOXPUT_16(isp, src->plogx_flags, &dst->plogx_flags); 1537 1.1 mjacob ISP_IOXPUT_16(isp, src->plogx_vphdl, &dst->plogx_vphdl); 1538 1.1 mjacob ISP_IOXPUT_16(isp, src->plogx_portlo, &dst->plogx_portlo); 1539 1.1 mjacob ISP_IOXPUT_16(isp, src->plogx_rspsz_porthi, &dst->plogx_rspsz_porthi); 1540 1.1 mjacob for (i = 0; i < 11; i++) { 1541 1.4 mjacob ISP_IOXPUT_16(isp, src->plogx_ioparm[i].lo16, &dst->plogx_ioparm[i].lo16); 1542 1.4 mjacob ISP_IOXPUT_16(isp, src->plogx_ioparm[i].hi16, &dst->plogx_ioparm[i].hi16); 1543 1.1 mjacob } 1544 1.1 mjacob } 1545 1.1 mjacob 1546 1.1 mjacob /* 1547 1.3 mjacob * Report ID canonicalization 1548 1.3 mjacob */ 1549 1.3 mjacob void 1550 1.3 mjacob isp_get_ridacq(ispsoftc_t *isp, isp_ridacq_t *src, isp_ridacq_t *dst) 1551 1.3 mjacob { 1552 1.3 mjacob int i; 1553 1.3 mjacob isp_get_hdr(isp, &src->ridacq_hdr, &dst->ridacq_hdr); 1554 1.3 mjacob ISP_IOXGET_32(isp, &src->ridacq_handle, dst->ridacq_handle); 1555 1.3 mjacob ISP_IOXGET_16(isp, &src->ridacq_vp_port_lo, dst->ridacq_vp_port_lo); 1556 1.3 mjacob ISP_IOXGET_8(isp, &src->ridacq_vp_port_hi, dst->ridacq_vp_port_hi); 1557 1.3 mjacob ISP_IOXGET_8(isp, &src->ridacq_format, dst->ridacq_format); 1558 1.4 mjacob for (i = 0; i < sizeof (src->ridacq_map) / sizeof (src->ridacq_map[0]); i++) { 1559 1.3 mjacob ISP_IOXGET_16(isp, &src->ridacq_map[i], dst->ridacq_map[i]); 1560 1.3 mjacob } 1561 1.4 mjacob for (i = 0; i < sizeof (src->ridacq_reserved1) / sizeof (src->ridacq_reserved1[0]); i++) { 1562 1.4 mjacob ISP_IOXGET_16(isp, &src->ridacq_reserved1[i], dst->ridacq_reserved1[i]); 1563 1.3 mjacob } 1564 1.3 mjacob if (dst->ridacq_format == 0) { 1565 1.4 mjacob ISP_IOXGET_8(isp, &src->un.type0.ridacq_vp_acquired, dst->un.type0.ridacq_vp_acquired); 1566 1.4 mjacob ISP_IOXGET_8(isp, &src->un.type0.ridacq_vp_setup, dst->un.type0.ridacq_vp_setup); 1567 1.4 mjacob ISP_IOXGET_16(isp, &src->un.type0.ridacq_reserved0, dst->un.type0.ridacq_reserved0); 1568 1.3 mjacob } else if (dst->ridacq_format == 1) { 1569 1.4 mjacob ISP_IOXGET_16(isp, &src->un.type1.ridacq_vp_count, dst->un.type1.ridacq_vp_count); 1570 1.4 mjacob ISP_IOXGET_8(isp, &src->un.type1.ridacq_vp_index, dst->un.type1.ridacq_vp_index); 1571 1.4 mjacob ISP_IOXGET_8(isp, &src->un.type1.ridacq_vp_status, dst->un.type1.ridacq_vp_status); 1572 1.3 mjacob } else { 1573 1.4 mjacob ISP_MEMZERO(&dst->un, sizeof (dst->un)); 1574 1.3 mjacob } 1575 1.3 mjacob } 1576 1.3 mjacob 1577 1.3 mjacob 1578 1.3 mjacob /* 1579 1.1 mjacob * CT Passthru canonicalization 1580 1.1 mjacob */ 1581 1.1 mjacob void 1582 1.1 mjacob isp_get_ct_pt(ispsoftc_t *isp, isp_ct_pt_t *src, isp_ct_pt_t *dst) 1583 1.1 mjacob { 1584 1.1 mjacob int i; 1585 1.1 mjacob 1586 1.1 mjacob isp_get_hdr(isp, &src->ctp_header, &dst->ctp_header); 1587 1.1 mjacob ISP_IOXGET_32(isp, &src->ctp_handle, dst->ctp_handle); 1588 1.1 mjacob ISP_IOXGET_16(isp, &src->ctp_status, dst->ctp_status); 1589 1.1 mjacob ISP_IOXGET_16(isp, &src->ctp_nphdl, dst->ctp_nphdl); 1590 1.1 mjacob ISP_IOXGET_16(isp, &src->ctp_cmd_cnt, dst->ctp_cmd_cnt); 1591 1.3 mjacob ISP_IOXGET_8(isp, &src->ctp_vpidx, dst->ctp_vpidx); 1592 1.3 mjacob ISP_IOXGET_8(isp, &src->ctp_reserved0, dst->ctp_reserved0); 1593 1.1 mjacob ISP_IOXGET_16(isp, &src->ctp_time, dst->ctp_time); 1594 1.3 mjacob ISP_IOXGET_16(isp, &src->ctp_reserved1, dst->ctp_reserved1); 1595 1.1 mjacob ISP_IOXGET_16(isp, &src->ctp_rsp_cnt, dst->ctp_rsp_cnt); 1596 1.1 mjacob for (i = 0; i < 5; i++) { 1597 1.4 mjacob ISP_IOXGET_16(isp, &src->ctp_reserved2[i], dst->ctp_reserved2[i]); 1598 1.1 mjacob } 1599 1.1 mjacob ISP_IOXGET_32(isp, &src->ctp_rsp_bcnt, dst->ctp_rsp_bcnt); 1600 1.1 mjacob ISP_IOXGET_32(isp, &src->ctp_cmd_bcnt, dst->ctp_cmd_bcnt); 1601 1.1 mjacob for (i = 0; i < 2; i++) { 1602 1.4 mjacob ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_base, dst->ctp_dataseg[i].ds_base); 1603 1.4 mjacob ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_basehi, dst->ctp_dataseg[i].ds_basehi); 1604 1.4 mjacob ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_count, dst->ctp_dataseg[i].ds_count); 1605 1.1 mjacob } 1606 1.1 mjacob } 1607 1.1 mjacob 1608 1.1 mjacob void 1609 1.1 mjacob isp_get_ms(ispsoftc_t *isp, isp_ms_t *src, isp_ms_t *dst) 1610 1.1 mjacob { 1611 1.1 mjacob int i; 1612 1.1 mjacob 1613 1.1 mjacob isp_get_hdr(isp, &src->ms_header, &dst->ms_header); 1614 1.1 mjacob ISP_IOXGET_32(isp, &src->ms_handle, dst->ms_handle); 1615 1.1 mjacob ISP_IOXGET_16(isp, &src->ms_nphdl, dst->ms_nphdl); 1616 1.1 mjacob ISP_IOXGET_16(isp, &src->ms_status, dst->ms_status); 1617 1.1 mjacob ISP_IOXGET_16(isp, &src->ms_flags, dst->ms_flags); 1618 1.1 mjacob ISP_IOXGET_16(isp, &src->ms_reserved1, dst->ms_reserved1); 1619 1.1 mjacob ISP_IOXGET_16(isp, &src->ms_time, dst->ms_time); 1620 1.1 mjacob ISP_IOXGET_16(isp, &src->ms_cmd_cnt, dst->ms_cmd_cnt); 1621 1.1 mjacob ISP_IOXGET_16(isp, &src->ms_tot_cnt, dst->ms_tot_cnt); 1622 1.1 mjacob ISP_IOXGET_8(isp, &src->ms_type, dst->ms_type); 1623 1.1 mjacob ISP_IOXGET_8(isp, &src->ms_r_ctl, dst->ms_r_ctl); 1624 1.1 mjacob ISP_IOXGET_16(isp, &src->ms_rxid, dst->ms_rxid); 1625 1.1 mjacob ISP_IOXGET_16(isp, &src->ms_reserved2, dst->ms_reserved2); 1626 1.1 mjacob ISP_IOXGET_32(isp, &src->ms_rsp_bcnt, dst->ms_rsp_bcnt); 1627 1.1 mjacob ISP_IOXGET_32(isp, &src->ms_cmd_bcnt, dst->ms_cmd_bcnt); 1628 1.1 mjacob for (i = 0; i < 2; i++) { 1629 1.4 mjacob ISP_IOXGET_32(isp, &src->ms_dataseg[i].ds_base, dst->ms_dataseg[i].ds_base); 1630 1.4 mjacob ISP_IOXGET_32(isp, &src->ms_dataseg[i].ds_basehi, dst->ms_dataseg[i].ds_basehi); 1631 1.4 mjacob ISP_IOXGET_32(isp, &src->ms_dataseg[i].ds_count, dst->ms_dataseg[i].ds_count); 1632 1.1 mjacob } 1633 1.1 mjacob } 1634 1.1 mjacob 1635 1.1 mjacob void 1636 1.1 mjacob isp_put_ct_pt(ispsoftc_t *isp, isp_ct_pt_t *src, isp_ct_pt_t *dst) 1637 1.1 mjacob { 1638 1.1 mjacob int i; 1639 1.1 mjacob 1640 1.1 mjacob isp_put_hdr(isp, &src->ctp_header, &dst->ctp_header); 1641 1.1 mjacob ISP_IOXPUT_32(isp, src->ctp_handle, &dst->ctp_handle); 1642 1.1 mjacob ISP_IOXPUT_16(isp, src->ctp_status, &dst->ctp_status); 1643 1.1 mjacob ISP_IOXPUT_16(isp, src->ctp_nphdl, &dst->ctp_nphdl); 1644 1.1 mjacob ISP_IOXPUT_16(isp, src->ctp_cmd_cnt, &dst->ctp_cmd_cnt); 1645 1.3 mjacob ISP_IOXPUT_8(isp, src->ctp_vpidx, &dst->ctp_vpidx); 1646 1.3 mjacob ISP_IOXPUT_8(isp, src->ctp_reserved0, &dst->ctp_reserved0); 1647 1.1 mjacob ISP_IOXPUT_16(isp, src->ctp_time, &dst->ctp_time); 1648 1.3 mjacob ISP_IOXPUT_16(isp, src->ctp_reserved1, &dst->ctp_reserved1); 1649 1.1 mjacob ISP_IOXPUT_16(isp, src->ctp_rsp_cnt, &dst->ctp_rsp_cnt); 1650 1.1 mjacob for (i = 0; i < 5; i++) { 1651 1.4 mjacob ISP_IOXPUT_16(isp, src->ctp_reserved2[i], &dst->ctp_reserved2[i]); 1652 1.1 mjacob } 1653 1.1 mjacob ISP_IOXPUT_32(isp, src->ctp_rsp_bcnt, &dst->ctp_rsp_bcnt); 1654 1.1 mjacob ISP_IOXPUT_32(isp, src->ctp_cmd_bcnt, &dst->ctp_cmd_bcnt); 1655 1.1 mjacob for (i = 0; i < 2; i++) { 1656 1.4 mjacob ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_base, &dst->ctp_dataseg[i].ds_base); 1657 1.4 mjacob ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_basehi, &dst->ctp_dataseg[i].ds_basehi); 1658 1.4 mjacob ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_count, &dst->ctp_dataseg[i].ds_count); 1659 1.1 mjacob } 1660 1.1 mjacob } 1661 1.1 mjacob 1662 1.1 mjacob void 1663 1.1 mjacob isp_put_ms(ispsoftc_t *isp, isp_ms_t *src, isp_ms_t *dst) 1664 1.1 mjacob { 1665 1.1 mjacob int i; 1666 1.1 mjacob 1667 1.1 mjacob isp_put_hdr(isp, &src->ms_header, &dst->ms_header); 1668 1.1 mjacob ISP_IOXPUT_32(isp, src->ms_handle, &dst->ms_handle); 1669 1.1 mjacob ISP_IOXPUT_16(isp, src->ms_nphdl, &dst->ms_nphdl); 1670 1.1 mjacob ISP_IOXPUT_16(isp, src->ms_status, &dst->ms_status); 1671 1.1 mjacob ISP_IOXPUT_16(isp, src->ms_flags, &dst->ms_flags); 1672 1.1 mjacob ISP_IOXPUT_16(isp, src->ms_reserved1, &dst->ms_reserved1); 1673 1.1 mjacob ISP_IOXPUT_16(isp, src->ms_time, &dst->ms_time); 1674 1.1 mjacob ISP_IOXPUT_16(isp, src->ms_cmd_cnt, &dst->ms_cmd_cnt); 1675 1.1 mjacob ISP_IOXPUT_16(isp, src->ms_tot_cnt, &dst->ms_tot_cnt); 1676 1.1 mjacob ISP_IOXPUT_8(isp, src->ms_type, &dst->ms_type); 1677 1.1 mjacob ISP_IOXPUT_8(isp, src->ms_r_ctl, &dst->ms_r_ctl); 1678 1.1 mjacob ISP_IOXPUT_16(isp, src->ms_rxid, &dst->ms_rxid); 1679 1.1 mjacob ISP_IOXPUT_16(isp, src->ms_reserved2, &dst->ms_reserved2); 1680 1.1 mjacob ISP_IOXPUT_32(isp, src->ms_rsp_bcnt, &dst->ms_rsp_bcnt); 1681 1.1 mjacob ISP_IOXPUT_32(isp, src->ms_cmd_bcnt, &dst->ms_cmd_bcnt); 1682 1.1 mjacob for (i = 0; i < 2; i++) { 1683 1.4 mjacob ISP_IOXPUT_32(isp, src->ms_dataseg[i].ds_base, &dst->ms_dataseg[i].ds_base); 1684 1.4 mjacob ISP_IOXPUT_32(isp, src->ms_dataseg[i].ds_basehi, &dst->ms_dataseg[i].ds_basehi); 1685 1.4 mjacob ISP_IOXPUT_32(isp, src->ms_dataseg[i].ds_count, &dst->ms_dataseg[i].ds_count); 1686 1.1 mjacob } 1687 1.1 mjacob } 1688 1.1 mjacob 1689 1.1 mjacob /* 1690 1.1 mjacob * Generic SNS request - not particularly useful since the per-command data 1691 1.1 mjacob * isn't always 16 bit words. 1692 1.1 mjacob */ 1693 1.1 mjacob void 1694 1.1 mjacob isp_put_sns_request(ispsoftc_t *isp, sns_screq_t *src, sns_screq_t *dst) 1695 1.1 mjacob { 1696 1.1 mjacob int i, nw = (int) src->snscb_sblen; 1697 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen); 1698 1.1 mjacob for (i = 0; i < 4; i++) { 1699 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_addr[i], &dst->snscb_addr[i]); 1700 1.1 mjacob } 1701 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen); 1702 1.1 mjacob for (i = 0; i < nw; i++) { 1703 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_data[i], &dst->snscb_data[i]); 1704 1.1 mjacob } 1705 1.1 mjacob } 1706 1.1 mjacob 1707 1.1 mjacob void 1708 1.4 mjacob isp_put_gid_ft_request(ispsoftc_t *isp, sns_gid_ft_req_t *src, sns_gid_ft_req_t *dst) 1709 1.1 mjacob { 1710 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen); 1711 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_reserved0, &dst->snscb_reserved0); 1712 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_addr[0], &dst->snscb_addr[0]); 1713 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_addr[1], &dst->snscb_addr[1]); 1714 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_addr[2], &dst->snscb_addr[2]); 1715 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_addr[3], &dst->snscb_addr[3]); 1716 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen); 1717 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_reserved1, &dst->snscb_reserved1); 1718 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_cmd, &dst->snscb_cmd); 1719 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_mword_div_2, &dst->snscb_mword_div_2); 1720 1.1 mjacob ISP_IOXPUT_32(isp, src->snscb_reserved3, &dst->snscb_reserved3); 1721 1.1 mjacob ISP_IOXPUT_32(isp, src->snscb_fc4_type, &dst->snscb_fc4_type); 1722 1.1 mjacob } 1723 1.1 mjacob 1724 1.1 mjacob void 1725 1.4 mjacob isp_put_gxn_id_request(ispsoftc_t *isp, sns_gxn_id_req_t *src, sns_gxn_id_req_t *dst) 1726 1.1 mjacob { 1727 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen); 1728 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_reserved0, &dst->snscb_reserved0); 1729 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_addr[0], &dst->snscb_addr[0]); 1730 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_addr[1], &dst->snscb_addr[1]); 1731 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_addr[2], &dst->snscb_addr[2]); 1732 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_addr[3], &dst->snscb_addr[3]); 1733 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen); 1734 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_reserved1, &dst->snscb_reserved1); 1735 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_cmd, &dst->snscb_cmd); 1736 1.1 mjacob ISP_IOXPUT_16(isp, src->snscb_reserved2, &dst->snscb_reserved2); 1737 1.1 mjacob ISP_IOXPUT_32(isp, src->snscb_reserved3, &dst->snscb_reserved3); 1738 1.1 mjacob ISP_IOXPUT_32(isp, src->snscb_portid, &dst->snscb_portid); 1739 1.1 mjacob } 1740 1.1 mjacob 1741 1.1 mjacob /* 1742 1.1 mjacob * Generic SNS response - not particularly useful since the per-command data 1743 1.1 mjacob * isn't always 16 bit words. 1744 1.1 mjacob */ 1745 1.1 mjacob void 1746 1.4 mjacob isp_get_sns_response(ispsoftc_t *isp, sns_scrsp_t *src, sns_scrsp_t *dst, int nwords) 1747 1.1 mjacob { 1748 1.1 mjacob int i; 1749 1.1 mjacob isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr); 1750 1.1 mjacob ISP_IOXGET_8(isp, &src->snscb_port_type, dst->snscb_port_type); 1751 1.1 mjacob for (i = 0; i < 3; i++) { 1752 1.1 mjacob ISP_IOXGET_8(isp, &src->snscb_port_id[i], 1753 1.1 mjacob dst->snscb_port_id[i]); 1754 1.1 mjacob } 1755 1.1 mjacob for (i = 0; i < 8; i++) { 1756 1.1 mjacob ISP_IOXGET_8(isp, &src->snscb_portname[i], 1757 1.1 mjacob dst->snscb_portname[i]); 1758 1.1 mjacob } 1759 1.1 mjacob for (i = 0; i < nwords; i++) { 1760 1.1 mjacob ISP_IOXGET_16(isp, &src->snscb_data[i], dst->snscb_data[i]); 1761 1.1 mjacob } 1762 1.1 mjacob } 1763 1.1 mjacob 1764 1.1 mjacob void 1765 1.4 mjacob isp_get_gid_ft_response(ispsoftc_t *isp, sns_gid_ft_rsp_t *src, sns_gid_ft_rsp_t *dst, int nwords) 1766 1.1 mjacob { 1767 1.1 mjacob int i; 1768 1.1 mjacob isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr); 1769 1.1 mjacob for (i = 0; i < nwords; i++) { 1770 1.1 mjacob int j; 1771 1.4 mjacob ISP_IOXGET_8(isp, &src->snscb_ports[i].control, dst->snscb_ports[i].control); 1772 1.1 mjacob for (j = 0; j < 3; j++) { 1773 1.4 mjacob ISP_IOXGET_8(isp, &src->snscb_ports[i].portid[j], dst->snscb_ports[i].portid[j]); 1774 1.1 mjacob } 1775 1.1 mjacob if (dst->snscb_ports[i].control & 0x80) { 1776 1.1 mjacob break; 1777 1.1 mjacob } 1778 1.1 mjacob } 1779 1.1 mjacob } 1780 1.1 mjacob 1781 1.1 mjacob void 1782 1.4 mjacob isp_get_gxn_id_response(ispsoftc_t *isp, sns_gxn_id_rsp_t *src, sns_gxn_id_rsp_t *dst) 1783 1.1 mjacob { 1784 1.1 mjacob int i; 1785 1.1 mjacob isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr); 1786 1.4 mjacob for (i = 0; i < 8; i++) { 1787 1.1 mjacob ISP_IOXGET_8(isp, &src->snscb_wwn[i], dst->snscb_wwn[i]); 1788 1.4 mjacob } 1789 1.1 mjacob } 1790 1.1 mjacob 1791 1.1 mjacob void 1792 1.4 mjacob isp_get_gff_id_response(ispsoftc_t *isp, sns_gff_id_rsp_t *src, sns_gff_id_rsp_t *dst) 1793 1.1 mjacob { 1794 1.1 mjacob int i; 1795 1.1 mjacob isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr); 1796 1.1 mjacob for (i = 0; i < 32; i++) { 1797 1.4 mjacob ISP_IOXGET_32(isp, &src->snscb_fc4_features[i], dst->snscb_fc4_features[i]); 1798 1.1 mjacob } 1799 1.1 mjacob } 1800 1.1 mjacob 1801 1.1 mjacob void 1802 1.4 mjacob isp_get_ga_nxt_response(ispsoftc_t *isp, sns_ga_nxt_rsp_t *src, sns_ga_nxt_rsp_t *dst) 1803 1.1 mjacob { 1804 1.1 mjacob int i; 1805 1.1 mjacob isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr); 1806 1.1 mjacob ISP_IOXGET_8(isp, &src->snscb_port_type, dst->snscb_port_type); 1807 1.1 mjacob for (i = 0; i < 3; i++) { 1808 1.4 mjacob ISP_IOXGET_8(isp, &src->snscb_port_id[i], dst->snscb_port_id[i]); 1809 1.1 mjacob } 1810 1.1 mjacob for (i = 0; i < 8; i++) { 1811 1.4 mjacob ISP_IOXGET_8(isp, &src->snscb_portname[i], dst->snscb_portname[i]); 1812 1.1 mjacob } 1813 1.1 mjacob ISP_IOXGET_8(isp, &src->snscb_pnlen, dst->snscb_pnlen); 1814 1.1 mjacob for (i = 0; i < 255; i++) { 1815 1.1 mjacob ISP_IOXGET_8(isp, &src->snscb_pname[i], dst->snscb_pname[i]); 1816 1.1 mjacob } 1817 1.1 mjacob for (i = 0; i < 8; i++) { 1818 1.4 mjacob ISP_IOXGET_8(isp, &src->snscb_nodename[i], dst->snscb_nodename[i]); 1819 1.1 mjacob } 1820 1.1 mjacob ISP_IOXGET_8(isp, &src->snscb_nnlen, dst->snscb_nnlen); 1821 1.1 mjacob for (i = 0; i < 255; i++) { 1822 1.1 mjacob ISP_IOXGET_8(isp, &src->snscb_nname[i], dst->snscb_nname[i]); 1823 1.1 mjacob } 1824 1.1 mjacob for (i = 0; i < 8; i++) { 1825 1.4 mjacob ISP_IOXGET_8(isp, &src->snscb_ipassoc[i], dst->snscb_ipassoc[i]); 1826 1.1 mjacob } 1827 1.1 mjacob for (i = 0; i < 16; i++) { 1828 1.1 mjacob ISP_IOXGET_8(isp, &src->snscb_ipaddr[i], dst->snscb_ipaddr[i]); 1829 1.1 mjacob } 1830 1.1 mjacob for (i = 0; i < 4; i++) { 1831 1.4 mjacob ISP_IOXGET_8(isp, &src->snscb_svc_class[i], dst->snscb_svc_class[i]); 1832 1.1 mjacob } 1833 1.1 mjacob for (i = 0; i < 32; i++) { 1834 1.4 mjacob ISP_IOXGET_8(isp, &src->snscb_fc4_types[i], dst->snscb_fc4_types[i]); 1835 1.1 mjacob } 1836 1.1 mjacob for (i = 0; i < 8; i++) { 1837 1.1 mjacob ISP_IOXGET_8(isp, &src->snscb_fpname[i], dst->snscb_fpname[i]); 1838 1.1 mjacob } 1839 1.1 mjacob ISP_IOXGET_8(isp, &src->snscb_reserved, dst->snscb_reserved); 1840 1.1 mjacob for (i = 0; i < 3; i++) { 1841 1.4 mjacob ISP_IOXGET_8(isp, &src->snscb_hardaddr[i], dst->snscb_hardaddr[i]); 1842 1.1 mjacob } 1843 1.1 mjacob } 1844 1.1 mjacob 1845 1.1 mjacob void 1846 1.1 mjacob isp_get_els(ispsoftc_t *isp, els_t *src, els_t *dst) 1847 1.1 mjacob { 1848 1.1 mjacob int i; 1849 1.1 mjacob 1850 1.1 mjacob isp_get_hdr(isp, &src->els_hdr, &dst->els_hdr); 1851 1.1 mjacob ISP_IOXGET_32(isp, &src->els_handle, dst->els_handle); 1852 1.1 mjacob ISP_IOXGET_16(isp, &src->els_status, dst->els_status); 1853 1.1 mjacob ISP_IOXGET_16(isp, &src->els_nphdl, dst->els_nphdl); 1854 1.1 mjacob ISP_IOXGET_16(isp, &src->els_xmit_dsd_count, dst->els_xmit_dsd_count); 1855 1.1 mjacob ISP_IOXGET_8(isp, &src->els_vphdl, dst->els_vphdl); 1856 1.1 mjacob ISP_IOXGET_8(isp, &src->els_sof, dst->els_sof); 1857 1.1 mjacob ISP_IOXGET_32(isp, &src->els_rxid, dst->els_rxid); 1858 1.1 mjacob ISP_IOXGET_16(isp, &src->els_recv_dsd_count, dst->els_recv_dsd_count); 1859 1.1 mjacob ISP_IOXGET_8(isp, &src->els_opcode, dst->els_opcode); 1860 1.1 mjacob ISP_IOXGET_8(isp, &src->els_reserved2, dst->els_reserved1); 1861 1.1 mjacob ISP_IOXGET_8(isp, &src->els_did_lo, dst->els_did_lo); 1862 1.1 mjacob ISP_IOXGET_8(isp, &src->els_did_mid, dst->els_did_mid); 1863 1.1 mjacob ISP_IOXGET_8(isp, &src->els_did_hi, dst->els_did_hi); 1864 1.1 mjacob ISP_IOXGET_8(isp, &src->els_reserved2, dst->els_reserved2); 1865 1.1 mjacob ISP_IOXGET_16(isp, &src->els_reserved3, dst->els_reserved3); 1866 1.1 mjacob ISP_IOXGET_16(isp, &src->els_ctl_flags, dst->els_ctl_flags); 1867 1.1 mjacob ISP_IOXGET_32(isp, &src->els_bytecnt, dst->els_bytecnt); 1868 1.1 mjacob ISP_IOXGET_32(isp, &src->els_subcode1, dst->els_subcode1); 1869 1.1 mjacob ISP_IOXGET_32(isp, &src->els_subcode2, dst->els_subcode2); 1870 1.1 mjacob for (i = 0; i < 20; i++) { 1871 1.4 mjacob ISP_IOXGET_8(isp, &src->els_reserved4[i], dst->els_reserved4[i]); 1872 1.1 mjacob } 1873 1.1 mjacob } 1874 1.1 mjacob 1875 1.1 mjacob void 1876 1.1 mjacob isp_put_els(ispsoftc_t *isp, els_t *src, els_t *dst) 1877 1.1 mjacob { 1878 1.1 mjacob isp_put_hdr(isp, &src->els_hdr, &dst->els_hdr); 1879 1.1 mjacob ISP_IOXPUT_32(isp, src->els_handle, &dst->els_handle); 1880 1.1 mjacob ISP_IOXPUT_16(isp, src->els_status, &dst->els_status); 1881 1.1 mjacob ISP_IOXPUT_16(isp, src->els_nphdl, &dst->els_nphdl); 1882 1.1 mjacob ISP_IOXPUT_16(isp, src->els_xmit_dsd_count, &dst->els_xmit_dsd_count); 1883 1.1 mjacob ISP_IOXPUT_8(isp, src->els_vphdl, &dst->els_vphdl); 1884 1.1 mjacob ISP_IOXPUT_8(isp, src->els_sof, &dst->els_sof); 1885 1.1 mjacob ISP_IOXPUT_32(isp, src->els_rxid, &dst->els_rxid); 1886 1.1 mjacob ISP_IOXPUT_16(isp, src->els_recv_dsd_count, &dst->els_recv_dsd_count); 1887 1.1 mjacob ISP_IOXPUT_8(isp, src->els_opcode, &dst->els_opcode); 1888 1.1 mjacob ISP_IOXPUT_8(isp, src->els_reserved2, &dst->els_reserved1); 1889 1.1 mjacob ISP_IOXPUT_8(isp, src->els_did_lo, &dst->els_did_lo); 1890 1.1 mjacob ISP_IOXPUT_8(isp, src->els_did_mid, &dst->els_did_mid); 1891 1.1 mjacob ISP_IOXPUT_8(isp, src->els_did_hi, &dst->els_did_hi); 1892 1.1 mjacob ISP_IOXPUT_8(isp, src->els_reserved2, &dst->els_reserved2); 1893 1.1 mjacob ISP_IOXPUT_16(isp, src->els_reserved3, &dst->els_reserved3); 1894 1.1 mjacob ISP_IOXPUT_16(isp, src->els_ctl_flags, &dst->els_ctl_flags); 1895 1.1 mjacob ISP_IOXPUT_32(isp, src->els_recv_bytecnt, &dst->els_recv_bytecnt); 1896 1.1 mjacob ISP_IOXPUT_32(isp, src->els_xmit_bytecnt, &dst->els_xmit_bytecnt); 1897 1.1 mjacob ISP_IOXPUT_32(isp, src->els_xmit_dsd_length, &dst->els_xmit_dsd_length); 1898 1.1 mjacob ISP_IOXPUT_16(isp, src->els_xmit_dsd_a1500, &dst->els_xmit_dsd_a1500); 1899 1.1 mjacob ISP_IOXPUT_16(isp, src->els_xmit_dsd_a3116, &dst->els_xmit_dsd_a3116); 1900 1.1 mjacob ISP_IOXPUT_16(isp, src->els_xmit_dsd_a4732, &dst->els_xmit_dsd_a4732); 1901 1.1 mjacob ISP_IOXPUT_16(isp, src->els_xmit_dsd_a6348, &dst->els_xmit_dsd_a6348); 1902 1.1 mjacob ISP_IOXPUT_32(isp, src->els_recv_dsd_length, &dst->els_recv_dsd_length); 1903 1.1 mjacob ISP_IOXPUT_16(isp, src->els_recv_dsd_a1500, &dst->els_recv_dsd_a1500); 1904 1.1 mjacob ISP_IOXPUT_16(isp, src->els_recv_dsd_a3116, &dst->els_recv_dsd_a3116); 1905 1.1 mjacob ISP_IOXPUT_16(isp, src->els_recv_dsd_a4732, &dst->els_recv_dsd_a4732); 1906 1.1 mjacob ISP_IOXPUT_16(isp, src->els_recv_dsd_a6348, &dst->els_recv_dsd_a6348); 1907 1.1 mjacob } 1908 1.1 mjacob 1909 1.1 mjacob /* 1910 1.1 mjacob * FC Structure Canonicalization 1911 1.1 mjacob */ 1912 1.1 mjacob 1913 1.1 mjacob void 1914 1.1 mjacob isp_get_fc_hdr(ispsoftc_t *isp, fc_hdr_t *src, fc_hdr_t *dst) 1915 1.1 mjacob { 1916 1.1 mjacob ISP_IOZGET_8(isp, &src->r_ctl, dst->r_ctl); 1917 1.1 mjacob ISP_IOZGET_8(isp, &src->d_id[0], dst->d_id[0]); 1918 1.1 mjacob ISP_IOZGET_8(isp, &src->d_id[1], dst->d_id[1]); 1919 1.1 mjacob ISP_IOZGET_8(isp, &src->d_id[2], dst->d_id[2]); 1920 1.1 mjacob ISP_IOZGET_8(isp, &src->cs_ctl, dst->cs_ctl); 1921 1.1 mjacob ISP_IOZGET_8(isp, &src->s_id[0], dst->s_id[0]); 1922 1.1 mjacob ISP_IOZGET_8(isp, &src->s_id[1], dst->s_id[1]); 1923 1.1 mjacob ISP_IOZGET_8(isp, &src->s_id[2], dst->s_id[2]); 1924 1.1 mjacob ISP_IOZGET_8(isp, &src->type, dst->type); 1925 1.4 mjacob ISP_IOZGET_8(isp, &src->f_ctl[0], dst->f_ctl[0]); 1926 1.4 mjacob ISP_IOZGET_8(isp, &src->f_ctl[1], dst->f_ctl[1]); 1927 1.4 mjacob ISP_IOZGET_8(isp, &src->f_ctl[2], dst->f_ctl[2]); 1928 1.1 mjacob ISP_IOZGET_8(isp, &src->seq_id, dst->seq_id); 1929 1.1 mjacob ISP_IOZGET_8(isp, &src->df_ctl, dst->df_ctl); 1930 1.1 mjacob ISP_IOZGET_16(isp, &src->seq_cnt, dst->seq_cnt); 1931 1.4 mjacob ISP_IOZGET_16(isp, &src->ox_id, dst->ox_id); 1932 1.4 mjacob ISP_IOZGET_16(isp, &src->rx_id, dst->rx_id); 1933 1.1 mjacob ISP_IOZGET_32(isp, &src->parameter, dst->parameter); 1934 1.1 mjacob } 1935 1.1 mjacob 1936 1.1 mjacob void 1937 1.1 mjacob isp_get_fcp_cmnd_iu(ispsoftc_t *isp, fcp_cmnd_iu_t *src, fcp_cmnd_iu_t *dst) 1938 1.1 mjacob { 1939 1.1 mjacob int i; 1940 1.1 mjacob 1941 1.1 mjacob for (i = 0; i < 8; i++) { 1942 1.1 mjacob ISP_IOZGET_8(isp, &src->fcp_cmnd_lun[i], dst->fcp_cmnd_lun[i]); 1943 1.1 mjacob } 1944 1.1 mjacob ISP_IOZGET_8(isp, &src->fcp_cmnd_crn, dst->fcp_cmnd_crn); 1945 1.4 mjacob ISP_IOZGET_8(isp, &src->fcp_cmnd_task_attribute, dst->fcp_cmnd_task_attribute); 1946 1.4 mjacob ISP_IOZGET_8(isp, &src->fcp_cmnd_task_management, dst->fcp_cmnd_task_management); 1947 1.4 mjacob ISP_IOZGET_8(isp, &src->fcp_cmnd_alen_datadir, dst->fcp_cmnd_alen_datadir); 1948 1.1 mjacob for (i = 0; i < 16; i++) { 1949 1.4 mjacob ISP_IOZGET_8(isp, &src->cdb_dl.sf.fcp_cmnd_cdb[i], dst->cdb_dl.sf.fcp_cmnd_cdb[i]); 1950 1.1 mjacob } 1951 1.4 mjacob ISP_IOZGET_32(isp, &src->cdb_dl.sf.fcp_cmnd_dl, dst->cdb_dl.sf.fcp_cmnd_dl); 1952 1.1 mjacob } 1953 1.1 mjacob 1954 1.1 mjacob void 1955 1.1 mjacob isp_put_rft_id(ispsoftc_t *isp, rft_id_t *src, rft_id_t *dst) 1956 1.1 mjacob { 1957 1.1 mjacob int i; 1958 1.1 mjacob isp_put_ct_hdr(isp, &src->rftid_hdr, &dst->rftid_hdr); 1959 1.1 mjacob ISP_IOZPUT_8(isp, src->rftid_reserved, &dst->rftid_reserved); 1960 1.1 mjacob for (i = 0; i < 3; i++) { 1961 1.1 mjacob ISP_IOZPUT_8(isp, src->rftid_portid[i], &dst->rftid_portid[i]); 1962 1.1 mjacob } 1963 1.1 mjacob for (i = 0; i < 8; i++) { 1964 1.4 mjacob ISP_IOZPUT_32(isp, src->rftid_fc4types[i], &dst->rftid_fc4types[i]); 1965 1.1 mjacob } 1966 1.1 mjacob } 1967 1.1 mjacob 1968 1.1 mjacob void 1969 1.1 mjacob isp_get_ct_hdr(ispsoftc_t *isp, ct_hdr_t *src, ct_hdr_t *dst) 1970 1.1 mjacob { 1971 1.1 mjacob ISP_IOZGET_8(isp, &src->ct_revision, dst->ct_revision); 1972 1.1 mjacob ISP_IOZGET_8(isp, &src->ct_in_id[0], dst->ct_in_id[0]); 1973 1.1 mjacob ISP_IOZGET_8(isp, &src->ct_in_id[1], dst->ct_in_id[1]); 1974 1.1 mjacob ISP_IOZGET_8(isp, &src->ct_in_id[2], dst->ct_in_id[2]); 1975 1.1 mjacob ISP_IOZGET_8(isp, &src->ct_fcs_type, dst->ct_fcs_type); 1976 1.1 mjacob ISP_IOZGET_8(isp, &src->ct_fcs_subtype, dst->ct_fcs_subtype); 1977 1.1 mjacob ISP_IOZGET_8(isp, &src->ct_options, dst->ct_options); 1978 1.1 mjacob ISP_IOZGET_8(isp, &src->ct_reserved0, dst->ct_reserved0); 1979 1.1 mjacob ISP_IOZGET_16(isp, &src->ct_cmd_resp, dst->ct_cmd_resp); 1980 1.1 mjacob ISP_IOZGET_16(isp, &src->ct_bcnt_resid, dst->ct_bcnt_resid); 1981 1.1 mjacob ISP_IOZGET_8(isp, &src->ct_reserved1, dst->ct_reserved1); 1982 1.1 mjacob ISP_IOZGET_8(isp, &src->ct_reason, dst->ct_reason); 1983 1.1 mjacob ISP_IOZGET_8(isp, &src->ct_explanation, dst->ct_explanation); 1984 1.1 mjacob ISP_IOZGET_8(isp, &src->ct_vunique, dst->ct_vunique); 1985 1.1 mjacob } 1986 1.1 mjacob 1987 1.1 mjacob void 1988 1.1 mjacob isp_put_ct_hdr(ispsoftc_t *isp, ct_hdr_t *src, ct_hdr_t *dst) 1989 1.1 mjacob { 1990 1.1 mjacob ISP_IOZPUT_8(isp, src->ct_revision, &dst->ct_revision); 1991 1.1 mjacob ISP_IOZPUT_8(isp, src->ct_in_id[0], &dst->ct_in_id[0]); 1992 1.1 mjacob ISP_IOZPUT_8(isp, src->ct_in_id[1], &dst->ct_in_id[1]); 1993 1.1 mjacob ISP_IOZPUT_8(isp, src->ct_in_id[2], &dst->ct_in_id[2]); 1994 1.1 mjacob ISP_IOZPUT_8(isp, src->ct_fcs_type, &dst->ct_fcs_type); 1995 1.1 mjacob ISP_IOZPUT_8(isp, src->ct_fcs_subtype, &dst->ct_fcs_subtype); 1996 1.1 mjacob ISP_IOZPUT_8(isp, src->ct_options, &dst->ct_options); 1997 1.1 mjacob ISP_IOZPUT_8(isp, src->ct_reserved0, &dst->ct_reserved0); 1998 1.1 mjacob ISP_IOZPUT_16(isp, src->ct_cmd_resp, &dst->ct_cmd_resp); 1999 1.1 mjacob ISP_IOZPUT_16(isp, src->ct_bcnt_resid, &dst->ct_bcnt_resid); 2000 1.1 mjacob ISP_IOZPUT_8(isp, src->ct_reserved1, &dst->ct_reserved1); 2001 1.1 mjacob ISP_IOZPUT_8(isp, src->ct_reason, &dst->ct_reason); 2002 1.1 mjacob ISP_IOZPUT_8(isp, src->ct_explanation, &dst->ct_explanation); 2003 1.1 mjacob ISP_IOZPUT_8(isp, src->ct_vunique, &dst->ct_vunique); 2004 1.1 mjacob } 2005 1.1 mjacob 2006 1.1 mjacob #ifdef ISP_TARGET_MODE 2007 1.4 mjacob 2008 1.4 mjacob /* 2009 1.4 mjacob * Command shipping- finish off first queue entry and do dma mapping and 2010 1.4 mjacob * additional segments as needed. 2011 1.4 mjacob * 2012 1.4 mjacob * Called with the first queue entry at least partially filled out. 2013 1.4 mjacob */ 2014 1.4 mjacob int 2015 1.4 mjacob isp_send_tgt_cmd(ispsoftc_t *isp, void *fqe, void *segp, uint32_t nsegs, uint32_t totalcnt, isp_ddir_t ddir, void *snsptr, uint32_t snslen) 2016 1.4 mjacob { 2017 1.4 mjacob uint8_t storage[QENTRY_LEN], storage2[QENTRY_LEN]; 2018 1.4 mjacob uint8_t type, nqe; 2019 1.4 mjacob uint32_t seg, curseg, seglim, nxt, nxtnxt; 2020 1.4 mjacob ispds_t *dsp = NULL; 2021 1.4 mjacob ispds64_t *dsp64 = NULL; 2022 1.4 mjacob void *qe0, *qe1, *sqe = NULL; 2023 1.4 mjacob 2024 1.4 mjacob qe0 = isp_getrqentry(isp); 2025 1.4 mjacob if (qe0 == NULL) { 2026 1.4 mjacob return (CMD_EAGAIN); 2027 1.4 mjacob } 2028 1.4 mjacob nxt = ISP_NXT_QENTRY(isp->isp_reqidx, RQUEST_QUEUE_LEN(isp)); 2029 1.4 mjacob 2030 1.4 mjacob type = ((isphdr_t *)fqe)->rqs_entry_type; 2031 1.4 mjacob nqe = 1; 2032 1.4 mjacob seglim = 0; 2033 1.4 mjacob 2034 1.4 mjacob /* 2035 1.4 mjacob * If we have no data to transmit, just copy the first IOCB and start it up. 2036 1.4 mjacob */ 2037 1.4 mjacob if (ddir != ISP_NOXFR) { 2038 1.4 mjacob /* 2039 1.4 mjacob * First, figure out how many pieces of data to transfer and what kind and how many we can put into the first queue entry. 2040 1.4 mjacob */ 2041 1.4 mjacob switch (type) { 2042 1.4 mjacob case RQSTYPE_CTIO: 2043 1.4 mjacob dsp = ((ct_entry_t *)fqe)->ct_dataseg; 2044 1.4 mjacob seglim = ISP_RQDSEG; 2045 1.4 mjacob break; 2046 1.4 mjacob case RQSTYPE_CTIO2: 2047 1.4 mjacob case RQSTYPE_CTIO3: 2048 1.4 mjacob { 2049 1.4 mjacob ct2_entry_t *ct = fqe, *ct2 = (ct2_entry_t *) storage2; 2050 1.4 mjacob uint16_t swd = ct->rsp.m0.ct_scsi_status & 0xff; 2051 1.4 mjacob 2052 1.4 mjacob if ((ct->ct_flags & CT2_SENDSTATUS) && (swd || ct->ct_resid)) { 2053 1.4 mjacob memcpy(ct2, ct, QENTRY_LEN); 2054 1.4 mjacob /* 2055 1.4 mjacob * Clear fields from first CTIO2 that now need to be cleared 2056 1.4 mjacob */ 2057 1.4 mjacob ct->ct_header.rqs_seqno = 0; 2058 1.4 mjacob ct->ct_flags &= ~(CT2_SENDSTATUS|CT2_CCINCR|CT2_FASTPOST); 2059 1.4 mjacob ct->ct_resid = 0; 2060 1.4 mjacob ct->ct_syshandle = 0; 2061 1.4 mjacob ct->rsp.m0.ct_scsi_status = 0; 2062 1.4 mjacob 2063 1.4 mjacob /* 2064 1.4 mjacob * Reset fields in the second CTIO2 as appropriate. 2065 1.4 mjacob */ 2066 1.4 mjacob ct2->ct_flags &= ~(CT2_FLAG_MMASK|CT2_DATAMASK|CT2_FASTPOST); 2067 1.4 mjacob ct2->ct_flags |= CT2_NO_DATA|CT2_FLAG_MODE1; 2068 1.4 mjacob ct2->ct_seg_count = 0; 2069 1.4 mjacob ct2->ct_reloff = 0; 2070 1.4 mjacob memset(&ct2->rsp, 0, sizeof (ct2->rsp)); 2071 1.4 mjacob if (swd == SCSI_CHECK && snsptr && snslen) { 2072 1.7 mjacob ct2->rsp.m1.ct_senselen = ISP_MIN(snslen, MAXRESPLEN); 2073 1.4 mjacob memcpy(ct2->rsp.m1.ct_resp, snsptr, ct2->rsp.m1.ct_senselen); 2074 1.4 mjacob swd |= CT2_SNSLEN_VALID; 2075 1.4 mjacob } 2076 1.4 mjacob if (ct2->ct_resid > 0) { 2077 1.4 mjacob swd |= CT2_DATA_UNDER; 2078 1.4 mjacob } else if (ct2->ct_resid < 0) { 2079 1.4 mjacob swd |= CT2_DATA_OVER; 2080 1.4 mjacob } 2081 1.4 mjacob ct2->rsp.m1.ct_scsi_status = swd; 2082 1.4 mjacob sqe = storage2; 2083 1.4 mjacob } 2084 1.4 mjacob if (type == RQSTYPE_CTIO2) { 2085 1.4 mjacob dsp = ct->rsp.m0.u.ct_dataseg; 2086 1.4 mjacob seglim = ISP_RQDSEG_T2; 2087 1.4 mjacob } else { 2088 1.4 mjacob dsp64 = ct->rsp.m0.u.ct_dataseg64; 2089 1.4 mjacob seglim = ISP_RQDSEG_T3; 2090 1.4 mjacob } 2091 1.4 mjacob break; 2092 1.4 mjacob } 2093 1.4 mjacob case RQSTYPE_CTIO7: 2094 1.4 mjacob { 2095 1.4 mjacob ct7_entry_t *ct = fqe, *ct2 = (ct7_entry_t *)storage2; 2096 1.4 mjacob uint16_t swd = ct->ct_scsi_status & 0xff; 2097 1.4 mjacob 2098 1.4 mjacob dsp64 = &ct->rsp.m0.ds; 2099 1.4 mjacob seglim = 1; 2100 1.4 mjacob if ((ct->ct_flags & CT7_SENDSTATUS) && (swd || ct->ct_resid)) { 2101 1.4 mjacob memcpy(ct2, ct, sizeof (ct7_entry_t)); 2102 1.4 mjacob 2103 1.4 mjacob /* 2104 1.4 mjacob * Clear fields from first CTIO7 that now need to be cleared 2105 1.4 mjacob */ 2106 1.4 mjacob ct->ct_header.rqs_seqno = 0; 2107 1.4 mjacob ct->ct_flags &= ~CT7_SENDSTATUS; 2108 1.4 mjacob ct->ct_resid = 0; 2109 1.4 mjacob ct->ct_syshandle = 0; 2110 1.4 mjacob ct->ct_scsi_status = 0; 2111 1.4 mjacob 2112 1.4 mjacob /* 2113 1.4 mjacob * Reset fields in the second CTIO7 as appropriate. 2114 1.4 mjacob */ 2115 1.4 mjacob ct2->ct_flags &= ~(CT7_FLAG_MMASK|CT7_DATAMASK); 2116 1.4 mjacob ct2->ct_flags |= CT7_NO_DATA|CT7_NO_DATA|CT7_FLAG_MODE1; 2117 1.4 mjacob ct2->ct_seg_count = 0; 2118 1.4 mjacob memset(&ct2->rsp, 0, sizeof (ct2->rsp)); 2119 1.4 mjacob if (swd == SCSI_CHECK && snsptr && snslen) { 2120 1.7 mjacob ct2->rsp.m1.ct_resplen = ISP_MIN(snslen, MAXRESPLEN_24XX); 2121 1.4 mjacob memcpy(ct2->rsp.m1.ct_resp, snsptr, ct2->rsp.m1.ct_resplen); 2122 1.4 mjacob swd |= (FCP_SNSLEN_VALID << 8); 2123 1.4 mjacob } 2124 1.4 mjacob if (ct2->ct_resid < 0) { 2125 1.4 mjacob swd |= (FCP_RESID_OVERFLOW << 8); 2126 1.4 mjacob } else if (ct2->ct_resid > 0) { 2127 1.4 mjacob swd |= (FCP_RESID_UNDERFLOW << 8); 2128 1.4 mjacob } 2129 1.4 mjacob ct2->ct_scsi_status = swd; 2130 1.4 mjacob sqe = storage2; 2131 1.4 mjacob } 2132 1.4 mjacob break; 2133 1.4 mjacob } 2134 1.4 mjacob default: 2135 1.4 mjacob return (CMD_COMPLETE); 2136 1.4 mjacob } 2137 1.4 mjacob } 2138 1.4 mjacob 2139 1.4 mjacob /* 2140 1.4 mjacob * Fill out the data transfer stuff in the first queue entry 2141 1.4 mjacob */ 2142 1.4 mjacob if (seglim > nsegs) { 2143 1.4 mjacob seglim = nsegs; 2144 1.4 mjacob } 2145 1.4 mjacob 2146 1.4 mjacob for (seg = curseg = 0; curseg < seglim; curseg++) { 2147 1.4 mjacob if (dsp64) { 2148 1.4 mjacob XS_GET_DMA64_SEG(dsp64++, segp, seg++); 2149 1.4 mjacob } else { 2150 1.4 mjacob XS_GET_DMA_SEG(dsp++, segp, seg++); 2151 1.4 mjacob } 2152 1.4 mjacob } 2153 1.4 mjacob 2154 1.4 mjacob /* 2155 1.4 mjacob * First, if we are sending status with data and we have a non-zero 2156 1.4 mjacob * status or non-zero residual, we have to make a synthetic extra CTIO 2157 1.4 mjacob * that contains the status that we'll ship separately (FC cards only). 2158 1.4 mjacob */ 2159 1.4 mjacob 2160 1.4 mjacob /* 2161 1.4 mjacob * Second, start building additional continuation segments as needed. 2162 1.4 mjacob */ 2163 1.4 mjacob while (seg < nsegs) { 2164 1.4 mjacob nxtnxt = ISP_NXT_QENTRY(nxt, RQUEST_QUEUE_LEN(isp)); 2165 1.4 mjacob if (nxtnxt == isp->isp_reqodx) { 2166 1.4 mjacob return (CMD_EAGAIN); 2167 1.4 mjacob } 2168 1.4 mjacob ISP_MEMZERO(storage, QENTRY_LEN); 2169 1.4 mjacob qe1 = ISP_QUEUE_ENTRY(isp->isp_rquest, nxt); 2170 1.4 mjacob nxt = nxtnxt; 2171 1.4 mjacob if (dsp64) { 2172 1.4 mjacob ispcontreq64_t *crq = (ispcontreq64_t *) storage; 2173 1.4 mjacob seglim = ISP_CDSEG64; 2174 1.4 mjacob crq->req_header.rqs_entry_type = RQSTYPE_A64_CONT; 2175 1.4 mjacob crq->req_header.rqs_entry_count = 1; 2176 1.4 mjacob dsp64 = crq->req_dataseg; 2177 1.4 mjacob } else { 2178 1.4 mjacob ispcontreq_t *crq = (ispcontreq_t *) storage; 2179 1.4 mjacob seglim = ISP_CDSEG; 2180 1.4 mjacob crq->req_header.rqs_entry_type = RQSTYPE_DATASEG; 2181 1.4 mjacob crq->req_header.rqs_entry_count = 1; 2182 1.4 mjacob dsp = crq->req_dataseg; 2183 1.4 mjacob } 2184 1.4 mjacob if (seg + seglim > nsegs) { 2185 1.4 mjacob seglim = nsegs - seg; 2186 1.4 mjacob } 2187 1.4 mjacob for (curseg = 0; curseg < seglim; curseg++) { 2188 1.4 mjacob if (dsp64) { 2189 1.4 mjacob XS_GET_DMA64_SEG(dsp64++, segp, seg++); 2190 1.4 mjacob } else { 2191 1.4 mjacob XS_GET_DMA_SEG(dsp++, segp, seg++); 2192 1.4 mjacob } 2193 1.4 mjacob } 2194 1.4 mjacob if (dsp64) { 2195 1.4 mjacob isp_put_cont64_req(isp, (ispcontreq64_t *)storage, qe1); 2196 1.4 mjacob } else { 2197 1.4 mjacob isp_put_cont_req(isp, (ispcontreq_t *)storage, qe1); 2198 1.4 mjacob } 2199 1.4 mjacob if (isp->isp_dblev & ISP_LOGTDEBUG1) { 2200 1.4 mjacob isp_print_bytes(isp, "additional queue entry", QENTRY_LEN, storage); 2201 1.4 mjacob } 2202 1.4 mjacob nqe++; 2203 1.4 mjacob } 2204 1.4 mjacob 2205 1.4 mjacob /* 2206 1.4 mjacob * If we have a synthetic queue entry to complete things, do it here. 2207 1.4 mjacob */ 2208 1.4 mjacob if (sqe) { 2209 1.4 mjacob nxtnxt = ISP_NXT_QENTRY(nxt, RQUEST_QUEUE_LEN(isp)); 2210 1.4 mjacob if (nxtnxt == isp->isp_reqodx) { 2211 1.4 mjacob return (CMD_EAGAIN); 2212 1.4 mjacob } 2213 1.4 mjacob qe1 = ISP_QUEUE_ENTRY(isp->isp_rquest, nxt); 2214 1.4 mjacob nxt = nxtnxt; 2215 1.4 mjacob if (type == RQSTYPE_CTIO7) { 2216 1.4 mjacob isp_put_ctio7(isp, sqe, qe1); 2217 1.4 mjacob } else { 2218 1.4 mjacob isp_put_ctio2(isp, sqe, qe1); 2219 1.4 mjacob } 2220 1.4 mjacob if (isp->isp_dblev & ISP_LOGTDEBUG1) { 2221 1.4 mjacob isp_print_bytes(isp, "synthetic final queue entry", QENTRY_LEN, storage2); 2222 1.4 mjacob } 2223 1.4 mjacob } 2224 1.4 mjacob 2225 1.4 mjacob ((isphdr_t *)fqe)->rqs_entry_count = nqe; 2226 1.4 mjacob switch (type) { 2227 1.4 mjacob case RQSTYPE_CTIO: 2228 1.4 mjacob ((ct_entry_t *)fqe)->ct_seg_count = nsegs; 2229 1.4 mjacob isp_put_ctio(isp, fqe, qe0); 2230 1.4 mjacob break; 2231 1.4 mjacob case RQSTYPE_CTIO2: 2232 1.4 mjacob case RQSTYPE_CTIO3: 2233 1.4 mjacob ((ct2_entry_t *)fqe)->ct_seg_count = nsegs; 2234 1.4 mjacob if (ISP_CAP_2KLOGIN(isp)) { 2235 1.4 mjacob isp_put_ctio2e(isp, fqe, qe0); 2236 1.4 mjacob } else { 2237 1.4 mjacob isp_put_ctio2(isp, fqe, qe0); 2238 1.4 mjacob } 2239 1.4 mjacob break; 2240 1.4 mjacob case RQSTYPE_CTIO7: 2241 1.4 mjacob ((ct7_entry_t *)fqe)->ct_seg_count = nsegs; 2242 1.4 mjacob isp_put_ctio7(isp, fqe, qe0); 2243 1.4 mjacob break; 2244 1.4 mjacob default: 2245 1.4 mjacob return (CMD_COMPLETE); 2246 1.4 mjacob } 2247 1.4 mjacob if (isp->isp_dblev & ISP_LOGTDEBUG1) { 2248 1.4 mjacob isp_print_bytes(isp, "first queue entry", QENTRY_LEN, fqe); 2249 1.4 mjacob } 2250 1.4 mjacob ISP_ADD_REQUEST(isp, nxt); 2251 1.4 mjacob return (CMD_QUEUED); 2252 1.4 mjacob } 2253 1.4 mjacob 2254 1.1 mjacob int 2255 1.6 mjacob isp_allocate_xs_tgt(ispsoftc_t *isp, void *xs, uint32_t *handlep) 2256 1.1 mjacob { 2257 1.6 mjacob isp_hdl_t *hdp; 2258 1.1 mjacob 2259 1.6 mjacob hdp = isp->isp_tgtfree; 2260 1.6 mjacob if (hdp == NULL) { 2261 1.6 mjacob return (-1); 2262 1.1 mjacob } 2263 1.6 mjacob isp->isp_tgtfree = hdp->cmd; 2264 1.6 mjacob hdp->cmd = xs; 2265 1.6 mjacob hdp->handle = (hdp - isp->isp_tgtlist); 2266 1.6 mjacob hdp->handle |= (ISP_HANDLE_TARGET << ISP_HANDLE_USAGE_SHIFT); 2267 1.6 mjacob /* 2268 1.6 mjacob * Target handles for SCSI cards are only 16 bits, so 2269 1.9 andvar * sequence number protection will be omitted. 2270 1.6 mjacob */ 2271 1.6 mjacob if (IS_FC(isp)) { 2272 1.6 mjacob hdp->handle |= (isp->isp_seqno++ << ISP_HANDLE_SEQ_SHIFT); 2273 1.1 mjacob } 2274 1.6 mjacob *handlep = hdp->handle; 2275 1.1 mjacob return (0); 2276 1.1 mjacob } 2277 1.1 mjacob 2278 1.1 mjacob void * 2279 1.1 mjacob isp_find_xs_tgt(ispsoftc_t *isp, uint32_t handle) 2280 1.1 mjacob { 2281 1.6 mjacob if (!ISP_VALID_TGT_HANDLE(isp, handle)) { 2282 1.6 mjacob isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle); 2283 1.1 mjacob return (NULL); 2284 1.1 mjacob } 2285 1.6 mjacob return (isp->isp_tgtlist[(handle & ISP_HANDLE_CMD_MASK)].cmd); 2286 1.1 mjacob } 2287 1.1 mjacob 2288 1.1 mjacob uint32_t 2289 1.1 mjacob isp_find_tgt_handle(ispsoftc_t *isp, void *xs) 2290 1.1 mjacob { 2291 1.6 mjacob uint32_t i, foundhdl = ISP_HANDLE_FREE; 2292 1.6 mjacob 2293 1.1 mjacob if (xs != NULL) { 2294 1.1 mjacob for (i = 0; i < isp->isp_maxcmds; i++) { 2295 1.6 mjacob if (isp->isp_tgtlist[i].cmd != xs) { 2296 1.6 mjacob continue; 2297 1.1 mjacob } 2298 1.6 mjacob foundhdl = isp->isp_tgtlist[i].handle; 2299 1.6 mjacob break; 2300 1.1 mjacob } 2301 1.1 mjacob } 2302 1.6 mjacob return (foundhdl); 2303 1.1 mjacob } 2304 1.1 mjacob 2305 1.1 mjacob void 2306 1.1 mjacob isp_destroy_tgt_handle(ispsoftc_t *isp, uint32_t handle) 2307 1.1 mjacob { 2308 1.6 mjacob if (!ISP_VALID_TGT_HANDLE(isp, handle)) { 2309 1.6 mjacob isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle); 2310 1.1 mjacob } else { 2311 1.6 mjacob isp->isp_tgtlist[(handle & ISP_HANDLE_CMD_MASK)].handle = ISP_HANDLE_FREE; 2312 1.6 mjacob isp->isp_tgtlist[(handle & ISP_HANDLE_CMD_MASK)].cmd = isp->isp_tgtfree; 2313 1.6 mjacob isp->isp_tgtfree = &isp->isp_tgtlist[(handle & ISP_HANDLE_CMD_MASK)]; 2314 1.1 mjacob } 2315 1.1 mjacob } 2316 1.1 mjacob 2317 1.4 mjacob /* 2318 1.4 mjacob * Find target mode entries 2319 1.4 mjacob */ 2320 1.4 mjacob int 2321 1.4 mjacob isp_find_pdb_by_wwn(ispsoftc_t *isp, int chan, uint64_t wwn, fcportdb_t **lptr) 2322 1.4 mjacob { 2323 1.4 mjacob fcparam *fcp; 2324 1.4 mjacob int i; 2325 1.4 mjacob 2326 1.4 mjacob if (chan < isp->isp_nchan) { 2327 1.4 mjacob fcp = FCPARAM(isp, chan); 2328 1.4 mjacob for (i = 0; i < MAX_FC_TARG; i++) { 2329 1.4 mjacob fcportdb_t *lp = &fcp->portdb[i]; 2330 1.4 mjacob 2331 1.4 mjacob if (lp->target_mode == 0) { 2332 1.4 mjacob continue; 2333 1.4 mjacob } 2334 1.4 mjacob if (lp->port_wwn == wwn) { 2335 1.4 mjacob *lptr = lp; 2336 1.4 mjacob return (1); 2337 1.4 mjacob } 2338 1.4 mjacob } 2339 1.4 mjacob } 2340 1.4 mjacob return (0); 2341 1.4 mjacob } 2342 1.4 mjacob 2343 1.4 mjacob int 2344 1.4 mjacob isp_find_pdb_by_loopid(ispsoftc_t *isp, int chan, uint32_t loopid, fcportdb_t **lptr) 2345 1.4 mjacob { 2346 1.4 mjacob fcparam *fcp; 2347 1.4 mjacob int i; 2348 1.4 mjacob 2349 1.4 mjacob if (chan < isp->isp_nchan) { 2350 1.4 mjacob fcp = FCPARAM(isp, chan); 2351 1.4 mjacob for (i = 0; i < MAX_FC_TARG; i++) { 2352 1.4 mjacob fcportdb_t *lp = &fcp->portdb[i]; 2353 1.4 mjacob 2354 1.4 mjacob if (lp->target_mode == 0) { 2355 1.4 mjacob continue; 2356 1.4 mjacob } 2357 1.4 mjacob if (lp->handle == loopid) { 2358 1.4 mjacob *lptr = lp; 2359 1.4 mjacob return (1); 2360 1.4 mjacob } 2361 1.4 mjacob } 2362 1.4 mjacob } 2363 1.4 mjacob return (0); 2364 1.4 mjacob } 2365 1.4 mjacob 2366 1.4 mjacob int 2367 1.4 mjacob isp_find_pdb_by_sid(ispsoftc_t *isp, int chan, uint32_t sid, fcportdb_t **lptr) 2368 1.4 mjacob { 2369 1.4 mjacob fcparam *fcp; 2370 1.4 mjacob int i; 2371 1.4 mjacob 2372 1.4 mjacob if (chan >= isp->isp_nchan) { 2373 1.4 mjacob return (0); 2374 1.4 mjacob } 2375 1.4 mjacob 2376 1.4 mjacob fcp = FCPARAM(isp, chan); 2377 1.4 mjacob for (i = 0; i < MAX_FC_TARG; i++) { 2378 1.4 mjacob fcportdb_t *lp = &fcp->portdb[i]; 2379 1.4 mjacob 2380 1.4 mjacob if (lp->target_mode == 0) { 2381 1.4 mjacob continue; 2382 1.4 mjacob } 2383 1.4 mjacob if (lp->portid == sid) { 2384 1.4 mjacob *lptr = lp; 2385 1.4 mjacob return (1); 2386 1.4 mjacob } 2387 1.4 mjacob } 2388 1.4 mjacob return (0); 2389 1.4 mjacob } 2390 1.4 mjacob 2391 1.4 mjacob void 2392 1.4 mjacob isp_find_chan_by_did(ispsoftc_t *isp, uint32_t did, uint16_t *cp) 2393 1.4 mjacob { 2394 1.4 mjacob uint16_t chan; 2395 1.4 mjacob 2396 1.4 mjacob *cp = ISP_NOCHAN; 2397 1.4 mjacob for (chan = 0; chan < isp->isp_nchan; chan++) { 2398 1.4 mjacob fcparam *fcp = FCPARAM(isp, chan); 2399 1.4 mjacob if ((fcp->role & ISP_ROLE_TARGET) == 0 || fcp->isp_fwstate != FW_READY || fcp->isp_loopstate < LOOP_PDB_RCVD) { 2400 1.4 mjacob continue; 2401 1.4 mjacob } 2402 1.4 mjacob if (fcp->isp_portid == did) { 2403 1.4 mjacob *cp = chan; 2404 1.4 mjacob break; 2405 1.4 mjacob } 2406 1.4 mjacob } 2407 1.4 mjacob } 2408 1.4 mjacob 2409 1.4 mjacob /* 2410 1.4 mjacob * Add an initiator device to the port database 2411 1.4 mjacob */ 2412 1.4 mjacob void 2413 1.4 mjacob isp_add_wwn_entry(ispsoftc_t *isp, int chan, uint64_t ini, uint16_t nphdl, uint32_t s_id) 2414 1.4 mjacob { 2415 1.4 mjacob fcparam *fcp; 2416 1.4 mjacob fcportdb_t *lp; 2417 1.4 mjacob isp_notify_t nt; 2418 1.4 mjacob int i; 2419 1.4 mjacob 2420 1.4 mjacob fcp = FCPARAM(isp, chan); 2421 1.4 mjacob 2422 1.4 mjacob if (nphdl >= MAX_NPORT_HANDLE) { 2423 1.4 mjacob isp_prt(isp, ISP_LOGWARN, "%s: Chan %d IID 0x%016llx bad N-Port handle 0x%04x Port ID 0x%06x", 2424 1.4 mjacob __func__, chan, (unsigned long long) ini, nphdl, s_id); 2425 1.4 mjacob return; 2426 1.4 mjacob } 2427 1.4 mjacob 2428 1.4 mjacob lp = NULL; 2429 1.4 mjacob if (fcp->isp_tgt_map[nphdl]) { 2430 1.4 mjacob lp = &fcp->portdb[fcp->isp_tgt_map[nphdl] - 1]; 2431 1.4 mjacob } else { 2432 1.4 mjacob /* 2433 1.4 mjacob * Make sure the addition of a new target mode entry doesn't duplicate entries 2434 1.4 mjacob * with the same N-Port handles, the same portids or the same Port WWN. 2435 1.4 mjacob */ 2436 1.4 mjacob for (i = 0; i < MAX_FC_TARG; i++) { 2437 1.4 mjacob lp = &fcp->portdb[i]; 2438 1.4 mjacob if (lp->target_mode == 0) { 2439 1.4 mjacob lp = NULL; 2440 1.4 mjacob continue; 2441 1.4 mjacob } 2442 1.4 mjacob if (lp->handle == nphdl) { 2443 1.4 mjacob break; 2444 1.4 mjacob } 2445 1.4 mjacob if (s_id != PORT_ANY && lp->portid == s_id) { 2446 1.4 mjacob break; 2447 1.4 mjacob } 2448 1.4 mjacob if (VALID_INI(ini) && lp->port_wwn == ini) { 2449 1.4 mjacob break; 2450 1.4 mjacob } 2451 1.4 mjacob lp = NULL; 2452 1.4 mjacob } 2453 1.4 mjacob 2454 1.4 mjacob } 2455 1.4 mjacob 2456 1.4 mjacob if (lp) { 2457 1.4 mjacob int something = 0; 2458 1.4 mjacob if (lp->handle != nphdl) { 2459 1.4 mjacob isp_prt(isp, ISP_LOGWARN, "%s: Chan %d attempt to re-enter N-port handle 0x%04x IID 0x%016llx Port ID 0x%06x finds IID 0x%016llx N-Port Handle 0x%04x Port ID 0x%06x", 2460 1.4 mjacob __func__, chan, nphdl, (unsigned long long)ini, s_id, (unsigned long long) lp->port_wwn, lp->handle, lp->portid); 2461 1.4 mjacob isp_dump_portdb(isp, chan); 2462 1.4 mjacob return; 2463 1.4 mjacob } 2464 1.4 mjacob if (s_id != PORT_NONE) { 2465 1.4 mjacob if (lp->portid == PORT_NONE) { 2466 1.4 mjacob lp->portid = s_id; 2467 1.4 mjacob isp_prt(isp, ISP_LOGTINFO, "%s: Chan %d N-port handle 0x%04x gets Port ID 0x%06x", __func__, chan, nphdl, s_id); 2468 1.4 mjacob something++; 2469 1.4 mjacob } else if (lp->portid != s_id) { 2470 1.4 mjacob isp_prt(isp, ISP_LOGTINFO, "%s: Chan %d N-port handle 0x%04x tries to change Port ID 0x%06x to 0x%06x", __func__, chan, nphdl, 2471 1.4 mjacob lp->portid, s_id); 2472 1.4 mjacob isp_dump_portdb(isp, chan); 2473 1.4 mjacob return; 2474 1.4 mjacob } 2475 1.4 mjacob } 2476 1.4 mjacob if (VALID_INI(ini)) { 2477 1.4 mjacob if (!VALID_INI(lp->port_wwn)) { 2478 1.4 mjacob lp->port_wwn = ini; 2479 1.4 mjacob isp_prt(isp, ISP_LOGTINFO, "%s: Chan %d N-port handle 0x%04x gets WWN 0x%016llxx", __func__, chan, nphdl, (unsigned long long) ini); 2480 1.4 mjacob something++; 2481 1.4 mjacob } else if (lp->port_wwn != ini) { 2482 1.4 mjacob isp_prt(isp, ISP_LOGWARN, "%s: Chan %d N-port handle 0x%04x tries to change WWN 0x%016llx to 0x%016llx", __func__, chan, nphdl, 2483 1.4 mjacob (unsigned long long) lp->port_wwn, (unsigned long long) ini); 2484 1.4 mjacob isp_dump_portdb(isp, chan); 2485 1.4 mjacob return; 2486 1.4 mjacob } 2487 1.4 mjacob } 2488 1.4 mjacob 2489 1.4 mjacob if (!something) { 2490 1.4 mjacob isp_prt(isp, ISP_LOGWARN, "%s: Chan %d IID 0x%016llx N-Port Handle 0x%04x Port ID 0x%06x reentered", __func__, chan, 2491 1.4 mjacob (unsigned long long) lp->port_wwn, lp->handle, lp->portid); 2492 1.4 mjacob } 2493 1.4 mjacob return; 2494 1.4 mjacob } 2495 1.4 mjacob 2496 1.4 mjacob /* 2497 1.4 mjacob * Find a new spot 2498 1.4 mjacob */ 2499 1.4 mjacob for (i = MAX_FC_TARG - 1; i >= 0; i--) { 2500 1.4 mjacob if (fcp->portdb[i].target_mode == 1) { 2501 1.4 mjacob continue; 2502 1.4 mjacob } 2503 1.4 mjacob if (fcp->portdb[i].state == FC_PORTDB_STATE_NIL) { 2504 1.4 mjacob break; 2505 1.4 mjacob } 2506 1.4 mjacob } 2507 1.4 mjacob if (i < 0) { 2508 1.4 mjacob isp_prt(isp, ISP_LOGWARN, "%s: Chan %d IID 0x%016llx N-Port Handle 0x%04x Port ID 0x%06x- no room in port database", 2509 1.4 mjacob __func__, chan, (unsigned long long) ini, nphdl, s_id); 2510 1.4 mjacob return; 2511 1.4 mjacob } 2512 1.4 mjacob 2513 1.4 mjacob lp = &fcp->portdb[i]; 2514 1.4 mjacob ISP_MEMZERO(lp, sizeof (fcportdb_t)); 2515 1.4 mjacob lp->target_mode = 1; 2516 1.4 mjacob lp->handle = nphdl; 2517 1.4 mjacob lp->portid = s_id; 2518 1.4 mjacob lp->port_wwn = ini; 2519 1.4 mjacob fcp->isp_tgt_map[nphdl] = i + 1; 2520 1.4 mjacob 2521 1.4 mjacob isp_prt(isp, ISP_LOGTINFO, "%s: Chan %d IID 0x%016llx N-Port Handle 0x%04x Port ID 0x%06x vtgt %d added", __func__, chan, (unsigned long long) ini, nphdl, s_id, fcp->isp_tgt_map[nphdl] - 1); 2522 1.4 mjacob 2523 1.4 mjacob ISP_MEMZERO(&nt, sizeof (nt)); 2524 1.4 mjacob nt.nt_hba = isp; 2525 1.4 mjacob nt.nt_wwn = ini; 2526 1.4 mjacob nt.nt_tgt = FCPARAM(isp, chan)->isp_wwpn; 2527 1.4 mjacob nt.nt_sid = s_id; 2528 1.4 mjacob nt.nt_did = FCPARAM(isp, chan)->isp_portid; 2529 1.4 mjacob nt.nt_nphdl = nphdl; 2530 1.4 mjacob nt.nt_channel = chan; 2531 1.4 mjacob nt.nt_ncode = NT_ARRIVED; 2532 1.4 mjacob isp_async(isp, ISPASYNC_TARGET_NOTIFY, &nt); 2533 1.4 mjacob } 2534 1.4 mjacob 2535 1.4 mjacob /* 2536 1.4 mjacob * Remove a target device to the port database 2537 1.4 mjacob */ 2538 1.4 mjacob void 2539 1.4 mjacob isp_del_wwn_entry(ispsoftc_t *isp, int chan, uint64_t ini, uint16_t nphdl, uint32_t s_id) 2540 1.4 mjacob { 2541 1.4 mjacob fcparam *fcp; 2542 1.4 mjacob isp_notify_t nt; 2543 1.4 mjacob fcportdb_t *lp; 2544 1.4 mjacob 2545 1.4 mjacob if (nphdl >= MAX_NPORT_HANDLE) { 2546 1.4 mjacob isp_prt(isp, ISP_LOGWARN, "%s: Chan %d IID 0x%016llx bad N-Port handle 0x%04x Port ID 0x%06x", 2547 1.4 mjacob __func__, chan, (unsigned long long) ini, nphdl, s_id); 2548 1.4 mjacob return; 2549 1.4 mjacob } 2550 1.4 mjacob 2551 1.4 mjacob fcp = FCPARAM(isp, chan); 2552 1.4 mjacob if (fcp->isp_tgt_map[nphdl] == 0) { 2553 1.4 mjacob lp = NULL; 2554 1.4 mjacob } else { 2555 1.4 mjacob lp = &fcp->portdb[fcp->isp_tgt_map[nphdl] - 1]; 2556 1.4 mjacob if (lp->target_mode == 0) { 2557 1.4 mjacob lp = NULL; 2558 1.4 mjacob } 2559 1.4 mjacob } 2560 1.4 mjacob if (lp == NULL) { 2561 1.4 mjacob isp_prt(isp, ISP_LOGWARN, "%s: Chan %d IID 0x%016llx N-Port Handle 0x%04x Port ID 0x%06x cannot be found to be cleared", 2562 1.4 mjacob __func__, chan, (unsigned long long) ini, nphdl, s_id); 2563 1.4 mjacob isp_dump_portdb(isp, chan); 2564 1.4 mjacob return; 2565 1.4 mjacob } 2566 1.4 mjacob isp_prt(isp, ISP_LOGTINFO, "%s: Chan %d IID 0x%016llx N-Port Handle 0x%04x Port ID 0x%06x vtgt %d cleared", 2567 1.4 mjacob __func__, chan, (unsigned long long) lp->port_wwn, nphdl, lp->portid, fcp->isp_tgt_map[nphdl] - 1); 2568 1.4 mjacob fcp->isp_tgt_map[nphdl] = 0; 2569 1.4 mjacob 2570 1.4 mjacob ISP_MEMZERO(&nt, sizeof (nt)); 2571 1.4 mjacob nt.nt_hba = isp; 2572 1.4 mjacob nt.nt_wwn = lp->port_wwn; 2573 1.4 mjacob nt.nt_tgt = FCPARAM(isp, chan)->isp_wwpn; 2574 1.4 mjacob nt.nt_sid = lp->portid; 2575 1.4 mjacob nt.nt_did = FCPARAM(isp, chan)->isp_portid; 2576 1.4 mjacob nt.nt_nphdl = nphdl; 2577 1.4 mjacob nt.nt_channel = chan; 2578 1.4 mjacob nt.nt_ncode = NT_DEPARTED; 2579 1.4 mjacob isp_async(isp, ISPASYNC_TARGET_NOTIFY, &nt); 2580 1.4 mjacob } 2581 1.4 mjacob 2582 1.4 mjacob void 2583 1.4 mjacob isp_del_all_wwn_entries(ispsoftc_t *isp, int chan) 2584 1.4 mjacob { 2585 1.4 mjacob fcparam *fcp; 2586 1.4 mjacob int i; 2587 1.4 mjacob 2588 1.4 mjacob if (!IS_FC(isp)) { 2589 1.4 mjacob return; 2590 1.4 mjacob } 2591 1.4 mjacob 2592 1.4 mjacob /* 2593 1.4 mjacob * Handle iterations over all channels via recursion 2594 1.4 mjacob */ 2595 1.4 mjacob if (chan == ISP_NOCHAN) { 2596 1.4 mjacob for (chan = 0; chan < isp->isp_nchan; chan++) { 2597 1.4 mjacob isp_del_all_wwn_entries(isp, chan); 2598 1.4 mjacob } 2599 1.4 mjacob return; 2600 1.4 mjacob } 2601 1.4 mjacob 2602 1.4 mjacob if (chan > isp->isp_nchan) { 2603 1.4 mjacob return; 2604 1.4 mjacob } 2605 1.4 mjacob 2606 1.4 mjacob fcp = FCPARAM(isp, chan); 2607 1.4 mjacob if (fcp == NULL) { 2608 1.4 mjacob return; 2609 1.4 mjacob } 2610 1.4 mjacob for (i = 0; i < MAX_NPORT_HANDLE; i++) { 2611 1.4 mjacob if (fcp->isp_tgt_map[i]) { 2612 1.4 mjacob fcportdb_t *lp = &fcp->portdb[fcp->isp_tgt_map[i] - 1]; 2613 1.4 mjacob isp_del_wwn_entry(isp, chan, lp->port_wwn, lp->handle, lp->portid); 2614 1.4 mjacob } 2615 1.4 mjacob } 2616 1.4 mjacob } 2617 1.4 mjacob 2618 1.4 mjacob void 2619 1.4 mjacob isp_del_wwn_entries(ispsoftc_t *isp, isp_notify_t *mp) 2620 1.4 mjacob { 2621 1.4 mjacob fcportdb_t *lp; 2622 1.4 mjacob 2623 1.4 mjacob /* 2624 1.4 mjacob * Handle iterations over all channels via recursion 2625 1.4 mjacob */ 2626 1.4 mjacob if (mp->nt_channel == ISP_NOCHAN) { 2627 1.4 mjacob for (mp->nt_channel = 0; mp->nt_channel < isp->isp_nchan; mp->nt_channel++) { 2628 1.4 mjacob isp_del_wwn_entries(isp, mp); 2629 1.4 mjacob } 2630 1.4 mjacob mp->nt_channel = ISP_NOCHAN; 2631 1.4 mjacob return; 2632 1.4 mjacob } 2633 1.4 mjacob 2634 1.4 mjacob /* 2635 1.4 mjacob * We have an entry which is only partially identified. 2636 1.4 mjacob * 2637 1.4 mjacob * It's only known by WWN, N-Port handle, or Port ID. 2638 1.4 mjacob * We need to find the actual entry so we can delete it. 2639 1.4 mjacob */ 2640 1.4 mjacob if (mp->nt_nphdl != NIL_HANDLE) { 2641 1.4 mjacob if (isp_find_pdb_by_loopid(isp, mp->nt_channel, mp->nt_nphdl, &lp)) { 2642 1.4 mjacob isp_del_wwn_entry(isp, mp->nt_channel, lp->port_wwn, lp->handle, lp->portid); 2643 1.4 mjacob return; 2644 1.4 mjacob } 2645 1.4 mjacob } 2646 1.4 mjacob if (mp->nt_wwn != INI_ANY) { 2647 1.4 mjacob if (isp_find_pdb_by_wwn(isp, mp->nt_channel, mp->nt_wwn, &lp)) { 2648 1.4 mjacob isp_del_wwn_entry(isp, mp->nt_channel, lp->port_wwn, lp->handle, lp->portid); 2649 1.4 mjacob return; 2650 1.4 mjacob } 2651 1.4 mjacob } 2652 1.4 mjacob if (mp->nt_sid != PORT_ANY && mp->nt_sid != PORT_NONE) { 2653 1.4 mjacob if (isp_find_pdb_by_sid(isp, mp->nt_channel, mp->nt_sid, &lp)) { 2654 1.4 mjacob isp_del_wwn_entry(isp, mp->nt_channel, lp->port_wwn, lp->handle, lp->portid); 2655 1.4 mjacob return; 2656 1.4 mjacob } 2657 1.4 mjacob } 2658 1.4 mjacob isp_prt(isp, ISP_LOGWARN, "%s: Chan %d unable to find entry to delete N-port handle 0x%04x initiator WWN 0x%016llx Port ID 0x%06x", __func__, 2659 1.4 mjacob mp->nt_channel, mp->nt_nphdl, (unsigned long long) mp->nt_wwn, mp->nt_sid); 2660 1.4 mjacob } 2661 1.4 mjacob 2662 1.1 mjacob void 2663 1.1 mjacob isp_put_atio(ispsoftc_t *isp, at_entry_t *src, at_entry_t *dst) 2664 1.1 mjacob { 2665 1.1 mjacob int i; 2666 1.1 mjacob isp_put_hdr(isp, &src->at_header, &dst->at_header); 2667 1.1 mjacob ISP_IOXPUT_16(isp, src->at_reserved, &dst->at_reserved); 2668 1.1 mjacob ISP_IOXPUT_16(isp, src->at_handle, &dst->at_handle); 2669 1.1 mjacob if (ISP_IS_SBUS(isp)) { 2670 1.1 mjacob ISP_IOXPUT_8(isp, src->at_lun, &dst->at_iid); 2671 1.1 mjacob ISP_IOXPUT_8(isp, src->at_iid, &dst->at_lun); 2672 1.1 mjacob ISP_IOXPUT_8(isp, src->at_cdblen, &dst->at_tgt); 2673 1.1 mjacob ISP_IOXPUT_8(isp, src->at_tgt, &dst->at_cdblen); 2674 1.1 mjacob ISP_IOXPUT_8(isp, src->at_status, &dst->at_scsi_status); 2675 1.1 mjacob ISP_IOXPUT_8(isp, src->at_scsi_status, &dst->at_status); 2676 1.1 mjacob ISP_IOXPUT_8(isp, src->at_tag_val, &dst->at_tag_type); 2677 1.1 mjacob ISP_IOXPUT_8(isp, src->at_tag_type, &dst->at_tag_val); 2678 1.1 mjacob } else { 2679 1.1 mjacob ISP_IOXPUT_8(isp, src->at_lun, &dst->at_lun); 2680 1.1 mjacob ISP_IOXPUT_8(isp, src->at_iid, &dst->at_iid); 2681 1.1 mjacob ISP_IOXPUT_8(isp, src->at_cdblen, &dst->at_cdblen); 2682 1.1 mjacob ISP_IOXPUT_8(isp, src->at_tgt, &dst->at_tgt); 2683 1.1 mjacob ISP_IOXPUT_8(isp, src->at_status, &dst->at_status); 2684 1.4 mjacob ISP_IOXPUT_8(isp, src->at_scsi_status, &dst->at_scsi_status); 2685 1.1 mjacob ISP_IOXPUT_8(isp, src->at_tag_val, &dst->at_tag_val); 2686 1.1 mjacob ISP_IOXPUT_8(isp, src->at_tag_type, &dst->at_tag_type); 2687 1.1 mjacob } 2688 1.1 mjacob ISP_IOXPUT_32(isp, src->at_flags, &dst->at_flags); 2689 1.1 mjacob for (i = 0; i < ATIO_CDBLEN; i++) { 2690 1.1 mjacob ISP_IOXPUT_8(isp, src->at_cdb[i], &dst->at_cdb[i]); 2691 1.1 mjacob } 2692 1.1 mjacob for (i = 0; i < QLTM_SENSELEN; i++) { 2693 1.1 mjacob ISP_IOXPUT_8(isp, src->at_sense[i], &dst->at_sense[i]); 2694 1.1 mjacob } 2695 1.1 mjacob } 2696 1.1 mjacob 2697 1.1 mjacob void 2698 1.1 mjacob isp_get_atio(ispsoftc_t *isp, at_entry_t *src, at_entry_t *dst) 2699 1.1 mjacob { 2700 1.1 mjacob int i; 2701 1.1 mjacob isp_get_hdr(isp, &src->at_header, &dst->at_header); 2702 1.1 mjacob ISP_IOXGET_16(isp, &src->at_reserved, dst->at_reserved); 2703 1.1 mjacob ISP_IOXGET_16(isp, &src->at_handle, dst->at_handle); 2704 1.1 mjacob if (ISP_IS_SBUS(isp)) { 2705 1.1 mjacob ISP_IOXGET_8(isp, &src->at_lun, dst->at_iid); 2706 1.1 mjacob ISP_IOXGET_8(isp, &src->at_iid, dst->at_lun); 2707 1.1 mjacob ISP_IOXGET_8(isp, &src->at_cdblen, dst->at_tgt); 2708 1.1 mjacob ISP_IOXGET_8(isp, &src->at_tgt, dst->at_cdblen); 2709 1.1 mjacob ISP_IOXGET_8(isp, &src->at_status, dst->at_scsi_status); 2710 1.1 mjacob ISP_IOXGET_8(isp, &src->at_scsi_status, dst->at_status); 2711 1.1 mjacob ISP_IOXGET_8(isp, &src->at_tag_val, dst->at_tag_type); 2712 1.1 mjacob ISP_IOXGET_8(isp, &src->at_tag_type, dst->at_tag_val); 2713 1.1 mjacob } else { 2714 1.1 mjacob ISP_IOXGET_8(isp, &src->at_lun, dst->at_lun); 2715 1.1 mjacob ISP_IOXGET_8(isp, &src->at_iid, dst->at_iid); 2716 1.1 mjacob ISP_IOXGET_8(isp, &src->at_cdblen, dst->at_cdblen); 2717 1.1 mjacob ISP_IOXGET_8(isp, &src->at_tgt, dst->at_tgt); 2718 1.1 mjacob ISP_IOXGET_8(isp, &src->at_status, dst->at_status); 2719 1.4 mjacob ISP_IOXGET_8(isp, &src->at_scsi_status, dst->at_scsi_status); 2720 1.1 mjacob ISP_IOXGET_8(isp, &src->at_tag_val, dst->at_tag_val); 2721 1.1 mjacob ISP_IOXGET_8(isp, &src->at_tag_type, dst->at_tag_type); 2722 1.1 mjacob } 2723 1.1 mjacob ISP_IOXGET_32(isp, &src->at_flags, dst->at_flags); 2724 1.1 mjacob for (i = 0; i < ATIO_CDBLEN; i++) { 2725 1.1 mjacob ISP_IOXGET_8(isp, &src->at_cdb[i], dst->at_cdb[i]); 2726 1.1 mjacob } 2727 1.1 mjacob for (i = 0; i < QLTM_SENSELEN; i++) { 2728 1.1 mjacob ISP_IOXGET_8(isp, &src->at_sense[i], dst->at_sense[i]); 2729 1.1 mjacob } 2730 1.1 mjacob } 2731 1.1 mjacob 2732 1.1 mjacob void 2733 1.1 mjacob isp_put_atio2(ispsoftc_t *isp, at2_entry_t *src, at2_entry_t *dst) 2734 1.1 mjacob { 2735 1.1 mjacob int i; 2736 1.1 mjacob isp_put_hdr(isp, &src->at_header, &dst->at_header); 2737 1.1 mjacob ISP_IOXPUT_32(isp, src->at_reserved, &dst->at_reserved); 2738 1.1 mjacob ISP_IOXPUT_8(isp, src->at_lun, &dst->at_lun); 2739 1.1 mjacob ISP_IOXPUT_8(isp, src->at_iid, &dst->at_iid); 2740 1.1 mjacob ISP_IOXPUT_16(isp, src->at_rxid, &dst->at_rxid); 2741 1.1 mjacob ISP_IOXPUT_16(isp, src->at_flags, &dst->at_flags); 2742 1.1 mjacob ISP_IOXPUT_16(isp, src->at_status, &dst->at_status); 2743 1.1 mjacob ISP_IOXPUT_8(isp, src->at_crn, &dst->at_crn); 2744 1.1 mjacob ISP_IOXPUT_8(isp, src->at_taskcodes, &dst->at_taskcodes); 2745 1.1 mjacob ISP_IOXPUT_8(isp, src->at_taskflags, &dst->at_taskflags); 2746 1.1 mjacob ISP_IOXPUT_8(isp, src->at_execodes, &dst->at_execodes); 2747 1.1 mjacob for (i = 0; i < ATIO2_CDBLEN; i++) { 2748 1.1 mjacob ISP_IOXPUT_8(isp, src->at_cdb[i], &dst->at_cdb[i]); 2749 1.1 mjacob } 2750 1.1 mjacob ISP_IOXPUT_32(isp, src->at_datalen, &dst->at_datalen); 2751 1.1 mjacob ISP_IOXPUT_16(isp, src->at_scclun, &dst->at_scclun); 2752 1.1 mjacob for (i = 0; i < 4; i++) { 2753 1.1 mjacob ISP_IOXPUT_16(isp, src->at_wwpn[i], &dst->at_wwpn[i]); 2754 1.1 mjacob } 2755 1.1 mjacob for (i = 0; i < 6; i++) { 2756 1.4 mjacob ISP_IOXPUT_16(isp, src->at_reserved2[i], &dst->at_reserved2[i]); 2757 1.1 mjacob } 2758 1.1 mjacob ISP_IOXPUT_16(isp, src->at_oxid, &dst->at_oxid); 2759 1.1 mjacob } 2760 1.1 mjacob 2761 1.1 mjacob void 2762 1.1 mjacob isp_put_atio2e(ispsoftc_t *isp, at2e_entry_t *src, at2e_entry_t *dst) 2763 1.1 mjacob { 2764 1.1 mjacob int i; 2765 1.1 mjacob isp_put_hdr(isp, &src->at_header, &dst->at_header); 2766 1.1 mjacob ISP_IOXPUT_32(isp, src->at_reserved, &dst->at_reserved); 2767 1.1 mjacob ISP_IOXPUT_16(isp, src->at_iid, &dst->at_iid); 2768 1.1 mjacob ISP_IOXPUT_16(isp, src->at_rxid, &dst->at_rxid); 2769 1.1 mjacob ISP_IOXPUT_16(isp, src->at_flags, &dst->at_flags); 2770 1.1 mjacob ISP_IOXPUT_16(isp, src->at_status, &dst->at_status); 2771 1.1 mjacob ISP_IOXPUT_8(isp, src->at_crn, &dst->at_crn); 2772 1.1 mjacob ISP_IOXPUT_8(isp, src->at_taskcodes, &dst->at_taskcodes); 2773 1.1 mjacob ISP_IOXPUT_8(isp, src->at_taskflags, &dst->at_taskflags); 2774 1.1 mjacob ISP_IOXPUT_8(isp, src->at_execodes, &dst->at_execodes); 2775 1.1 mjacob for (i = 0; i < ATIO2_CDBLEN; i++) { 2776 1.1 mjacob ISP_IOXPUT_8(isp, src->at_cdb[i], &dst->at_cdb[i]); 2777 1.1 mjacob } 2778 1.1 mjacob ISP_IOXPUT_32(isp, src->at_datalen, &dst->at_datalen); 2779 1.1 mjacob ISP_IOXPUT_16(isp, src->at_scclun, &dst->at_scclun); 2780 1.1 mjacob for (i = 0; i < 4; i++) { 2781 1.1 mjacob ISP_IOXPUT_16(isp, src->at_wwpn[i], &dst->at_wwpn[i]); 2782 1.1 mjacob } 2783 1.1 mjacob for (i = 0; i < 6; i++) { 2784 1.4 mjacob ISP_IOXPUT_16(isp, src->at_reserved2[i], &dst->at_reserved2[i]); 2785 1.1 mjacob } 2786 1.1 mjacob ISP_IOXPUT_16(isp, src->at_oxid, &dst->at_oxid); 2787 1.1 mjacob } 2788 1.1 mjacob 2789 1.1 mjacob void 2790 1.1 mjacob isp_get_atio2(ispsoftc_t *isp, at2_entry_t *src, at2_entry_t *dst) 2791 1.1 mjacob { 2792 1.1 mjacob int i; 2793 1.1 mjacob isp_get_hdr(isp, &src->at_header, &dst->at_header); 2794 1.1 mjacob ISP_IOXGET_32(isp, &src->at_reserved, dst->at_reserved); 2795 1.1 mjacob ISP_IOXGET_8(isp, &src->at_lun, dst->at_lun); 2796 1.1 mjacob ISP_IOXGET_8(isp, &src->at_iid, dst->at_iid); 2797 1.1 mjacob ISP_IOXGET_16(isp, &src->at_rxid, dst->at_rxid); 2798 1.1 mjacob ISP_IOXGET_16(isp, &src->at_flags, dst->at_flags); 2799 1.1 mjacob ISP_IOXGET_16(isp, &src->at_status, dst->at_status); 2800 1.1 mjacob ISP_IOXGET_8(isp, &src->at_crn, dst->at_crn); 2801 1.1 mjacob ISP_IOXGET_8(isp, &src->at_taskcodes, dst->at_taskcodes); 2802 1.1 mjacob ISP_IOXGET_8(isp, &src->at_taskflags, dst->at_taskflags); 2803 1.1 mjacob ISP_IOXGET_8(isp, &src->at_execodes, dst->at_execodes); 2804 1.1 mjacob for (i = 0; i < ATIO2_CDBLEN; i++) { 2805 1.1 mjacob ISP_IOXGET_8(isp, &src->at_cdb[i], dst->at_cdb[i]); 2806 1.1 mjacob } 2807 1.1 mjacob ISP_IOXGET_32(isp, &src->at_datalen, dst->at_datalen); 2808 1.1 mjacob ISP_IOXGET_16(isp, &src->at_scclun, dst->at_scclun); 2809 1.1 mjacob for (i = 0; i < 4; i++) { 2810 1.1 mjacob ISP_IOXGET_16(isp, &src->at_wwpn[i], dst->at_wwpn[i]); 2811 1.1 mjacob } 2812 1.1 mjacob for (i = 0; i < 6; i++) { 2813 1.4 mjacob ISP_IOXGET_16(isp, &src->at_reserved2[i], dst->at_reserved2[i]); 2814 1.1 mjacob } 2815 1.1 mjacob ISP_IOXGET_16(isp, &src->at_oxid, dst->at_oxid); 2816 1.1 mjacob } 2817 1.1 mjacob 2818 1.1 mjacob void 2819 1.1 mjacob isp_get_atio2e(ispsoftc_t *isp, at2e_entry_t *src, at2e_entry_t *dst) 2820 1.1 mjacob { 2821 1.1 mjacob int i; 2822 1.1 mjacob isp_get_hdr(isp, &src->at_header, &dst->at_header); 2823 1.1 mjacob ISP_IOXGET_32(isp, &src->at_reserved, dst->at_reserved); 2824 1.1 mjacob ISP_IOXGET_16(isp, &src->at_iid, dst->at_iid); 2825 1.1 mjacob ISP_IOXGET_16(isp, &src->at_rxid, dst->at_rxid); 2826 1.1 mjacob ISP_IOXGET_16(isp, &src->at_flags, dst->at_flags); 2827 1.1 mjacob ISP_IOXGET_16(isp, &src->at_status, dst->at_status); 2828 1.1 mjacob ISP_IOXGET_8(isp, &src->at_crn, dst->at_crn); 2829 1.1 mjacob ISP_IOXGET_8(isp, &src->at_taskcodes, dst->at_taskcodes); 2830 1.1 mjacob ISP_IOXGET_8(isp, &src->at_taskflags, dst->at_taskflags); 2831 1.1 mjacob ISP_IOXGET_8(isp, &src->at_execodes, dst->at_execodes); 2832 1.1 mjacob for (i = 0; i < ATIO2_CDBLEN; i++) { 2833 1.1 mjacob ISP_IOXGET_8(isp, &src->at_cdb[i], dst->at_cdb[i]); 2834 1.1 mjacob } 2835 1.1 mjacob ISP_IOXGET_32(isp, &src->at_datalen, dst->at_datalen); 2836 1.1 mjacob ISP_IOXGET_16(isp, &src->at_scclun, dst->at_scclun); 2837 1.1 mjacob for (i = 0; i < 4; i++) { 2838 1.1 mjacob ISP_IOXGET_16(isp, &src->at_wwpn[i], dst->at_wwpn[i]); 2839 1.1 mjacob } 2840 1.1 mjacob for (i = 0; i < 6; i++) { 2841 1.4 mjacob ISP_IOXGET_16(isp, &src->at_reserved2[i], dst->at_reserved2[i]); 2842 1.1 mjacob } 2843 1.1 mjacob ISP_IOXGET_16(isp, &src->at_oxid, dst->at_oxid); 2844 1.1 mjacob } 2845 1.1 mjacob 2846 1.1 mjacob void 2847 1.1 mjacob isp_get_atio7(ispsoftc_t *isp, at7_entry_t *src, at7_entry_t *dst) 2848 1.1 mjacob { 2849 1.1 mjacob ISP_IOXGET_8(isp, &src->at_type, dst->at_type); 2850 1.1 mjacob ISP_IOXGET_8(isp, &src->at_count, dst->at_count); 2851 1.1 mjacob ISP_IOXGET_16(isp, &src->at_ta_len, dst->at_ta_len); 2852 1.1 mjacob ISP_IOXGET_32(isp, &src->at_rxid, dst->at_rxid); 2853 1.1 mjacob isp_get_fc_hdr(isp, &src->at_hdr, &dst->at_hdr); 2854 1.1 mjacob isp_get_fcp_cmnd_iu(isp, &src->at_cmnd, &dst->at_cmnd); 2855 1.1 mjacob } 2856 1.1 mjacob 2857 1.1 mjacob void 2858 1.1 mjacob isp_put_ctio(ispsoftc_t *isp, ct_entry_t *src, ct_entry_t *dst) 2859 1.1 mjacob { 2860 1.1 mjacob int i; 2861 1.1 mjacob isp_put_hdr(isp, &src->ct_header, &dst->ct_header); 2862 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_syshandle, &dst->ct_syshandle); 2863 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_fwhandle, &dst->ct_fwhandle); 2864 1.1 mjacob if (ISP_IS_SBUS(isp)) { 2865 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_iid, &dst->ct_lun); 2866 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_lun, &dst->ct_iid); 2867 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_tgt, &dst->ct_reserved2); 2868 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_reserved2, &dst->ct_tgt); 2869 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_status, &dst->ct_scsi_status); 2870 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_scsi_status, &dst->ct_status); 2871 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_tag_type, &dst->ct_tag_val); 2872 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_tag_val, &dst->ct_tag_type); 2873 1.1 mjacob } else { 2874 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_iid, &dst->ct_iid); 2875 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_lun, &dst->ct_lun); 2876 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_tgt, &dst->ct_tgt); 2877 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_reserved2, &dst->ct_reserved2); 2878 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_scsi_status, 2879 1.1 mjacob &dst->ct_scsi_status); 2880 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_status, &dst->ct_status); 2881 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_tag_type, &dst->ct_tag_type); 2882 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_tag_val, &dst->ct_tag_val); 2883 1.1 mjacob } 2884 1.1 mjacob ISP_IOXPUT_32(isp, src->ct_flags, &dst->ct_flags); 2885 1.1 mjacob ISP_IOXPUT_32(isp, src->ct_xfrlen, &dst->ct_xfrlen); 2886 1.1 mjacob ISP_IOXPUT_32(isp, src->ct_resid, &dst->ct_resid); 2887 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_timeout, &dst->ct_timeout); 2888 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_seg_count, &dst->ct_seg_count); 2889 1.1 mjacob for (i = 0; i < ISP_RQDSEG; i++) { 2890 1.4 mjacob ISP_IOXPUT_32(isp, src->ct_dataseg[i].ds_base, &dst->ct_dataseg[i].ds_base); 2891 1.4 mjacob ISP_IOXPUT_32(isp, src->ct_dataseg[i].ds_count, &dst->ct_dataseg[i].ds_count); 2892 1.1 mjacob } 2893 1.1 mjacob } 2894 1.1 mjacob 2895 1.1 mjacob void 2896 1.1 mjacob isp_get_ctio(ispsoftc_t *isp, ct_entry_t *src, ct_entry_t *dst) 2897 1.1 mjacob { 2898 1.1 mjacob int i; 2899 1.1 mjacob isp_get_hdr(isp, &src->ct_header, &dst->ct_header); 2900 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_syshandle, dst->ct_syshandle); 2901 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_fwhandle, dst->ct_fwhandle); 2902 1.1 mjacob if (ISP_IS_SBUS(isp)) { 2903 1.1 mjacob ISP_IOXGET_8(isp, &src->ct_lun, dst->ct_iid); 2904 1.1 mjacob ISP_IOXGET_8(isp, &src->ct_iid, dst->ct_lun); 2905 1.1 mjacob ISP_IOXGET_8(isp, &src->ct_reserved2, dst->ct_tgt); 2906 1.1 mjacob ISP_IOXGET_8(isp, &src->ct_tgt, dst->ct_reserved2); 2907 1.1 mjacob ISP_IOXGET_8(isp, &src->ct_status, dst->ct_scsi_status); 2908 1.1 mjacob ISP_IOXGET_8(isp, &src->ct_scsi_status, dst->ct_status); 2909 1.1 mjacob ISP_IOXGET_8(isp, &src->ct_tag_val, dst->ct_tag_type); 2910 1.1 mjacob ISP_IOXGET_8(isp, &src->ct_tag_type, dst->ct_tag_val); 2911 1.1 mjacob } else { 2912 1.1 mjacob ISP_IOXGET_8(isp, &src->ct_lun, dst->ct_lun); 2913 1.1 mjacob ISP_IOXGET_8(isp, &src->ct_iid, dst->ct_iid); 2914 1.1 mjacob ISP_IOXGET_8(isp, &src->ct_reserved2, dst->ct_reserved2); 2915 1.1 mjacob ISP_IOXGET_8(isp, &src->ct_tgt, dst->ct_tgt); 2916 1.1 mjacob ISP_IOXGET_8(isp, &src->ct_status, dst->ct_status); 2917 1.4 mjacob ISP_IOXGET_8(isp, &src->ct_scsi_status, dst->ct_scsi_status); 2918 1.1 mjacob ISP_IOXGET_8(isp, &src->ct_tag_val, dst->ct_tag_val); 2919 1.1 mjacob ISP_IOXGET_8(isp, &src->ct_tag_type, dst->ct_tag_type); 2920 1.1 mjacob } 2921 1.1 mjacob ISP_IOXGET_32(isp, &src->ct_flags, dst->ct_flags); 2922 1.1 mjacob ISP_IOXGET_32(isp, &src->ct_xfrlen, dst->ct_xfrlen); 2923 1.1 mjacob ISP_IOXGET_32(isp, &src->ct_resid, dst->ct_resid); 2924 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_timeout, dst->ct_timeout); 2925 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_seg_count, dst->ct_seg_count); 2926 1.1 mjacob for (i = 0; i < ISP_RQDSEG; i++) { 2927 1.4 mjacob ISP_IOXGET_32(isp, &src->ct_dataseg[i].ds_base, dst->ct_dataseg[i].ds_base); 2928 1.4 mjacob ISP_IOXGET_32(isp, &src->ct_dataseg[i].ds_count, dst->ct_dataseg[i].ds_count); 2929 1.1 mjacob } 2930 1.1 mjacob } 2931 1.1 mjacob 2932 1.1 mjacob void 2933 1.1 mjacob isp_put_ctio2(ispsoftc_t *isp, ct2_entry_t *src, ct2_entry_t *dst) 2934 1.1 mjacob { 2935 1.1 mjacob int i; 2936 1.1 mjacob isp_put_hdr(isp, &src->ct_header, &dst->ct_header); 2937 1.1 mjacob ISP_IOXPUT_32(isp, src->ct_syshandle, &dst->ct_syshandle); 2938 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_lun, &dst->ct_lun); 2939 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_iid, &dst->ct_iid); 2940 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_rxid, &dst->ct_rxid); 2941 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_flags, &dst->ct_flags); 2942 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_timeout, &dst->ct_timeout); 2943 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_seg_count, &dst->ct_seg_count); 2944 1.1 mjacob ISP_IOXPUT_32(isp, src->ct_resid, &dst->ct_resid); 2945 1.1 mjacob ISP_IOXPUT_32(isp, src->ct_reloff, &dst->ct_reloff); 2946 1.1 mjacob if ((src->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) { 2947 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0._reserved, &dst->rsp.m0._reserved); 2948 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m0._reserved2, &dst->rsp.m0._reserved2); 2949 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m0.ct_scsi_status, &dst->rsp.m0.ct_scsi_status); 2950 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.ct_xfrlen, &dst->rsp.m0.ct_xfrlen); 2951 1.1 mjacob if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) { 2952 1.1 mjacob for (i = 0; i < ISP_RQDSEG_T2; i++) { 2953 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg[i].ds_base, &dst->rsp.m0.u.ct_dataseg[i].ds_base); 2954 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg[i].ds_count, &dst->rsp.m0.u.ct_dataseg[i].ds_count); 2955 1.1 mjacob } 2956 1.1 mjacob } else if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO3) { 2957 1.1 mjacob for (i = 0; i < ISP_RQDSEG_T3; i++) { 2958 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_base, &dst->rsp.m0.u.ct_dataseg64[i].ds_base); 2959 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_basehi, &dst->rsp.m0.u.ct_dataseg64[i].ds_basehi); 2960 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_count, &dst->rsp.m0.u.ct_dataseg64[i].ds_count); 2961 1.1 mjacob } 2962 1.1 mjacob } else if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO4) { 2963 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m0.u.ct_dslist.ds_type, &dst->rsp.m0.u.ct_dslist.ds_type); ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dslist.ds_segment, 2964 1.1 mjacob &dst->rsp.m0.u.ct_dslist.ds_segment); 2965 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dslist.ds_base, &dst->rsp.m0.u.ct_dslist.ds_base); 2966 1.1 mjacob } 2967 1.1 mjacob } else if ((src->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) { 2968 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m1._reserved, &dst->rsp.m1._reserved); 2969 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m1._reserved2, &dst->rsp.m1._reserved2); 2970 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m1.ct_senselen, &dst->rsp.m1.ct_senselen); 2971 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m1.ct_scsi_status, &dst->rsp.m1.ct_scsi_status); 2972 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m1.ct_resplen, &dst->rsp.m1.ct_resplen); 2973 1.1 mjacob for (i = 0; i < MAXRESPLEN; i++) { 2974 1.4 mjacob ISP_IOXPUT_8(isp, src->rsp.m1.ct_resp[i], &dst->rsp.m1.ct_resp[i]); 2975 1.1 mjacob } 2976 1.1 mjacob } else { 2977 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m2._reserved, &dst->rsp.m2._reserved); 2978 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m2._reserved2, &dst->rsp.m2._reserved2); 2979 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m2._reserved3, &dst->rsp.m2._reserved3); 2980 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m2.ct_datalen, &dst->rsp.m2.ct_datalen); 2981 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_base, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_base); 2982 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_count, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_count); 2983 1.1 mjacob } 2984 1.1 mjacob } 2985 1.1 mjacob 2986 1.1 mjacob void 2987 1.1 mjacob isp_put_ctio2e(ispsoftc_t *isp, ct2e_entry_t *src, ct2e_entry_t *dst) 2988 1.1 mjacob { 2989 1.1 mjacob int i; 2990 1.1 mjacob isp_put_hdr(isp, &src->ct_header, &dst->ct_header); 2991 1.1 mjacob ISP_IOXPUT_32(isp, src->ct_syshandle, &dst->ct_syshandle); 2992 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_iid, &dst->ct_iid); 2993 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_rxid, &dst->ct_rxid); 2994 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_flags, &dst->ct_flags); 2995 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_timeout, &dst->ct_timeout); 2996 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_seg_count, &dst->ct_seg_count); 2997 1.1 mjacob ISP_IOXPUT_32(isp, src->ct_resid, &dst->ct_resid); 2998 1.1 mjacob ISP_IOXPUT_32(isp, src->ct_reloff, &dst->ct_reloff); 2999 1.1 mjacob if ((src->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) { 3000 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0._reserved, &dst->rsp.m0._reserved); 3001 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m0._reserved2, &dst->rsp.m0._reserved2); 3002 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m0.ct_scsi_status, &dst->rsp.m0.ct_scsi_status); 3003 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.ct_xfrlen, &dst->rsp.m0.ct_xfrlen); 3004 1.1 mjacob if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) { 3005 1.1 mjacob for (i = 0; i < ISP_RQDSEG_T2; i++) { 3006 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg[i].ds_base, &dst->rsp.m0.u.ct_dataseg[i].ds_base); 3007 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg[i].ds_count, &dst->rsp.m0.u.ct_dataseg[i].ds_count); 3008 1.1 mjacob } 3009 1.1 mjacob } else if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO3) { 3010 1.1 mjacob for (i = 0; i < ISP_RQDSEG_T3; i++) { 3011 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_base, &dst->rsp.m0.u.ct_dataseg64[i].ds_base); 3012 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_basehi, &dst->rsp.m0.u.ct_dataseg64[i].ds_basehi); 3013 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_count, &dst->rsp.m0.u.ct_dataseg64[i].ds_count); 3014 1.1 mjacob } 3015 1.1 mjacob } else if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO4) { 3016 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m0.u.ct_dslist.ds_type, &dst->rsp.m0.u.ct_dslist.ds_type); 3017 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dslist.ds_segment, &dst->rsp.m0.u.ct_dslist.ds_segment); 3018 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dslist.ds_base, &dst->rsp.m0.u.ct_dslist.ds_base); 3019 1.1 mjacob } 3020 1.1 mjacob } else if ((src->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) { 3021 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m1._reserved, &dst->rsp.m1._reserved); 3022 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m1._reserved2, &dst->rsp.m1._reserved2); 3023 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m1.ct_senselen, &dst->rsp.m1.ct_senselen); 3024 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m1.ct_scsi_status, &dst->rsp.m1.ct_scsi_status); 3025 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m1.ct_resplen, &dst->rsp.m1.ct_resplen); 3026 1.1 mjacob for (i = 0; i < MAXRESPLEN; i++) { 3027 1.4 mjacob ISP_IOXPUT_8(isp, src->rsp.m1.ct_resp[i], &dst->rsp.m1.ct_resp[i]); 3028 1.1 mjacob } 3029 1.1 mjacob } else { 3030 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m2._reserved, &dst->rsp.m2._reserved); 3031 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m2._reserved2, &dst->rsp.m2._reserved2); 3032 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m2._reserved3, &dst->rsp.m2._reserved3); 3033 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m2.ct_datalen, &dst->rsp.m2.ct_datalen); 3034 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_base, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_base); 3035 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_count, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_count); 3036 1.1 mjacob } 3037 1.1 mjacob } 3038 1.1 mjacob 3039 1.1 mjacob void 3040 1.1 mjacob isp_put_ctio7(ispsoftc_t *isp, ct7_entry_t *src, ct7_entry_t *dst) 3041 1.1 mjacob { 3042 1.1 mjacob int i; 3043 1.1 mjacob 3044 1.1 mjacob isp_put_hdr(isp, &src->ct_header, &dst->ct_header); 3045 1.1 mjacob ISP_IOXPUT_32(isp, src->ct_syshandle, &dst->ct_syshandle); 3046 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_nphdl, &dst->ct_nphdl); 3047 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_timeout, &dst->ct_timeout); 3048 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_seg_count, &dst->ct_seg_count); 3049 1.4 mjacob ISP_IOXPUT_8(isp, src->ct_vpidx, &dst->ct_vpidx); 3050 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_xflags, &dst->ct_xflags); 3051 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_iid_lo, &dst->ct_iid_lo); 3052 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_iid_hi, &dst->ct_iid_hi); 3053 1.1 mjacob ISP_IOXPUT_8(isp, src->ct_reserved, &dst->ct_reserved); 3054 1.1 mjacob ISP_IOXPUT_32(isp, src->ct_rxid, &dst->ct_rxid); 3055 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_senselen, &dst->ct_senselen); 3056 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_flags, &dst->ct_flags); 3057 1.1 mjacob ISP_IOXPUT_32(isp, src->ct_resid, &dst->ct_resid); 3058 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_oxid, &dst->ct_oxid); 3059 1.1 mjacob ISP_IOXPUT_16(isp, src->ct_scsi_status, &dst->ct_scsi_status); 3060 1.1 mjacob if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE0) { 3061 1.1 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.reloff, &dst->rsp.m0.reloff); 3062 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.reserved0, &dst->rsp.m0.reserved0); 3063 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.ct_xfrlen, &dst->rsp.m0.ct_xfrlen); 3064 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.reserved1, &dst->rsp.m0.reserved1); 3065 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_base, &dst->rsp.m0.ds.ds_base); 3066 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_basehi, &dst->rsp.m0.ds.ds_basehi); 3067 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_count, &dst->rsp.m0.ds.ds_count); 3068 1.1 mjacob } else if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE1) { 3069 1.3 mjacob uint32_t *a, *b; 3070 1.3 mjacob 3071 1.4 mjacob ISP_IOXPUT_16(isp, src->rsp.m1.ct_resplen, &dst->rsp.m1.ct_resplen); 3072 1.1 mjacob ISP_IOXPUT_16(isp, src->rsp.m1.reserved, &dst->rsp.m1.reserved); 3073 1.3 mjacob a = (uint32_t *) src->rsp.m1.ct_resp; 3074 1.3 mjacob b = (uint32_t *) dst->rsp.m1.ct_resp; 3075 1.3 mjacob for (i = 0; i < (ASIZE(src->rsp.m1.ct_resp) >> 2); i++) { 3076 1.3 mjacob *b++ = ISP_SWAP32(isp, *a++); 3077 1.1 mjacob } 3078 1.1 mjacob } else { 3079 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m2.reserved0, &dst->rsp.m2.reserved0); 3080 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m2.ct_datalen, &dst->rsp.m2.ct_datalen); 3081 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m2.reserved1, &dst->rsp.m2.reserved1); 3082 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_base, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_base); 3083 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_basehi, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_basehi); 3084 1.4 mjacob ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_count, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_count); 3085 1.1 mjacob } 3086 1.1 mjacob } 3087 1.1 mjacob 3088 1.1 mjacob 3089 1.1 mjacob void 3090 1.1 mjacob isp_get_ctio2(ispsoftc_t *isp, ct2_entry_t *src, ct2_entry_t *dst) 3091 1.1 mjacob { 3092 1.1 mjacob int i; 3093 1.1 mjacob 3094 1.1 mjacob isp_get_hdr(isp, &src->ct_header, &dst->ct_header); 3095 1.1 mjacob ISP_IOXGET_32(isp, &src->ct_syshandle, dst->ct_syshandle); 3096 1.1 mjacob ISP_IOXGET_8(isp, &src->ct_lun, dst->ct_lun); 3097 1.1 mjacob ISP_IOXGET_8(isp, &src->ct_iid, dst->ct_iid); 3098 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_rxid, dst->ct_rxid); 3099 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_flags, dst->ct_flags); 3100 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_status, dst->ct_status); 3101 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_timeout, dst->ct_timeout); 3102 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_seg_count, dst->ct_seg_count); 3103 1.1 mjacob ISP_IOXGET_32(isp, &src->ct_reloff, dst->ct_reloff); 3104 1.1 mjacob ISP_IOXGET_32(isp, &src->ct_resid, dst->ct_resid); 3105 1.1 mjacob if ((dst->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) { 3106 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0._reserved, dst->rsp.m0._reserved); 3107 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m0._reserved2, dst->rsp.m0._reserved2); 3108 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m0.ct_scsi_status, dst->rsp.m0.ct_scsi_status); 3109 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.ct_xfrlen, dst->rsp.m0.ct_xfrlen); 3110 1.1 mjacob if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO2) { 3111 1.1 mjacob for (i = 0; i < ISP_RQDSEG_T2; i++) { 3112 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg[i].ds_base, dst->rsp.m0.u.ct_dataseg[i].ds_base); 3113 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg[i].ds_count, dst->rsp.m0.u.ct_dataseg[i].ds_count); 3114 1.1 mjacob } 3115 1.1 mjacob } else if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO3) { 3116 1.1 mjacob for (i = 0; i < ISP_RQDSEG_T3; i++) { 3117 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_base, dst->rsp.m0.u.ct_dataseg64[i].ds_base); 3118 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_basehi, dst->rsp.m0.u.ct_dataseg64[i].ds_basehi); 3119 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_count, dst->rsp.m0.u.ct_dataseg64[i].ds_count); 3120 1.1 mjacob } 3121 1.1 mjacob } else if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO4) { 3122 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m0.u.ct_dslist.ds_type, dst->rsp.m0.u.ct_dslist.ds_type); 3123 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dslist.ds_segment, dst->rsp.m0.u.ct_dslist.ds_segment); 3124 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dslist.ds_base, dst->rsp.m0.u.ct_dslist.ds_base); 3125 1.1 mjacob } 3126 1.1 mjacob } else if ((dst->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) { 3127 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m1._reserved, dst->rsp.m1._reserved); 3128 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m1._reserved2, dst->rsp.m1._reserved2); 3129 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m1.ct_senselen, dst->rsp.m1.ct_senselen); 3130 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m1.ct_scsi_status, dst->rsp.m1.ct_scsi_status); 3131 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m1.ct_resplen, dst->rsp.m1.ct_resplen); 3132 1.1 mjacob for (i = 0; i < MAXRESPLEN; i++) { 3133 1.4 mjacob ISP_IOXGET_8(isp, &src->rsp.m1.ct_resp[i], dst->rsp.m1.ct_resp[i]); 3134 1.1 mjacob } 3135 1.1 mjacob } else { 3136 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m2._reserved, dst->rsp.m2._reserved); 3137 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m2._reserved2, dst->rsp.m2._reserved2); 3138 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m2._reserved3, dst->rsp.m2._reserved3); 3139 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m2.ct_datalen, dst->rsp.m2.ct_datalen); 3140 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_base, dst->rsp.m2.ct_fcp_rsp_iudata.ds_base); 3141 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_count, dst->rsp.m2.ct_fcp_rsp_iudata.ds_count); 3142 1.1 mjacob } 3143 1.1 mjacob } 3144 1.1 mjacob 3145 1.1 mjacob void 3146 1.1 mjacob isp_get_ctio2e(ispsoftc_t *isp, ct2e_entry_t *src, ct2e_entry_t *dst) 3147 1.1 mjacob { 3148 1.1 mjacob int i; 3149 1.1 mjacob 3150 1.1 mjacob isp_get_hdr(isp, &src->ct_header, &dst->ct_header); 3151 1.1 mjacob ISP_IOXGET_32(isp, &src->ct_syshandle, dst->ct_syshandle); 3152 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_iid, dst->ct_iid); 3153 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_rxid, dst->ct_rxid); 3154 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_flags, dst->ct_flags); 3155 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_status, dst->ct_status); 3156 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_timeout, dst->ct_timeout); 3157 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_seg_count, dst->ct_seg_count); 3158 1.1 mjacob ISP_IOXGET_32(isp, &src->ct_reloff, dst->ct_reloff); 3159 1.1 mjacob ISP_IOXGET_32(isp, &src->ct_resid, dst->ct_resid); 3160 1.1 mjacob if ((dst->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) { 3161 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0._reserved, dst->rsp.m0._reserved); 3162 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m0._reserved2, dst->rsp.m0._reserved2); 3163 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m0.ct_scsi_status, dst->rsp.m0.ct_scsi_status); 3164 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.ct_xfrlen, dst->rsp.m0.ct_xfrlen); 3165 1.1 mjacob if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) { 3166 1.1 mjacob for (i = 0; i < ISP_RQDSEG_T2; i++) { 3167 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg[i].ds_base, dst->rsp.m0.u.ct_dataseg[i].ds_base); 3168 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg[i].ds_count, dst->rsp.m0.u.ct_dataseg[i].ds_count); 3169 1.1 mjacob } 3170 1.1 mjacob } else if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO3) { 3171 1.1 mjacob for (i = 0; i < ISP_RQDSEG_T3; i++) { 3172 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_base, dst->rsp.m0.u.ct_dataseg64[i].ds_base); 3173 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_basehi, dst->rsp.m0.u.ct_dataseg64[i].ds_basehi); 3174 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_count, dst->rsp.m0.u.ct_dataseg64[i].ds_count); 3175 1.1 mjacob } 3176 1.1 mjacob } else if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO4) { 3177 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m0.u.ct_dslist.ds_type, dst->rsp.m0.u.ct_dslist.ds_type); 3178 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dslist.ds_segment, dst->rsp.m0.u.ct_dslist.ds_segment); 3179 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dslist.ds_base, dst->rsp.m0.u.ct_dslist.ds_base); 3180 1.1 mjacob } 3181 1.1 mjacob } else if ((dst->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) { 3182 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m1._reserved, dst->rsp.m1._reserved); 3183 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m1._reserved2, dst->rsp.m1._reserved2); 3184 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m1.ct_senselen, dst->rsp.m1.ct_senselen); 3185 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m1.ct_scsi_status, dst->rsp.m1.ct_scsi_status); 3186 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m1.ct_resplen, dst->rsp.m1.ct_resplen); 3187 1.1 mjacob for (i = 0; i < MAXRESPLEN; i++) { 3188 1.4 mjacob ISP_IOXGET_8(isp, &src->rsp.m1.ct_resp[i], dst->rsp.m1.ct_resp[i]); 3189 1.1 mjacob } 3190 1.1 mjacob } else { 3191 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m2._reserved, dst->rsp.m2._reserved); 3192 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m2._reserved2, dst->rsp.m2._reserved2); 3193 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m2._reserved3, dst->rsp.m2._reserved3); 3194 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m2.ct_datalen, dst->rsp.m2.ct_datalen); 3195 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_base, dst->rsp.m2.ct_fcp_rsp_iudata.ds_base); 3196 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_count, dst->rsp.m2.ct_fcp_rsp_iudata.ds_count); 3197 1.1 mjacob } 3198 1.1 mjacob } 3199 1.1 mjacob 3200 1.1 mjacob void 3201 1.1 mjacob isp_get_ctio7(ispsoftc_t *isp, ct7_entry_t *src, ct7_entry_t *dst) 3202 1.1 mjacob { 3203 1.1 mjacob int i; 3204 1.1 mjacob 3205 1.1 mjacob isp_get_hdr(isp, &src->ct_header, &dst->ct_header); 3206 1.1 mjacob ISP_IOXGET_32(isp, &src->ct_syshandle, dst->ct_syshandle); 3207 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_nphdl, dst->ct_nphdl); 3208 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_timeout, dst->ct_timeout); 3209 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_seg_count, dst->ct_seg_count); 3210 1.4 mjacob ISP_IOXGET_8(isp, &src->ct_vpidx, dst->ct_vpidx); 3211 1.1 mjacob ISP_IOXGET_8(isp, &src->ct_xflags, dst->ct_xflags); 3212 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_iid_lo, dst->ct_iid_lo); 3213 1.1 mjacob ISP_IOXGET_8(isp, &src->ct_iid_hi, dst->ct_iid_hi); 3214 1.1 mjacob ISP_IOXGET_8(isp, &src->ct_reserved, dst->ct_reserved); 3215 1.1 mjacob ISP_IOXGET_32(isp, &src->ct_rxid, dst->ct_rxid); 3216 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_senselen, dst->ct_senselen); 3217 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_flags, dst->ct_flags); 3218 1.1 mjacob ISP_IOXGET_32(isp, &src->ct_resid, dst->ct_resid); 3219 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_oxid, dst->ct_oxid); 3220 1.1 mjacob ISP_IOXGET_16(isp, &src->ct_scsi_status, dst->ct_scsi_status); 3221 1.1 mjacob if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE0) { 3222 1.1 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.reloff, dst->rsp.m0.reloff); 3223 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.reserved0, dst->rsp.m0.reserved0); 3224 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.ct_xfrlen, dst->rsp.m0.ct_xfrlen); 3225 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.reserved1, dst->rsp.m0.reserved1); 3226 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_base, dst->rsp.m0.ds.ds_base); 3227 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_basehi, dst->rsp.m0.ds.ds_basehi); 3228 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_count, dst->rsp.m0.ds.ds_count); 3229 1.1 mjacob } else if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE1) { 3230 1.3 mjacob uint32_t *a, *b; 3231 1.3 mjacob 3232 1.4 mjacob ISP_IOXGET_16(isp, &src->rsp.m1.ct_resplen, dst->rsp.m1.ct_resplen); 3233 1.1 mjacob ISP_IOXGET_16(isp, &src->rsp.m1.reserved, dst->rsp.m1.reserved); 3234 1.3 mjacob a = (uint32_t *) src->rsp.m1.ct_resp; 3235 1.3 mjacob b = (uint32_t *) dst->rsp.m1.ct_resp; 3236 1.1 mjacob for (i = 0; i < MAXRESPLEN_24XX; i++) { 3237 1.4 mjacob ISP_IOXGET_8(isp, &src->rsp.m1.ct_resp[i], dst->rsp.m1.ct_resp[i]); 3238 1.1 mjacob } 3239 1.3 mjacob for (i = 0; i < (ASIZE(src->rsp.m1.ct_resp) >> 2); i++) { 3240 1.3 mjacob *b++ = ISP_SWAP32(isp, *a++); 3241 1.3 mjacob } 3242 1.1 mjacob } else { 3243 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m2.reserved0, dst->rsp.m2.reserved0); 3244 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m2.ct_datalen, dst->rsp.m2.ct_datalen); 3245 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m2.reserved1, dst->rsp.m2.reserved1); 3246 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_base, dst->rsp.m2.ct_fcp_rsp_iudata.ds_base); 3247 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_basehi, dst->rsp.m2.ct_fcp_rsp_iudata.ds_basehi); 3248 1.4 mjacob ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_count, dst->rsp.m2.ct_fcp_rsp_iudata.ds_count); 3249 1.1 mjacob } 3250 1.1 mjacob } 3251 1.1 mjacob 3252 1.1 mjacob void 3253 1.1 mjacob isp_put_enable_lun(ispsoftc_t *isp, lun_entry_t *lesrc, lun_entry_t *ledst) 3254 1.1 mjacob { 3255 1.1 mjacob int i; 3256 1.1 mjacob isp_put_hdr(isp, &lesrc->le_header, &ledst->le_header); 3257 1.1 mjacob ISP_IOXPUT_32(isp, lesrc->le_reserved, &ledst->le_reserved); 3258 1.1 mjacob if (ISP_IS_SBUS(isp)) { 3259 1.1 mjacob ISP_IOXPUT_8(isp, lesrc->le_lun, &ledst->le_rsvd); 3260 1.1 mjacob ISP_IOXPUT_8(isp, lesrc->le_rsvd, &ledst->le_lun); 3261 1.1 mjacob ISP_IOXPUT_8(isp, lesrc->le_ops, &ledst->le_tgt); 3262 1.1 mjacob ISP_IOXPUT_8(isp, lesrc->le_tgt, &ledst->le_ops); 3263 1.1 mjacob ISP_IOXPUT_8(isp, lesrc->le_status, &ledst->le_reserved2); 3264 1.1 mjacob ISP_IOXPUT_8(isp, lesrc->le_reserved2, &ledst->le_status); 3265 1.1 mjacob ISP_IOXPUT_8(isp, lesrc->le_cmd_count, &ledst->le_in_count); 3266 1.1 mjacob ISP_IOXPUT_8(isp, lesrc->le_in_count, &ledst->le_cmd_count); 3267 1.1 mjacob ISP_IOXPUT_8(isp, lesrc->le_cdb6len, &ledst->le_cdb7len); 3268 1.1 mjacob ISP_IOXPUT_8(isp, lesrc->le_cdb7len, &ledst->le_cdb6len); 3269 1.1 mjacob } else { 3270 1.1 mjacob ISP_IOXPUT_8(isp, lesrc->le_lun, &ledst->le_lun); 3271 1.1 mjacob ISP_IOXPUT_8(isp, lesrc->le_rsvd, &ledst->le_rsvd); 3272 1.1 mjacob ISP_IOXPUT_8(isp, lesrc->le_ops, &ledst->le_ops); 3273 1.1 mjacob ISP_IOXPUT_8(isp, lesrc->le_tgt, &ledst->le_tgt); 3274 1.1 mjacob ISP_IOXPUT_8(isp, lesrc->le_status, &ledst->le_status); 3275 1.1 mjacob ISP_IOXPUT_8(isp, lesrc->le_reserved2, &ledst->le_reserved2); 3276 1.1 mjacob ISP_IOXPUT_8(isp, lesrc->le_cmd_count, &ledst->le_cmd_count); 3277 1.1 mjacob ISP_IOXPUT_8(isp, lesrc->le_in_count, &ledst->le_in_count); 3278 1.1 mjacob ISP_IOXPUT_8(isp, lesrc->le_cdb6len, &ledst->le_cdb6len); 3279 1.1 mjacob ISP_IOXPUT_8(isp, lesrc->le_cdb7len, &ledst->le_cdb7len); 3280 1.1 mjacob } 3281 1.1 mjacob ISP_IOXPUT_32(isp, lesrc->le_flags, &ledst->le_flags); 3282 1.1 mjacob ISP_IOXPUT_16(isp, lesrc->le_timeout, &ledst->le_timeout); 3283 1.1 mjacob for (i = 0; i < 20; i++) { 3284 1.4 mjacob ISP_IOXPUT_8(isp, lesrc->le_reserved3[i], &ledst->le_reserved3[i]); 3285 1.1 mjacob } 3286 1.1 mjacob } 3287 1.1 mjacob 3288 1.1 mjacob void 3289 1.1 mjacob isp_get_enable_lun(ispsoftc_t *isp, lun_entry_t *lesrc, lun_entry_t *ledst) 3290 1.1 mjacob { 3291 1.1 mjacob int i; 3292 1.1 mjacob isp_get_hdr(isp, &lesrc->le_header, &ledst->le_header); 3293 1.1 mjacob ISP_IOXGET_32(isp, &lesrc->le_reserved, ledst->le_reserved); 3294 1.1 mjacob if (ISP_IS_SBUS(isp)) { 3295 1.1 mjacob ISP_IOXGET_8(isp, &lesrc->le_lun, ledst->le_rsvd); 3296 1.1 mjacob ISP_IOXGET_8(isp, &lesrc->le_rsvd, ledst->le_lun); 3297 1.1 mjacob ISP_IOXGET_8(isp, &lesrc->le_ops, ledst->le_tgt); 3298 1.1 mjacob ISP_IOXGET_8(isp, &lesrc->le_tgt, ledst->le_ops); 3299 1.1 mjacob ISP_IOXGET_8(isp, &lesrc->le_status, ledst->le_reserved2); 3300 1.1 mjacob ISP_IOXGET_8(isp, &lesrc->le_reserved2, ledst->le_status); 3301 1.1 mjacob ISP_IOXGET_8(isp, &lesrc->le_cmd_count, ledst->le_in_count); 3302 1.1 mjacob ISP_IOXGET_8(isp, &lesrc->le_in_count, ledst->le_cmd_count); 3303 1.1 mjacob ISP_IOXGET_8(isp, &lesrc->le_cdb6len, ledst->le_cdb7len); 3304 1.1 mjacob ISP_IOXGET_8(isp, &lesrc->le_cdb7len, ledst->le_cdb6len); 3305 1.1 mjacob } else { 3306 1.1 mjacob ISP_IOXGET_8(isp, &lesrc->le_lun, ledst->le_lun); 3307 1.1 mjacob ISP_IOXGET_8(isp, &lesrc->le_rsvd, ledst->le_rsvd); 3308 1.1 mjacob ISP_IOXGET_8(isp, &lesrc->le_ops, ledst->le_ops); 3309 1.1 mjacob ISP_IOXGET_8(isp, &lesrc->le_tgt, ledst->le_tgt); 3310 1.1 mjacob ISP_IOXGET_8(isp, &lesrc->le_status, ledst->le_status); 3311 1.1 mjacob ISP_IOXGET_8(isp, &lesrc->le_reserved2, ledst->le_reserved2); 3312 1.1 mjacob ISP_IOXGET_8(isp, &lesrc->le_cmd_count, ledst->le_cmd_count); 3313 1.1 mjacob ISP_IOXGET_8(isp, &lesrc->le_in_count, ledst->le_in_count); 3314 1.1 mjacob ISP_IOXGET_8(isp, &lesrc->le_cdb6len, ledst->le_cdb6len); 3315 1.1 mjacob ISP_IOXGET_8(isp, &lesrc->le_cdb7len, ledst->le_cdb7len); 3316 1.1 mjacob } 3317 1.1 mjacob ISP_IOXGET_32(isp, &lesrc->le_flags, ledst->le_flags); 3318 1.1 mjacob ISP_IOXGET_16(isp, &lesrc->le_timeout, ledst->le_timeout); 3319 1.1 mjacob for (i = 0; i < 20; i++) { 3320 1.4 mjacob ISP_IOXGET_8(isp, &lesrc->le_reserved3[i], ledst->le_reserved3[i]); 3321 1.1 mjacob } 3322 1.1 mjacob } 3323 1.1 mjacob 3324 1.1 mjacob void 3325 1.1 mjacob isp_put_notify(ispsoftc_t *isp, in_entry_t *src, in_entry_t *dst) 3326 1.1 mjacob { 3327 1.1 mjacob int i; 3328 1.1 mjacob isp_put_hdr(isp, &src->in_header, &dst->in_header); 3329 1.1 mjacob ISP_IOXPUT_32(isp, src->in_reserved, &dst->in_reserved); 3330 1.1 mjacob if (ISP_IS_SBUS(isp)) { 3331 1.1 mjacob ISP_IOXPUT_8(isp, src->in_lun, &dst->in_iid); 3332 1.1 mjacob ISP_IOXPUT_8(isp, src->in_iid, &dst->in_lun); 3333 1.1 mjacob ISP_IOXPUT_8(isp, src->in_reserved2, &dst->in_tgt); 3334 1.1 mjacob ISP_IOXPUT_8(isp, src->in_tgt, &dst->in_reserved2); 3335 1.1 mjacob ISP_IOXPUT_8(isp, src->in_status, &dst->in_rsvd2); 3336 1.1 mjacob ISP_IOXPUT_8(isp, src->in_rsvd2, &dst->in_status); 3337 1.1 mjacob ISP_IOXPUT_8(isp, src->in_tag_val, &dst->in_tag_type); 3338 1.1 mjacob ISP_IOXPUT_8(isp, src->in_tag_type, &dst->in_tag_val); 3339 1.1 mjacob } else { 3340 1.1 mjacob ISP_IOXPUT_8(isp, src->in_lun, &dst->in_lun); 3341 1.1 mjacob ISP_IOXPUT_8(isp, src->in_iid, &dst->in_iid); 3342 1.1 mjacob ISP_IOXPUT_8(isp, src->in_reserved2, &dst->in_reserved2); 3343 1.1 mjacob ISP_IOXPUT_8(isp, src->in_tgt, &dst->in_tgt); 3344 1.1 mjacob ISP_IOXPUT_8(isp, src->in_status, &dst->in_status); 3345 1.1 mjacob ISP_IOXPUT_8(isp, src->in_rsvd2, &dst->in_rsvd2); 3346 1.1 mjacob ISP_IOXPUT_8(isp, src->in_tag_val, &dst->in_tag_val); 3347 1.1 mjacob ISP_IOXPUT_8(isp, src->in_tag_type, &dst->in_tag_type); 3348 1.1 mjacob } 3349 1.1 mjacob ISP_IOXPUT_32(isp, src->in_flags, &dst->in_flags); 3350 1.1 mjacob ISP_IOXPUT_16(isp, src->in_seqid, &dst->in_seqid); 3351 1.1 mjacob for (i = 0; i < IN_MSGLEN; i++) { 3352 1.1 mjacob ISP_IOXPUT_8(isp, src->in_msg[i], &dst->in_msg[i]); 3353 1.1 mjacob } 3354 1.1 mjacob for (i = 0; i < IN_RSVDLEN; i++) { 3355 1.4 mjacob ISP_IOXPUT_8(isp, src->in_reserved3[i], &dst->in_reserved3[i]); 3356 1.1 mjacob } 3357 1.1 mjacob for (i = 0; i < QLTM_SENSELEN; i++) { 3358 1.4 mjacob ISP_IOXPUT_8(isp, src->in_sense[i], &dst->in_sense[i]); 3359 1.1 mjacob } 3360 1.1 mjacob } 3361 1.1 mjacob 3362 1.1 mjacob void 3363 1.1 mjacob isp_get_notify(ispsoftc_t *isp, in_entry_t *src, in_entry_t *dst) 3364 1.1 mjacob { 3365 1.1 mjacob int i; 3366 1.1 mjacob isp_get_hdr(isp, &src->in_header, &dst->in_header); 3367 1.1 mjacob ISP_IOXGET_32(isp, &src->in_reserved, dst->in_reserved); 3368 1.1 mjacob if (ISP_IS_SBUS(isp)) { 3369 1.1 mjacob ISP_IOXGET_8(isp, &src->in_lun, dst->in_iid); 3370 1.1 mjacob ISP_IOXGET_8(isp, &src->in_iid, dst->in_lun); 3371 1.1 mjacob ISP_IOXGET_8(isp, &src->in_reserved2, dst->in_tgt); 3372 1.1 mjacob ISP_IOXGET_8(isp, &src->in_tgt, dst->in_reserved2); 3373 1.1 mjacob ISP_IOXGET_8(isp, &src->in_status, dst->in_rsvd2); 3374 1.1 mjacob ISP_IOXGET_8(isp, &src->in_rsvd2, dst->in_status); 3375 1.1 mjacob ISP_IOXGET_8(isp, &src->in_tag_val, dst->in_tag_type); 3376 1.1 mjacob ISP_IOXGET_8(isp, &src->in_tag_type, dst->in_tag_val); 3377 1.1 mjacob } else { 3378 1.1 mjacob ISP_IOXGET_8(isp, &src->in_lun, dst->in_lun); 3379 1.1 mjacob ISP_IOXGET_8(isp, &src->in_iid, dst->in_iid); 3380 1.1 mjacob ISP_IOXGET_8(isp, &src->in_reserved2, dst->in_reserved2); 3381 1.1 mjacob ISP_IOXGET_8(isp, &src->in_tgt, dst->in_tgt); 3382 1.1 mjacob ISP_IOXGET_8(isp, &src->in_status, dst->in_status); 3383 1.1 mjacob ISP_IOXGET_8(isp, &src->in_rsvd2, dst->in_rsvd2); 3384 1.1 mjacob ISP_IOXGET_8(isp, &src->in_tag_val, dst->in_tag_val); 3385 1.1 mjacob ISP_IOXGET_8(isp, &src->in_tag_type, dst->in_tag_type); 3386 1.1 mjacob } 3387 1.1 mjacob ISP_IOXGET_32(isp, &src->in_flags, dst->in_flags); 3388 1.1 mjacob ISP_IOXGET_16(isp, &src->in_seqid, dst->in_seqid); 3389 1.1 mjacob for (i = 0; i < IN_MSGLEN; i++) { 3390 1.1 mjacob ISP_IOXGET_8(isp, &src->in_msg[i], dst->in_msg[i]); 3391 1.1 mjacob } 3392 1.1 mjacob for (i = 0; i < IN_RSVDLEN; i++) { 3393 1.4 mjacob ISP_IOXGET_8(isp, &src->in_reserved3[i], dst->in_reserved3[i]); 3394 1.1 mjacob } 3395 1.1 mjacob for (i = 0; i < QLTM_SENSELEN; i++) { 3396 1.4 mjacob ISP_IOXGET_8(isp, &src->in_sense[i], dst->in_sense[i]); 3397 1.1 mjacob } 3398 1.1 mjacob } 3399 1.1 mjacob 3400 1.1 mjacob void 3401 1.4 mjacob isp_put_notify_fc(ispsoftc_t *isp, in_fcentry_t *src, in_fcentry_t *dst) 3402 1.1 mjacob { 3403 1.1 mjacob isp_put_hdr(isp, &src->in_header, &dst->in_header); 3404 1.1 mjacob ISP_IOXPUT_32(isp, src->in_reserved, &dst->in_reserved); 3405 1.1 mjacob ISP_IOXPUT_8(isp, src->in_lun, &dst->in_lun); 3406 1.1 mjacob ISP_IOXPUT_8(isp, src->in_iid, &dst->in_iid); 3407 1.1 mjacob ISP_IOXPUT_16(isp, src->in_scclun, &dst->in_scclun); 3408 1.1 mjacob ISP_IOXPUT_32(isp, src->in_reserved2, &dst->in_reserved2); 3409 1.1 mjacob ISP_IOXPUT_16(isp, src->in_status, &dst->in_status); 3410 1.1 mjacob ISP_IOXPUT_16(isp, src->in_task_flags, &dst->in_task_flags); 3411 1.1 mjacob ISP_IOXPUT_16(isp, src->in_seqid, &dst->in_seqid); 3412 1.1 mjacob } 3413 1.1 mjacob 3414 1.1 mjacob void 3415 1.4 mjacob isp_put_notify_fc_e(ispsoftc_t *isp, in_fcentry_e_t *src, in_fcentry_e_t *dst) 3416 1.1 mjacob { 3417 1.1 mjacob isp_put_hdr(isp, &src->in_header, &dst->in_header); 3418 1.1 mjacob ISP_IOXPUT_32(isp, src->in_reserved, &dst->in_reserved); 3419 1.1 mjacob ISP_IOXPUT_16(isp, src->in_iid, &dst->in_iid); 3420 1.1 mjacob ISP_IOXPUT_16(isp, src->in_scclun, &dst->in_scclun); 3421 1.1 mjacob ISP_IOXPUT_32(isp, src->in_reserved2, &dst->in_reserved2); 3422 1.1 mjacob ISP_IOXPUT_16(isp, src->in_status, &dst->in_status); 3423 1.1 mjacob ISP_IOXPUT_16(isp, src->in_task_flags, &dst->in_task_flags); 3424 1.1 mjacob ISP_IOXPUT_16(isp, src->in_seqid, &dst->in_seqid); 3425 1.1 mjacob } 3426 1.1 mjacob 3427 1.1 mjacob void 3428 1.4 mjacob isp_put_notify_24xx(ispsoftc_t *isp, in_fcentry_24xx_t *src, in_fcentry_24xx_t *dst) 3429 1.1 mjacob { 3430 1.1 mjacob int i; 3431 1.1 mjacob 3432 1.1 mjacob isp_put_hdr(isp, &src->in_header, &dst->in_header); 3433 1.1 mjacob ISP_IOXPUT_32(isp, src->in_reserved, &dst->in_reserved); 3434 1.1 mjacob ISP_IOXPUT_16(isp, src->in_nphdl, &dst->in_nphdl); 3435 1.1 mjacob ISP_IOXPUT_16(isp, src->in_reserved1, &dst->in_reserved1); 3436 1.1 mjacob ISP_IOXPUT_16(isp, src->in_flags, &dst->in_flags); 3437 1.1 mjacob ISP_IOXPUT_16(isp, src->in_srr_rxid, &dst->in_srr_rxid); 3438 1.1 mjacob ISP_IOXPUT_16(isp, src->in_status, &dst->in_status); 3439 1.1 mjacob ISP_IOXPUT_8(isp, src->in_status_subcode, &dst->in_status_subcode); 3440 1.1 mjacob ISP_IOXPUT_16(isp, src->in_reserved2, &dst->in_reserved2); 3441 1.1 mjacob ISP_IOXPUT_32(isp, src->in_rxid, &dst->in_rxid); 3442 1.1 mjacob ISP_IOXPUT_16(isp, src->in_srr_reloff_hi, &dst->in_srr_reloff_hi); 3443 1.1 mjacob ISP_IOXPUT_16(isp, src->in_srr_reloff_lo, &dst->in_srr_reloff_lo); 3444 1.1 mjacob ISP_IOXPUT_16(isp, src->in_srr_iu, &dst->in_srr_iu); 3445 1.1 mjacob ISP_IOXPUT_16(isp, src->in_srr_oxid, &dst->in_srr_oxid); 3446 1.3 mjacob ISP_IOXPUT_16(isp, src->in_nport_id_hi, &dst->in_nport_id_hi); 3447 1.3 mjacob ISP_IOXPUT_8(isp, src->in_nport_id_lo, &dst->in_nport_id_lo); 3448 1.3 mjacob ISP_IOXPUT_8(isp, src->in_reserved3, &dst->in_reserved3); 3449 1.3 mjacob ISP_IOXPUT_16(isp, src->in_np_handle, &dst->in_np_handle); 3450 1.3 mjacob for (i = 0; i < ASIZE(src->in_reserved4); i++) { 3451 1.3 mjacob ISP_IOXPUT_8(isp, src->in_reserved4[i], &dst->in_reserved4[i]); 3452 1.1 mjacob } 3453 1.3 mjacob ISP_IOXPUT_8(isp, src->in_reserved5, &dst->in_reserved5); 3454 1.4 mjacob ISP_IOXPUT_8(isp, src->in_vpidx, &dst->in_vpidx); 3455 1.3 mjacob ISP_IOXPUT_32(isp, src->in_reserved6, &dst->in_reserved6); 3456 1.1 mjacob ISP_IOXPUT_16(isp, src->in_portid_lo, &dst->in_portid_lo); 3457 1.1 mjacob ISP_IOXPUT_8(isp, src->in_portid_hi, &dst->in_portid_hi); 3458 1.3 mjacob ISP_IOXPUT_8(isp, src->in_reserved7, &dst->in_reserved7); 3459 1.3 mjacob ISP_IOXPUT_16(isp, src->in_reserved8, &dst->in_reserved8); 3460 1.1 mjacob ISP_IOXPUT_16(isp, src->in_oxid, &dst->in_oxid); 3461 1.1 mjacob } 3462 1.1 mjacob 3463 1.1 mjacob void 3464 1.4 mjacob isp_get_notify_fc(ispsoftc_t *isp, in_fcentry_t *src, in_fcentry_t *dst) 3465 1.1 mjacob { 3466 1.1 mjacob isp_get_hdr(isp, &src->in_header, &dst->in_header); 3467 1.1 mjacob ISP_IOXGET_32(isp, &src->in_reserved, dst->in_reserved); 3468 1.1 mjacob ISP_IOXGET_8(isp, &src->in_lun, dst->in_lun); 3469 1.1 mjacob ISP_IOXGET_8(isp, &src->in_iid, dst->in_iid); 3470 1.1 mjacob ISP_IOXGET_16(isp, &src->in_scclun, dst->in_scclun); 3471 1.1 mjacob ISP_IOXGET_32(isp, &src->in_reserved2, dst->in_reserved2); 3472 1.1 mjacob ISP_IOXGET_16(isp, &src->in_status, dst->in_status); 3473 1.1 mjacob ISP_IOXGET_16(isp, &src->in_task_flags, dst->in_task_flags); 3474 1.1 mjacob ISP_IOXGET_16(isp, &src->in_seqid, dst->in_seqid); 3475 1.1 mjacob } 3476 1.1 mjacob 3477 1.1 mjacob void 3478 1.4 mjacob isp_get_notify_fc_e(ispsoftc_t *isp, in_fcentry_e_t *src, in_fcentry_e_t *dst) 3479 1.1 mjacob { 3480 1.1 mjacob isp_get_hdr(isp, &src->in_header, &dst->in_header); 3481 1.1 mjacob ISP_IOXGET_32(isp, &src->in_reserved, dst->in_reserved); 3482 1.1 mjacob ISP_IOXGET_16(isp, &src->in_iid, dst->in_iid); 3483 1.1 mjacob ISP_IOXGET_16(isp, &src->in_scclun, dst->in_scclun); 3484 1.1 mjacob ISP_IOXGET_32(isp, &src->in_reserved2, dst->in_reserved2); 3485 1.1 mjacob ISP_IOXGET_16(isp, &src->in_status, dst->in_status); 3486 1.1 mjacob ISP_IOXGET_16(isp, &src->in_task_flags, dst->in_task_flags); 3487 1.1 mjacob ISP_IOXGET_16(isp, &src->in_seqid, dst->in_seqid); 3488 1.1 mjacob } 3489 1.1 mjacob 3490 1.1 mjacob void 3491 1.4 mjacob isp_get_notify_24xx(ispsoftc_t *isp, in_fcentry_24xx_t *src, in_fcentry_24xx_t *dst) 3492 1.1 mjacob { 3493 1.1 mjacob int i; 3494 1.1 mjacob 3495 1.1 mjacob isp_get_hdr(isp, &src->in_header, &dst->in_header); 3496 1.1 mjacob ISP_IOXGET_32(isp, &src->in_reserved, dst->in_reserved); 3497 1.1 mjacob ISP_IOXGET_16(isp, &src->in_nphdl, dst->in_nphdl); 3498 1.1 mjacob ISP_IOXGET_16(isp, &src->in_reserved1, dst->in_reserved1); 3499 1.1 mjacob ISP_IOXGET_16(isp, &src->in_flags, dst->in_flags); 3500 1.1 mjacob ISP_IOXGET_16(isp, &src->in_srr_rxid, dst->in_srr_rxid); 3501 1.1 mjacob ISP_IOXGET_16(isp, &src->in_status, dst->in_status); 3502 1.1 mjacob ISP_IOXGET_8(isp, &src->in_status_subcode, dst->in_status_subcode); 3503 1.1 mjacob ISP_IOXGET_16(isp, &src->in_reserved2, dst->in_reserved2); 3504 1.1 mjacob ISP_IOXGET_32(isp, &src->in_rxid, dst->in_rxid); 3505 1.1 mjacob ISP_IOXGET_16(isp, &src->in_srr_reloff_hi, dst->in_srr_reloff_hi); 3506 1.1 mjacob ISP_IOXGET_16(isp, &src->in_srr_reloff_lo, dst->in_srr_reloff_lo); 3507 1.1 mjacob ISP_IOXGET_16(isp, &src->in_srr_iu, dst->in_srr_iu); 3508 1.1 mjacob ISP_IOXGET_16(isp, &src->in_srr_oxid, dst->in_srr_oxid); 3509 1.3 mjacob ISP_IOXGET_16(isp, &src->in_nport_id_hi, dst->in_nport_id_hi); 3510 1.3 mjacob ISP_IOXGET_8(isp, &src->in_nport_id_lo, dst->in_nport_id_lo); 3511 1.3 mjacob ISP_IOXGET_8(isp, &src->in_reserved3, dst->in_reserved3); 3512 1.3 mjacob ISP_IOXGET_16(isp, &src->in_np_handle, dst->in_np_handle); 3513 1.3 mjacob for (i = 0; i < ASIZE(src->in_reserved4); i++) { 3514 1.3 mjacob ISP_IOXGET_8(isp, &src->in_reserved4[i], dst->in_reserved4[i]); 3515 1.1 mjacob } 3516 1.3 mjacob ISP_IOXGET_8(isp, &src->in_reserved5, dst->in_reserved5); 3517 1.4 mjacob ISP_IOXGET_8(isp, &src->in_vpidx, dst->in_vpidx); 3518 1.3 mjacob ISP_IOXGET_32(isp, &src->in_reserved6, dst->in_reserved6); 3519 1.1 mjacob ISP_IOXGET_16(isp, &src->in_portid_lo, dst->in_portid_lo); 3520 1.1 mjacob ISP_IOXGET_8(isp, &src->in_portid_hi, dst->in_portid_hi); 3521 1.3 mjacob ISP_IOXGET_8(isp, &src->in_reserved7, dst->in_reserved7); 3522 1.3 mjacob ISP_IOXGET_16(isp, &src->in_reserved8, dst->in_reserved8); 3523 1.1 mjacob ISP_IOXGET_16(isp, &src->in_oxid, dst->in_oxid); 3524 1.1 mjacob } 3525 1.1 mjacob 3526 1.1 mjacob void 3527 1.1 mjacob isp_put_notify_ack(ispsoftc_t *isp, na_entry_t *src, na_entry_t *dst) 3528 1.1 mjacob { 3529 1.1 mjacob int i; 3530 1.1 mjacob isp_put_hdr(isp, &src->na_header, &dst->na_header); 3531 1.1 mjacob ISP_IOXPUT_32(isp, src->na_reserved, &dst->na_reserved); 3532 1.1 mjacob if (ISP_IS_SBUS(isp)) { 3533 1.1 mjacob ISP_IOXPUT_8(isp, src->na_lun, &dst->na_iid); 3534 1.1 mjacob ISP_IOXPUT_8(isp, src->na_iid, &dst->na_lun); 3535 1.1 mjacob ISP_IOXPUT_8(isp, src->na_status, &dst->na_event); 3536 1.1 mjacob ISP_IOXPUT_8(isp, src->na_event, &dst->na_status); 3537 1.1 mjacob } else { 3538 1.1 mjacob ISP_IOXPUT_8(isp, src->na_lun, &dst->na_lun); 3539 1.1 mjacob ISP_IOXPUT_8(isp, src->na_iid, &dst->na_iid); 3540 1.1 mjacob ISP_IOXPUT_8(isp, src->na_status, &dst->na_status); 3541 1.1 mjacob ISP_IOXPUT_8(isp, src->na_event, &dst->na_event); 3542 1.1 mjacob } 3543 1.1 mjacob ISP_IOXPUT_32(isp, src->na_flags, &dst->na_flags); 3544 1.1 mjacob for (i = 0; i < NA_RSVDLEN; i++) { 3545 1.4 mjacob ISP_IOXPUT_16(isp, src->na_reserved3[i], &dst->na_reserved3[i]); 3546 1.1 mjacob } 3547 1.1 mjacob } 3548 1.1 mjacob 3549 1.1 mjacob void 3550 1.1 mjacob isp_get_notify_ack(ispsoftc_t *isp, na_entry_t *src, na_entry_t *dst) 3551 1.1 mjacob { 3552 1.1 mjacob int i; 3553 1.1 mjacob isp_get_hdr(isp, &src->na_header, &dst->na_header); 3554 1.1 mjacob ISP_IOXGET_32(isp, &src->na_reserved, dst->na_reserved); 3555 1.1 mjacob if (ISP_IS_SBUS(isp)) { 3556 1.1 mjacob ISP_IOXGET_8(isp, &src->na_lun, dst->na_iid); 3557 1.1 mjacob ISP_IOXGET_8(isp, &src->na_iid, dst->na_lun); 3558 1.1 mjacob ISP_IOXGET_8(isp, &src->na_status, dst->na_event); 3559 1.1 mjacob ISP_IOXGET_8(isp, &src->na_event, dst->na_status); 3560 1.1 mjacob } else { 3561 1.1 mjacob ISP_IOXGET_8(isp, &src->na_lun, dst->na_lun); 3562 1.1 mjacob ISP_IOXGET_8(isp, &src->na_iid, dst->na_iid); 3563 1.1 mjacob ISP_IOXGET_8(isp, &src->na_status, dst->na_status); 3564 1.1 mjacob ISP_IOXGET_8(isp, &src->na_event, dst->na_event); 3565 1.1 mjacob } 3566 1.1 mjacob ISP_IOXGET_32(isp, &src->na_flags, dst->na_flags); 3567 1.1 mjacob for (i = 0; i < NA_RSVDLEN; i++) { 3568 1.4 mjacob ISP_IOXGET_16(isp, &src->na_reserved3[i], dst->na_reserved3[i]); 3569 1.1 mjacob } 3570 1.1 mjacob } 3571 1.1 mjacob 3572 1.1 mjacob void 3573 1.4 mjacob isp_put_notify_ack_fc(ispsoftc_t *isp, na_fcentry_t *src, na_fcentry_t *dst) 3574 1.1 mjacob { 3575 1.1 mjacob int i; 3576 1.1 mjacob isp_put_hdr(isp, &src->na_header, &dst->na_header); 3577 1.1 mjacob ISP_IOXPUT_32(isp, src->na_reserved, &dst->na_reserved); 3578 1.1 mjacob ISP_IOXPUT_8(isp, src->na_reserved1, &dst->na_reserved1); 3579 1.1 mjacob ISP_IOXPUT_8(isp, src->na_iid, &dst->na_iid); 3580 1.1 mjacob ISP_IOXPUT_16(isp, src->na_response, &dst->na_response); 3581 1.1 mjacob ISP_IOXPUT_16(isp, src->na_flags, &dst->na_flags); 3582 1.1 mjacob ISP_IOXPUT_16(isp, src->na_reserved2, &dst->na_reserved2); 3583 1.1 mjacob ISP_IOXPUT_16(isp, src->na_status, &dst->na_status); 3584 1.1 mjacob ISP_IOXPUT_16(isp, src->na_task_flags, &dst->na_task_flags); 3585 1.1 mjacob ISP_IOXPUT_16(isp, src->na_seqid, &dst->na_seqid); 3586 1.1 mjacob for (i = 0; i < NA2_RSVDLEN; i++) { 3587 1.4 mjacob ISP_IOXPUT_16(isp, src->na_reserved3[i], &dst->na_reserved3[i]); 3588 1.1 mjacob } 3589 1.1 mjacob } 3590 1.1 mjacob 3591 1.1 mjacob void 3592 1.4 mjacob isp_put_notify_ack_fc_e(ispsoftc_t *isp, na_fcentry_e_t *src, na_fcentry_e_t *dst) 3593 1.1 mjacob { 3594 1.1 mjacob int i; 3595 1.1 mjacob isp_put_hdr(isp, &src->na_header, &dst->na_header); 3596 1.1 mjacob ISP_IOXPUT_32(isp, src->na_reserved, &dst->na_reserved); 3597 1.1 mjacob ISP_IOXPUT_16(isp, src->na_iid, &dst->na_iid); 3598 1.1 mjacob ISP_IOXPUT_16(isp, src->na_response, &dst->na_response); 3599 1.1 mjacob ISP_IOXPUT_16(isp, src->na_flags, &dst->na_flags); 3600 1.1 mjacob ISP_IOXPUT_16(isp, src->na_reserved2, &dst->na_reserved2); 3601 1.1 mjacob ISP_IOXPUT_16(isp, src->na_status, &dst->na_status); 3602 1.1 mjacob ISP_IOXPUT_16(isp, src->na_task_flags, &dst->na_task_flags); 3603 1.1 mjacob ISP_IOXPUT_16(isp, src->na_seqid, &dst->na_seqid); 3604 1.1 mjacob for (i = 0; i < NA2_RSVDLEN; i++) { 3605 1.4 mjacob ISP_IOXPUT_16(isp, src->na_reserved3[i], &dst->na_reserved3[i]); 3606 1.1 mjacob } 3607 1.1 mjacob } 3608 1.1 mjacob 3609 1.1 mjacob void 3610 1.4 mjacob isp_put_notify_24xx_ack(ispsoftc_t *isp, na_fcentry_24xx_t *src, na_fcentry_24xx_t *dst) 3611 1.1 mjacob { 3612 1.1 mjacob int i; 3613 1.1 mjacob 3614 1.1 mjacob isp_put_hdr(isp, &src->na_header, &dst->na_header); 3615 1.1 mjacob ISP_IOXPUT_32(isp, src->na_handle, &dst->na_handle); 3616 1.1 mjacob ISP_IOXPUT_16(isp, src->na_nphdl, &dst->na_nphdl); 3617 1.1 mjacob ISP_IOXPUT_16(isp, src->na_reserved1, &dst->na_reserved1); 3618 1.1 mjacob ISP_IOXPUT_16(isp, src->na_flags, &dst->na_flags); 3619 1.1 mjacob ISP_IOXPUT_16(isp, src->na_srr_rxid, &dst->na_srr_rxid); 3620 1.1 mjacob ISP_IOXPUT_16(isp, src->na_status, &dst->na_status); 3621 1.1 mjacob ISP_IOXPUT_8(isp, src->na_status_subcode, &dst->na_status_subcode); 3622 1.1 mjacob ISP_IOXPUT_16(isp, src->na_reserved2, &dst->na_reserved2); 3623 1.1 mjacob ISP_IOXPUT_32(isp, src->na_rxid, &dst->na_rxid); 3624 1.1 mjacob ISP_IOXPUT_16(isp, src->na_srr_reloff_hi, &dst->na_srr_reloff_hi); 3625 1.1 mjacob ISP_IOXPUT_16(isp, src->na_srr_reloff_lo, &dst->na_srr_reloff_lo); 3626 1.1 mjacob ISP_IOXPUT_16(isp, src->na_srr_iu, &dst->na_srr_iu); 3627 1.1 mjacob ISP_IOXPUT_16(isp, src->na_srr_flags, &dst->na_srr_flags); 3628 1.1 mjacob for (i = 0; i < 18; i++) { 3629 1.1 mjacob ISP_IOXPUT_8(isp, src->na_reserved3[i], &dst->na_reserved3[i]); 3630 1.1 mjacob } 3631 1.1 mjacob ISP_IOXPUT_8(isp, src->na_reserved4, &dst->na_reserved4); 3632 1.4 mjacob ISP_IOXPUT_8(isp, src->na_vpidx, &dst->na_vpidx); 3633 1.4 mjacob ISP_IOXPUT_8(isp, src->na_srr_reject_vunique, &dst->na_srr_reject_vunique); 3634 1.4 mjacob ISP_IOXPUT_8(isp, src->na_srr_reject_explanation, &dst->na_srr_reject_explanation); 3635 1.1 mjacob ISP_IOXPUT_8(isp, src->na_srr_reject_code, &dst->na_srr_reject_code); 3636 1.1 mjacob ISP_IOXPUT_8(isp, src->na_reserved5, &dst->na_reserved5); 3637 1.1 mjacob for (i = 0; i < 6; i++) { 3638 1.1 mjacob ISP_IOXPUT_8(isp, src->na_reserved6[i], &dst->na_reserved6[i]); 3639 1.1 mjacob } 3640 1.1 mjacob ISP_IOXPUT_16(isp, src->na_oxid, &dst->na_oxid); 3641 1.1 mjacob } 3642 1.1 mjacob 3643 1.1 mjacob void 3644 1.4 mjacob isp_get_notify_ack_fc(ispsoftc_t *isp, na_fcentry_t *src, na_fcentry_t *dst) 3645 1.1 mjacob { 3646 1.1 mjacob int i; 3647 1.1 mjacob isp_get_hdr(isp, &src->na_header, &dst->na_header); 3648 1.1 mjacob ISP_IOXGET_32(isp, &src->na_reserved, dst->na_reserved); 3649 1.1 mjacob ISP_IOXGET_8(isp, &src->na_reserved1, dst->na_reserved1); 3650 1.1 mjacob ISP_IOXGET_8(isp, &src->na_iid, dst->na_iid); 3651 1.1 mjacob ISP_IOXGET_16(isp, &src->na_response, dst->na_response); 3652 1.1 mjacob ISP_IOXGET_16(isp, &src->na_flags, dst->na_flags); 3653 1.1 mjacob ISP_IOXGET_16(isp, &src->na_reserved2, dst->na_reserved2); 3654 1.1 mjacob ISP_IOXGET_16(isp, &src->na_status, dst->na_status); 3655 1.1 mjacob ISP_IOXGET_16(isp, &src->na_task_flags, dst->na_task_flags); 3656 1.1 mjacob ISP_IOXGET_16(isp, &src->na_seqid, dst->na_seqid); 3657 1.1 mjacob for (i = 0; i < NA2_RSVDLEN; i++) { 3658 1.4 mjacob ISP_IOXGET_16(isp, &src->na_reserved3[i], dst->na_reserved3[i]); 3659 1.1 mjacob } 3660 1.1 mjacob } 3661 1.1 mjacob 3662 1.1 mjacob void 3663 1.4 mjacob isp_get_notify_ack_fc_e(ispsoftc_t *isp, na_fcentry_e_t *src, na_fcentry_e_t *dst) 3664 1.1 mjacob { 3665 1.1 mjacob int i; 3666 1.1 mjacob isp_get_hdr(isp, &src->na_header, &dst->na_header); 3667 1.1 mjacob ISP_IOXGET_32(isp, &src->na_reserved, dst->na_reserved); 3668 1.1 mjacob ISP_IOXGET_16(isp, &src->na_iid, dst->na_iid); 3669 1.1 mjacob ISP_IOXGET_16(isp, &src->na_response, dst->na_response); 3670 1.1 mjacob ISP_IOXGET_16(isp, &src->na_flags, dst->na_flags); 3671 1.1 mjacob ISP_IOXGET_16(isp, &src->na_reserved2, dst->na_reserved2); 3672 1.1 mjacob ISP_IOXGET_16(isp, &src->na_status, dst->na_status); 3673 1.1 mjacob ISP_IOXGET_16(isp, &src->na_task_flags, dst->na_task_flags); 3674 1.1 mjacob ISP_IOXGET_16(isp, &src->na_seqid, dst->na_seqid); 3675 1.1 mjacob for (i = 0; i < NA2_RSVDLEN; i++) { 3676 1.4 mjacob ISP_IOXGET_16(isp, &src->na_reserved3[i], dst->na_reserved3[i]); 3677 1.1 mjacob } 3678 1.1 mjacob } 3679 1.1 mjacob 3680 1.1 mjacob void 3681 1.4 mjacob isp_get_notify_ack_24xx(ispsoftc_t *isp, na_fcentry_24xx_t *src, na_fcentry_24xx_t *dst) 3682 1.1 mjacob { 3683 1.1 mjacob int i; 3684 1.1 mjacob 3685 1.1 mjacob isp_get_hdr(isp, &src->na_header, &dst->na_header); 3686 1.1 mjacob ISP_IOXGET_32(isp, &src->na_handle, dst->na_handle); 3687 1.1 mjacob ISP_IOXGET_16(isp, &src->na_nphdl, dst->na_nphdl); 3688 1.1 mjacob ISP_IOXGET_16(isp, &src->na_reserved1, dst->na_reserved1); 3689 1.1 mjacob ISP_IOXGET_16(isp, &src->na_flags, dst->na_flags); 3690 1.1 mjacob ISP_IOXGET_16(isp, &src->na_srr_rxid, dst->na_srr_rxid); 3691 1.1 mjacob ISP_IOXGET_16(isp, &src->na_status, dst->na_status); 3692 1.1 mjacob ISP_IOXGET_8(isp, &src->na_status_subcode, dst->na_status_subcode); 3693 1.1 mjacob ISP_IOXGET_16(isp, &src->na_reserved2, dst->na_reserved2); 3694 1.1 mjacob ISP_IOXGET_32(isp, &src->na_rxid, dst->na_rxid); 3695 1.1 mjacob ISP_IOXGET_16(isp, &src->na_srr_reloff_hi, dst->na_srr_reloff_hi); 3696 1.1 mjacob ISP_IOXGET_16(isp, &src->na_srr_reloff_lo, dst->na_srr_reloff_lo); 3697 1.1 mjacob ISP_IOXGET_16(isp, &src->na_srr_iu, dst->na_srr_iu); 3698 1.1 mjacob ISP_IOXGET_16(isp, &src->na_srr_flags, dst->na_srr_flags); 3699 1.1 mjacob for (i = 0; i < 18; i++) { 3700 1.1 mjacob ISP_IOXGET_8(isp, &src->na_reserved3[i], dst->na_reserved3[i]); 3701 1.1 mjacob } 3702 1.1 mjacob ISP_IOXGET_8(isp, &src->na_reserved4, dst->na_reserved4); 3703 1.4 mjacob ISP_IOXGET_8(isp, &src->na_vpidx, dst->na_vpidx); 3704 1.4 mjacob ISP_IOXGET_8(isp, &src->na_srr_reject_vunique, dst->na_srr_reject_vunique); 3705 1.4 mjacob ISP_IOXGET_8(isp, &src->na_srr_reject_explanation, dst->na_srr_reject_explanation); 3706 1.1 mjacob ISP_IOXGET_8(isp, &src->na_srr_reject_code, dst->na_srr_reject_code); 3707 1.1 mjacob ISP_IOXGET_8(isp, &src->na_reserved5, dst->na_reserved5); 3708 1.1 mjacob for (i = 0; i < 6; i++) { 3709 1.1 mjacob ISP_IOXGET_8(isp, &src->na_reserved6[i], dst->na_reserved6[i]); 3710 1.1 mjacob } 3711 1.1 mjacob ISP_IOXGET_16(isp, &src->na_oxid, dst->na_oxid); 3712 1.1 mjacob } 3713 1.1 mjacob 3714 1.1 mjacob void 3715 1.1 mjacob isp_get_abts(ispsoftc_t *isp, abts_t *src, abts_t *dst) 3716 1.1 mjacob { 3717 1.1 mjacob int i; 3718 1.1 mjacob 3719 1.1 mjacob isp_get_hdr(isp, &src->abts_header, &dst->abts_header); 3720 1.1 mjacob for (i = 0; i < 6; i++) { 3721 1.4 mjacob ISP_IOXGET_8(isp, &src->abts_reserved0[i], dst->abts_reserved0[i]); 3722 1.1 mjacob } 3723 1.1 mjacob ISP_IOXGET_16(isp, &src->abts_nphdl, dst->abts_nphdl); 3724 1.1 mjacob ISP_IOXGET_16(isp, &src->abts_reserved1, dst->abts_reserved1); 3725 1.1 mjacob ISP_IOXGET_16(isp, &src->abts_sof, dst->abts_sof); 3726 1.1 mjacob ISP_IOXGET_32(isp, &src->abts_rxid_abts, dst->abts_rxid_abts); 3727 1.1 mjacob ISP_IOXGET_16(isp, &src->abts_did_lo, dst->abts_did_lo); 3728 1.1 mjacob ISP_IOXGET_8(isp, &src->abts_did_hi, dst->abts_did_hi); 3729 1.1 mjacob ISP_IOXGET_8(isp, &src->abts_r_ctl, dst->abts_r_ctl); 3730 1.1 mjacob ISP_IOXGET_16(isp, &src->abts_sid_lo, dst->abts_sid_lo); 3731 1.1 mjacob ISP_IOXGET_8(isp, &src->abts_sid_hi, dst->abts_sid_hi); 3732 1.1 mjacob ISP_IOXGET_8(isp, &src->abts_cs_ctl, dst->abts_cs_ctl); 3733 1.1 mjacob ISP_IOXGET_16(isp, &src->abts_fs_ctl, dst->abts_fs_ctl); 3734 1.1 mjacob ISP_IOXGET_8(isp, &src->abts_f_ctl, dst->abts_f_ctl); 3735 1.1 mjacob ISP_IOXGET_8(isp, &src->abts_type, dst->abts_type); 3736 1.1 mjacob ISP_IOXGET_16(isp, &src->abts_seq_cnt, dst->abts_seq_cnt); 3737 1.1 mjacob ISP_IOXGET_8(isp, &src->abts_df_ctl, dst->abts_df_ctl); 3738 1.1 mjacob ISP_IOXGET_8(isp, &src->abts_seq_id, dst->abts_seq_id); 3739 1.1 mjacob ISP_IOXGET_16(isp, &src->abts_rx_id, dst->abts_rx_id); 3740 1.1 mjacob ISP_IOXGET_16(isp, &src->abts_ox_id, dst->abts_ox_id); 3741 1.1 mjacob ISP_IOXGET_32(isp, &src->abts_param, dst->abts_param); 3742 1.1 mjacob for (i = 0; i < 16; i++) { 3743 1.4 mjacob ISP_IOXGET_8(isp, &src->abts_reserved2[i], dst->abts_reserved2[i]); 3744 1.1 mjacob } 3745 1.1 mjacob ISP_IOXGET_32(isp, &src->abts_rxid_task, dst->abts_rxid_task); 3746 1.1 mjacob } 3747 1.1 mjacob 3748 1.1 mjacob void 3749 1.1 mjacob isp_put_abts_rsp(ispsoftc_t *isp, abts_rsp_t *src, abts_rsp_t *dst) 3750 1.1 mjacob { 3751 1.1 mjacob int i; 3752 1.1 mjacob 3753 1.1 mjacob isp_put_hdr(isp, &src->abts_rsp_header, &dst->abts_rsp_header); 3754 1.1 mjacob ISP_IOXPUT_32(isp, src->abts_rsp_handle, &dst->abts_rsp_handle); 3755 1.1 mjacob ISP_IOXPUT_16(isp, src->abts_rsp_status, &dst->abts_rsp_status); 3756 1.1 mjacob ISP_IOXPUT_16(isp, src->abts_rsp_nphdl, &dst->abts_rsp_nphdl); 3757 1.1 mjacob ISP_IOXPUT_16(isp, src->abts_rsp_ctl_flags, &dst->abts_rsp_ctl_flags); 3758 1.1 mjacob ISP_IOXPUT_16(isp, src->abts_rsp_sof, &dst->abts_rsp_sof); 3759 1.1 mjacob ISP_IOXPUT_32(isp, src->abts_rsp_rxid_abts, &dst->abts_rsp_rxid_abts); 3760 1.1 mjacob ISP_IOXPUT_16(isp, src->abts_rsp_did_lo, &dst->abts_rsp_did_lo); 3761 1.1 mjacob ISP_IOXPUT_8(isp, src->abts_rsp_did_hi, &dst->abts_rsp_did_hi); 3762 1.1 mjacob ISP_IOXPUT_8(isp, src->abts_rsp_r_ctl, &dst->abts_rsp_r_ctl); 3763 1.1 mjacob ISP_IOXPUT_16(isp, src->abts_rsp_sid_lo, &dst->abts_rsp_sid_lo); 3764 1.1 mjacob ISP_IOXPUT_8(isp, src->abts_rsp_sid_hi, &dst->abts_rsp_sid_hi); 3765 1.1 mjacob ISP_IOXPUT_8(isp, src->abts_rsp_cs_ctl, &dst->abts_rsp_cs_ctl); 3766 1.1 mjacob ISP_IOXPUT_16(isp, src->abts_rsp_f_ctl_lo, &dst->abts_rsp_f_ctl_lo); 3767 1.1 mjacob ISP_IOXPUT_8(isp, src->abts_rsp_f_ctl_hi, &dst->abts_rsp_f_ctl_hi); 3768 1.1 mjacob ISP_IOXPUT_8(isp, src->abts_rsp_type, &dst->abts_rsp_type); 3769 1.1 mjacob ISP_IOXPUT_16(isp, src->abts_rsp_seq_cnt, &dst->abts_rsp_seq_cnt); 3770 1.1 mjacob ISP_IOXPUT_8(isp, src->abts_rsp_df_ctl, &dst->abts_rsp_df_ctl); 3771 1.1 mjacob ISP_IOXPUT_8(isp, src->abts_rsp_seq_id, &dst->abts_rsp_seq_id); 3772 1.1 mjacob ISP_IOXPUT_16(isp, src->abts_rsp_rx_id, &dst->abts_rsp_rx_id); 3773 1.1 mjacob ISP_IOXPUT_16(isp, src->abts_rsp_ox_id, &dst->abts_rsp_ox_id); 3774 1.1 mjacob ISP_IOXPUT_32(isp, src->abts_rsp_param, &dst->abts_rsp_param); 3775 1.1 mjacob if (src->abts_rsp_r_ctl == BA_ACC) { 3776 1.4 mjacob ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.reserved, &dst->abts_rsp_payload.ba_acc.reserved); 3777 1.4 mjacob ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_acc.last_seq_id, &dst->abts_rsp_payload.ba_acc.last_seq_id); 3778 1.4 mjacob ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_acc.seq_id_valid, &dst->abts_rsp_payload.ba_acc.seq_id_valid); 3779 1.4 mjacob ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.aborted_rx_id, &dst->abts_rsp_payload.ba_acc.aborted_rx_id); 3780 1.4 mjacob ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.aborted_ox_id, &dst->abts_rsp_payload.ba_acc.aborted_ox_id); 3781 1.4 mjacob ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.high_seq_cnt, &dst->abts_rsp_payload.ba_acc.high_seq_cnt); 3782 1.4 mjacob ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.low_seq_cnt, &dst->abts_rsp_payload.ba_acc.low_seq_cnt); 3783 1.1 mjacob for (i = 0; i < 4; i++) { 3784 1.4 mjacob ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.reserved2[i], &dst->abts_rsp_payload.ba_acc.reserved2[i]); 3785 1.1 mjacob } 3786 1.1 mjacob } else if (src->abts_rsp_r_ctl == BA_RJT) { 3787 1.4 mjacob ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.vendor_unique, &dst->abts_rsp_payload.ba_rjt.vendor_unique); 3788 1.4 mjacob ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.explanation, &dst->abts_rsp_payload.ba_rjt.explanation); 3789 1.4 mjacob ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.reason, &dst->abts_rsp_payload.ba_rjt.reason); 3790 1.4 mjacob ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.reserved, &dst->abts_rsp_payload.ba_rjt.reserved); 3791 1.1 mjacob for (i = 0; i < 12; i++) { 3792 1.4 mjacob ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_rjt.reserved2[i], &dst->abts_rsp_payload.ba_rjt.reserved2[i]); 3793 1.1 mjacob } 3794 1.1 mjacob } else { 3795 1.1 mjacob for (i = 0; i < 16; i++) { 3796 1.4 mjacob ISP_IOXPUT_8(isp, src->abts_rsp_payload.reserved[i], &dst->abts_rsp_payload.reserved[i]); 3797 1.1 mjacob } 3798 1.1 mjacob } 3799 1.1 mjacob ISP_IOXPUT_32(isp, src->abts_rsp_rxid_task, &dst->abts_rsp_rxid_task); 3800 1.1 mjacob } 3801 1.1 mjacob 3802 1.1 mjacob void 3803 1.1 mjacob isp_get_abts_rsp(ispsoftc_t *isp, abts_rsp_t *src, abts_rsp_t *dst) 3804 1.1 mjacob { 3805 1.1 mjacob int i; 3806 1.1 mjacob 3807 1.1 mjacob isp_get_hdr(isp, &src->abts_rsp_header, &dst->abts_rsp_header); 3808 1.1 mjacob ISP_IOXGET_32(isp, &src->abts_rsp_handle, dst->abts_rsp_handle); 3809 1.1 mjacob ISP_IOXGET_16(isp, &src->abts_rsp_status, dst->abts_rsp_status); 3810 1.1 mjacob ISP_IOXGET_16(isp, &src->abts_rsp_nphdl, dst->abts_rsp_nphdl); 3811 1.1 mjacob ISP_IOXGET_16(isp, &src->abts_rsp_ctl_flags, dst->abts_rsp_ctl_flags); 3812 1.1 mjacob ISP_IOXGET_16(isp, &src->abts_rsp_sof, dst->abts_rsp_sof); 3813 1.1 mjacob ISP_IOXGET_32(isp, &src->abts_rsp_rxid_abts, dst->abts_rsp_rxid_abts); 3814 1.1 mjacob ISP_IOXGET_16(isp, &src->abts_rsp_did_lo, dst->abts_rsp_did_lo); 3815 1.1 mjacob ISP_IOXGET_8(isp, &src->abts_rsp_did_hi, dst->abts_rsp_did_hi); 3816 1.1 mjacob ISP_IOXGET_8(isp, &src->abts_rsp_r_ctl, dst->abts_rsp_r_ctl); 3817 1.1 mjacob ISP_IOXGET_16(isp, &src->abts_rsp_sid_lo, dst->abts_rsp_sid_lo); 3818 1.1 mjacob ISP_IOXGET_8(isp, &src->abts_rsp_sid_hi, dst->abts_rsp_sid_hi); 3819 1.1 mjacob ISP_IOXGET_8(isp, &src->abts_rsp_cs_ctl, dst->abts_rsp_cs_ctl); 3820 1.1 mjacob ISP_IOXGET_16(isp, &src->abts_rsp_f_ctl_lo, dst->abts_rsp_f_ctl_lo); 3821 1.1 mjacob ISP_IOXGET_8(isp, &src->abts_rsp_f_ctl_hi, dst->abts_rsp_f_ctl_hi); 3822 1.1 mjacob ISP_IOXGET_8(isp, &src->abts_rsp_type, dst->abts_rsp_type); 3823 1.1 mjacob ISP_IOXGET_16(isp, &src->abts_rsp_seq_cnt, dst->abts_rsp_seq_cnt); 3824 1.1 mjacob ISP_IOXGET_8(isp, &src->abts_rsp_df_ctl, dst->abts_rsp_df_ctl); 3825 1.1 mjacob ISP_IOXGET_8(isp, &src->abts_rsp_seq_id, dst->abts_rsp_seq_id); 3826 1.1 mjacob ISP_IOXGET_16(isp, &src->abts_rsp_rx_id, dst->abts_rsp_rx_id); 3827 1.1 mjacob ISP_IOXGET_16(isp, &src->abts_rsp_ox_id, dst->abts_rsp_ox_id); 3828 1.1 mjacob ISP_IOXGET_32(isp, &src->abts_rsp_param, dst->abts_rsp_param); 3829 1.1 mjacob for (i = 0; i < 8; i++) { 3830 1.4 mjacob ISP_IOXGET_8(isp, &src->abts_rsp_payload.rsp.reserved[i], dst->abts_rsp_payload.rsp.reserved[i]); 3831 1.1 mjacob } 3832 1.4 mjacob ISP_IOXGET_32(isp, &src->abts_rsp_payload.rsp.subcode1, dst->abts_rsp_payload.rsp.subcode1); 3833 1.4 mjacob ISP_IOXGET_32(isp, &src->abts_rsp_payload.rsp.subcode2, dst->abts_rsp_payload.rsp.subcode2); 3834 1.1 mjacob ISP_IOXGET_32(isp, &src->abts_rsp_rxid_task, dst->abts_rsp_rxid_task); 3835 1.1 mjacob } 3836 1.1 mjacob #endif /* ISP_TARGET_MODE */ 3837 1.1 mjacob /* 3838 1.1 mjacob * vim:ts=8:sw=8 3839 1.1 mjacob */ 3840