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