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