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