isp_library.c revision 290993
1155228Smjacob/*-
2196008Smjacob *  Copyright (c) 1997-2009 by Matthew Jacob
3167403Smjacob *  All rights reserved.
4196008Smjacob *
5167403Smjacob *  Redistribution and use in source and binary forms, with or without
6167403Smjacob *  modification, are permitted provided that the following conditions
7167403Smjacob *  are met:
8196008Smjacob *
9167403Smjacob *  1. Redistributions of source code must retain the above copyright
10167403Smjacob *     notice, this list of conditions and the following disclaimer.
11167403Smjacob *  2. Redistributions in binary form must reproduce the above copyright
12167403Smjacob *     notice, this list of conditions and the following disclaimer in the
13167403Smjacob *     documentation and/or other materials provided with the distribution.
14196008Smjacob *
15167403Smjacob *  THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16167403Smjacob *  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17167403Smjacob *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18167403Smjacob *  ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
19167403Smjacob *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20167403Smjacob *  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21167403Smjacob *  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22167403Smjacob *  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23167403Smjacob *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24167403Smjacob *  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25167403Smjacob *  SUCH DAMAGE.
26196008Smjacob *
27155228Smjacob */
28160410Smjacob/*
29160410Smjacob * Qlogic Host Adapter Internal Library Functions
30160410Smjacob */
31155704Smjacob#ifdef	__NetBSD__
32167403Smjacob#include <sys/cdefs.h>
33167403Smjacob__KERNEL_RCSID(0, "$NetBSD$");
34155704Smjacob#include <dev/ic/isp_netbsd.h>
35155704Smjacob#endif
36155704Smjacob#ifdef	__FreeBSD__
37160410Smjacob#include <sys/cdefs.h>
38160410Smjacob__FBSDID("$FreeBSD: head/sys/dev/isp/isp_library.c 290993 2015-11-17 16:33:46Z mav $");
39155228Smjacob#include <dev/isp/isp_freebsd.h>
40155704Smjacob#endif
41155704Smjacob#ifdef	__OpenBSD__
42155704Smjacob#include <dev/ic/isp_openbsd.h>
43155704Smjacob#endif
44155704Smjacob#ifdef	__linux__
45155704Smjacob#include "isp_linux.h"
46155704Smjacob#endif
47155704Smjacob#ifdef	__svr4__
48155704Smjacob#include "isp_solaris.h"
49155704Smjacob#endif
50155228Smjacob
51196008Smjacobconst char *isp_class3_roles[4] = {
52196008Smjacob    "None", "Target", "Initiator", "Target/Initiator"
53196008Smjacob};
54196008Smjacob
55196008Smjacob/*
56196008Smjacob * Command shipping- finish off first queue entry and do dma mapping and additional segments as needed.
57196008Smjacob *
58196008Smjacob * Called with the first queue entry at least partially filled out.
59196008Smjacob */
60155228Smjacobint
61238869Smjacobisp_send_cmd(ispsoftc_t *isp, void *fqe, void *segp, uint32_t nsegs, uint32_t totalcnt, isp_ddir_t ddir, ispds64_t *ecmd)
62196008Smjacob{
63196008Smjacob	uint8_t storage[QENTRY_LEN];
64196008Smjacob	uint8_t type, nqe;
65196008Smjacob	uint32_t seg, curseg, seglim, nxt, nxtnxt, ddf;
66196008Smjacob	ispds_t *dsp = NULL;
67196008Smjacob	ispds64_t *dsp64 = NULL;
68196008Smjacob	void *qe0, *qe1;
69196008Smjacob
70196008Smjacob	qe0 = isp_getrqentry(isp);
71196008Smjacob	if (qe0 == NULL) {
72196008Smjacob		return (CMD_EAGAIN);
73196008Smjacob	}
74196008Smjacob	nxt = ISP_NXT_QENTRY(isp->isp_reqidx, RQUEST_QUEUE_LEN(isp));
75196008Smjacob
76196008Smjacob	type = ((isphdr_t *)fqe)->rqs_entry_type;
77196008Smjacob	nqe = 1;
78196008Smjacob
79196008Smjacob	/*
80196008Smjacob	 * If we have no data to transmit, just copy the first IOCB and start it up.
81196008Smjacob	 */
82196008Smjacob	if (ddir == ISP_NOXFR) {
83196008Smjacob		if (type == RQSTYPE_T2RQS || type == RQSTYPE_T3RQS) {
84196008Smjacob			ddf = CT2_NO_DATA;
85196008Smjacob		} else {
86196008Smjacob			ddf = 0;
87196008Smjacob		}
88196008Smjacob		goto copy_and_sync;
89196008Smjacob	}
90196008Smjacob
91196008Smjacob	/*
92196008Smjacob	 * First figure out how many pieces of data to transfer and what kind and how many we can put into the first queue entry.
93196008Smjacob	 */
94196008Smjacob	switch (type) {
95196008Smjacob	case RQSTYPE_REQUEST:
96196008Smjacob		ddf = (ddir == ISP_TO_DEVICE)? REQFLAG_DATA_OUT : REQFLAG_DATA_IN;
97196008Smjacob		dsp = ((ispreq_t *)fqe)->req_dataseg;
98196008Smjacob		seglim = ISP_RQDSEG;
99196008Smjacob		break;
100196008Smjacob	case RQSTYPE_CMDONLY:
101196008Smjacob		ddf = (ddir == ISP_TO_DEVICE)? REQFLAG_DATA_OUT : REQFLAG_DATA_IN;
102196008Smjacob		seglim = 0;
103196008Smjacob		break;
104196008Smjacob	case RQSTYPE_T2RQS:
105196008Smjacob		ddf = (ddir == ISP_TO_DEVICE)? REQFLAG_DATA_OUT : REQFLAG_DATA_IN;
106196008Smjacob		dsp = ((ispreqt2_t *)fqe)->req_dataseg;
107196008Smjacob		seglim = ISP_RQDSEG_T2;
108196008Smjacob		break;
109196008Smjacob	case RQSTYPE_A64:
110196008Smjacob		ddf = (ddir == ISP_TO_DEVICE)? REQFLAG_DATA_OUT : REQFLAG_DATA_IN;
111196008Smjacob		dsp64 = ((ispreqt3_t *)fqe)->req_dataseg;
112196008Smjacob		seglim = ISP_RQDSEG_T3;
113196008Smjacob		break;
114196008Smjacob	case RQSTYPE_T3RQS:
115196008Smjacob		ddf = (ddir == ISP_TO_DEVICE)? REQFLAG_DATA_OUT : REQFLAG_DATA_IN;
116196008Smjacob		dsp64 = ((ispreqt3_t *)fqe)->req_dataseg;
117196008Smjacob		seglim = ISP_RQDSEG_T3;
118196008Smjacob		break;
119196008Smjacob	case RQSTYPE_T7RQS:
120196008Smjacob		ddf = (ddir == ISP_TO_DEVICE)? FCP_CMND_DATA_WRITE : FCP_CMND_DATA_READ;
121196008Smjacob		dsp64 = &((ispreqt7_t *)fqe)->req_dataseg;
122196008Smjacob		seglim = 1;
123196008Smjacob		break;
124196008Smjacob	default:
125196008Smjacob		return (CMD_COMPLETE);
126196008Smjacob	}
127196008Smjacob
128196008Smjacob	if (seglim > nsegs) {
129196008Smjacob		seglim = nsegs;
130196008Smjacob	}
131196008Smjacob
132196008Smjacob	for (seg = curseg = 0; curseg < seglim; curseg++) {
133196008Smjacob		if (dsp64) {
134196008Smjacob			XS_GET_DMA64_SEG(dsp64++, segp, seg++);
135196008Smjacob		} else {
136196008Smjacob			XS_GET_DMA_SEG(dsp++, segp, seg++);
137196008Smjacob		}
138196008Smjacob	}
139196008Smjacob
140196008Smjacob
141196008Smjacob	/*
142196008Smjacob	 * Second, start building additional continuation segments as needed.
143196008Smjacob	 */
144196008Smjacob	while (seg < nsegs) {
145196008Smjacob		nxtnxt = ISP_NXT_QENTRY(nxt, RQUEST_QUEUE_LEN(isp));
146196008Smjacob		if (nxtnxt == isp->isp_reqodx) {
147261515Smav			isp->isp_reqodx = ISP_READ(isp, isp->isp_rqstoutrp);
148261515Smav			if (nxtnxt == isp->isp_reqodx)
149261515Smav				return (CMD_EAGAIN);
150196008Smjacob		}
151196008Smjacob		ISP_MEMZERO(storage, QENTRY_LEN);
152196008Smjacob		qe1 = ISP_QUEUE_ENTRY(isp->isp_rquest, nxt);
153196008Smjacob		nxt = nxtnxt;
154196008Smjacob		if (dsp64) {
155196008Smjacob			ispcontreq64_t *crq = (ispcontreq64_t *) storage;
156196008Smjacob			seglim = ISP_CDSEG64;
157196008Smjacob			crq->req_header.rqs_entry_type = RQSTYPE_A64_CONT;
158196008Smjacob			crq->req_header.rqs_entry_count = 1;
159196008Smjacob			dsp64 = crq->req_dataseg;
160196008Smjacob		} else {
161196008Smjacob			ispcontreq_t *crq = (ispcontreq_t *) storage;
162196008Smjacob			seglim = ISP_CDSEG;
163196008Smjacob			crq->req_header.rqs_entry_type = RQSTYPE_DATASEG;
164196008Smjacob			crq->req_header.rqs_entry_count = 1;
165196008Smjacob			dsp = crq->req_dataseg;
166196008Smjacob		}
167196008Smjacob		if (seg + seglim > nsegs) {
168196008Smjacob			seglim = nsegs - seg;
169196008Smjacob		}
170196008Smjacob		for (curseg = 0; curseg < seglim; curseg++) {
171196008Smjacob			if (dsp64) {
172196008Smjacob				XS_GET_DMA64_SEG(dsp64++, segp, seg++);
173196008Smjacob			} else {
174196008Smjacob				XS_GET_DMA_SEG(dsp++, segp, seg++);
175196008Smjacob			}
176196008Smjacob		}
177196008Smjacob		if (dsp64) {
178196008Smjacob			isp_put_cont64_req(isp, (ispcontreq64_t *)storage, qe1);
179196008Smjacob		} else {
180196008Smjacob			isp_put_cont_req(isp, (ispcontreq_t *)storage, qe1);
181196008Smjacob		}
182196008Smjacob		if (isp->isp_dblev & ISP_LOGDEBUG1) {
183196008Smjacob			isp_print_bytes(isp, "additional queue entry", QENTRY_LEN, storage);
184196008Smjacob		}
185196008Smjacob		nqe++;
186196008Smjacob        }
187196008Smjacob
188196008Smjacobcopy_and_sync:
189196008Smjacob	((isphdr_t *)fqe)->rqs_entry_count = nqe;
190196008Smjacob	switch (type) {
191196008Smjacob	case RQSTYPE_REQUEST:
192196008Smjacob		((ispreq_t *)fqe)->req_flags |= ddf;
193196008Smjacob		/*
194196008Smjacob		 * This is historical and not clear whether really needed.
195196008Smjacob		 */
196196008Smjacob		if (nsegs == 0) {
197196008Smjacob			nsegs = 1;
198196008Smjacob		}
199196008Smjacob		((ispreq_t *)fqe)->req_seg_count = nsegs;
200196008Smjacob		isp_put_request(isp, fqe, qe0);
201196008Smjacob		break;
202196008Smjacob	case RQSTYPE_CMDONLY:
203196008Smjacob		((ispreq_t *)fqe)->req_flags |= ddf;
204196008Smjacob		/*
205196008Smjacob		 * This is historical and not clear whether really needed.
206196008Smjacob		 */
207196008Smjacob		if (nsegs == 0) {
208196008Smjacob			nsegs = 1;
209196008Smjacob		}
210196008Smjacob		((ispextreq_t *)fqe)->req_seg_count = nsegs;
211196008Smjacob		isp_put_extended_request(isp, fqe, qe0);
212196008Smjacob		break;
213196008Smjacob	case RQSTYPE_T2RQS:
214196008Smjacob		((ispreqt2_t *)fqe)->req_flags |= ddf;
215196008Smjacob		((ispreqt2_t *)fqe)->req_seg_count = nsegs;
216196008Smjacob		((ispreqt2_t *)fqe)->req_totalcnt = totalcnt;
217196008Smjacob		if (ISP_CAP_2KLOGIN(isp)) {
218196008Smjacob			isp_put_request_t2e(isp, fqe, qe0);
219196008Smjacob		} else {
220196008Smjacob			isp_put_request_t2(isp, fqe, qe0);
221196008Smjacob		}
222196008Smjacob		break;
223196008Smjacob	case RQSTYPE_A64:
224196008Smjacob	case RQSTYPE_T3RQS:
225196008Smjacob		((ispreqt3_t *)fqe)->req_flags |= ddf;
226196008Smjacob		((ispreqt3_t *)fqe)->req_seg_count = nsegs;
227196008Smjacob		((ispreqt3_t *)fqe)->req_totalcnt = totalcnt;
228196008Smjacob		if (ISP_CAP_2KLOGIN(isp)) {
229196008Smjacob			isp_put_request_t3e(isp, fqe, qe0);
230196008Smjacob		} else {
231196008Smjacob			isp_put_request_t3(isp, fqe, qe0);
232196008Smjacob		}
233196008Smjacob		break;
234196008Smjacob	case RQSTYPE_T7RQS:
235196008Smjacob        	((ispreqt7_t *)fqe)->req_alen_datadir = ddf;
236196008Smjacob		((ispreqt7_t *)fqe)->req_seg_count = nsegs;
237196008Smjacob		((ispreqt7_t *)fqe)->req_dl = totalcnt;
238196008Smjacob		isp_put_request_t7(isp, fqe, qe0);
239196008Smjacob		break;
240196008Smjacob	default:
241196008Smjacob		return (CMD_COMPLETE);
242196008Smjacob	}
243196008Smjacob	if (isp->isp_dblev & ISP_LOGDEBUG1) {
244196008Smjacob		isp_print_bytes(isp, "first queue entry", QENTRY_LEN, fqe);
245196008Smjacob	}
246196008Smjacob	ISP_ADD_REQUEST(isp, nxt);
247196008Smjacob	return (CMD_QUEUED);
248196008Smjacob}
249196008Smjacob
250196008Smjacobint
251203444Smjacobisp_allocate_xs(ispsoftc_t *isp, XS_T *xs, uint32_t *handlep)
252155228Smjacob{
253203444Smjacob	isp_hdl_t *hdp;
254155228Smjacob
255203444Smjacob	hdp = isp->isp_xffree;
256203444Smjacob	if (hdp == NULL) {
257155228Smjacob		return (-1);
258155228Smjacob	}
259203444Smjacob	isp->isp_xffree = hdp->cmd;
260203444Smjacob	hdp->cmd = xs;
261203444Smjacob	hdp->handle = (hdp - isp->isp_xflist);
262203444Smjacob	hdp->handle |= (ISP_HANDLE_INITIATOR << ISP_HANDLE_USAGE_SHIFT);
263203444Smjacob	hdp->handle |= (isp->isp_seqno++ << ISP_HANDLE_SEQ_SHIFT);
264203444Smjacob	*handlep = hdp->handle;
265155228Smjacob	return (0);
266155228Smjacob}
267155228Smjacob
268155228SmjacobXS_T *
269163899Smjacobisp_find_xs(ispsoftc_t *isp, uint32_t handle)
270155228Smjacob{
271203444Smjacob	if (!ISP_VALID_INI_HANDLE(isp, handle)) {
272203444Smjacob		isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle);
273155228Smjacob		return (NULL);
274155228Smjacob	}
275203444Smjacob	return (isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].cmd);
276155228Smjacob}
277155228Smjacob
278163899Smjacobuint32_t
279155704Smjacobisp_find_handle(ispsoftc_t *isp, XS_T *xs)
280155228Smjacob{
281203444Smjacob	uint32_t i, foundhdl = ISP_HANDLE_FREE;
282203444Smjacob
283155228Smjacob	if (xs != NULL) {
284155228Smjacob		for (i = 0; i < isp->isp_maxcmds; i++) {
285203444Smjacob			if (isp->isp_xflist[i].cmd != xs) {
286203444Smjacob				continue;
287155228Smjacob			}
288203444Smjacob			foundhdl = isp->isp_xflist[i].handle;
289203444Smjacob			break;
290155228Smjacob		}
291155228Smjacob	}
292203444Smjacob	return (foundhdl);
293155228Smjacob}
294155228Smjacob
295163899Smjacobuint32_t
296203444Smjacobisp_handle_index(ispsoftc_t *isp, uint32_t handle)
297155228Smjacob{
298203444Smjacob	if (!ISP_VALID_HANDLE(isp, handle)) {
299203444Smjacob		isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle);
300203444Smjacob		return (ISP_BAD_HANDLE_INDEX);
301205712Smjacob	} else {
302205712Smjacob		return (handle & ISP_HANDLE_CMD_MASK);
303203444Smjacob	}
304155228Smjacob}
305155228Smjacob
306155228Smjacobvoid
307163899Smjacobisp_destroy_handle(ispsoftc_t *isp, uint32_t handle)
308155228Smjacob{
309203444Smjacob	if (!ISP_VALID_INI_HANDLE(isp, handle)) {
310203444Smjacob		isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle);
311203444Smjacob	} else {
312203444Smjacob		isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].handle = ISP_HANDLE_FREE;
313203444Smjacob		isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].cmd = isp->isp_xffree;
314203444Smjacob		isp->isp_xffree = &isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)];
315155228Smjacob	}
316155228Smjacob}
317155228Smjacob
318196008Smjacob/*
319196008Smjacob * Make sure we have space to put something on the request queue.
320196008Smjacob * Return a pointer to that entry if we do. A side effect of this
321196008Smjacob * function is to update the output index. The input index
322196008Smjacob * stays the same.
323196008Smjacob */
324196008Smjacobvoid *
325196008Smjacobisp_getrqentry(ispsoftc_t *isp)
326155228Smjacob{
327257916Smav	uint32_t next;
328257916Smav
329257916Smav	next = ISP_NXT_QENTRY(isp->isp_reqidx, RQUEST_QUEUE_LEN(isp));
330257916Smav	if (next == isp->isp_reqodx) {
331257916Smav		isp->isp_reqodx = ISP_READ(isp, isp->isp_rqstoutrp);
332257916Smav		if (next == isp->isp_reqodx)
333257916Smav			return (NULL);
334155228Smjacob	}
335196008Smjacob	return (ISP_QUEUE_ENTRY(isp->isp_rquest, isp->isp_reqidx));
336155228Smjacob}
337155228Smjacob
338155228Smjacob#define	TBA	(4 * (((QENTRY_LEN >> 2) * 3) + 1) + 1)
339155228Smjacobvoid
340196008Smjacobisp_print_qentry(ispsoftc_t *isp, const char *msg, int idx, void *arg)
341155228Smjacob{
342155228Smjacob	char buf[TBA];
343155228Smjacob	int amt, i, j;
344155704Smjacob	uint8_t *ptr = arg;
345155228Smjacob
346155228Smjacob	isp_prt(isp, ISP_LOGALL, "%s index %d=>", msg, idx);
347155228Smjacob	for (buf[0] = 0, amt = i = 0; i < 4; i++) {
348155228Smjacob		buf[0] = 0;
349196008Smjacob		ISP_SNPRINTF(buf, TBA, "  ");
350155228Smjacob		for (j = 0; j < (QENTRY_LEN >> 2); j++) {
351196008Smjacob			ISP_SNPRINTF(buf, TBA, "%s %02x", buf, ptr[amt++] & 0xff);
352155228Smjacob		}
353208997Smjacob		isp_prt(isp, ISP_LOGALL, "%s", buf);
354155228Smjacob	}
355155228Smjacob}
356155228Smjacob
357155228Smjacobvoid
358167821Smjacobisp_print_bytes(ispsoftc_t *isp, const char *msg, int amt, void *arg)
359155228Smjacob{
360155228Smjacob	char buf[128];
361155704Smjacob	uint8_t *ptr = arg;
362155228Smjacob	int off;
363155228Smjacob
364155228Smjacob	if (msg)
365155228Smjacob		isp_prt(isp, ISP_LOGALL, "%s:", msg);
366155228Smjacob	off = 0;
367155228Smjacob	buf[0] = 0;
368155228Smjacob	while (off < amt) {
369155228Smjacob		int j, to;
370155228Smjacob		to = off;
371155228Smjacob		for (j = 0; j < 16; j++) {
372196008Smjacob			ISP_SNPRINTF(buf, 128, "%s %02x", buf, ptr[off++] & 0xff);
373196008Smjacob			if (off == amt) {
374155228Smjacob				break;
375196008Smjacob			}
376155228Smjacob		}
377155228Smjacob		isp_prt(isp, ISP_LOGALL, "0x%08x:%s", to, buf);
378155228Smjacob		buf[0] = 0;
379155228Smjacob	}
380155228Smjacob}
381155228Smjacob
382155228Smjacob/*
383155228Smjacob * Do the common path to try and ensure that link is up, we've scanned
384155228Smjacob * the fabric (if we're on a fabric), and that we've synchronized this
385155228Smjacob * all with our own database and done the appropriate logins.
386155228Smjacob *
387155228Smjacob * We repeatedly check for firmware state and loop state after each
388155228Smjacob * action because things may have changed while we were doing this.
389155228Smjacob * Any failure or change of state causes us to return a nonzero value.
390155228Smjacob *
391155228Smjacob * We assume we enter here with any locks held.
392155228Smjacob */
393155228Smjacob
394155228Smjacobint
395196008Smjacobisp_fc_runstate(ispsoftc_t *isp, int chan, int tval)
396155228Smjacob{
397155228Smjacob	fcparam *fcp;
398155228Smjacob
399196008Smjacob	fcp = FCPARAM(isp, chan);
400196008Smjacob        if (fcp->role == ISP_ROLE_NONE) {
401155228Smjacob		return (0);
402155228Smjacob	}
403290993Smav	if (isp_control(isp, ISPCTL_FCLINK_TEST, chan, tval) != 0) {
404290993Smav		isp_prt(isp, ISP_LOG_SANCFG, "isp_fc_runstate: linktest failed for channel %d", chan);
405290993Smav		return (-1);
406155228Smjacob	}
407196008Smjacob	if (isp_control(isp, ISPCTL_SCAN_LOOP, chan) != 0) {
408290993Smav		isp_prt(isp, ISP_LOG_SANCFG, "isp_fc_runstate: scan loop failed on channel %d", chan);
409290993Smav		return (LOOP_LTEST_DONE);
410163899Smjacob	}
411196008Smjacob	if (isp_control(isp, ISPCTL_SCAN_FABRIC, chan) != 0) {
412290993Smav		isp_prt(isp, ISP_LOG_SANCFG, "isp_fc_runstate: scan fabric failed on channel %d", chan);
413163899Smjacob		return (LOOP_LSCAN_DONE);
414163899Smjacob	}
415196008Smjacob	if (isp_control(isp, ISPCTL_PDB_SYNC, chan) != 0) {
416290993Smav		isp_prt(isp, ISP_LOG_SANCFG, "isp_fc_runstate: pdb_sync failed on channel %d", chan);
417163899Smjacob		return (LOOP_FSCAN_DONE);
418155228Smjacob	}
419290993Smav	if (fcp->isp_loopstate != LOOP_READY) {
420290993Smav		isp_prt(isp, ISP_LOG_SANCFG, "isp_fc_runstate: not ready again on channel %d", chan);
421155228Smjacob		return (-1);
422155228Smjacob	}
423155228Smjacob	return (0);
424155228Smjacob}
425155228Smjacob
426164272Smjacob/*
427196008Smjacob * Fibre Channel Support routines
428164272Smjacob */
429163899Smjacobvoid
430196008Smjacobisp_dump_portdb(ispsoftc_t *isp, int chan)
431164272Smjacob{
432196008Smjacob	fcparam *fcp = FCPARAM(isp, chan);
433164272Smjacob	int i;
434164272Smjacob
435164272Smjacob	for (i = 0; i < MAX_FC_TARG; i++) {
436285459Smav		char buf1[64], buf2[64];
437164272Smjacob		const char *dbs[8] = {
438164272Smjacob			"NIL ",
439164272Smjacob			"PROB",
440164272Smjacob			"DEAD",
441164272Smjacob			"CHGD",
442164272Smjacob			"NEW ",
443164272Smjacob			"PVLD",
444164272Smjacob			"ZOMB",
445164272Smjacob			"VLD "
446164272Smjacob		};
447164272Smjacob		fcportdb_t *lp = &fcp->portdb[i];
448164272Smjacob
449285459Smav		if (lp->state == FC_PORTDB_STATE_NIL) {
450164272Smjacob			continue;
451164272Smjacob		}
452238869Smjacob		isp_gen_role_str(buf1, sizeof (buf1), lp->prli_word3);
453238869Smjacob		isp_gen_role_str(buf2, sizeof (buf2), lp->new_prli_word3);
454285459Smav		isp_prt(isp, ISP_LOGALL, "Chan %d [%d]: hdl 0x%x %s al%d %s 0x%06x =>%s 0x%06x; WWNN 0x%08x%08x WWPN 0x%08x%08x",
455285459Smav		    chan, i, lp->handle, dbs[lp->state], lp->autologin, buf1, lp->portid, buf2, lp->new_portid,
456196008Smjacob		    (uint32_t) (lp->node_wwn >> 32), (uint32_t) (lp->node_wwn), (uint32_t) (lp->port_wwn >> 32), (uint32_t) (lp->port_wwn));
457164272Smjacob	}
458164272Smjacob}
459164272Smjacob
460238869Smjacobvoid
461238869Smjacobisp_gen_role_str(char *buf, size_t len, uint16_t p3)
462238869Smjacob{
463238869Smjacob	int nd = 0;
464238869Smjacob	buf[0] = '(';
465238869Smjacob	buf[1] = 0;
466238869Smjacob	if (p3 & PRLI_WD3_ENHANCED_DISCOVERY) {
467238869Smjacob		nd++;
468238869Smjacob		strlcat(buf, "EDisc", len);
469238869Smjacob	}
470238869Smjacob	if (p3 & PRLI_WD3_REC_SUPPORT) {
471238869Smjacob		if (nd++) {
472238869Smjacob			strlcat(buf, ",", len);
473238869Smjacob		}
474238869Smjacob		strlcat(buf, "REC", len);
475238869Smjacob	}
476238869Smjacob	if (p3 & PRLI_WD3_TASK_RETRY_IDENTIFICATION_REQUESTED) {
477238869Smjacob		if (nd++) {
478238869Smjacob			strlcat(buf, ",", len);
479238869Smjacob		}
480238869Smjacob		strlcat(buf, "RetryID", len);
481238869Smjacob	}
482238869Smjacob	if (p3 & PRLI_WD3_RETRY) {
483238869Smjacob		if (nd++) {
484238869Smjacob			strlcat(buf, ",", len);
485238869Smjacob		}
486238869Smjacob		strlcat(buf, "Retry", len);
487238869Smjacob	}
488238869Smjacob	if (p3 & PRLI_WD3_CONFIRMED_COMPLETION_ALLOWED) {
489238869Smjacob		if (nd++) {
490238869Smjacob			strlcat(buf, ",", len);
491238869Smjacob		}
492238869Smjacob		strlcat(buf, "CNFRM", len);
493238869Smjacob	}
494238869Smjacob	if (p3 & PRLI_WD3_DATA_OVERLAY_ALLOWED) {
495238869Smjacob		if (nd++) {
496238869Smjacob			strlcat(buf, ",", len);
497238869Smjacob		}
498238869Smjacob		strlcat(buf, "DOver", len);
499238869Smjacob	}
500238869Smjacob	if (p3 & PRLI_WD3_INITIATOR_FUNCTION) {
501238869Smjacob		if (nd++) {
502238869Smjacob			strlcat(buf, ",", len);
503238869Smjacob		}
504238869Smjacob		strlcat(buf, "INI", len);
505238869Smjacob	}
506238869Smjacob	if (p3 & PRLI_WD3_TARGET_FUNCTION) {
507238869Smjacob		if (nd++) {
508238869Smjacob			strlcat(buf, ",", len);
509238869Smjacob		}
510238869Smjacob		strlcat(buf, "TGT", len);
511238869Smjacob	}
512238869Smjacob	if (p3 & PRLI_WD3_READ_FCP_XFER_RDY_DISABLED) {
513238869Smjacob		if (nd++) {
514238869Smjacob			strlcat(buf, ",", len);
515238869Smjacob		}
516238869Smjacob		strlcat(buf, "RdXfrDis", len);
517238869Smjacob	}
518238869Smjacob	if (p3 & PRLI_WD3_WRITE_FCP_XFER_RDY_DISABLED) {
519238869Smjacob		if (nd++) {
520238869Smjacob			strlcat(buf, ",", len);
521238869Smjacob		}
522238869Smjacob		strlcat(buf, "XfrDis", len);
523238869Smjacob	}
524238869Smjacob	strlcat(buf, ")", len);
525238869Smjacob}
526238869Smjacob
527196008Smjacobconst char *
528196008Smjacobisp_fc_fw_statename(int state)
529196008Smjacob{
530196008Smjacob	switch (state) {
531196008Smjacob	case FW_CONFIG_WAIT:	return "Config Wait";
532290993Smav	case FW_WAIT_LINK:	return "Wait Link";
533196008Smjacob	case FW_WAIT_LOGIN:	return "Wait Login";
534196008Smjacob	case FW_READY:		return "Ready";
535196008Smjacob	case FW_LOSS_OF_SYNC:	return "Loss Of Sync";
536196008Smjacob	case FW_ERROR:		return "Error";
537196008Smjacob	case FW_REINIT:		return "Re-Init";
538196008Smjacob	case FW_NON_PART:	return "Nonparticipating";
539196008Smjacob	default:		return "?????";
540196008Smjacob	}
541196008Smjacob}
542196008Smjacob
543196008Smjacobconst char *
544196008Smjacobisp_fc_loop_statename(int state)
545196008Smjacob{
546196008Smjacob	switch (state) {
547196008Smjacob	case LOOP_NIL:                  return "NIL";
548290993Smav	case LOOP_TESTING_LINK:         return "Testing Link";
549290993Smav	case LOOP_LTEST_DONE:           return "Link Test Done";
550290993Smav	case LOOP_SCANNING_LOOP:        return "Scanning Loop";
551196008Smjacob	case LOOP_LSCAN_DONE:           return "Loop Scan Done";
552196008Smjacob	case LOOP_SCANNING_FABRIC:      return "Scanning Fabric";
553196008Smjacob	case LOOP_FSCAN_DONE:           return "Fabric Scan Done";
554196008Smjacob	case LOOP_SYNCING_PDB:          return "Syncing PDB";
555196008Smjacob	case LOOP_READY:                return "Ready";
556196008Smjacob	default:                        return "?????";
557196008Smjacob	}
558196008Smjacob}
559196008Smjacob
560196008Smjacobconst char *
561196008Smjacobisp_fc_toponame(fcparam *fcp)
562196008Smjacob{
563196008Smjacob
564290993Smav	if (fcp->isp_loopstate < LOOP_LTEST_DONE) {
565196008Smjacob		return "Unavailable";
566196008Smjacob	}
567196008Smjacob	switch (fcp->isp_topo) {
568196008Smjacob	case TOPO_NL_PORT:      return "Private Loop";
569196008Smjacob	case TOPO_FL_PORT:      return "FL Port";
570196008Smjacob	case TOPO_N_PORT:       return "N-Port to N-Port";
571196008Smjacob	case TOPO_F_PORT:       return "F Port";
572196008Smjacob	case TOPO_PTP_STUB:     return "F Port (no FLOGI_ACC response)";
573196008Smjacob	default:                return "?????";
574196008Smjacob	}
575196008Smjacob}
576196008Smjacob
577290018Smavstatic int
578290018Smavisp_fc_enable_vp(ispsoftc_t *isp, int chan)
579290018Smav{
580290018Smav	fcparam *fcp = FCPARAM(isp, chan);
581290018Smav	mbreg_t mbs;
582290018Smav	vp_modify_t *vp;
583290018Smav	uint8_t qe[QENTRY_LEN], *scp;
584290018Smav
585290018Smav	ISP_MEMZERO(qe, QENTRY_LEN);
586290018Smav	if (FC_SCRATCH_ACQUIRE(isp, chan)) {
587290018Smav		return (EBUSY);
588290018Smav	}
589290018Smav	scp = fcp->isp_scratch;
590290018Smav
591290018Smav	/*
592290018Smav	 * Build a VP MODIFY command in memory
593290018Smav	 */
594290018Smav	vp = (vp_modify_t *) qe;
595290018Smav	vp->vp_mod_hdr.rqs_entry_type = RQSTYPE_VP_MODIFY;
596290018Smav	vp->vp_mod_hdr.rqs_entry_count = 1;
597290018Smav	vp->vp_mod_cnt = 1;
598290018Smav	vp->vp_mod_idx0 = chan;
599290018Smav	vp->vp_mod_cmd = VP_MODIFY_ENA;
600290980Smav	vp->vp_mod_ports[0].options = ICB2400_VPOPT_ENABLED |
601290980Smav	    ICB2400_VPOPT_ENA_SNSLOGIN;
602290018Smav	if (fcp->role & ISP_ROLE_INITIATOR) {
603290018Smav		vp->vp_mod_ports[0].options |= ICB2400_VPOPT_INI_ENABLE;
604290018Smav	}
605290018Smav	if ((fcp->role & ISP_ROLE_TARGET) == 0) {
606290018Smav		vp->vp_mod_ports[0].options |= ICB2400_VPOPT_TGT_DISABLE;
607290018Smav	}
608290018Smav	if (fcp->isp_loopid < LOCAL_LOOP_LIM) {
609290018Smav		vp->vp_mod_ports[0].loopid = fcp->isp_loopid;
610290018Smav		if (isp->isp_confopts & ISP_CFG_OWNLOOPID)
611290018Smav			vp->vp_mod_ports[0].options |=
612290018Smav			    ICB2400_VPOPT_HARD_ADDRESS;
613290018Smav		else
614290018Smav			vp->vp_mod_ports[0].options |=
615290018Smav			    ICB2400_VPOPT_PREV_ADDRESS;
616290018Smav	}
617290018Smav	MAKE_NODE_NAME_FROM_WWN(vp->vp_mod_ports[0].wwpn, fcp->isp_wwpn);
618290018Smav	MAKE_NODE_NAME_FROM_WWN(vp->vp_mod_ports[0].wwnn, fcp->isp_wwnn);
619290018Smav	isp_put_vp_modify(isp, vp, (vp_modify_t *) scp);
620290018Smav
621290018Smav	/*
622290018Smav	 * Build a EXEC IOCB A64 command that points to the VP MODIFY command
623290018Smav	 */
624290018Smav	MBSINIT(&mbs, MBOX_EXEC_COMMAND_IOCB_A64, MBLOGALL, 0);
625290018Smav	mbs.param[1] = QENTRY_LEN;
626290018Smav	mbs.param[2] = DMA_WD1(fcp->isp_scdma);
627290018Smav	mbs.param[3] = DMA_WD0(fcp->isp_scdma);
628290018Smav	mbs.param[6] = DMA_WD3(fcp->isp_scdma);
629290018Smav	mbs.param[7] = DMA_WD2(fcp->isp_scdma);
630290018Smav	MEMORYBARRIER(isp, SYNC_SFORDEV, 0, 2 * QENTRY_LEN, chan);
631290018Smav	isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs);
632290018Smav	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
633290018Smav		FC_SCRATCH_RELEASE(isp, chan);
634290018Smav		return (EIO);
635290018Smav	}
636290018Smav	MEMORYBARRIER(isp, SYNC_SFORCPU, QENTRY_LEN, QENTRY_LEN, chan);
637290018Smav	isp_get_vp_modify(isp, (vp_modify_t *)&scp[QENTRY_LEN], vp);
638290018Smav
639290018Smav	FC_SCRATCH_RELEASE(isp, chan);
640290018Smav
641290018Smav	if (vp->vp_mod_status != VP_STS_OK) {
642290018Smav		isp_prt(isp, ISP_LOGERR, "%s: VP_MODIFY of Chan %d failed with status %d", __func__, chan, vp->vp_mod_status);
643290018Smav		return (EIO);
644290018Smav	}
645290018Smav	return (0);
646290018Smav}
647290018Smav
648290018Smavstatic int
649290018Smavisp_fc_disable_vp(ispsoftc_t *isp, int chan)
650290018Smav{
651290018Smav	fcparam *fcp = FCPARAM(isp, chan);
652290018Smav	mbreg_t mbs;
653290018Smav	vp_ctrl_info_t *vp;
654290018Smav	uint8_t qe[QENTRY_LEN], *scp;
655290018Smav
656290018Smav	ISP_MEMZERO(qe, QENTRY_LEN);
657290018Smav	if (FC_SCRATCH_ACQUIRE(isp, chan)) {
658290018Smav		return (EBUSY);
659290018Smav	}
660290018Smav	scp = fcp->isp_scratch;
661290018Smav
662290018Smav	/*
663290018Smav	 * Build a VP CTRL command in memory
664290018Smav	 */
665290018Smav	vp = (vp_ctrl_info_t *) qe;
666290018Smav	vp->vp_ctrl_hdr.rqs_entry_type = RQSTYPE_VP_CTRL;
667290018Smav	vp->vp_ctrl_hdr.rqs_entry_count = 1;
668290018Smav	if (ISP_CAP_VP0(isp)) {
669290018Smav		vp->vp_ctrl_status = 1;
670290018Smav	} else {
671290018Smav		vp->vp_ctrl_status = 0;
672290018Smav		chan--;	/* VP0 can not be controlled in this case. */
673290018Smav	}
674290018Smav	vp->vp_ctrl_command = VP_CTRL_CMD_DISABLE_VP_LOGO_ALL;
675290018Smav	vp->vp_ctrl_vp_count = 1;
676290018Smav	vp->vp_ctrl_idmap[chan / 16] |= (1 << chan % 16);
677290018Smav	isp_put_vp_ctrl_info(isp, vp, (vp_ctrl_info_t *) scp);
678290018Smav
679290018Smav	/*
680290018Smav	 * Build a EXEC IOCB A64 command that points to the VP CTRL command
681290018Smav	 */
682290018Smav	MBSINIT(&mbs, MBOX_EXEC_COMMAND_IOCB_A64, MBLOGALL, 0);
683290018Smav	mbs.param[1] = QENTRY_LEN;
684290018Smav	mbs.param[2] = DMA_WD1(fcp->isp_scdma);
685290018Smav	mbs.param[3] = DMA_WD0(fcp->isp_scdma);
686290018Smav	mbs.param[6] = DMA_WD3(fcp->isp_scdma);
687290018Smav	mbs.param[7] = DMA_WD2(fcp->isp_scdma);
688290018Smav	MEMORYBARRIER(isp, SYNC_SFORDEV, 0, 2 * QENTRY_LEN, chan);
689290018Smav	isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs);
690290018Smav	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
691290018Smav		FC_SCRATCH_RELEASE(isp, chan);
692290018Smav		return (EIO);
693290018Smav	}
694290018Smav	MEMORYBARRIER(isp, SYNC_SFORCPU, QENTRY_LEN, QENTRY_LEN, chan);
695290018Smav	isp_get_vp_ctrl_info(isp, (vp_ctrl_info_t *)&scp[QENTRY_LEN], vp);
696290018Smav
697290018Smav	FC_SCRATCH_RELEASE(isp, chan);
698290018Smav
699290018Smav	if (vp->vp_ctrl_status != 0) {
700290018Smav		isp_prt(isp, ISP_LOGERR,
701290018Smav		    "%s: VP_CTRL of Chan %d failed with status %d %d",
702290018Smav		    __func__, chan, vp->vp_ctrl_status, vp->vp_ctrl_index_fail);
703290018Smav		return (EIO);
704290018Smav	}
705290018Smav	return (0);
706290018Smav}
707290018Smav
708196008Smjacob/*
709196008Smjacob * Change Roles
710196008Smjacob */
711196008Smjacobint
712196008Smjacobisp_fc_change_role(ispsoftc_t *isp, int chan, int new_role)
713196008Smjacob{
714196008Smjacob	fcparam *fcp = FCPARAM(isp, chan);
715290018Smav	int i, was, res = 0;
716196008Smjacob
717196008Smjacob	if (chan >= isp->isp_nchan) {
718196008Smjacob		isp_prt(isp, ISP_LOGWARN, "%s: bad channel %d", __func__, chan);
719196008Smjacob		return (ENXIO);
720196008Smjacob	}
721290018Smav	if (fcp->role == new_role)
722290018Smav		return (0);
723290018Smav	for (was = 0, i = 0; i < isp->isp_nchan; i++) {
724290018Smav		if (FCPARAM(isp, i)->role != ISP_ROLE_NONE)
725290018Smav			was++;
726290018Smav	}
727290018Smav	if (was == 0 || (was == 1 && fcp->role != ISP_ROLE_NONE)) {
728196008Smjacob		fcp->role = new_role;
729285459Smav		return (isp_reinit(isp, 0));
730196008Smjacob	}
731290018Smav	if (fcp->role != ISP_ROLE_NONE)
732290018Smav		res = isp_fc_disable_vp(isp, chan);
733290018Smav	fcp->role = new_role;
734290018Smav	if (fcp->role != ISP_ROLE_NONE)
735290018Smav		res = isp_fc_enable_vp(isp, chan);
736290018Smav	return (res);
737196008Smjacob}
738196008Smjacob
739164272Smjacobvoid
740196008Smjacobisp_clear_commands(ispsoftc_t *isp)
741196008Smjacob{
742203444Smjacob	uint32_t tmp;
743203444Smjacob	isp_hdl_t *hdp;
744196008Smjacob#ifdef	ISP_TARGET_MODE
745196008Smjacob	isp_notify_t notify;
746196008Smjacob#endif
747196008Smjacob
748196008Smjacob	for (tmp = 0; isp->isp_xflist && tmp < isp->isp_maxcmds; tmp++) {
749203444Smjacob		XS_T *xs;
750203444Smjacob
751203444Smjacob		hdp = &isp->isp_xflist[tmp];
752203444Smjacob		if (hdp->handle == ISP_HANDLE_FREE) {
753196008Smjacob			continue;
754196008Smjacob		}
755203444Smjacob		xs = hdp->cmd;
756196008Smjacob		if (XS_XFRLEN(xs)) {
757203444Smjacob			ISP_DMAFREE(isp, xs, hdp->handle);
758196008Smjacob			XS_SET_RESID(xs, XS_XFRLEN(xs));
759196008Smjacob		} else {
760196008Smjacob			XS_SET_RESID(xs, 0);
761196008Smjacob		}
762203444Smjacob		hdp->handle = 0;
763203444Smjacob		hdp->cmd = NULL;
764196008Smjacob		XS_SETERR(xs, HBA_BUSRESET);
765196008Smjacob		isp_done(xs);
766196008Smjacob	}
767196008Smjacob#ifdef	ISP_TARGET_MODE
768196008Smjacob	for (tmp = 0; isp->isp_tgtlist && tmp < isp->isp_maxcmds; tmp++) {
769196008Smjacob		uint8_t local[QENTRY_LEN];
770203478Smjacob		hdp = &isp->isp_tgtlist[tmp];
771203444Smjacob		if (hdp->handle == ISP_HANDLE_FREE) {
772196008Smjacob			continue;
773196008Smjacob		}
774203444Smjacob		ISP_DMAFREE(isp, hdp->cmd, hdp->handle);
775196008Smjacob		ISP_MEMZERO(local, QENTRY_LEN);
776196008Smjacob		if (IS_24XX(isp)) {
777196008Smjacob			ct7_entry_t *ctio = (ct7_entry_t *) local;
778203444Smjacob			ctio->ct_syshandle = hdp->handle;
779196008Smjacob			ctio->ct_nphdl = CT_HBA_RESET;
780196008Smjacob			ctio->ct_header.rqs_entry_type = RQSTYPE_CTIO7;
781196008Smjacob		} else if (IS_FC(isp)) {
782196008Smjacob			ct2_entry_t *ctio = (ct2_entry_t *) local;
783203444Smjacob			ctio->ct_syshandle = hdp->handle;
784196008Smjacob			ctio->ct_status = CT_HBA_RESET;
785196008Smjacob			ctio->ct_header.rqs_entry_type = RQSTYPE_CTIO2;
786196008Smjacob		} else {
787196008Smjacob			ct_entry_t *ctio = (ct_entry_t *) local;
788204397Smjacob			ctio->ct_syshandle = hdp->handle;
789201758Smbr			ctio->ct_status = CT_HBA_RESET & 0xff;
790196008Smjacob			ctio->ct_header.rqs_entry_type = RQSTYPE_CTIO;
791196008Smjacob		}
792196008Smjacob		isp_async(isp, ISPASYNC_TARGET_ACTION, local);
793196008Smjacob	}
794196008Smjacob	for (tmp = 0; tmp < isp->isp_nchan; tmp++) {
795196008Smjacob		ISP_MEMZERO(&notify, sizeof (isp_notify_t));
796196008Smjacob		notify.nt_ncode = NT_HBA_RESET;
797196008Smjacob		notify.nt_hba = isp;
798196008Smjacob		notify.nt_wwn = INI_ANY;
799196008Smjacob		notify.nt_nphdl = NIL_HANDLE;
800196008Smjacob		notify.nt_sid = PORT_ANY;
801196008Smjacob		notify.nt_did = PORT_ANY;
802196008Smjacob		notify.nt_tgt = TGT_ANY;
803196008Smjacob		notify.nt_channel = tmp;
804196008Smjacob		notify.nt_lun = LUN_ANY;
805196008Smjacob		notify.nt_tagval = TAG_ANY;
806196008Smjacob		isp_async(isp, ISPASYNC_TARGET_NOTIFY, &notify);
807196008Smjacob	}
808196008Smjacob#endif
809196008Smjacob}
810196008Smjacob
811196008Smjacobvoid
812163899Smjacobisp_shutdown(ispsoftc_t *isp)
813163899Smjacob{
814163899Smjacob	if (IS_FC(isp)) {
815163899Smjacob		if (IS_24XX(isp)) {
816163899Smjacob			ISP_WRITE(isp, BIU2400_ICR, 0);
817163899Smjacob			ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_PAUSE);
818163899Smjacob		} else {
819163899Smjacob			ISP_WRITE(isp, BIU_ICR, 0);
820163899Smjacob			ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
821163899Smjacob			ISP_WRITE(isp, BIU2100_CSR, BIU2100_FPM0_REGS);
822163899Smjacob			ISP_WRITE(isp, FPM_DIAG_CONFIG, FPM_SOFT_RESET);
823163899Smjacob			ISP_WRITE(isp, BIU2100_CSR, BIU2100_FB_REGS);
824163899Smjacob			ISP_WRITE(isp, FBM_CMD, FBMCMD_FIFO_RESET_ALL);
825163899Smjacob			ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS);
826163899Smjacob		}
827163899Smjacob	} else {
828163899Smjacob		ISP_WRITE(isp, BIU_ICR, 0);
829163899Smjacob		ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
830163899Smjacob	}
831163899Smjacob}
832163899Smjacob
833155228Smjacob/*
834155228Smjacob * Functions to move stuff to a form that the QLogic RISC engine understands
835155228Smjacob * and functions to move stuff back to a form the processor understands.
836155228Smjacob *
837155228Smjacob * Each platform is required to provide the 8, 16 and 32 bit
838155228Smjacob * swizzle and unswizzle macros (ISP_IOX{PUT|GET}_{8,16,32})
839155228Smjacob *
840155228Smjacob * The assumption is that swizzling and unswizzling is mostly done 'in place'
841155228Smjacob * (with a few exceptions for efficiency).
842155228Smjacob */
843155228Smjacob
844196008Smjacob#define	ISP_IS_SBUS(isp)	(ISP_SBUS_SUPPORTED && (isp)->isp_bustype == ISP_BT_SBUS)
845155228Smjacob
846163899Smjacob#define	ASIZE(x)	(sizeof (x) / sizeof (x[0]))
847155228Smjacob/*
848155228Smjacob * Swizzle/Copy Functions
849155228Smjacob */
850155228Smjacobvoid
851163899Smjacobisp_put_hdr(ispsoftc_t *isp, isphdr_t *hpsrc, isphdr_t *hpdst)
852155228Smjacob{
853155228Smjacob	if (ISP_IS_SBUS(isp)) {
854196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_entry_type, &hpdst->rqs_entry_count);
855196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_entry_count, &hpdst->rqs_entry_type);
856196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_seqno, &hpdst->rqs_flags);
857196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_flags, &hpdst->rqs_seqno);
858155228Smjacob	} else {
859196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_entry_type, &hpdst->rqs_entry_type);
860196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_entry_count, &hpdst->rqs_entry_count);
861196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_seqno, &hpdst->rqs_seqno);
862196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_flags, &hpdst->rqs_flags);
863155228Smjacob	}
864155228Smjacob}
865155228Smjacob
866155228Smjacobvoid
867163899Smjacobisp_get_hdr(ispsoftc_t *isp, isphdr_t *hpsrc, isphdr_t *hpdst)
868155228Smjacob{
869155228Smjacob	if (ISP_IS_SBUS(isp)) {
870196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_entry_type, hpdst->rqs_entry_count);
871196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_entry_count, hpdst->rqs_entry_type);
872196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_seqno, hpdst->rqs_flags);
873196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_flags, hpdst->rqs_seqno);
874155228Smjacob	} else {
875196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_entry_type, hpdst->rqs_entry_type);
876196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_entry_count, hpdst->rqs_entry_count);
877196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_seqno, hpdst->rqs_seqno);
878196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_flags, hpdst->rqs_flags);
879155228Smjacob	}
880155228Smjacob}
881155228Smjacob
882155228Smjacobint
883155704Smjacobisp_get_response_type(ispsoftc_t *isp, isphdr_t *hp)
884155228Smjacob{
885155704Smjacob	uint8_t type;
886155228Smjacob	if (ISP_IS_SBUS(isp)) {
887155228Smjacob		ISP_IOXGET_8(isp, &hp->rqs_entry_count, type);
888155228Smjacob	} else {
889155228Smjacob		ISP_IOXGET_8(isp, &hp->rqs_entry_type, type);
890155228Smjacob	}
891155228Smjacob	return ((int)type);
892155228Smjacob}
893155228Smjacob
894155228Smjacobvoid
895155704Smjacobisp_put_request(ispsoftc_t *isp, ispreq_t *rqsrc, ispreq_t *rqdst)
896155228Smjacob{
897155228Smjacob	int i;
898163899Smjacob	isp_put_hdr(isp, &rqsrc->req_header, &rqdst->req_header);
899155228Smjacob	ISP_IOXPUT_32(isp, rqsrc->req_handle, &rqdst->req_handle);
900155228Smjacob	if (ISP_IS_SBUS(isp)) {
901155228Smjacob		ISP_IOXPUT_8(isp, rqsrc->req_lun_trn, &rqdst->req_target);
902155228Smjacob		ISP_IOXPUT_8(isp, rqsrc->req_target, &rqdst->req_lun_trn);
903155228Smjacob	} else {
904155228Smjacob		ISP_IOXPUT_8(isp, rqsrc->req_lun_trn, &rqdst->req_lun_trn);
905155228Smjacob		ISP_IOXPUT_8(isp, rqsrc->req_target, &rqdst->req_target);
906155228Smjacob	}
907155228Smjacob	ISP_IOXPUT_16(isp, rqsrc->req_cdblen, &rqdst->req_cdblen);
908155228Smjacob	ISP_IOXPUT_16(isp, rqsrc->req_flags, &rqdst->req_flags);
909155228Smjacob	ISP_IOXPUT_16(isp, rqsrc->req_time, &rqdst->req_time);
910155228Smjacob	ISP_IOXPUT_16(isp, rqsrc->req_seg_count, &rqdst->req_seg_count);
911163899Smjacob	for (i = 0; i < ASIZE(rqsrc->req_cdb); i++) {
912155228Smjacob		ISP_IOXPUT_8(isp, rqsrc->req_cdb[i], &rqdst->req_cdb[i]);
913155228Smjacob	}
914155228Smjacob	for (i = 0; i < ISP_RQDSEG; i++) {
915196008Smjacob		ISP_IOXPUT_32(isp, rqsrc->req_dataseg[i].ds_base, &rqdst->req_dataseg[i].ds_base);
916196008Smjacob		ISP_IOXPUT_32(isp, rqsrc->req_dataseg[i].ds_count, &rqdst->req_dataseg[i].ds_count);
917155228Smjacob	}
918155228Smjacob}
919155228Smjacob
920155228Smjacobvoid
921163899Smjacobisp_put_marker(ispsoftc_t *isp, isp_marker_t *src, isp_marker_t *dst)
922155228Smjacob{
923155228Smjacob	int i;
924163899Smjacob	isp_put_hdr(isp, &src->mrk_header, &dst->mrk_header);
925163899Smjacob	ISP_IOXPUT_32(isp, src->mrk_handle, &dst->mrk_handle);
926163899Smjacob	if (ISP_IS_SBUS(isp)) {
927163899Smjacob		ISP_IOXPUT_8(isp, src->mrk_reserved0, &dst->mrk_target);
928163899Smjacob		ISP_IOXPUT_8(isp, src->mrk_target, &dst->mrk_reserved0);
929163899Smjacob	} else {
930163899Smjacob		ISP_IOXPUT_8(isp, src->mrk_reserved0, &dst->mrk_reserved0);
931163899Smjacob		ISP_IOXPUT_8(isp, src->mrk_target, &dst->mrk_target);
932155228Smjacob	}
933163899Smjacob	ISP_IOXPUT_16(isp, src->mrk_modifier, &dst->mrk_modifier);
934163899Smjacob	ISP_IOXPUT_16(isp, src->mrk_flags, &dst->mrk_flags);
935163899Smjacob	ISP_IOXPUT_16(isp, src->mrk_lun, &dst->mrk_lun);
936163899Smjacob	for (i = 0; i < ASIZE(src->mrk_reserved1); i++) {
937196008Smjacob		ISP_IOXPUT_8(isp, src->mrk_reserved1[i], &dst->mrk_reserved1[i]);
938163899Smjacob	}
939163899Smjacob}
940163899Smjacob
941163899Smjacobvoid
942196008Smjacobisp_put_marker_24xx(ispsoftc_t *isp, isp_marker_24xx_t *src, isp_marker_24xx_t *dst)
943163899Smjacob{
944163899Smjacob	int i;
945163899Smjacob	isp_put_hdr(isp, &src->mrk_header, &dst->mrk_header);
946163899Smjacob	ISP_IOXPUT_32(isp, src->mrk_handle, &dst->mrk_handle);
947163899Smjacob	ISP_IOXPUT_16(isp, src->mrk_nphdl, &dst->mrk_nphdl);
948163899Smjacob	ISP_IOXPUT_8(isp, src->mrk_modifier, &dst->mrk_modifier);
949163899Smjacob	ISP_IOXPUT_8(isp, src->mrk_reserved0, &dst->mrk_reserved0);
950163899Smjacob	ISP_IOXPUT_8(isp, src->mrk_reserved1, &dst->mrk_reserved1);
951163899Smjacob	ISP_IOXPUT_8(isp, src->mrk_vphdl, &dst->mrk_vphdl);
952163899Smjacob	ISP_IOXPUT_8(isp, src->mrk_reserved2, &dst->mrk_reserved2);
953163899Smjacob	for (i = 0; i < ASIZE(src->mrk_lun); i++) {
954163899Smjacob		ISP_IOXPUT_8(isp, src->mrk_lun[i], &dst->mrk_lun[i]);
955163899Smjacob	}
956163899Smjacob	for (i = 0; i < ASIZE(src->mrk_reserved3); i++) {
957196008Smjacob		ISP_IOXPUT_8(isp, src->mrk_reserved3[i], &dst->mrk_reserved3[i]);
958163899Smjacob	}
959163899Smjacob}
960163899Smjacob
961163899Smjacobvoid
962163899Smjacobisp_put_request_t2(ispsoftc_t *isp, ispreqt2_t *src, ispreqt2_t *dst)
963163899Smjacob{
964163899Smjacob	int i;
965163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
966163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
967163899Smjacob	ISP_IOXPUT_8(isp, src->req_lun_trn, &dst->req_lun_trn);
968163899Smjacob	ISP_IOXPUT_8(isp, src->req_target, &dst->req_target);
969163899Smjacob	ISP_IOXPUT_16(isp, src->req_scclun, &dst->req_scclun);
970163899Smjacob	ISP_IOXPUT_16(isp, src->req_flags,  &dst->req_flags);
971163899Smjacob	ISP_IOXPUT_16(isp, src->req_reserved, &dst->req_reserved);
972163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
973163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
974163899Smjacob	for (i = 0; i < ASIZE(src->req_cdb); i++) {
975163899Smjacob		ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]);
976163899Smjacob	}
977163899Smjacob	ISP_IOXPUT_32(isp, src->req_totalcnt, &dst->req_totalcnt);
978155228Smjacob	for (i = 0; i < ISP_RQDSEG_T2; i++) {
979196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
980196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
981155228Smjacob	}
982155228Smjacob}
983155228Smjacob
984155228Smjacobvoid
985163899Smjacobisp_put_request_t2e(ispsoftc_t *isp, ispreqt2e_t *src, ispreqt2e_t *dst)
986155228Smjacob{
987155228Smjacob	int i;
988163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
989163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
990163899Smjacob	ISP_IOXPUT_16(isp, src->req_target, &dst->req_target);
991163899Smjacob	ISP_IOXPUT_16(isp, src->req_scclun, &dst->req_scclun);
992163899Smjacob	ISP_IOXPUT_16(isp, src->req_flags,  &dst->req_flags);
993163899Smjacob	ISP_IOXPUT_16(isp, src->req_reserved, &dst->req_reserved);
994163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
995163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
996163899Smjacob	for (i = 0; i < ASIZE(src->req_cdb); i++) {
997163899Smjacob		ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]);
998155228Smjacob	}
999163899Smjacob	ISP_IOXPUT_32(isp, src->req_totalcnt, &dst->req_totalcnt);
1000155228Smjacob	for (i = 0; i < ISP_RQDSEG_T2; i++) {
1001196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
1002196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
1003155228Smjacob	}
1004155228Smjacob}
1005155228Smjacob
1006155228Smjacobvoid
1007163899Smjacobisp_put_request_t3(ispsoftc_t *isp, ispreqt3_t *src, ispreqt3_t *dst)
1008155228Smjacob{
1009155228Smjacob	int i;
1010163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
1011163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
1012163899Smjacob	ISP_IOXPUT_8(isp, src->req_lun_trn, &dst->req_lun_trn);
1013163899Smjacob	ISP_IOXPUT_8(isp, src->req_target, &dst->req_target);
1014163899Smjacob	ISP_IOXPUT_16(isp, src->req_scclun, &dst->req_scclun);
1015163899Smjacob	ISP_IOXPUT_16(isp, src->req_flags,  &dst->req_flags);
1016238869Smjacob	ISP_IOXPUT_8(isp, src->req_crn, &dst->req_crn);
1017238869Smjacob	ISP_IOXPUT_8(isp, src->req_reserved, &dst->req_reserved);
1018163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
1019163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
1020163899Smjacob	for (i = 0; i < ASIZE(src->req_cdb); i++) {
1021163899Smjacob		ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]);
1022155228Smjacob	}
1023163899Smjacob	ISP_IOXPUT_32(isp, src->req_totalcnt, &dst->req_totalcnt);
1024155228Smjacob	for (i = 0; i < ISP_RQDSEG_T3; i++) {
1025196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
1026196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_basehi, &dst->req_dataseg[i].ds_basehi);
1027196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
1028155228Smjacob	}
1029155228Smjacob}
1030155228Smjacob
1031155228Smjacobvoid
1032163899Smjacobisp_put_request_t3e(ispsoftc_t *isp, ispreqt3e_t *src, ispreqt3e_t *dst)
1033155228Smjacob{
1034155228Smjacob	int i;
1035163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
1036163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
1037163899Smjacob	ISP_IOXPUT_16(isp, src->req_target, &dst->req_target);
1038163899Smjacob	ISP_IOXPUT_16(isp, src->req_scclun, &dst->req_scclun);
1039163899Smjacob	ISP_IOXPUT_16(isp, src->req_flags,  &dst->req_flags);
1040238869Smjacob	ISP_IOXPUT_8(isp, src->req_crn, &dst->req_crn);
1041238869Smjacob	ISP_IOXPUT_8(isp, src->req_reserved, &dst->req_reserved);
1042163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
1043163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
1044163899Smjacob	for (i = 0; i < ASIZE(src->req_cdb); i++) {
1045163899Smjacob		ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]);
1046155228Smjacob	}
1047163899Smjacob	ISP_IOXPUT_32(isp, src->req_totalcnt, &dst->req_totalcnt);
1048155228Smjacob	for (i = 0; i < ISP_RQDSEG_T3; i++) {
1049196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
1050196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_basehi, &dst->req_dataseg[i].ds_basehi);
1051196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
1052155228Smjacob	}
1053155228Smjacob}
1054155228Smjacob
1055155228Smjacobvoid
1056163899Smjacobisp_put_extended_request(ispsoftc_t *isp, ispextreq_t *src, ispextreq_t *dst)
1057155228Smjacob{
1058155228Smjacob	int i;
1059163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
1060163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
1061155228Smjacob	if (ISP_IS_SBUS(isp)) {
1062163899Smjacob		ISP_IOXPUT_8(isp, src->req_lun_trn, &dst->req_target);
1063163899Smjacob		ISP_IOXPUT_8(isp, src->req_target, &dst->req_lun_trn);
1064155228Smjacob	} else {
1065163899Smjacob		ISP_IOXPUT_8(isp, src->req_lun_trn, &dst->req_lun_trn);
1066163899Smjacob		ISP_IOXPUT_8(isp, src->req_target, &dst->req_target);
1067155228Smjacob	}
1068163899Smjacob	ISP_IOXPUT_16(isp, src->req_cdblen, &dst->req_cdblen);
1069163899Smjacob	ISP_IOXPUT_16(isp, src->req_flags, &dst->req_flags);
1070163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
1071163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
1072163899Smjacob	for (i = 0; i < ASIZE(src->req_cdb); i++) {
1073163899Smjacob		ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]);
1074155228Smjacob	}
1075155228Smjacob}
1076155228Smjacob
1077155228Smjacobvoid
1078163899Smjacobisp_put_request_t7(ispsoftc_t *isp, ispreqt7_t *src, ispreqt7_t *dst)
1079155228Smjacob{
1080155228Smjacob	int i;
1081163899Smjacob	uint32_t *a, *b;
1082163899Smjacob
1083163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
1084163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
1085163899Smjacob	ISP_IOXPUT_16(isp, src->req_nphdl, &dst->req_nphdl);
1086163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
1087163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
1088163899Smjacob	ISP_IOXPUT_16(isp, src->req_reserved, &dst->req_reserved);
1089163899Smjacob	a = (uint32_t *) src->req_lun;
1090163899Smjacob	b = (uint32_t *) dst->req_lun;
1091163899Smjacob	for (i = 0; i < (ASIZE(src->req_lun) >> 2); i++ ) {
1092171159Smjacob		*b++ = ISP_SWAP32(isp, *a++);
1093163899Smjacob	}
1094163899Smjacob	ISP_IOXPUT_8(isp, src->req_alen_datadir, &dst->req_alen_datadir);
1095163899Smjacob	ISP_IOXPUT_8(isp, src->req_task_management, &dst->req_task_management);
1096163899Smjacob	ISP_IOXPUT_8(isp, src->req_task_attribute, &dst->req_task_attribute);
1097163899Smjacob	ISP_IOXPUT_8(isp, src->req_crn, &dst->req_crn);
1098163899Smjacob	a = (uint32_t *) src->req_cdb;
1099163899Smjacob	b = (uint32_t *) dst->req_cdb;
1100171159Smjacob	for (i = 0; i < (ASIZE(src->req_cdb) >> 2); i++) {
1101171159Smjacob		*b++ = ISP_SWAP32(isp, *a++);
1102163899Smjacob	}
1103163899Smjacob	ISP_IOXPUT_32(isp, src->req_dl, &dst->req_dl);
1104163899Smjacob	ISP_IOXPUT_16(isp, src->req_tidlo, &dst->req_tidlo);
1105163899Smjacob	ISP_IOXPUT_8(isp, src->req_tidhi, &dst->req_tidhi);
1106163899Smjacob	ISP_IOXPUT_8(isp, src->req_vpidx, &dst->req_vpidx);
1107196008Smjacob	ISP_IOXPUT_32(isp, src->req_dataseg.ds_base, &dst->req_dataseg.ds_base);
1108196008Smjacob	ISP_IOXPUT_32(isp, src->req_dataseg.ds_basehi, &dst->req_dataseg.ds_basehi);
1109196008Smjacob	ISP_IOXPUT_32(isp, src->req_dataseg.ds_count, &dst->req_dataseg.ds_count);
1110163899Smjacob}
1111163899Smjacob
1112163899Smjacobvoid
1113196008Smjacobisp_put_24xx_tmf(ispsoftc_t *isp, isp24xx_tmf_t *src, isp24xx_tmf_t *dst)
1114196008Smjacob{
1115196008Smjacob	int i;
1116196008Smjacob	uint32_t *a, *b;
1117196008Smjacob
1118196008Smjacob	isp_put_hdr(isp, &src->tmf_header, &dst->tmf_header);
1119196008Smjacob	ISP_IOXPUT_32(isp, src->tmf_handle, &dst->tmf_handle);
1120196008Smjacob	ISP_IOXPUT_16(isp, src->tmf_nphdl, &dst->tmf_nphdl);
1121196008Smjacob	ISP_IOXPUT_16(isp, src->tmf_delay, &dst->tmf_delay);
1122196008Smjacob	ISP_IOXPUT_16(isp, src->tmf_timeout, &dst->tmf_timeout);
1123196008Smjacob	for (i = 0; i < ASIZE(src->tmf_reserved0); i++) {
1124196008Smjacob		ISP_IOXPUT_8(isp, src->tmf_reserved0[i], &dst->tmf_reserved0[i]);
1125196008Smjacob	}
1126196008Smjacob	a = (uint32_t *) src->tmf_lun;
1127196008Smjacob	b = (uint32_t *) dst->tmf_lun;
1128196008Smjacob	for (i = 0; i < (ASIZE(src->tmf_lun) >> 2); i++ ) {
1129196008Smjacob		*b++ = ISP_SWAP32(isp, *a++);
1130196008Smjacob	}
1131196008Smjacob	ISP_IOXPUT_32(isp, src->tmf_flags, &dst->tmf_flags);
1132196008Smjacob	for (i = 0; i < ASIZE(src->tmf_reserved1); i++) {
1133196008Smjacob		ISP_IOXPUT_8(isp, src->tmf_reserved1[i], &dst->tmf_reserved1[i]);
1134196008Smjacob	}
1135196008Smjacob	ISP_IOXPUT_16(isp, src->tmf_tidlo, &dst->tmf_tidlo);
1136196008Smjacob	ISP_IOXPUT_8(isp, src->tmf_tidhi, &dst->tmf_tidhi);
1137196008Smjacob	ISP_IOXPUT_8(isp, src->tmf_vpidx, &dst->tmf_vpidx);
1138196008Smjacob	for (i = 0; i < ASIZE(src->tmf_reserved2); i++) {
1139196008Smjacob		ISP_IOXPUT_8(isp, src->tmf_reserved2[i], &dst->tmf_reserved2[i]);
1140196008Smjacob	}
1141196008Smjacob}
1142196008Smjacob
1143196008Smjacobvoid
1144163899Smjacobisp_put_24xx_abrt(ispsoftc_t *isp, isp24xx_abrt_t *src, isp24xx_abrt_t *dst)
1145163899Smjacob{
1146163899Smjacob	int i;
1147163899Smjacob	isp_put_hdr(isp, &src->abrt_header, &dst->abrt_header);
1148163899Smjacob	ISP_IOXPUT_32(isp, src->abrt_handle, &dst->abrt_handle);
1149163899Smjacob	ISP_IOXPUT_16(isp, src->abrt_nphdl, &dst->abrt_nphdl);
1150163899Smjacob	ISP_IOXPUT_16(isp, src->abrt_options, &dst->abrt_options);
1151163899Smjacob	ISP_IOXPUT_32(isp, src->abrt_cmd_handle, &dst->abrt_cmd_handle);
1152289886Smav	ISP_IOXPUT_16(isp, src->abrt_queue_number, &dst->abrt_queue_number);
1153163899Smjacob	for (i = 0; i < ASIZE(src->abrt_reserved); i++) {
1154196008Smjacob		ISP_IOXPUT_8(isp, src->abrt_reserved[i], &dst->abrt_reserved[i]);
1155163899Smjacob	}
1156163899Smjacob	ISP_IOXPUT_16(isp, src->abrt_tidlo, &dst->abrt_tidlo);
1157163899Smjacob	ISP_IOXPUT_8(isp, src->abrt_tidhi, &dst->abrt_tidhi);
1158163899Smjacob	ISP_IOXPUT_8(isp, src->abrt_vpidx, &dst->abrt_vpidx);
1159163899Smjacob	for (i = 0; i < ASIZE(src->abrt_reserved1); i++) {
1160196008Smjacob		ISP_IOXPUT_8(isp, src->abrt_reserved1[i], &dst->abrt_reserved1[i]);
1161163899Smjacob	}
1162163899Smjacob}
1163163899Smjacob
1164163899Smjacobvoid
1165163899Smjacobisp_put_cont_req(ispsoftc_t *isp, ispcontreq_t *src, ispcontreq_t *dst)
1166163899Smjacob{
1167163899Smjacob	int i;
1168163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
1169155228Smjacob	for (i = 0; i < ISP_CDSEG; i++) {
1170196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
1171196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
1172155228Smjacob	}
1173155228Smjacob}
1174155228Smjacob
1175155228Smjacobvoid
1176163899Smjacobisp_put_cont64_req(ispsoftc_t *isp, ispcontreq64_t *src, ispcontreq64_t *dst)
1177155228Smjacob{
1178155228Smjacob	int i;
1179163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
1180155228Smjacob	for (i = 0; i < ISP_CDSEG64; i++) {
1181196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
1182196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_basehi, &dst->req_dataseg[i].ds_basehi);
1183196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
1184155228Smjacob	}
1185155228Smjacob}
1186155228Smjacob
1187155228Smjacobvoid
1188163899Smjacobisp_get_response(ispsoftc_t *isp, ispstatusreq_t *src, ispstatusreq_t *dst)
1189155228Smjacob{
1190155228Smjacob	int i;
1191163899Smjacob	isp_get_hdr(isp, &src->req_header, &dst->req_header);
1192163899Smjacob	ISP_IOXGET_32(isp, &src->req_handle, dst->req_handle);
1193163899Smjacob	ISP_IOXGET_16(isp, &src->req_scsi_status, dst->req_scsi_status);
1194196008Smjacob	ISP_IOXGET_16(isp, &src->req_completion_status, dst->req_completion_status);
1195163899Smjacob	ISP_IOXGET_16(isp, &src->req_state_flags, dst->req_state_flags);
1196163899Smjacob	ISP_IOXGET_16(isp, &src->req_status_flags, dst->req_status_flags);
1197163899Smjacob	ISP_IOXGET_16(isp, &src->req_time, dst->req_time);
1198163899Smjacob	ISP_IOXGET_16(isp, &src->req_sense_len, dst->req_sense_len);
1199163899Smjacob	ISP_IOXGET_32(isp, &src->req_resid, dst->req_resid);
1200238869Smjacob	for (i = 0; i < sizeof (src->req_response); i++) {
1201196008Smjacob		ISP_IOXGET_8(isp, &src->req_response[i], dst->req_response[i]);
1202155228Smjacob	}
1203238869Smjacob	for (i = 0; i < sizeof (src->req_sense_data); i++) {
1204196008Smjacob		ISP_IOXGET_8(isp, &src->req_sense_data[i], dst->req_sense_data[i]);
1205155228Smjacob	}
1206155228Smjacob}
1207155228Smjacob
1208155228Smjacobvoid
1209238869Smjacobisp_get_cont_response(ispsoftc_t *isp, ispstatus_cont_t *src, ispstatus_cont_t *dst)
1210238869Smjacob{
1211238869Smjacob	int i;
1212238869Smjacob	isp_get_hdr(isp, &src->req_header, &dst->req_header);
1213238869Smjacob	if (IS_24XX(isp)) {
1214238869Smjacob		uint32_t *a, *b;
1215238869Smjacob		a = (uint32_t *) src->req_sense_data;
1216238869Smjacob		b = (uint32_t *) dst->req_sense_data;
1217238869Smjacob		for (i = 0; i < (sizeof (src->req_sense_data) / sizeof (uint32_t)); i++) {
1218238869Smjacob			ISP_IOZGET_32(isp, a++, *b++);
1219238869Smjacob		}
1220238869Smjacob	} else {
1221238869Smjacob		for (i = 0; i < sizeof (src->req_sense_data); i++) {
1222238869Smjacob			ISP_IOXGET_8(isp, &src->req_sense_data[i], dst->req_sense_data[i]);
1223238869Smjacob		}
1224238869Smjacob	}
1225238869Smjacob}
1226238869Smjacob
1227238869Smjacobvoid
1228196008Smjacobisp_get_24xx_response(ispsoftc_t *isp, isp24xx_statusreq_t *src, isp24xx_statusreq_t *dst)
1229155228Smjacob{
1230155228Smjacob	int i;
1231171159Smjacob	uint32_t *s, *d;
1232171159Smjacob
1233163899Smjacob	isp_get_hdr(isp, &src->req_header, &dst->req_header);
1234163899Smjacob	ISP_IOXGET_32(isp, &src->req_handle, dst->req_handle);
1235196008Smjacob	ISP_IOXGET_16(isp, &src->req_completion_status, dst->req_completion_status);
1236163899Smjacob	ISP_IOXGET_16(isp, &src->req_oxid, dst->req_oxid);
1237163899Smjacob	ISP_IOXGET_32(isp, &src->req_resid, dst->req_resid);
1238163899Smjacob	ISP_IOXGET_16(isp, &src->req_reserved0, dst->req_reserved0);
1239163899Smjacob	ISP_IOXGET_16(isp, &src->req_state_flags, dst->req_state_flags);
1240289855Smav	ISP_IOXGET_16(isp, &src->req_retry_delay, dst->req_retry_delay);
1241163899Smjacob	ISP_IOXGET_16(isp, &src->req_scsi_status, dst->req_scsi_status);
1242163899Smjacob	ISP_IOXGET_32(isp, &src->req_fcp_residual, dst->req_fcp_residual);
1243163899Smjacob	ISP_IOXGET_32(isp, &src->req_sense_len, dst->req_sense_len);
1244163899Smjacob	ISP_IOXGET_32(isp, &src->req_response_len, dst->req_response_len);
1245171159Smjacob	s = (uint32_t *)src->req_rsp_sense;
1246171159Smjacob	d = (uint32_t *)dst->req_rsp_sense;
1247171159Smjacob	for (i = 0; i < (ASIZE(src->req_rsp_sense) >> 2); i++) {
1248171159Smjacob		d[i] = ISP_SWAP32(isp, s[i]);
1249155228Smjacob	}
1250155228Smjacob}
1251155228Smjacob
1252155228Smjacobvoid
1253163899Smjacobisp_get_24xx_abrt(ispsoftc_t *isp, isp24xx_abrt_t *src, isp24xx_abrt_t *dst)
1254163899Smjacob{
1255163899Smjacob	int i;
1256163899Smjacob	isp_get_hdr(isp, &src->abrt_header, &dst->abrt_header);
1257163899Smjacob	ISP_IOXGET_32(isp, &src->abrt_handle, dst->abrt_handle);
1258163899Smjacob	ISP_IOXGET_16(isp, &src->abrt_nphdl, dst->abrt_nphdl);
1259163899Smjacob	ISP_IOXGET_16(isp, &src->abrt_options, dst->abrt_options);
1260163899Smjacob	ISP_IOXGET_32(isp, &src->abrt_cmd_handle, dst->abrt_cmd_handle);
1261289886Smav	ISP_IOXGET_16(isp, &src->abrt_queue_number, dst->abrt_queue_number);
1262171159Smjacob	for (i = 0; i < ASIZE(src->abrt_reserved); i++) {
1263196008Smjacob		ISP_IOXGET_8(isp, &src->abrt_reserved[i], dst->abrt_reserved[i]);
1264163899Smjacob	}
1265163899Smjacob	ISP_IOXGET_16(isp, &src->abrt_tidlo, dst->abrt_tidlo);
1266163899Smjacob	ISP_IOXGET_8(isp, &src->abrt_tidhi, dst->abrt_tidhi);
1267163899Smjacob	ISP_IOXGET_8(isp, &src->abrt_vpidx, dst->abrt_vpidx);
1268171159Smjacob	for (i = 0; i < ASIZE(src->abrt_reserved1); i++) {
1269196008Smjacob		ISP_IOXGET_8(isp, &src->abrt_reserved1[i], dst->abrt_reserved1[i]);
1270163899Smjacob	}
1271163899Smjacob}
1272163899Smjacob
1273163899Smjacob
1274163899Smjacobvoid
1275204397Smjacobisp_get_rio1(ispsoftc_t *isp, isp_rio1_t *r1src, isp_rio1_t *r1dst)
1276204397Smjacob{
1277204397Smjacob	const int lim = sizeof (r1dst->req_handles) / sizeof (r1dst->req_handles[0]);
1278204397Smjacob	int i;
1279204397Smjacob	isp_get_hdr(isp, &r1src->req_header, &r1dst->req_header);
1280204397Smjacob	if (r1dst->req_header.rqs_seqno > lim) {
1281204397Smjacob		r1dst->req_header.rqs_seqno = lim;
1282204397Smjacob	}
1283204397Smjacob	for (i = 0; i < r1dst->req_header.rqs_seqno; i++) {
1284204397Smjacob		ISP_IOXGET_32(isp, &r1src->req_handles[i], r1dst->req_handles[i]);
1285204397Smjacob	}
1286204397Smjacob	while (i < lim) {
1287204397Smjacob		r1dst->req_handles[i++] = 0;
1288204397Smjacob	}
1289204397Smjacob}
1290204397Smjacob
1291204397Smjacobvoid
1292155704Smjacobisp_get_rio2(ispsoftc_t *isp, isp_rio2_t *r2src, isp_rio2_t *r2dst)
1293155228Smjacob{
1294204397Smjacob	const int lim = sizeof (r2dst->req_handles) / sizeof (r2dst->req_handles[0]);
1295155228Smjacob	int i;
1296204397Smjacob
1297163899Smjacob	isp_get_hdr(isp, &r2src->req_header, &r2dst->req_header);
1298204397Smjacob	if (r2dst->req_header.rqs_seqno > lim) {
1299204397Smjacob		r2dst->req_header.rqs_seqno = lim;
1300163899Smjacob	}
1301155228Smjacob	for (i = 0; i < r2dst->req_header.rqs_seqno; i++) {
1302196008Smjacob		ISP_IOXGET_16(isp, &r2src->req_handles[i], r2dst->req_handles[i]);
1303155228Smjacob	}
1304204397Smjacob	while (i < lim) {
1305155228Smjacob		r2dst->req_handles[i++] = 0;
1306155228Smjacob	}
1307155228Smjacob}
1308155228Smjacob
1309155228Smjacobvoid
1310163899Smjacobisp_put_icb(ispsoftc_t *isp, isp_icb_t *src, isp_icb_t *dst)
1311155228Smjacob{
1312155228Smjacob	int i;
1313155228Smjacob	if (ISP_IS_SBUS(isp)) {
1314163899Smjacob		ISP_IOXPUT_8(isp, src->icb_version, &dst->icb_reserved0);
1315163899Smjacob		ISP_IOXPUT_8(isp, src->icb_reserved0, &dst->icb_version);
1316155228Smjacob	} else {
1317163899Smjacob		ISP_IOXPUT_8(isp, src->icb_version, &dst->icb_version);
1318163899Smjacob		ISP_IOXPUT_8(isp, src->icb_reserved0, &dst->icb_reserved0);
1319155228Smjacob	}
1320163899Smjacob	ISP_IOXPUT_16(isp, src->icb_fwoptions, &dst->icb_fwoptions);
1321163899Smjacob	ISP_IOXPUT_16(isp, src->icb_maxfrmlen, &dst->icb_maxfrmlen);
1322163899Smjacob	ISP_IOXPUT_16(isp, src->icb_maxalloc, &dst->icb_maxalloc);
1323163899Smjacob	ISP_IOXPUT_16(isp, src->icb_execthrottle, &dst->icb_execthrottle);
1324155228Smjacob	if (ISP_IS_SBUS(isp)) {
1325163899Smjacob		ISP_IOXPUT_8(isp, src->icb_retry_count, &dst->icb_retry_delay);
1326163899Smjacob		ISP_IOXPUT_8(isp, src->icb_retry_delay, &dst->icb_retry_count);
1327155228Smjacob	} else {
1328163899Smjacob		ISP_IOXPUT_8(isp, src->icb_retry_count, &dst->icb_retry_count);
1329163899Smjacob		ISP_IOXPUT_8(isp, src->icb_retry_delay, &dst->icb_retry_delay);
1330155228Smjacob	}
1331155228Smjacob	for (i = 0; i < 8; i++) {
1332163899Smjacob		ISP_IOXPUT_8(isp, src->icb_portname[i], &dst->icb_portname[i]);
1333155228Smjacob	}
1334163899Smjacob	ISP_IOXPUT_16(isp, src->icb_hardaddr, &dst->icb_hardaddr);
1335155228Smjacob	if (ISP_IS_SBUS(isp)) {
1336163899Smjacob		ISP_IOXPUT_8(isp, src->icb_iqdevtype, &dst->icb_logintime);
1337163899Smjacob		ISP_IOXPUT_8(isp, src->icb_logintime, &dst->icb_iqdevtype);
1338155228Smjacob	} else {
1339163899Smjacob		ISP_IOXPUT_8(isp, src->icb_iqdevtype, &dst->icb_iqdevtype);
1340163899Smjacob		ISP_IOXPUT_8(isp, src->icb_logintime, &dst->icb_logintime);
1341155228Smjacob	}
1342155228Smjacob	for (i = 0; i < 8; i++) {
1343163899Smjacob		ISP_IOXPUT_8(isp, src->icb_nodename[i], &dst->icb_nodename[i]);
1344155228Smjacob	}
1345163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rqstout, &dst->icb_rqstout);
1346163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rspnsin, &dst->icb_rspnsin);
1347163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rqstqlen, &dst->icb_rqstqlen);
1348163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rsltqlen, &dst->icb_rsltqlen);
1349155228Smjacob	for (i = 0; i < 4; i++) {
1350163899Smjacob		ISP_IOXPUT_16(isp, src->icb_rqstaddr[i], &dst->icb_rqstaddr[i]);
1351155228Smjacob	}
1352155228Smjacob	for (i = 0; i < 4; i++) {
1353163899Smjacob		ISP_IOXPUT_16(isp, src->icb_respaddr[i], &dst->icb_respaddr[i]);
1354155228Smjacob	}
1355163899Smjacob	ISP_IOXPUT_16(isp, src->icb_lunenables, &dst->icb_lunenables);
1356155228Smjacob	if (ISP_IS_SBUS(isp)) {
1357163899Smjacob		ISP_IOXPUT_8(isp, src->icb_ccnt, &dst->icb_icnt);
1358163899Smjacob		ISP_IOXPUT_8(isp, src->icb_icnt, &dst->icb_ccnt);
1359155228Smjacob	} else {
1360163899Smjacob		ISP_IOXPUT_8(isp, src->icb_ccnt, &dst->icb_ccnt);
1361163899Smjacob		ISP_IOXPUT_8(isp, src->icb_icnt, &dst->icb_icnt);
1362155228Smjacob	}
1363163899Smjacob	ISP_IOXPUT_16(isp, src->icb_lunetimeout, &dst->icb_lunetimeout);
1364163899Smjacob	ISP_IOXPUT_16(isp, src->icb_reserved1, &dst->icb_reserved1);
1365163899Smjacob	ISP_IOXPUT_16(isp, src->icb_xfwoptions, &dst->icb_xfwoptions);
1366155228Smjacob	if (ISP_IS_SBUS(isp)) {
1367163899Smjacob		ISP_IOXPUT_8(isp, src->icb_racctimer, &dst->icb_idelaytimer);
1368163899Smjacob		ISP_IOXPUT_8(isp, src->icb_idelaytimer, &dst->icb_racctimer);
1369155228Smjacob	} else {
1370163899Smjacob		ISP_IOXPUT_8(isp, src->icb_racctimer, &dst->icb_racctimer);
1371163899Smjacob		ISP_IOXPUT_8(isp, src->icb_idelaytimer, &dst->icb_idelaytimer);
1372155228Smjacob	}
1373163899Smjacob	ISP_IOXPUT_16(isp, src->icb_zfwoptions, &dst->icb_zfwoptions);
1374155228Smjacob}
1375155228Smjacob
1376155228Smjacobvoid
1377163899Smjacobisp_put_icb_2400(ispsoftc_t *isp, isp_icb_2400_t *src, isp_icb_2400_t *dst)
1378155228Smjacob{
1379155228Smjacob	int i;
1380163899Smjacob	ISP_IOXPUT_16(isp, src->icb_version, &dst->icb_version);
1381163899Smjacob	ISP_IOXPUT_16(isp, src->icb_reserved0, &dst->icb_reserved0);
1382163899Smjacob	ISP_IOXPUT_16(isp, src->icb_maxfrmlen, &dst->icb_maxfrmlen);
1383163899Smjacob	ISP_IOXPUT_16(isp, src->icb_execthrottle, &dst->icb_execthrottle);
1384163899Smjacob	ISP_IOXPUT_16(isp, src->icb_xchgcnt, &dst->icb_xchgcnt);
1385163899Smjacob	ISP_IOXPUT_16(isp, src->icb_hardaddr, &dst->icb_hardaddr);
1386163899Smjacob	for (i = 0; i < 8; i++) {
1387163899Smjacob		ISP_IOXPUT_8(isp, src->icb_portname[i], &dst->icb_portname[i]);
1388163899Smjacob	}
1389163899Smjacob	for (i = 0; i < 8; i++) {
1390163899Smjacob		ISP_IOXPUT_8(isp, src->icb_nodename[i], &dst->icb_nodename[i]);
1391163899Smjacob	}
1392163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rspnsin, &dst->icb_rspnsin);
1393163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rqstout, &dst->icb_rqstout);
1394163899Smjacob	ISP_IOXPUT_16(isp, src->icb_retry_count, &dst->icb_retry_count);
1395163899Smjacob	ISP_IOXPUT_16(isp, src->icb_priout, &dst->icb_priout);
1396163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rsltqlen, &dst->icb_rsltqlen);
1397163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rqstqlen, &dst->icb_rqstqlen);
1398163899Smjacob	ISP_IOXPUT_16(isp, src->icb_ldn_nols, &dst->icb_ldn_nols);
1399163899Smjacob	ISP_IOXPUT_16(isp, src->icb_prqstqlen, &dst->icb_prqstqlen);
1400163899Smjacob	for (i = 0; i < 4; i++) {
1401163899Smjacob		ISP_IOXPUT_16(isp, src->icb_rqstaddr[i], &dst->icb_rqstaddr[i]);
1402163899Smjacob	}
1403163899Smjacob	for (i = 0; i < 4; i++) {
1404163899Smjacob		ISP_IOXPUT_16(isp, src->icb_respaddr[i], &dst->icb_respaddr[i]);
1405163899Smjacob	}
1406163899Smjacob	for (i = 0; i < 4; i++) {
1407163899Smjacob		ISP_IOXPUT_16(isp, src->icb_priaddr[i], &dst->icb_priaddr[i]);
1408163899Smjacob	}
1409163899Smjacob	for (i = 0; i < 4; i++) {
1410196008Smjacob		ISP_IOXPUT_16(isp, src->icb_reserved1[i], &dst->icb_reserved1[i]);
1411163899Smjacob	}
1412163899Smjacob	ISP_IOXPUT_16(isp, src->icb_atio_in, &dst->icb_atio_in);
1413163899Smjacob	ISP_IOXPUT_16(isp, src->icb_atioqlen, &dst->icb_atioqlen);
1414163899Smjacob	for (i = 0; i < 4; i++) {
1415196008Smjacob		ISP_IOXPUT_16(isp, src->icb_atioqaddr[i], &dst->icb_atioqaddr[i]);
1416163899Smjacob	}
1417163899Smjacob	ISP_IOXPUT_16(isp, src->icb_idelaytimer, &dst->icb_idelaytimer);
1418163899Smjacob	ISP_IOXPUT_16(isp, src->icb_logintime, &dst->icb_logintime);
1419163899Smjacob	ISP_IOXPUT_32(isp, src->icb_fwoptions1, &dst->icb_fwoptions1);
1420163899Smjacob	ISP_IOXPUT_32(isp, src->icb_fwoptions2, &dst->icb_fwoptions2);
1421163899Smjacob	ISP_IOXPUT_32(isp, src->icb_fwoptions3, &dst->icb_fwoptions3);
1422163899Smjacob	for (i = 0; i < 12; i++) {
1423196008Smjacob		ISP_IOXPUT_16(isp, src->icb_reserved2[i], &dst->icb_reserved2[i]);
1424163899Smjacob	}
1425163899Smjacob}
1426163899Smjacob
1427163899Smjacobvoid
1428196008Smjacobisp_put_icb_2400_vpinfo(ispsoftc_t *isp, isp_icb_2400_vpinfo_t *src, isp_icb_2400_vpinfo_t *dst)
1429196008Smjacob{
1430196008Smjacob	ISP_IOXPUT_16(isp, src->vp_count, &dst->vp_count);
1431196008Smjacob	ISP_IOXPUT_16(isp, src->vp_global_options, &dst->vp_global_options);
1432196008Smjacob}
1433196008Smjacob
1434196008Smjacobvoid
1435196008Smjacobisp_put_vp_port_info(ispsoftc_t *isp, vp_port_info_t *src, vp_port_info_t *dst)
1436196008Smjacob{
1437196008Smjacob	int i;
1438196008Smjacob	ISP_IOXPUT_16(isp, src->vp_port_status, &dst->vp_port_status);
1439196008Smjacob	ISP_IOXPUT_8(isp, src->vp_port_options, &dst->vp_port_options);
1440196008Smjacob	ISP_IOXPUT_8(isp, src->vp_port_loopid, &dst->vp_port_loopid);
1441196008Smjacob	for (i = 0; i < 8; i++) {
1442196008Smjacob		ISP_IOXPUT_8(isp, src->vp_port_portname[i], &dst->vp_port_portname[i]);
1443196008Smjacob	}
1444196008Smjacob	for (i = 0; i < 8; i++) {
1445196008Smjacob		ISP_IOXPUT_8(isp, src->vp_port_nodename[i], &dst->vp_port_nodename[i]);
1446196008Smjacob	}
1447196008Smjacob	/* we never *put* portid_lo/portid_hi */
1448196008Smjacob}
1449196008Smjacob
1450196008Smjacobvoid
1451196008Smjacobisp_get_vp_port_info(ispsoftc_t *isp, vp_port_info_t *src, vp_port_info_t *dst)
1452196008Smjacob{
1453196008Smjacob	int i;
1454196008Smjacob	ISP_IOXGET_16(isp, &src->vp_port_status, dst->vp_port_status);
1455196008Smjacob	ISP_IOXGET_8(isp, &src->vp_port_options, dst->vp_port_options);
1456196008Smjacob	ISP_IOXGET_8(isp, &src->vp_port_loopid, dst->vp_port_loopid);
1457196008Smjacob	for (i = 0; i < ASIZE(src->vp_port_portname); i++) {
1458196008Smjacob		ISP_IOXGET_8(isp, &src->vp_port_portname[i], dst->vp_port_portname[i]);
1459196008Smjacob	}
1460196008Smjacob	for (i = 0; i < ASIZE(src->vp_port_nodename); i++) {
1461196008Smjacob		ISP_IOXGET_8(isp, &src->vp_port_nodename[i], dst->vp_port_nodename[i]);
1462196008Smjacob	}
1463196008Smjacob	ISP_IOXGET_16(isp, &src->vp_port_portid_lo, dst->vp_port_portid_lo);
1464196008Smjacob	ISP_IOXGET_16(isp, &src->vp_port_portid_hi, dst->vp_port_portid_hi);
1465196008Smjacob}
1466196008Smjacob
1467196008Smjacobvoid
1468196008Smjacobisp_put_vp_ctrl_info(ispsoftc_t *isp, vp_ctrl_info_t *src, vp_ctrl_info_t *dst)
1469196008Smjacob{
1470196008Smjacob	int i;
1471196008Smjacob	isp_put_hdr(isp, &src->vp_ctrl_hdr, &dst->vp_ctrl_hdr);
1472196008Smjacob	ISP_IOXPUT_32(isp, src->vp_ctrl_handle, &dst->vp_ctrl_handle);
1473196008Smjacob	ISP_IOXPUT_16(isp, src->vp_ctrl_index_fail, &dst->vp_ctrl_index_fail);
1474196008Smjacob	ISP_IOXPUT_16(isp, src->vp_ctrl_status, &dst->vp_ctrl_status);
1475196008Smjacob	ISP_IOXPUT_16(isp, src->vp_ctrl_command, &dst->vp_ctrl_command);
1476196008Smjacob	ISP_IOXPUT_16(isp, src->vp_ctrl_vp_count, &dst->vp_ctrl_vp_count);
1477196008Smjacob	for (i = 0; i < ASIZE(src->vp_ctrl_idmap); i++) {
1478196008Smjacob		ISP_IOXPUT_16(isp, src->vp_ctrl_idmap[i], &dst->vp_ctrl_idmap[i]);
1479196008Smjacob	}
1480196008Smjacob	for (i = 0; i < ASIZE(src->vp_ctrl_reserved); i++) {
1481290018Smav		ISP_IOXPUT_16(isp, src->vp_ctrl_reserved[i], &dst->vp_ctrl_reserved[i]);
1482196008Smjacob	}
1483290018Smav	ISP_IOXPUT_16(isp, src->vp_ctrl_fcf_index, &dst->vp_ctrl_fcf_index);
1484196008Smjacob}
1485196008Smjacob
1486196008Smjacobvoid
1487196008Smjacobisp_get_vp_ctrl_info(ispsoftc_t *isp, vp_ctrl_info_t *src, vp_ctrl_info_t *dst)
1488196008Smjacob{
1489196008Smjacob	int i;
1490196008Smjacob	isp_get_hdr(isp, &src->vp_ctrl_hdr, &dst->vp_ctrl_hdr);
1491196008Smjacob	ISP_IOXGET_32(isp, &src->vp_ctrl_handle, dst->vp_ctrl_handle);
1492196008Smjacob	ISP_IOXGET_16(isp, &src->vp_ctrl_index_fail, dst->vp_ctrl_index_fail);
1493196008Smjacob	ISP_IOXGET_16(isp, &src->vp_ctrl_status, dst->vp_ctrl_status);
1494196008Smjacob	ISP_IOXGET_16(isp, &src->vp_ctrl_command, dst->vp_ctrl_command);
1495196008Smjacob	ISP_IOXGET_16(isp, &src->vp_ctrl_vp_count, dst->vp_ctrl_vp_count);
1496196008Smjacob	for (i = 0; i < ASIZE(src->vp_ctrl_idmap); i++) {
1497196008Smjacob		ISP_IOXGET_16(isp, &src->vp_ctrl_idmap[i], dst->vp_ctrl_idmap[i]);
1498196008Smjacob	}
1499196008Smjacob	for (i = 0; i < ASIZE(src->vp_ctrl_reserved); i++) {
1500290018Smav		ISP_IOXGET_16(isp, &src->vp_ctrl_reserved[i], dst->vp_ctrl_reserved[i]);
1501196008Smjacob	}
1502290018Smav	ISP_IOXGET_16(isp, &src->vp_ctrl_fcf_index, dst->vp_ctrl_fcf_index);
1503196008Smjacob}
1504196008Smjacob
1505196008Smjacobvoid
1506196008Smjacobisp_put_vp_modify(ispsoftc_t *isp, vp_modify_t *src, vp_modify_t *dst)
1507196008Smjacob{
1508196008Smjacob	int i, j;
1509196008Smjacob	isp_put_hdr(isp, &src->vp_mod_hdr, &dst->vp_mod_hdr);
1510196008Smjacob	ISP_IOXPUT_32(isp, src->vp_mod_hdl, &dst->vp_mod_hdl);
1511196008Smjacob	ISP_IOXPUT_16(isp, src->vp_mod_reserved0, &dst->vp_mod_reserved0);
1512196008Smjacob	ISP_IOXPUT_16(isp, src->vp_mod_status, &dst->vp_mod_status);
1513196008Smjacob	ISP_IOXPUT_8(isp, src->vp_mod_cmd, &dst->vp_mod_cmd);
1514196008Smjacob	ISP_IOXPUT_8(isp, src->vp_mod_cnt, &dst->vp_mod_cnt);
1515196008Smjacob	ISP_IOXPUT_8(isp, src->vp_mod_idx0, &dst->vp_mod_idx0);
1516196008Smjacob	ISP_IOXPUT_8(isp, src->vp_mod_idx1, &dst->vp_mod_idx1);
1517196008Smjacob	for (i = 0; i < ASIZE(src->vp_mod_ports); i++) {
1518196008Smjacob		ISP_IOXPUT_8(isp, src->vp_mod_ports[i].options, &dst->vp_mod_ports[i].options);
1519196008Smjacob		ISP_IOXPUT_8(isp, src->vp_mod_ports[i].loopid, &dst->vp_mod_ports[i].loopid);
1520196008Smjacob		ISP_IOXPUT_16(isp, src->vp_mod_ports[i].reserved1, &dst->vp_mod_ports[i].reserved1);
1521196008Smjacob		for (j = 0; j < ASIZE(src->vp_mod_ports[i].wwpn); j++) {
1522196008Smjacob			ISP_IOXPUT_8(isp, src->vp_mod_ports[i].wwpn[j], &dst->vp_mod_ports[i].wwpn[j]);
1523196008Smjacob		}
1524196008Smjacob		for (j = 0; j < ASIZE(src->vp_mod_ports[i].wwnn); j++) {
1525196008Smjacob			ISP_IOXPUT_8(isp, src->vp_mod_ports[i].wwnn[j], &dst->vp_mod_ports[i].wwnn[j]);
1526196008Smjacob		}
1527196008Smjacob	}
1528196008Smjacob	for (i = 0; i < ASIZE(src->vp_mod_reserved2); i++) {
1529196008Smjacob		ISP_IOXPUT_8(isp, src->vp_mod_reserved2[i], &dst->vp_mod_reserved2[i]);
1530196008Smjacob	}
1531196008Smjacob}
1532196008Smjacob
1533196008Smjacobvoid
1534196008Smjacobisp_get_vp_modify(ispsoftc_t *isp, vp_modify_t *src, vp_modify_t *dst)
1535196008Smjacob{
1536196008Smjacob	int i, j;
1537196008Smjacob	isp_get_hdr(isp, &src->vp_mod_hdr, &dst->vp_mod_hdr);
1538196008Smjacob	ISP_IOXGET_32(isp, &src->vp_mod_hdl, dst->vp_mod_hdl);
1539196008Smjacob	ISP_IOXGET_16(isp, &src->vp_mod_reserved0, dst->vp_mod_reserved0);
1540196008Smjacob	ISP_IOXGET_16(isp, &src->vp_mod_status, dst->vp_mod_status);
1541196008Smjacob	ISP_IOXGET_8(isp, &src->vp_mod_cmd, dst->vp_mod_cmd);
1542196008Smjacob	ISP_IOXGET_8(isp, &src->vp_mod_cnt, dst->vp_mod_cnt);
1543196008Smjacob	ISP_IOXGET_8(isp, &src->vp_mod_idx0, dst->vp_mod_idx0);
1544196008Smjacob	ISP_IOXGET_8(isp, &src->vp_mod_idx1, dst->vp_mod_idx1);
1545196008Smjacob	for (i = 0; i < ASIZE(src->vp_mod_ports); i++) {
1546196008Smjacob		ISP_IOXGET_8(isp, &src->vp_mod_ports[i].options, dst->vp_mod_ports[i].options);
1547196008Smjacob		ISP_IOXGET_8(isp, &src->vp_mod_ports[i].loopid, dst->vp_mod_ports[i].loopid);
1548196008Smjacob		ISP_IOXGET_16(isp, &src->vp_mod_ports[i].reserved1, dst->vp_mod_ports[i].reserved1);
1549196008Smjacob		for (j = 0; j < ASIZE(src->vp_mod_ports[i].wwpn); j++) {
1550196008Smjacob			ISP_IOXGET_8(isp, &src->vp_mod_ports[i].wwpn[j], dst->vp_mod_ports[i].wwpn[j]);
1551196008Smjacob		}
1552196008Smjacob		for (j = 0; j < ASIZE(src->vp_mod_ports[i].wwnn); j++) {
1553196008Smjacob			ISP_IOXGET_8(isp, &src->vp_mod_ports[i].wwnn[j], dst->vp_mod_ports[i].wwnn[j]);
1554196008Smjacob		}
1555196008Smjacob	}
1556196008Smjacob	for (i = 0; i < ASIZE(src->vp_mod_reserved2); i++) {
1557196008Smjacob		ISP_IOXGET_8(isp, &src->vp_mod_reserved2[i], dst->vp_mod_reserved2[i]);
1558196008Smjacob	}
1559196008Smjacob}
1560196008Smjacob
1561196008Smjacobvoid
1562163899Smjacobisp_get_pdb_21xx(ispsoftc_t *isp, isp_pdb_21xx_t *src, isp_pdb_21xx_t *dst)
1563163899Smjacob{
1564163899Smjacob	int i;
1565155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_options, dst->pdb_options);
1566155228Smjacob        ISP_IOXGET_8(isp, &src->pdb_mstate, dst->pdb_mstate);
1567155228Smjacob        ISP_IOXGET_8(isp, &src->pdb_sstate, dst->pdb_sstate);
1568155228Smjacob	for (i = 0; i < 4; i++) {
1569196008Smjacob		ISP_IOXGET_8(isp, &src->pdb_hardaddr_bits[i], dst->pdb_hardaddr_bits[i]);
1570155228Smjacob	}
1571155228Smjacob	for (i = 0; i < 4; i++) {
1572196008Smjacob		ISP_IOXGET_8(isp, &src->pdb_portid_bits[i], dst->pdb_portid_bits[i]);
1573155228Smjacob	}
1574155228Smjacob	for (i = 0; i < 8; i++) {
1575155228Smjacob		ISP_IOXGET_8(isp, &src->pdb_nodename[i], dst->pdb_nodename[i]);
1576155228Smjacob	}
1577155228Smjacob	for (i = 0; i < 8; i++) {
1578155228Smjacob		ISP_IOXGET_8(isp, &src->pdb_portname[i], dst->pdb_portname[i]);
1579155228Smjacob	}
1580155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_execthrottle, dst->pdb_execthrottle);
1581155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_exec_count, dst->pdb_exec_count);
1582155228Smjacob	ISP_IOXGET_8(isp, &src->pdb_retry_count, dst->pdb_retry_count);
1583155228Smjacob	ISP_IOXGET_8(isp, &src->pdb_retry_delay, dst->pdb_retry_delay);
1584155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_resalloc, dst->pdb_resalloc);
1585155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_curalloc, dst->pdb_curalloc);
1586155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_qhead, dst->pdb_qhead);
1587155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_qtail, dst->pdb_qtail);
1588155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_tl_next, dst->pdb_tl_next);
1589155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_tl_last, dst->pdb_tl_last);
1590155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_features, dst->pdb_features);
1591155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_pconcurrnt, dst->pdb_pconcurrnt);
1592155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_roi, dst->pdb_roi);
1593155228Smjacob	ISP_IOXGET_8(isp, &src->pdb_target, dst->pdb_target);
1594155228Smjacob	ISP_IOXGET_8(isp, &src->pdb_initiator, dst->pdb_initiator);
1595155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_rdsiz, dst->pdb_rdsiz);
1596155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_ncseq, dst->pdb_ncseq);
1597155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_noseq, dst->pdb_noseq);
1598155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_labrtflg, dst->pdb_labrtflg);
1599155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_lstopflg, dst->pdb_lstopflg);
1600155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_sqhead, dst->pdb_sqhead);
1601155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_sqtail, dst->pdb_sqtail);
1602155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_ptimer, dst->pdb_ptimer);
1603155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_nxt_seqid, dst->pdb_nxt_seqid);
1604155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_fcount, dst->pdb_fcount);
1605155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_prli_len, dst->pdb_prli_len);
1606155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_prli_svc0, dst->pdb_prli_svc0);
1607155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_prli_svc3, dst->pdb_prli_svc3);
1608155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_loopid, dst->pdb_loopid);
1609155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_il_ptr, dst->pdb_il_ptr);
1610155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_sl_ptr, dst->pdb_sl_ptr);
1611155228Smjacob}
1612155228Smjacob
1613163899Smjacobvoid
1614163899Smjacobisp_get_pdb_24xx(ispsoftc_t *isp, isp_pdb_24xx_t *src, isp_pdb_24xx_t *dst)
1615163899Smjacob{
1616163899Smjacob	int i;
1617163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_flags, dst->pdb_flags);
1618163899Smjacob        ISP_IOXGET_8(isp, &src->pdb_curstate, dst->pdb_curstate);
1619163899Smjacob        ISP_IOXGET_8(isp, &src->pdb_laststate, dst->pdb_laststate);
1620163899Smjacob	for (i = 0; i < 4; i++) {
1621196008Smjacob		ISP_IOXGET_8(isp, &src->pdb_hardaddr_bits[i], dst->pdb_hardaddr_bits[i]);
1622163899Smjacob	}
1623163899Smjacob	for (i = 0; i < 4; i++) {
1624196008Smjacob		ISP_IOXGET_8(isp, &src->pdb_portid_bits[i], dst->pdb_portid_bits[i]);
1625163899Smjacob	}
1626163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_retry_timer, dst->pdb_retry_timer);
1627163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_handle, dst->pdb_handle);
1628163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_rcv_dsize, dst->pdb_rcv_dsize);
1629163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_reserved0, dst->pdb_reserved0);
1630163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_prli_svc0, dst->pdb_prli_svc0);
1631163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_prli_svc3, dst->pdb_prli_svc3);
1632163899Smjacob	for (i = 0; i < 8; i++) {
1633163899Smjacob		ISP_IOXGET_8(isp, &src->pdb_nodename[i], dst->pdb_nodename[i]);
1634163899Smjacob	}
1635163899Smjacob	for (i = 0; i < 8; i++) {
1636163899Smjacob		ISP_IOXGET_8(isp, &src->pdb_portname[i], dst->pdb_portname[i]);
1637163899Smjacob	}
1638163899Smjacob	for (i = 0; i < 24; i++) {
1639196008Smjacob		ISP_IOXGET_8(isp, &src->pdb_reserved1[i], dst->pdb_reserved1[i]);
1640163899Smjacob	}
1641163899Smjacob}
1642155228Smjacob
1643290104Smavvoid
1644290104Smavisp_get_pnhle_21xx(ispsoftc_t *isp, isp_pnhle_21xx_t *src, isp_pnhle_21xx_t *dst)
1645290104Smav{
1646290104Smav
1647290104Smav	ISP_IOXGET_16(isp, &src->pnhle_port_id_lo, dst->pnhle_port_id_lo);
1648290104Smav	ISP_IOXGET_16(isp, &src->pnhle_port_id_hi_handle, dst->pnhle_port_id_hi_handle);
1649290104Smav}
1650290104Smav
1651290104Smavvoid
1652290104Smavisp_get_pnhle_23xx(ispsoftc_t *isp, isp_pnhle_23xx_t *src, isp_pnhle_23xx_t *dst)
1653290104Smav{
1654290104Smav
1655290104Smav	ISP_IOXGET_16(isp, &src->pnhle_port_id_lo, dst->pnhle_port_id_lo);
1656290104Smav	ISP_IOXGET_16(isp, &src->pnhle_port_id_hi, dst->pnhle_port_id_hi);
1657290104Smav	ISP_IOXGET_16(isp, &src->pnhle_handle, dst->pnhle_handle);
1658290104Smav}
1659290104Smav
1660290104Smavvoid
1661290104Smavisp_get_pnhle_24xx(ispsoftc_t *isp, isp_pnhle_24xx_t *src, isp_pnhle_24xx_t *dst)
1662290104Smav{
1663290104Smav
1664290104Smav	ISP_IOXGET_16(isp, &src->pnhle_port_id_lo, dst->pnhle_port_id_lo);
1665290104Smav	ISP_IOXGET_16(isp, &src->pnhle_port_id_hi, dst->pnhle_port_id_hi);
1666290104Smav	ISP_IOXGET_16(isp, &src->pnhle_handle, dst->pnhle_handle);
1667290104Smav	ISP_IOXGET_16(isp, &src->pnhle_reserved, dst->pnhle_reserved);
1668290104Smav}
1669290104Smav
1670290104Smavvoid
1671290104Smavisp_get_pnnle(ispsoftc_t *isp, isp_pnnle_t *src, isp_pnnle_t *dst)
1672290104Smav{
1673290104Smav	int i;
1674290104Smav
1675290104Smav	for (i = 0; i < 8; i++)
1676290104Smav		ISP_IOXGET_8(isp, &src->pnnle_name[i], dst->pnnle_name[i]);
1677290104Smav	ISP_IOXGET_16(isp, &src->pnnle_handle, dst->pnnle_handle);
1678290104Smav	ISP_IOXGET_16(isp, &src->pnnle_reserved, dst->pnnle_reserved);
1679290104Smav}
1680290104Smav
1681155228Smjacob/*
1682163899Smjacob * PLOGI/LOGO IOCB canonicalization
1683155228Smjacob */
1684163899Smjacob
1685155228Smjacobvoid
1686163899Smjacobisp_get_plogx(ispsoftc_t *isp, isp_plogx_t *src, isp_plogx_t *dst)
1687155228Smjacob{
1688163899Smjacob	int i;
1689163899Smjacob	isp_get_hdr(isp, &src->plogx_header, &dst->plogx_header);
1690163899Smjacob	ISP_IOXGET_32(isp, &src->plogx_handle, dst->plogx_handle);
1691163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_status, dst->plogx_status);
1692163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_nphdl, dst->plogx_nphdl);
1693163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_flags, dst->plogx_flags);
1694163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_vphdl, dst->plogx_vphdl);
1695163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_portlo, dst->plogx_portlo);
1696163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_rspsz_porthi, dst->plogx_rspsz_porthi);
1697163899Smjacob	for (i = 0; i < 11; i++) {
1698196008Smjacob		ISP_IOXGET_16(isp, &src->plogx_ioparm[i].lo16, dst->plogx_ioparm[i].lo16);
1699196008Smjacob		ISP_IOXGET_16(isp, &src->plogx_ioparm[i].hi16, dst->plogx_ioparm[i].hi16);
1700163899Smjacob	}
1701155228Smjacob}
1702155228Smjacob
1703163899Smjacobvoid
1704163899Smjacobisp_put_plogx(ispsoftc_t *isp, isp_plogx_t *src, isp_plogx_t *dst)
1705163899Smjacob{
1706163899Smjacob	int i;
1707163899Smjacob	isp_put_hdr(isp, &src->plogx_header, &dst->plogx_header);
1708163899Smjacob	ISP_IOXPUT_32(isp, src->plogx_handle, &dst->plogx_handle);
1709163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_status, &dst->plogx_status);
1710163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_nphdl, &dst->plogx_nphdl);
1711163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_flags, &dst->plogx_flags);
1712163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_vphdl, &dst->plogx_vphdl);
1713163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_portlo, &dst->plogx_portlo);
1714163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_rspsz_porthi, &dst->plogx_rspsz_porthi);
1715163899Smjacob	for (i = 0; i < 11; i++) {
1716196008Smjacob		ISP_IOXPUT_16(isp, src->plogx_ioparm[i].lo16, &dst->plogx_ioparm[i].lo16);
1717196008Smjacob		ISP_IOXPUT_16(isp, src->plogx_ioparm[i].hi16, &dst->plogx_ioparm[i].hi16);
1718163899Smjacob	}
1719163899Smjacob}
1720163899Smjacob
1721155228Smjacob/*
1722196008Smjacob * Report ID canonicalization
1723196008Smjacob */
1724196008Smjacobvoid
1725196008Smjacobisp_get_ridacq(ispsoftc_t *isp, isp_ridacq_t *src, isp_ridacq_t *dst)
1726196008Smjacob{
1727196008Smjacob	int i;
1728196008Smjacob	isp_get_hdr(isp, &src->ridacq_hdr, &dst->ridacq_hdr);
1729196008Smjacob	ISP_IOXGET_32(isp, &src->ridacq_handle, dst->ridacq_handle);
1730290978Smav	ISP_IOXGET_8(isp, &src->ridacq_vp_acquired, dst->ridacq_vp_acquired);
1731290978Smav	ISP_IOXGET_8(isp, &src->ridacq_vp_setup, dst->ridacq_vp_setup);
1732290978Smav	ISP_IOXGET_8(isp, &src->ridacq_vp_index, dst->ridacq_vp_index);
1733290978Smav	ISP_IOXGET_8(isp, &src->ridacq_vp_status, dst->ridacq_vp_status);
1734196008Smjacob	ISP_IOXGET_16(isp, &src->ridacq_vp_port_lo, dst->ridacq_vp_port_lo);
1735196008Smjacob	ISP_IOXGET_8(isp, &src->ridacq_vp_port_hi, dst->ridacq_vp_port_hi);
1736196008Smjacob	ISP_IOXGET_8(isp, &src->ridacq_format, dst->ridacq_format);
1737196008Smjacob	for (i = 0; i < sizeof (src->ridacq_map) / sizeof (src->ridacq_map[0]); i++) {
1738196008Smjacob		ISP_IOXGET_16(isp, &src->ridacq_map[i], dst->ridacq_map[i]);
1739196008Smjacob	}
1740196008Smjacob	for (i = 0; i < sizeof (src->ridacq_reserved1) / sizeof (src->ridacq_reserved1[0]); i++) {
1741196008Smjacob		ISP_IOXGET_16(isp, &src->ridacq_reserved1[i], dst->ridacq_reserved1[i]);
1742196008Smjacob	}
1743196008Smjacob}
1744196008Smjacob
1745196008Smjacob
1746196008Smjacob/*
1747163899Smjacob * CT Passthru canonicalization
1748163899Smjacob */
1749163899Smjacobvoid
1750163899Smjacobisp_get_ct_pt(ispsoftc_t *isp, isp_ct_pt_t *src, isp_ct_pt_t *dst)
1751163899Smjacob{
1752163899Smjacob	int i;
1753163899Smjacob
1754163899Smjacob	isp_get_hdr(isp, &src->ctp_header, &dst->ctp_header);
1755163899Smjacob	ISP_IOXGET_32(isp, &src->ctp_handle, dst->ctp_handle);
1756163899Smjacob	ISP_IOXGET_16(isp, &src->ctp_status, dst->ctp_status);
1757163899Smjacob	ISP_IOXGET_16(isp, &src->ctp_nphdl, dst->ctp_nphdl);
1758163899Smjacob	ISP_IOXGET_16(isp, &src->ctp_cmd_cnt, dst->ctp_cmd_cnt);
1759196008Smjacob	ISP_IOXGET_8(isp, &src->ctp_vpidx, dst->ctp_vpidx);
1760196008Smjacob	ISP_IOXGET_8(isp, &src->ctp_reserved0, dst->ctp_reserved0);
1761163899Smjacob	ISP_IOXGET_16(isp, &src->ctp_time, dst->ctp_time);
1762196008Smjacob	ISP_IOXGET_16(isp, &src->ctp_reserved1, dst->ctp_reserved1);
1763163899Smjacob	ISP_IOXGET_16(isp, &src->ctp_rsp_cnt, dst->ctp_rsp_cnt);
1764163899Smjacob	for (i = 0; i < 5; i++) {
1765196008Smjacob		ISP_IOXGET_16(isp, &src->ctp_reserved2[i], dst->ctp_reserved2[i]);
1766163899Smjacob	}
1767163899Smjacob	ISP_IOXGET_32(isp, &src->ctp_rsp_bcnt, dst->ctp_rsp_bcnt);
1768163899Smjacob	ISP_IOXGET_32(isp, &src->ctp_cmd_bcnt, dst->ctp_cmd_bcnt);
1769163899Smjacob	for (i = 0; i < 2; i++) {
1770196008Smjacob		ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_base, dst->ctp_dataseg[i].ds_base);
1771196008Smjacob		ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_basehi, dst->ctp_dataseg[i].ds_basehi);
1772196008Smjacob		ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_count, dst->ctp_dataseg[i].ds_count);
1773163899Smjacob	}
1774163899Smjacob}
1775163899Smjacob
1776163899Smjacobvoid
1777164370Smjacobisp_get_ms(ispsoftc_t *isp, isp_ms_t *src, isp_ms_t *dst)
1778164370Smjacob{
1779164370Smjacob	int i;
1780164370Smjacob
1781164370Smjacob	isp_get_hdr(isp, &src->ms_header, &dst->ms_header);
1782164370Smjacob	ISP_IOXGET_32(isp, &src->ms_handle, dst->ms_handle);
1783164370Smjacob	ISP_IOXGET_16(isp, &src->ms_nphdl, dst->ms_nphdl);
1784164370Smjacob	ISP_IOXGET_16(isp, &src->ms_status, dst->ms_status);
1785164370Smjacob	ISP_IOXGET_16(isp, &src->ms_flags, dst->ms_flags);
1786164370Smjacob	ISP_IOXGET_16(isp, &src->ms_reserved1, dst->ms_reserved1);
1787164370Smjacob	ISP_IOXGET_16(isp, &src->ms_time, dst->ms_time);
1788164370Smjacob	ISP_IOXGET_16(isp, &src->ms_cmd_cnt, dst->ms_cmd_cnt);
1789164370Smjacob	ISP_IOXGET_16(isp, &src->ms_tot_cnt, dst->ms_tot_cnt);
1790164370Smjacob	ISP_IOXGET_8(isp, &src->ms_type, dst->ms_type);
1791164370Smjacob	ISP_IOXGET_8(isp, &src->ms_r_ctl, dst->ms_r_ctl);
1792164370Smjacob	ISP_IOXGET_16(isp, &src->ms_rxid, dst->ms_rxid);
1793164370Smjacob	ISP_IOXGET_16(isp, &src->ms_reserved2, dst->ms_reserved2);
1794164370Smjacob	ISP_IOXGET_32(isp, &src->ms_rsp_bcnt, dst->ms_rsp_bcnt);
1795164370Smjacob	ISP_IOXGET_32(isp, &src->ms_cmd_bcnt, dst->ms_cmd_bcnt);
1796164370Smjacob	for (i = 0; i < 2; i++) {
1797196008Smjacob		ISP_IOXGET_32(isp, &src->ms_dataseg[i].ds_base, dst->ms_dataseg[i].ds_base);
1798196008Smjacob		ISP_IOXGET_32(isp, &src->ms_dataseg[i].ds_basehi, dst->ms_dataseg[i].ds_basehi);
1799196008Smjacob		ISP_IOXGET_32(isp, &src->ms_dataseg[i].ds_count, dst->ms_dataseg[i].ds_count);
1800164370Smjacob	}
1801164370Smjacob}
1802164370Smjacob
1803164370Smjacobvoid
1804163899Smjacobisp_put_ct_pt(ispsoftc_t *isp, isp_ct_pt_t *src, isp_ct_pt_t *dst)
1805163899Smjacob{
1806163899Smjacob	int i;
1807163899Smjacob
1808163899Smjacob	isp_put_hdr(isp, &src->ctp_header, &dst->ctp_header);
1809163899Smjacob	ISP_IOXPUT_32(isp, src->ctp_handle, &dst->ctp_handle);
1810163899Smjacob	ISP_IOXPUT_16(isp, src->ctp_status, &dst->ctp_status);
1811163899Smjacob	ISP_IOXPUT_16(isp, src->ctp_nphdl, &dst->ctp_nphdl);
1812163899Smjacob	ISP_IOXPUT_16(isp, src->ctp_cmd_cnt, &dst->ctp_cmd_cnt);
1813196008Smjacob	ISP_IOXPUT_8(isp, src->ctp_vpidx, &dst->ctp_vpidx);
1814196008Smjacob	ISP_IOXPUT_8(isp, src->ctp_reserved0, &dst->ctp_reserved0);
1815163899Smjacob	ISP_IOXPUT_16(isp, src->ctp_time, &dst->ctp_time);
1816196008Smjacob	ISP_IOXPUT_16(isp, src->ctp_reserved1, &dst->ctp_reserved1);
1817163899Smjacob	ISP_IOXPUT_16(isp, src->ctp_rsp_cnt, &dst->ctp_rsp_cnt);
1818163899Smjacob	for (i = 0; i < 5; i++) {
1819196008Smjacob		ISP_IOXPUT_16(isp, src->ctp_reserved2[i], &dst->ctp_reserved2[i]);
1820163899Smjacob	}
1821163899Smjacob	ISP_IOXPUT_32(isp, src->ctp_rsp_bcnt, &dst->ctp_rsp_bcnt);
1822163899Smjacob	ISP_IOXPUT_32(isp, src->ctp_cmd_bcnt, &dst->ctp_cmd_bcnt);
1823163899Smjacob	for (i = 0; i < 2; i++) {
1824196008Smjacob		ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_base, &dst->ctp_dataseg[i].ds_base);
1825196008Smjacob		ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_basehi, &dst->ctp_dataseg[i].ds_basehi);
1826196008Smjacob		ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_count, &dst->ctp_dataseg[i].ds_count);
1827163899Smjacob	}
1828163899Smjacob}
1829163899Smjacob
1830164370Smjacobvoid
1831164370Smjacobisp_put_ms(ispsoftc_t *isp, isp_ms_t *src, isp_ms_t *dst)
1832164370Smjacob{
1833164370Smjacob	int i;
1834164370Smjacob
1835164370Smjacob	isp_put_hdr(isp, &src->ms_header, &dst->ms_header);
1836164370Smjacob	ISP_IOXPUT_32(isp, src->ms_handle, &dst->ms_handle);
1837164370Smjacob	ISP_IOXPUT_16(isp, src->ms_nphdl, &dst->ms_nphdl);
1838164370Smjacob	ISP_IOXPUT_16(isp, src->ms_status, &dst->ms_status);
1839164370Smjacob	ISP_IOXPUT_16(isp, src->ms_flags, &dst->ms_flags);
1840164370Smjacob	ISP_IOXPUT_16(isp, src->ms_reserved1, &dst->ms_reserved1);
1841164370Smjacob	ISP_IOXPUT_16(isp, src->ms_time, &dst->ms_time);
1842164370Smjacob	ISP_IOXPUT_16(isp, src->ms_cmd_cnt, &dst->ms_cmd_cnt);
1843164370Smjacob	ISP_IOXPUT_16(isp, src->ms_tot_cnt, &dst->ms_tot_cnt);
1844164370Smjacob	ISP_IOXPUT_8(isp, src->ms_type, &dst->ms_type);
1845164370Smjacob	ISP_IOXPUT_8(isp, src->ms_r_ctl, &dst->ms_r_ctl);
1846164370Smjacob	ISP_IOXPUT_16(isp, src->ms_rxid, &dst->ms_rxid);
1847164370Smjacob	ISP_IOXPUT_16(isp, src->ms_reserved2, &dst->ms_reserved2);
1848164370Smjacob	ISP_IOXPUT_32(isp, src->ms_rsp_bcnt, &dst->ms_rsp_bcnt);
1849164370Smjacob	ISP_IOXPUT_32(isp, src->ms_cmd_bcnt, &dst->ms_cmd_bcnt);
1850164370Smjacob	for (i = 0; i < 2; i++) {
1851196008Smjacob		ISP_IOXPUT_32(isp, src->ms_dataseg[i].ds_base, &dst->ms_dataseg[i].ds_base);
1852196008Smjacob		ISP_IOXPUT_32(isp, src->ms_dataseg[i].ds_basehi, &dst->ms_dataseg[i].ds_basehi);
1853196008Smjacob		ISP_IOXPUT_32(isp, src->ms_dataseg[i].ds_count, &dst->ms_dataseg[i].ds_count);
1854164370Smjacob	}
1855164370Smjacob}
1856164370Smjacob
1857163899Smjacob/*
1858155228Smjacob * Generic SNS request - not particularly useful since the per-command data
1859155228Smjacob * isn't always 16 bit words.
1860155228Smjacob */
1861155228Smjacobvoid
1862155704Smjacobisp_put_sns_request(ispsoftc_t *isp, sns_screq_t *src, sns_screq_t *dst)
1863155228Smjacob{
1864155228Smjacob	int i, nw = (int) src->snscb_sblen;
1865155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
1866155228Smjacob	for (i = 0; i < 4; i++) {
1867155228Smjacob		ISP_IOXPUT_16(isp, src->snscb_addr[i], &dst->snscb_addr[i]);
1868155228Smjacob	}
1869155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
1870155228Smjacob	for (i = 0; i < nw; i++) {
1871155228Smjacob		ISP_IOXPUT_16(isp, src->snscb_data[i], &dst->snscb_data[i]);
1872155228Smjacob	}
1873155228Smjacob}
1874155228Smjacob
1875155228Smjacobvoid
1876196008Smjacobisp_put_gid_ft_request(ispsoftc_t *isp, sns_gid_ft_req_t *src, sns_gid_ft_req_t *dst)
1877155228Smjacob{
1878155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
1879163899Smjacob	ISP_IOXPUT_16(isp, src->snscb_reserved0, &dst->snscb_reserved0);
1880155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[0], &dst->snscb_addr[0]);
1881155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[1], &dst->snscb_addr[1]);
1882155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[2], &dst->snscb_addr[2]);
1883155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[3], &dst->snscb_addr[3]);
1884155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
1885163899Smjacob	ISP_IOXPUT_16(isp, src->snscb_reserved1, &dst->snscb_reserved1);
1886155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_cmd, &dst->snscb_cmd);
1887155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_mword_div_2, &dst->snscb_mword_div_2);
1888163899Smjacob	ISP_IOXPUT_32(isp, src->snscb_reserved3, &dst->snscb_reserved3);
1889155228Smjacob	ISP_IOXPUT_32(isp, src->snscb_fc4_type, &dst->snscb_fc4_type);
1890155228Smjacob}
1891155228Smjacob
1892155228Smjacobvoid
1893196008Smjacobisp_put_gxn_id_request(ispsoftc_t *isp, sns_gxn_id_req_t *src, sns_gxn_id_req_t *dst)
1894155228Smjacob{
1895155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
1896163899Smjacob	ISP_IOXPUT_16(isp, src->snscb_reserved0, &dst->snscb_reserved0);
1897155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[0], &dst->snscb_addr[0]);
1898155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[1], &dst->snscb_addr[1]);
1899155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[2], &dst->snscb_addr[2]);
1900155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[3], &dst->snscb_addr[3]);
1901155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
1902163899Smjacob	ISP_IOXPUT_16(isp, src->snscb_reserved1, &dst->snscb_reserved1);
1903155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_cmd, &dst->snscb_cmd);
1904163899Smjacob	ISP_IOXPUT_16(isp, src->snscb_reserved2, &dst->snscb_reserved2);
1905163899Smjacob	ISP_IOXPUT_32(isp, src->snscb_reserved3, &dst->snscb_reserved3);
1906155228Smjacob	ISP_IOXPUT_32(isp, src->snscb_portid, &dst->snscb_portid);
1907155228Smjacob}
1908155228Smjacob
1909155228Smjacob/*
1910155228Smjacob * Generic SNS response - not particularly useful since the per-command data
1911155228Smjacob * isn't always 16 bit words.
1912155228Smjacob */
1913155228Smjacobvoid
1914196008Smjacobisp_get_sns_response(ispsoftc_t *isp, sns_scrsp_t *src, sns_scrsp_t *dst, int nwords)
1915155228Smjacob{
1916155228Smjacob	int i;
1917155228Smjacob	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1918155228Smjacob	ISP_IOXGET_8(isp, &src->snscb_port_type, dst->snscb_port_type);
1919155228Smjacob	for (i = 0; i < 3; i++) {
1920155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_port_id[i],
1921155228Smjacob		    dst->snscb_port_id[i]);
1922155228Smjacob	}
1923155228Smjacob	for (i = 0; i < 8; i++) {
1924155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_portname[i],
1925155228Smjacob		    dst->snscb_portname[i]);
1926155228Smjacob	}
1927155228Smjacob	for (i = 0; i < nwords; i++) {
1928155228Smjacob		ISP_IOXGET_16(isp, &src->snscb_data[i], dst->snscb_data[i]);
1929155228Smjacob	}
1930155228Smjacob}
1931155228Smjacob
1932155228Smjacobvoid
1933196008Smjacobisp_get_gid_ft_response(ispsoftc_t *isp, sns_gid_ft_rsp_t *src, sns_gid_ft_rsp_t *dst, int nwords)
1934155228Smjacob{
1935155228Smjacob	int i;
1936155228Smjacob	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1937155228Smjacob	for (i = 0; i < nwords; i++) {
1938155228Smjacob		int j;
1939196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_ports[i].control, dst->snscb_ports[i].control);
1940155228Smjacob		for (j = 0; j < 3; j++) {
1941196008Smjacob			ISP_IOXGET_8(isp, &src->snscb_ports[i].portid[j], dst->snscb_ports[i].portid[j]);
1942155228Smjacob		}
1943155228Smjacob		if (dst->snscb_ports[i].control & 0x80) {
1944155228Smjacob			break;
1945155228Smjacob		}
1946155228Smjacob	}
1947155228Smjacob}
1948155228Smjacob
1949155228Smjacobvoid
1950196008Smjacobisp_get_gxn_id_response(ispsoftc_t *isp, sns_gxn_id_rsp_t *src, sns_gxn_id_rsp_t *dst)
1951155228Smjacob{
1952155228Smjacob	int i;
1953155228Smjacob	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1954196008Smjacob	for (i = 0; i < 8; i++) {
1955155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_wwn[i], dst->snscb_wwn[i]);
1956196008Smjacob	}
1957155228Smjacob}
1958155228Smjacob
1959155228Smjacobvoid
1960196008Smjacobisp_get_gff_id_response(ispsoftc_t *isp, sns_gff_id_rsp_t *src, sns_gff_id_rsp_t *dst)
1961155228Smjacob{
1962155228Smjacob	int i;
1963155228Smjacob	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1964155228Smjacob	for (i = 0; i < 32; i++) {
1965196008Smjacob		ISP_IOXGET_32(isp, &src->snscb_fc4_features[i], dst->snscb_fc4_features[i]);
1966155228Smjacob	}
1967155228Smjacob}
1968155228Smjacob
1969155228Smjacobvoid
1970196008Smjacobisp_get_ga_nxt_response(ispsoftc_t *isp, sns_ga_nxt_rsp_t *src, sns_ga_nxt_rsp_t *dst)
1971155228Smjacob{
1972155228Smjacob	int i;
1973155228Smjacob	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1974155228Smjacob	ISP_IOXGET_8(isp, &src->snscb_port_type, dst->snscb_port_type);
1975155228Smjacob	for (i = 0; i < 3; i++) {
1976196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_port_id[i], dst->snscb_port_id[i]);
1977155228Smjacob	}
1978155228Smjacob	for (i = 0; i < 8; i++) {
1979196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_portname[i], dst->snscb_portname[i]);
1980155228Smjacob	}
1981155228Smjacob	ISP_IOXGET_8(isp, &src->snscb_pnlen, dst->snscb_pnlen);
1982155228Smjacob	for (i = 0; i < 255; i++) {
1983155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_pname[i], dst->snscb_pname[i]);
1984155228Smjacob	}
1985155228Smjacob	for (i = 0; i < 8; i++) {
1986196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_nodename[i], dst->snscb_nodename[i]);
1987155228Smjacob	}
1988155228Smjacob	ISP_IOXGET_8(isp, &src->snscb_nnlen, dst->snscb_nnlen);
1989155228Smjacob	for (i = 0; i < 255; i++) {
1990155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_nname[i], dst->snscb_nname[i]);
1991155228Smjacob	}
1992155228Smjacob	for (i = 0; i < 8; i++) {
1993196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_ipassoc[i], dst->snscb_ipassoc[i]);
1994155228Smjacob	}
1995155228Smjacob	for (i = 0; i < 16; i++) {
1996155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_ipaddr[i], dst->snscb_ipaddr[i]);
1997155228Smjacob	}
1998155228Smjacob	for (i = 0; i < 4; i++) {
1999196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_svc_class[i], dst->snscb_svc_class[i]);
2000155228Smjacob	}
2001155228Smjacob	for (i = 0; i < 32; i++) {
2002196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_fc4_types[i], dst->snscb_fc4_types[i]);
2003155228Smjacob	}
2004155228Smjacob	for (i = 0; i < 8; i++) {
2005155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_fpname[i], dst->snscb_fpname[i]);
2006155228Smjacob	}
2007155228Smjacob	ISP_IOXGET_8(isp, &src->snscb_reserved, dst->snscb_reserved);
2008155228Smjacob	for (i = 0; i < 3; i++) {
2009196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_hardaddr[i], dst->snscb_hardaddr[i]);
2010155228Smjacob	}
2011155228Smjacob}
2012155228Smjacob
2013163899Smjacobvoid
2014163899Smjacobisp_get_els(ispsoftc_t *isp, els_t *src, els_t *dst)
2015163899Smjacob{
2016163899Smjacob	int i;
2017163899Smjacob
2018163899Smjacob	isp_get_hdr(isp, &src->els_hdr, &dst->els_hdr);
2019163899Smjacob	ISP_IOXGET_32(isp, &src->els_handle, dst->els_handle);
2020163899Smjacob	ISP_IOXGET_16(isp, &src->els_status, dst->els_status);
2021163899Smjacob	ISP_IOXGET_16(isp, &src->els_nphdl, dst->els_nphdl);
2022163899Smjacob	ISP_IOXGET_16(isp, &src->els_xmit_dsd_count, dst->els_xmit_dsd_count);
2023163899Smjacob	ISP_IOXGET_8(isp, &src->els_vphdl, dst->els_vphdl);
2024163899Smjacob	ISP_IOXGET_8(isp, &src->els_sof, dst->els_sof);
2025163899Smjacob	ISP_IOXGET_32(isp, &src->els_rxid, dst->els_rxid);
2026163899Smjacob	ISP_IOXGET_16(isp, &src->els_recv_dsd_count, dst->els_recv_dsd_count);
2027163899Smjacob	ISP_IOXGET_8(isp, &src->els_opcode, dst->els_opcode);
2028163899Smjacob	ISP_IOXGET_8(isp, &src->els_reserved2, dst->els_reserved1);
2029163899Smjacob	ISP_IOXGET_8(isp, &src->els_did_lo, dst->els_did_lo);
2030163899Smjacob	ISP_IOXGET_8(isp, &src->els_did_mid, dst->els_did_mid);
2031163899Smjacob	ISP_IOXGET_8(isp, &src->els_did_hi, dst->els_did_hi);
2032163899Smjacob	ISP_IOXGET_8(isp, &src->els_reserved2, dst->els_reserved2);
2033163899Smjacob	ISP_IOXGET_16(isp, &src->els_reserved3, dst->els_reserved3);
2034163899Smjacob	ISP_IOXGET_16(isp, &src->els_ctl_flags, dst->els_ctl_flags);
2035163899Smjacob	ISP_IOXGET_32(isp, &src->els_bytecnt, dst->els_bytecnt);
2036163899Smjacob	ISP_IOXGET_32(isp, &src->els_subcode1, dst->els_subcode1);
2037163899Smjacob	ISP_IOXGET_32(isp, &src->els_subcode2, dst->els_subcode2);
2038163899Smjacob	for (i = 0; i < 20; i++) {
2039196008Smjacob		ISP_IOXGET_8(isp, &src->els_reserved4[i], dst->els_reserved4[i]);
2040163899Smjacob	}
2041163899Smjacob}
2042163899Smjacob
2043163899Smjacobvoid
2044163899Smjacobisp_put_els(ispsoftc_t *isp, els_t *src, els_t *dst)
2045163899Smjacob{
2046163899Smjacob	isp_put_hdr(isp, &src->els_hdr, &dst->els_hdr);
2047163899Smjacob	ISP_IOXPUT_32(isp, src->els_handle, &dst->els_handle);
2048163899Smjacob	ISP_IOXPUT_16(isp, src->els_status, &dst->els_status);
2049163899Smjacob	ISP_IOXPUT_16(isp, src->els_nphdl, &dst->els_nphdl);
2050163899Smjacob	ISP_IOXPUT_16(isp, src->els_xmit_dsd_count, &dst->els_xmit_dsd_count);
2051163899Smjacob	ISP_IOXPUT_8(isp, src->els_vphdl, &dst->els_vphdl);
2052163899Smjacob	ISP_IOXPUT_8(isp, src->els_sof, &dst->els_sof);
2053163899Smjacob	ISP_IOXPUT_32(isp, src->els_rxid, &dst->els_rxid);
2054163899Smjacob	ISP_IOXPUT_16(isp, src->els_recv_dsd_count, &dst->els_recv_dsd_count);
2055163899Smjacob	ISP_IOXPUT_8(isp, src->els_opcode, &dst->els_opcode);
2056163899Smjacob	ISP_IOXPUT_8(isp, src->els_reserved2, &dst->els_reserved1);
2057163899Smjacob	ISP_IOXPUT_8(isp, src->els_did_lo, &dst->els_did_lo);
2058163899Smjacob	ISP_IOXPUT_8(isp, src->els_did_mid, &dst->els_did_mid);
2059163899Smjacob	ISP_IOXPUT_8(isp, src->els_did_hi, &dst->els_did_hi);
2060163899Smjacob	ISP_IOXPUT_8(isp, src->els_reserved2, &dst->els_reserved2);
2061163899Smjacob	ISP_IOXPUT_16(isp, src->els_reserved3, &dst->els_reserved3);
2062163899Smjacob	ISP_IOXPUT_16(isp, src->els_ctl_flags, &dst->els_ctl_flags);
2063163899Smjacob	ISP_IOXPUT_32(isp, src->els_recv_bytecnt, &dst->els_recv_bytecnt);
2064163899Smjacob	ISP_IOXPUT_32(isp, src->els_xmit_bytecnt, &dst->els_xmit_bytecnt);
2065163899Smjacob	ISP_IOXPUT_32(isp, src->els_xmit_dsd_length, &dst->els_xmit_dsd_length);
2066163899Smjacob	ISP_IOXPUT_16(isp, src->els_xmit_dsd_a1500, &dst->els_xmit_dsd_a1500);
2067163899Smjacob	ISP_IOXPUT_16(isp, src->els_xmit_dsd_a3116, &dst->els_xmit_dsd_a3116);
2068163899Smjacob	ISP_IOXPUT_16(isp, src->els_xmit_dsd_a4732, &dst->els_xmit_dsd_a4732);
2069163899Smjacob	ISP_IOXPUT_16(isp, src->els_xmit_dsd_a6348, &dst->els_xmit_dsd_a6348);
2070163899Smjacob	ISP_IOXPUT_32(isp, src->els_recv_dsd_length, &dst->els_recv_dsd_length);
2071163899Smjacob	ISP_IOXPUT_16(isp, src->els_recv_dsd_a1500, &dst->els_recv_dsd_a1500);
2072163899Smjacob	ISP_IOXPUT_16(isp, src->els_recv_dsd_a3116, &dst->els_recv_dsd_a3116);
2073163899Smjacob	ISP_IOXPUT_16(isp, src->els_recv_dsd_a4732, &dst->els_recv_dsd_a4732);
2074163899Smjacob	ISP_IOXPUT_16(isp, src->els_recv_dsd_a6348, &dst->els_recv_dsd_a6348);
2075163899Smjacob}
2076163899Smjacob
2077163899Smjacob/*
2078163899Smjacob * FC Structure Canonicalization
2079163899Smjacob */
2080163899Smjacob
2081163899Smjacobvoid
2082163899Smjacobisp_get_fc_hdr(ispsoftc_t *isp, fc_hdr_t *src, fc_hdr_t *dst)
2083163899Smjacob{
2084163899Smjacob        ISP_IOZGET_8(isp, &src->r_ctl, dst->r_ctl);
2085163899Smjacob        ISP_IOZGET_8(isp, &src->d_id[0], dst->d_id[0]);
2086163899Smjacob        ISP_IOZGET_8(isp, &src->d_id[1], dst->d_id[1]);
2087163899Smjacob        ISP_IOZGET_8(isp, &src->d_id[2], dst->d_id[2]);
2088163899Smjacob        ISP_IOZGET_8(isp, &src->cs_ctl, dst->cs_ctl);
2089163899Smjacob        ISP_IOZGET_8(isp, &src->s_id[0], dst->s_id[0]);
2090163899Smjacob        ISP_IOZGET_8(isp, &src->s_id[1], dst->s_id[1]);
2091163899Smjacob        ISP_IOZGET_8(isp, &src->s_id[2], dst->s_id[2]);
2092163899Smjacob        ISP_IOZGET_8(isp, &src->type, dst->type);
2093196008Smjacob        ISP_IOZGET_8(isp, &src->f_ctl[0], dst->f_ctl[0]);
2094196008Smjacob        ISP_IOZGET_8(isp, &src->f_ctl[1], dst->f_ctl[1]);
2095196008Smjacob        ISP_IOZGET_8(isp, &src->f_ctl[2], dst->f_ctl[2]);
2096163899Smjacob        ISP_IOZGET_8(isp, &src->seq_id, dst->seq_id);
2097163899Smjacob        ISP_IOZGET_8(isp, &src->df_ctl, dst->df_ctl);
2098163899Smjacob        ISP_IOZGET_16(isp, &src->seq_cnt, dst->seq_cnt);
2099163899Smjacob        ISP_IOZGET_16(isp, &src->ox_id, dst->ox_id);
2100163899Smjacob        ISP_IOZGET_16(isp, &src->rx_id, dst->rx_id);
2101163899Smjacob        ISP_IOZGET_32(isp, &src->parameter, dst->parameter);
2102163899Smjacob}
2103163899Smjacob
2104163899Smjacobvoid
2105238869Smjacobisp_put_fc_hdr(ispsoftc_t *isp, fc_hdr_t *src, fc_hdr_t *dst)
2106238869Smjacob{
2107238869Smjacob        ISP_IOZPUT_8(isp, src->r_ctl, &dst->r_ctl);
2108238869Smjacob        ISP_IOZPUT_8(isp, src->d_id[0], &dst->d_id[0]);
2109238869Smjacob        ISP_IOZPUT_8(isp, src->d_id[1], &dst->d_id[1]);
2110238869Smjacob        ISP_IOZPUT_8(isp, src->d_id[2], &dst->d_id[2]);
2111238869Smjacob        ISP_IOZPUT_8(isp, src->cs_ctl, &dst->cs_ctl);
2112238869Smjacob        ISP_IOZPUT_8(isp, src->s_id[0], &dst->s_id[0]);
2113238869Smjacob        ISP_IOZPUT_8(isp, src->s_id[1], &dst->s_id[1]);
2114238869Smjacob        ISP_IOZPUT_8(isp, src->s_id[2], &dst->s_id[2]);
2115238869Smjacob        ISP_IOZPUT_8(isp, src->type, &dst->type);
2116238869Smjacob        ISP_IOZPUT_8(isp, src->f_ctl[0], &dst->f_ctl[0]);
2117238869Smjacob        ISP_IOZPUT_8(isp, src->f_ctl[1], &dst->f_ctl[1]);
2118238869Smjacob        ISP_IOZPUT_8(isp, src->f_ctl[2], &dst->f_ctl[2]);
2119238869Smjacob        ISP_IOZPUT_8(isp, src->seq_id, &dst->seq_id);
2120238869Smjacob        ISP_IOZPUT_8(isp, src->df_ctl, &dst->df_ctl);
2121238869Smjacob        ISP_IOZPUT_16(isp, src->seq_cnt, &dst->seq_cnt);
2122238869Smjacob        ISP_IOZPUT_16(isp, src->ox_id, &dst->ox_id);
2123238869Smjacob        ISP_IOZPUT_16(isp, src->rx_id, &dst->rx_id);
2124238869Smjacob        ISP_IOZPUT_32(isp, src->parameter, &dst->parameter);
2125238869Smjacob}
2126238869Smjacob
2127238869Smjacobvoid
2128163899Smjacobisp_get_fcp_cmnd_iu(ispsoftc_t *isp, fcp_cmnd_iu_t *src, fcp_cmnd_iu_t *dst)
2129163899Smjacob{
2130163899Smjacob	int i;
2131163899Smjacob
2132163899Smjacob	for (i = 0; i < 8; i++) {
2133163899Smjacob		ISP_IOZGET_8(isp, &src->fcp_cmnd_lun[i], dst->fcp_cmnd_lun[i]);
2134163899Smjacob	}
2135163899Smjacob        ISP_IOZGET_8(isp, &src->fcp_cmnd_crn, dst->fcp_cmnd_crn);
2136196008Smjacob        ISP_IOZGET_8(isp, &src->fcp_cmnd_task_attribute, dst->fcp_cmnd_task_attribute);
2137196008Smjacob        ISP_IOZGET_8(isp, &src->fcp_cmnd_task_management, dst->fcp_cmnd_task_management);
2138196008Smjacob        ISP_IOZGET_8(isp, &src->fcp_cmnd_alen_datadir, dst->fcp_cmnd_alen_datadir);
2139163899Smjacob	for (i = 0; i < 16; i++) {
2140196008Smjacob		ISP_IOZGET_8(isp, &src->cdb_dl.sf.fcp_cmnd_cdb[i], dst->cdb_dl.sf.fcp_cmnd_cdb[i]);
2141163899Smjacob	}
2142196008Smjacob	ISP_IOZGET_32(isp, &src->cdb_dl.sf.fcp_cmnd_dl, dst->cdb_dl.sf.fcp_cmnd_dl);
2143163899Smjacob}
2144163899Smjacob
2145163899Smjacobvoid
2146163899Smjacobisp_put_rft_id(ispsoftc_t *isp, rft_id_t *src, rft_id_t *dst)
2147163899Smjacob{
2148163899Smjacob	int i;
2149163899Smjacob	isp_put_ct_hdr(isp, &src->rftid_hdr, &dst->rftid_hdr);
2150163899Smjacob	ISP_IOZPUT_8(isp, src->rftid_reserved, &dst->rftid_reserved);
2151163899Smjacob	for (i = 0; i < 3; i++) {
2152163899Smjacob		ISP_IOZPUT_8(isp, src->rftid_portid[i], &dst->rftid_portid[i]);
2153163899Smjacob	}
2154163899Smjacob	for (i = 0; i < 8; i++) {
2155196008Smjacob		ISP_IOZPUT_32(isp, src->rftid_fc4types[i], &dst->rftid_fc4types[i]);
2156163899Smjacob	}
2157163899Smjacob}
2158163899Smjacob
2159163899Smjacobvoid
2160163899Smjacobisp_get_ct_hdr(ispsoftc_t *isp, ct_hdr_t *src, ct_hdr_t *dst)
2161163899Smjacob{
2162163899Smjacob	ISP_IOZGET_8(isp, &src->ct_revision, dst->ct_revision);
2163163899Smjacob	ISP_IOZGET_8(isp, &src->ct_in_id[0], dst->ct_in_id[0]);
2164163899Smjacob	ISP_IOZGET_8(isp, &src->ct_in_id[1], dst->ct_in_id[1]);
2165163899Smjacob	ISP_IOZGET_8(isp, &src->ct_in_id[2], dst->ct_in_id[2]);
2166163899Smjacob	ISP_IOZGET_8(isp, &src->ct_fcs_type, dst->ct_fcs_type);
2167163899Smjacob	ISP_IOZGET_8(isp, &src->ct_fcs_subtype, dst->ct_fcs_subtype);
2168163899Smjacob	ISP_IOZGET_8(isp, &src->ct_options, dst->ct_options);
2169163899Smjacob	ISP_IOZGET_8(isp, &src->ct_reserved0, dst->ct_reserved0);
2170163899Smjacob	ISP_IOZGET_16(isp, &src->ct_cmd_resp, dst->ct_cmd_resp);
2171163899Smjacob	ISP_IOZGET_16(isp, &src->ct_bcnt_resid, dst->ct_bcnt_resid);
2172163899Smjacob	ISP_IOZGET_8(isp, &src->ct_reserved1, dst->ct_reserved1);
2173163899Smjacob	ISP_IOZGET_8(isp, &src->ct_reason, dst->ct_reason);
2174163899Smjacob	ISP_IOZGET_8(isp, &src->ct_explanation, dst->ct_explanation);
2175163899Smjacob	ISP_IOZGET_8(isp, &src->ct_vunique, dst->ct_vunique);
2176163899Smjacob}
2177163899Smjacob
2178163899Smjacobvoid
2179163899Smjacobisp_put_ct_hdr(ispsoftc_t *isp, ct_hdr_t *src, ct_hdr_t *dst)
2180163899Smjacob{
2181163899Smjacob	ISP_IOZPUT_8(isp, src->ct_revision, &dst->ct_revision);
2182163899Smjacob	ISP_IOZPUT_8(isp, src->ct_in_id[0], &dst->ct_in_id[0]);
2183163899Smjacob	ISP_IOZPUT_8(isp, src->ct_in_id[1], &dst->ct_in_id[1]);
2184163899Smjacob	ISP_IOZPUT_8(isp, src->ct_in_id[2], &dst->ct_in_id[2]);
2185163899Smjacob	ISP_IOZPUT_8(isp, src->ct_fcs_type, &dst->ct_fcs_type);
2186163899Smjacob	ISP_IOZPUT_8(isp, src->ct_fcs_subtype, &dst->ct_fcs_subtype);
2187163899Smjacob	ISP_IOZPUT_8(isp, src->ct_options, &dst->ct_options);
2188163899Smjacob	ISP_IOZPUT_8(isp, src->ct_reserved0, &dst->ct_reserved0);
2189163899Smjacob	ISP_IOZPUT_16(isp, src->ct_cmd_resp, &dst->ct_cmd_resp);
2190163899Smjacob	ISP_IOZPUT_16(isp, src->ct_bcnt_resid, &dst->ct_bcnt_resid);
2191163899Smjacob	ISP_IOZPUT_8(isp, src->ct_reserved1, &dst->ct_reserved1);
2192163899Smjacob	ISP_IOZPUT_8(isp, src->ct_reason, &dst->ct_reason);
2193163899Smjacob	ISP_IOZPUT_8(isp, src->ct_explanation, &dst->ct_explanation);
2194163899Smjacob	ISP_IOZPUT_8(isp, src->ct_vunique, &dst->ct_vunique);
2195163899Smjacob}
2196163899Smjacob
2197238869Smjacobvoid
2198238869Smjacobisp_put_fcp_rsp_iu(ispsoftc_t *isp, fcp_rsp_iu_t *src, fcp_rsp_iu_t *dst)
2199238869Smjacob{
2200238869Smjacob	int i;
2201238869Smjacob	for (i = 0; i < ((sizeof (src->fcp_rsp_reserved))/(sizeof (src->fcp_rsp_reserved[0]))); i++) {
2202238869Smjacob		ISP_IOZPUT_8(isp, src->fcp_rsp_reserved[i], &dst->fcp_rsp_reserved[i]);
2203238869Smjacob	}
2204238869Smjacob	ISP_IOZPUT_16(isp, src->fcp_rsp_status_qualifier, &dst->fcp_rsp_status_qualifier);
2205238869Smjacob	ISP_IOZPUT_8(isp, src->fcp_rsp_bits, &dst->fcp_rsp_bits);
2206238869Smjacob	ISP_IOZPUT_8(isp, src->fcp_rsp_scsi_status, &dst->fcp_rsp_scsi_status);
2207238869Smjacob	ISP_IOZPUT_32(isp, src->fcp_rsp_resid, &dst->fcp_rsp_resid);
2208238869Smjacob	ISP_IOZPUT_32(isp, src->fcp_rsp_snslen, &dst->fcp_rsp_snslen);
2209238869Smjacob	ISP_IOZPUT_32(isp, src->fcp_rsp_rsplen, &dst->fcp_rsp_rsplen);
2210238869Smjacob}
2211238869Smjacob
2212155228Smjacob#ifdef	ISP_TARGET_MODE
2213196008Smjacob
2214196008Smjacob/*
2215196008Smjacob * Command shipping- finish off first queue entry and do dma mapping and
2216196008Smjacob * additional segments as needed.
2217196008Smjacob *
2218238869Smjacob * Called with the first queue entry mostly filled out.
2219238869Smjacob * Our job here is to finish that and add additional data
2220238869Smjacob * segments if needed.
2221238869Smjacob *
2222238869Smjacob * We used to do synthetic entries to split data and status
2223238869Smjacob * at this level, but that started getting too tricky.
2224196008Smjacob */
2225155228Smjacobint
2226196008Smjacobisp_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)
2227196008Smjacob{
2228238869Smjacob	uint8_t storage[QENTRY_LEN];
2229196008Smjacob	uint8_t type, nqe;
2230196008Smjacob	uint32_t seg, curseg, seglim, nxt, nxtnxt;
2231196008Smjacob	ispds_t *dsp = NULL;
2232196008Smjacob	ispds64_t *dsp64 = NULL;
2233238869Smjacob	void *qe0, *qe1;
2234196008Smjacob
2235196008Smjacob	qe0 = isp_getrqentry(isp);
2236196008Smjacob	if (qe0 == NULL) {
2237196008Smjacob		return (CMD_EAGAIN);
2238196008Smjacob	}
2239196008Smjacob	nxt = ISP_NXT_QENTRY(isp->isp_reqidx, RQUEST_QUEUE_LEN(isp));
2240196008Smjacob
2241196008Smjacob	type = ((isphdr_t *)fqe)->rqs_entry_type;
2242196008Smjacob	nqe = 1;
2243196008Smjacob	seglim = 0;
2244196008Smjacob
2245196008Smjacob	/*
2246238869Smjacob	 * If we have data to transmit, figure out how many segments can fit into the first entry.
2247196008Smjacob	 */
2248196008Smjacob	if (ddir != ISP_NOXFR) {
2249196008Smjacob		/*
2250196008Smjacob		 * First, figure out how many pieces of data to transfer and what kind and how many we can put into the first queue entry.
2251196008Smjacob		 */
2252196008Smjacob		switch (type) {
2253196008Smjacob		case RQSTYPE_CTIO:
2254196008Smjacob			dsp = ((ct_entry_t *)fqe)->ct_dataseg;
2255196008Smjacob			seglim = ISP_RQDSEG;
2256196008Smjacob			break;
2257196008Smjacob		case RQSTYPE_CTIO2:
2258238869Smjacob			dsp = ((ct2_entry_t *)fqe)->rsp.m0.u.ct_dataseg;
2259238869Smjacob			seglim = ISP_RQDSEG_T2;
2260238869Smjacob			break;
2261196008Smjacob		case RQSTYPE_CTIO3:
2262238869Smjacob			dsp64 = ((ct2_entry_t *)fqe)->rsp.m0.u.ct_dataseg64;
2263238869Smjacob			seglim = ISP_RQDSEG_T3;
2264196008Smjacob			break;
2265196008Smjacob		case RQSTYPE_CTIO7:
2266238869Smjacob			dsp64 = &((ct7_entry_t *)fqe)->rsp.m0.ds;
2267196008Smjacob			seglim = 1;
2268196008Smjacob			break;
2269196008Smjacob		default:
2270196008Smjacob			return (CMD_COMPLETE);
2271196008Smjacob		}
2272196008Smjacob	}
2273196008Smjacob
2274196008Smjacob	/*
2275238869Smjacob	 * First, fill out any of the data transfer stuff that fits
2276238869Smjacob	 * in the first queue entry.
2277196008Smjacob	 */
2278196008Smjacob	if (seglim > nsegs) {
2279196008Smjacob		seglim = nsegs;
2280196008Smjacob	}
2281196008Smjacob
2282196008Smjacob	for (seg = curseg = 0; curseg < seglim; curseg++) {
2283196008Smjacob		if (dsp64) {
2284196008Smjacob			XS_GET_DMA64_SEG(dsp64++, segp, seg++);
2285196008Smjacob		} else {
2286196008Smjacob			XS_GET_DMA_SEG(dsp++, segp, seg++);
2287196008Smjacob		}
2288196008Smjacob	}
2289196008Smjacob
2290196008Smjacob	/*
2291196008Smjacob	 * Second, start building additional continuation segments as needed.
2292196008Smjacob	 */
2293196008Smjacob	while (seg < nsegs) {
2294196008Smjacob		nxtnxt = ISP_NXT_QENTRY(nxt, RQUEST_QUEUE_LEN(isp));
2295196008Smjacob		if (nxtnxt == isp->isp_reqodx) {
2296261515Smav			isp->isp_reqodx = ISP_READ(isp, isp->isp_rqstoutrp);
2297261515Smav			if (nxtnxt == isp->isp_reqodx)
2298261515Smav				return (CMD_EAGAIN);
2299196008Smjacob		}
2300196008Smjacob		ISP_MEMZERO(storage, QENTRY_LEN);
2301196008Smjacob		qe1 = ISP_QUEUE_ENTRY(isp->isp_rquest, nxt);
2302196008Smjacob		nxt = nxtnxt;
2303196008Smjacob		if (dsp64) {
2304196008Smjacob			ispcontreq64_t *crq = (ispcontreq64_t *) storage;
2305196008Smjacob			seglim = ISP_CDSEG64;
2306196008Smjacob			crq->req_header.rqs_entry_type = RQSTYPE_A64_CONT;
2307196008Smjacob			crq->req_header.rqs_entry_count = 1;
2308196008Smjacob			dsp64 = crq->req_dataseg;
2309196008Smjacob		} else {
2310196008Smjacob			ispcontreq_t *crq = (ispcontreq_t *) storage;
2311196008Smjacob			seglim = ISP_CDSEG;
2312196008Smjacob			crq->req_header.rqs_entry_type = RQSTYPE_DATASEG;
2313196008Smjacob			crq->req_header.rqs_entry_count = 1;
2314196008Smjacob			dsp = crq->req_dataseg;
2315196008Smjacob		}
2316196008Smjacob		if (seg + seglim > nsegs) {
2317196008Smjacob			seglim = nsegs - seg;
2318196008Smjacob		}
2319196008Smjacob		for (curseg = 0; curseg < seglim; curseg++) {
2320196008Smjacob			if (dsp64) {
2321196008Smjacob				XS_GET_DMA64_SEG(dsp64++, segp, seg++);
2322196008Smjacob			} else {
2323196008Smjacob				XS_GET_DMA_SEG(dsp++, segp, seg++);
2324196008Smjacob			}
2325196008Smjacob		}
2326196008Smjacob		if (dsp64) {
2327196008Smjacob			isp_put_cont64_req(isp, (ispcontreq64_t *)storage, qe1);
2328196008Smjacob		} else {
2329196008Smjacob			isp_put_cont_req(isp, (ispcontreq_t *)storage, qe1);
2330196008Smjacob		}
2331196008Smjacob		if (isp->isp_dblev & ISP_LOGTDEBUG1) {
2332196008Smjacob			isp_print_bytes(isp, "additional queue entry", QENTRY_LEN, storage);
2333196008Smjacob		}
2334196008Smjacob		nqe++;
2335196008Smjacob        }
2336196008Smjacob
2337196008Smjacob	/*
2338238869Smjacob	 * Third, not patch up the first queue entry with the number of segments
2339238869Smjacob	 * we actually are going to be transmitting. At the same time, handle
2340238869Smjacob	 * any mode 2 requests.
2341196008Smjacob	 */
2342196008Smjacob	((isphdr_t *)fqe)->rqs_entry_count = nqe;
2343196008Smjacob	switch (type) {
2344196008Smjacob	case RQSTYPE_CTIO:
2345196008Smjacob		((ct_entry_t *)fqe)->ct_seg_count = nsegs;
2346196008Smjacob		isp_put_ctio(isp, fqe, qe0);
2347196008Smjacob		break;
2348196008Smjacob	case RQSTYPE_CTIO2:
2349196008Smjacob	case RQSTYPE_CTIO3:
2350238869Smjacob		if (((ct2_entry_t *)fqe)->ct_flags & CT2_FLAG_MODE2) {
2351238869Smjacob			((ct2_entry_t *)fqe)->ct_seg_count = 1;
2352238869Smjacob		} else {
2353238869Smjacob			((ct2_entry_t *)fqe)->ct_seg_count = nsegs;
2354238869Smjacob		}
2355196008Smjacob		if (ISP_CAP_2KLOGIN(isp)) {
2356196008Smjacob			isp_put_ctio2e(isp, fqe, qe0);
2357196008Smjacob		} else {
2358196008Smjacob			isp_put_ctio2(isp, fqe, qe0);
2359196008Smjacob		}
2360196008Smjacob		break;
2361196008Smjacob	case RQSTYPE_CTIO7:
2362238869Smjacob		if (((ct7_entry_t *)fqe)->ct_flags & CT7_FLAG_MODE2) {
2363238869Smjacob			((ct7_entry_t *)fqe)->ct_seg_count = 1;
2364238869Smjacob		} else {
2365238869Smjacob			((ct7_entry_t *)fqe)->ct_seg_count = nsegs;
2366238869Smjacob		}
2367196008Smjacob		isp_put_ctio7(isp, fqe, qe0);
2368196008Smjacob		break;
2369196008Smjacob	default:
2370196008Smjacob		return (CMD_COMPLETE);
2371196008Smjacob	}
2372196008Smjacob	if (isp->isp_dblev & ISP_LOGTDEBUG1) {
2373196008Smjacob		isp_print_bytes(isp, "first queue entry", QENTRY_LEN, fqe);
2374196008Smjacob	}
2375196008Smjacob	ISP_ADD_REQUEST(isp, nxt);
2376196008Smjacob	return (CMD_QUEUED);
2377196008Smjacob}
2378196008Smjacob
2379196008Smjacobint
2380203444Smjacobisp_allocate_xs_tgt(ispsoftc_t *isp, void *xs, uint32_t *handlep)
2381155228Smjacob{
2382203444Smjacob	isp_hdl_t *hdp;
2383155228Smjacob
2384203444Smjacob	hdp = isp->isp_tgtfree;
2385203444Smjacob	if (hdp == NULL) {
2386155228Smjacob		return (-1);
2387155228Smjacob	}
2388203444Smjacob	isp->isp_tgtfree = hdp->cmd;
2389203444Smjacob	hdp->cmd = xs;
2390203444Smjacob	hdp->handle = (hdp - isp->isp_tgtlist);
2391203444Smjacob	hdp->handle |= (ISP_HANDLE_TARGET << ISP_HANDLE_USAGE_SHIFT);
2392204397Smjacob	/*
2393204397Smjacob	 * Target handles for SCSI cards are only 16 bits, so
2394204397Smjacob	 * sequence number protection will be ommitted.
2395204397Smjacob	 */
2396204397Smjacob	if (IS_FC(isp)) {
2397204397Smjacob		hdp->handle |= (isp->isp_seqno++ << ISP_HANDLE_SEQ_SHIFT);
2398204397Smjacob	}
2399203444Smjacob	*handlep = hdp->handle;
2400155228Smjacob	return (0);
2401155228Smjacob}
2402155228Smjacob
2403155228Smjacobvoid *
2404163899Smjacobisp_find_xs_tgt(ispsoftc_t *isp, uint32_t handle)
2405155228Smjacob{
2406203444Smjacob	if (!ISP_VALID_TGT_HANDLE(isp, handle)) {
2407203444Smjacob		isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle);
2408155228Smjacob		return (NULL);
2409155228Smjacob	}
2410203444Smjacob	return (isp->isp_tgtlist[(handle & ISP_HANDLE_CMD_MASK)].cmd);
2411155228Smjacob}
2412155228Smjacob
2413163899Smjacobuint32_t
2414155704Smjacobisp_find_tgt_handle(ispsoftc_t *isp, void *xs)
2415155228Smjacob{
2416203444Smjacob	uint32_t i, foundhdl = ISP_HANDLE_FREE;
2417203444Smjacob
2418155228Smjacob	if (xs != NULL) {
2419155228Smjacob		for (i = 0; i < isp->isp_maxcmds; i++) {
2420203444Smjacob			if (isp->isp_tgtlist[i].cmd != xs) {
2421203444Smjacob				continue;
2422155228Smjacob			}
2423203444Smjacob			foundhdl = isp->isp_tgtlist[i].handle;
2424203444Smjacob			break;
2425155228Smjacob		}
2426155228Smjacob	}
2427203444Smjacob	return (foundhdl);
2428155228Smjacob}
2429155228Smjacob
2430155228Smjacobvoid
2431163899Smjacobisp_destroy_tgt_handle(ispsoftc_t *isp, uint32_t handle)
2432155228Smjacob{
2433203463Smjacob	if (!ISP_VALID_TGT_HANDLE(isp, handle)) {
2434203444Smjacob		isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle);
2435163899Smjacob	} else {
2436203444Smjacob		isp->isp_tgtlist[(handle & ISP_HANDLE_CMD_MASK)].handle = ISP_HANDLE_FREE;
2437203444Smjacob		isp->isp_tgtlist[(handle & ISP_HANDLE_CMD_MASK)].cmd = isp->isp_tgtfree;
2438203444Smjacob		isp->isp_tgtfree = &isp->isp_tgtlist[(handle & ISP_HANDLE_CMD_MASK)];
2439155228Smjacob	}
2440155228Smjacob}
2441163899Smjacob
2442285459Smav#endif
2443285459Smav
2444196008Smjacob/*
2445285459Smav * Find port database entries
2446196008Smjacob */
2447196008Smjacobint
2448196008Smjacobisp_find_pdb_by_wwn(ispsoftc_t *isp, int chan, uint64_t wwn, fcportdb_t **lptr)
2449196008Smjacob{
2450196008Smjacob	fcparam *fcp;
2451196008Smjacob	int i;
2452196008Smjacob
2453284681Smav	if (chan >= isp->isp_nchan)
2454284681Smav		return (0);
2455284681Smav	fcp = FCPARAM(isp, chan);
2456285459Smav	for (i = 0; i < MAX_FC_TARG; i++) {
2457284681Smav		fcportdb_t *lp = &fcp->portdb[i];
2458196008Smjacob
2459285459Smav		if (lp->state == FC_PORTDB_STATE_NIL)
2460284681Smav			continue;
2461284681Smav		if (lp->port_wwn == wwn) {
2462284681Smav			*lptr = lp;
2463284681Smav			return (1);
2464196008Smjacob		}
2465196008Smjacob	}
2466196008Smjacob	return (0);
2467196008Smjacob}
2468196008Smjacob
2469285459Smav#ifdef	ISP_TARGET_MODE
2470285459Smav
2471196008Smjacobint
2472285459Smavisp_find_pdb_by_handle(ispsoftc_t *isp, int chan, uint32_t handle, fcportdb_t **lptr)
2473196008Smjacob{
2474196008Smjacob	fcparam *fcp;
2475196008Smjacob	int i;
2476196008Smjacob
2477284681Smav	if (chan >= isp->isp_nchan)
2478284681Smav		return (0);
2479284681Smav	fcp = FCPARAM(isp, chan);
2480285459Smav	for (i = 0; i < MAX_FC_TARG; i++) {
2481285459Smav		fcportdb_t *lp = &fcp->portdb[i];
2482285459Smav
2483285459Smav		if (lp->state == FC_PORTDB_STATE_NIL)
2484285459Smav			continue;
2485285459Smav		if (lp->handle == handle) {
2486285459Smav			*lptr = lp;
2487285459Smav			return (1);
2488285459Smav		}
2489196008Smjacob	}
2490196008Smjacob	return (0);
2491196008Smjacob}
2492196008Smjacob
2493196008Smjacobint
2494196008Smjacobisp_find_pdb_by_sid(ispsoftc_t *isp, int chan, uint32_t sid, fcportdb_t **lptr)
2495196008Smjacob{
2496196008Smjacob	fcparam *fcp;
2497196008Smjacob	int i;
2498196008Smjacob
2499284681Smav	if (chan >= isp->isp_nchan)
2500196008Smjacob		return (0);
2501196008Smjacob	fcp = FCPARAM(isp, chan);
2502285459Smav	for (i = 0; i < MAX_FC_TARG; i++) {
2503196008Smjacob		fcportdb_t *lp = &fcp->portdb[i];
2504196008Smjacob
2505285459Smav		if (lp->state == FC_PORTDB_STATE_NIL)
2506196008Smjacob			continue;
2507196008Smjacob		if (lp->portid == sid) {
2508196008Smjacob			*lptr = lp;
2509196008Smjacob			return (1);
2510196008Smjacob		}
2511196008Smjacob	}
2512196008Smjacob	return (0);
2513196008Smjacob}
2514196008Smjacob
2515155228Smjacobvoid
2516196008Smjacobisp_find_chan_by_did(ispsoftc_t *isp, uint32_t did, uint16_t *cp)
2517196008Smjacob{
2518196008Smjacob	uint16_t chan;
2519196008Smjacob
2520196008Smjacob	*cp = ISP_NOCHAN;
2521196008Smjacob	for (chan = 0; chan < isp->isp_nchan; chan++) {
2522196008Smjacob		fcparam *fcp = FCPARAM(isp, chan);
2523290993Smav		if ((fcp->role & ISP_ROLE_TARGET) == 0 ||
2524290993Smav		    fcp->isp_loopstate < LOOP_LTEST_DONE) {
2525196008Smjacob			continue;
2526196008Smjacob		}
2527196008Smjacob		if (fcp->isp_portid == did) {
2528196008Smjacob			*cp = chan;
2529196008Smjacob			break;
2530196008Smjacob		}
2531196008Smjacob	}
2532196008Smjacob}
2533196008Smjacob
2534196008Smjacob/*
2535196008Smjacob * Add an initiator device to the port database
2536196008Smjacob */
2537196008Smjacobvoid
2538289838Smavisp_add_wwn_entry(ispsoftc_t *isp, int chan, uint64_t wwpn, uint64_t wwnn,
2539289838Smav    uint16_t nphdl, uint32_t s_id, uint16_t prli_params)
2540196008Smjacob{
2541238869Smjacob	char buf[64];
2542196008Smjacob	fcparam *fcp;
2543196008Smjacob	fcportdb_t *lp;
2544285459Smav	int i, change;
2545196008Smjacob
2546196008Smjacob	fcp = FCPARAM(isp, chan);
2547196008Smjacob	if (nphdl >= MAX_NPORT_HANDLE) {
2548285459Smav		isp_prt(isp, ISP_LOGTINFO|ISP_LOGWARN, "Chan %d WWPN 0x%016llx "
2549285459Smav		    "PortID 0x%06x handle 0x%x -- bad handle",
2550289838Smav		    chan, (unsigned long long) wwpn, s_id, nphdl);
2551196008Smjacob		return;
2552196008Smjacob	}
2553196008Smjacob
2554284681Smav	/*
2555284681Smav	 * If valid record for requested handle already exists, update it
2556284681Smav	 * with new parameters.  Some cases of update can be suspicious,
2557284681Smav	 * so log them verbosely and dump the whole port database.
2558284681Smav	 */
2559289838Smav	if ((VALID_INI(wwpn) && isp_find_pdb_by_wwn(isp, chan, wwpn, &lp)) ||
2560285459Smav	    (s_id != PORT_NONE && isp_find_pdb_by_sid(isp, chan, s_id, &lp))) {
2561285459Smav		change = 0;
2562285459Smav		lp->new_portid = lp->portid;
2563285459Smav		lp->new_prli_word3 = lp->prli_word3;
2564284681Smav		if (s_id != PORT_NONE && lp->portid != s_id) {
2565196008Smjacob			if (lp->portid == PORT_NONE) {
2566284681Smav				isp_prt(isp, ISP_LOGTINFO,
2567285459Smav				    "Chan %d WWPN 0x%016llx handle 0x%x "
2568285459Smav				    "gets PortID 0x%06x",
2569284681Smav				    chan, (unsigned long long) lp->port_wwn,
2570284681Smav				    nphdl, s_id);
2571284681Smav			} else {
2572284681Smav				isp_prt(isp, ISP_LOGTINFO|ISP_LOGWARN,
2573285459Smav				    "Chan %d WWPN 0x%016llx handle 0x%x "
2574285459Smav				    "changes PortID 0x%06x to 0x%06x",
2575284681Smav				    chan, (unsigned long long) lp->port_wwn,
2576284681Smav				    nphdl, lp->portid, s_id);
2577284681Smav				if (isp->isp_dblev & (ISP_LOGTINFO|ISP_LOGWARN))
2578284681Smav					isp_dump_portdb(isp, chan);
2579196008Smjacob			}
2580285459Smav			lp->new_portid = s_id;
2581285459Smav			change++;
2582196008Smjacob		}
2583289838Smav		if (VALID_INI(wwpn) && lp->port_wwn != wwpn) {
2584196008Smjacob			if (!VALID_INI(lp->port_wwn)) {
2585284681Smav				isp_prt(isp, ISP_LOGTINFO,
2586285459Smav				    "Chan %d PortID 0x%06x handle 0x%x "
2587289838Smav				    "gets WWPN 0x%016llxx",
2588285459Smav				    chan, lp->portid, nphdl,
2589289838Smav				    (unsigned long long) wwpn);
2590289838Smav			} else if (lp->port_wwn != wwpn) {
2591284681Smav				isp_prt(isp, ISP_LOGTINFO|ISP_LOGWARN,
2592285459Smav				    "Chan %d PortID 0x%06x handle 0x%x "
2593289838Smav				    "changes WWPN 0x%016llx to 0x%016llx",
2594285459Smav				    chan, lp->portid, nphdl,
2595284681Smav				    (unsigned long long) lp->port_wwn,
2596289838Smav				    (unsigned long long) wwpn);
2597284681Smav				if (isp->isp_dblev & (ISP_LOGTINFO|ISP_LOGWARN))
2598284681Smav					isp_dump_portdb(isp, chan);
2599196008Smjacob			}
2600289838Smav			lp->port_wwn = wwpn;
2601285459Smav			change++;
2602196008Smjacob		}
2603289838Smav		if (VALID_INI(wwnn) && lp->node_wwn != wwnn) {
2604289838Smav			if (!VALID_INI(lp->node_wwn)) {
2605289838Smav				isp_prt(isp, ISP_LOGTINFO,
2606289838Smav				    "Chan %d PortID 0x%06x handle 0x%x "
2607289838Smav				    "gets WWNN 0x%016llxx",
2608289838Smav				    chan, lp->portid, nphdl,
2609289838Smav				    (unsigned long long) wwnn);
2610289838Smav			} else if (lp->port_wwn != wwnn) {
2611289838Smav				isp_prt(isp, ISP_LOGTINFO,
2612289838Smav				    "Chan %d PortID 0x%06x handle 0x%x "
2613289838Smav				    "changes WWNN 0x%016llx to 0x%016llx",
2614289838Smav				    chan, lp->portid, nphdl,
2615289838Smav				    (unsigned long long) lp->node_wwn,
2616289838Smav				    (unsigned long long) wwnn);
2617289838Smav			}
2618289838Smav			lp->node_wwn = wwnn;
2619289838Smav			change++;
2620289838Smav		}
2621285459Smav		if (prli_params != 0 && lp->prli_word3 != prli_params) {
2622285459Smav			isp_gen_role_str(buf, sizeof (buf), prli_params);
2623284681Smav			isp_prt(isp, ISP_LOGTINFO|ISP_LOGCONFIG,
2624285459Smav			    "Chan %d WWPN 0x%016llx PortID 0x%06x "
2625285459Smav			    "handle 0x%x changes PRLI Word 3 %s",
2626284681Smav			    chan, (unsigned long long) lp->port_wwn,
2627285459Smav			    lp->portid, lp->handle, buf);
2628285459Smav			lp->new_prli_word3 = prli_params;
2629285459Smav			change++;
2630238869Smjacob		}
2631285459Smav		if (lp->handle != nphdl) {
2632285459Smav			isp_prt(isp, ISP_LOGTINFO|ISP_LOGCONFIG,
2633285459Smav			    "Chan %d WWPN 0x%016llx PortID 0x%06x "
2634285459Smav			    "changes handle 0x%x to 0x%x",
2635284681Smav			    chan, (unsigned long long) lp->port_wwn,
2636285459Smav			    lp->portid, lp->handle, nphdl);
2637285459Smav			lp->handle = nphdl;
2638285459Smav			change++;
2639196008Smjacob		}
2640285459Smav		lp->state = FC_PORTDB_STATE_VALID;
2641285459Smav		if (change) {
2642285459Smav			isp_async(isp, ISPASYNC_DEV_CHANGED, chan, lp);
2643285459Smav			lp->portid = lp->new_portid;
2644285459Smav			lp->prli_word3 = lp->new_prli_word3;
2645285459Smav			lp->new_prli_word3 = 0;
2646285459Smav			lp->new_portid = 0;
2647285459Smav		} else {
2648285459Smav			isp_prt(isp, ISP_LOGTINFO,
2649285459Smav			    "Chan %d WWPN 0x%016llx PortID 0x%06x "
2650285459Smav			    "handle 0x%x reentered",
2651284681Smav			    chan, (unsigned long long) lp->port_wwn,
2652285459Smav			    lp->portid, lp->handle);
2653285459Smav			isp_async(isp, ISPASYNC_DEV_STAYED, chan, lp);
2654196008Smjacob		}
2655285459Smav		return;
2656284681Smav	}
2657284681Smav
2658284681Smav	/* Search for room to insert new record. */
2659285459Smav	for (i = 0; i < MAX_FC_TARG; i++) {
2660285459Smav		if (fcp->portdb[i].state == FC_PORTDB_STATE_NIL)
2661285459Smav			break;
2662196008Smjacob	}
2663285459Smav	if (i >= MAX_FC_TARG) {
2664284681Smav		isp_prt(isp, ISP_LOGTINFO|ISP_LOGWARN,
2665285459Smav		    "Chan %d WWPN 0x%016llx PortID 0x%06x handle 0x%x "
2666284681Smav		    "-- no room in port database",
2667289838Smav		    chan, (unsigned long long) wwpn, s_id, nphdl);
2668284681Smav		if (isp->isp_dblev & (ISP_LOGTINFO|ISP_LOGWARN))
2669284681Smav			isp_dump_portdb(isp, chan);
2670196008Smjacob		return;
2671196008Smjacob	}
2672196008Smjacob
2673284681Smav	/* Insert new record and mark it valid. */
2674285459Smav	lp = &fcp->portdb[i];
2675196008Smjacob	ISP_MEMZERO(lp, sizeof (fcportdb_t));
2676196008Smjacob	lp->handle = nphdl;
2677196008Smjacob	lp->portid = s_id;
2678289838Smav	lp->port_wwn = wwpn;
2679289838Smav	lp->node_wwn = wwnn;
2680285459Smav	lp->prli_word3 = (prli_params != 0) ? prli_params : PRLI_WD3_INITIATOR_FUNCTION;
2681284681Smav	lp->state = FC_PORTDB_STATE_VALID;
2682284681Smav
2683238869Smjacob	isp_gen_role_str(buf, sizeof (buf), lp->prli_word3);
2684285459Smav	isp_prt(isp, ISP_LOGTINFO, "Chan %d WWPN 0x%016llx "
2685285459Smav	    "PortID 0x%06x handle 0x%x vtgt %d %s added", chan,
2686289838Smav	    (unsigned long long) wwpn, s_id, nphdl, i, buf);
2687196008Smjacob
2688285459Smav	/* Notify above levels about new port arrival. */
2689285459Smav	isp_async(isp, ISPASYNC_DEV_ARRIVED, chan, lp);
2690196008Smjacob}
2691196008Smjacob
2692196008Smjacob/*
2693196008Smjacob * Remove a target device to the port database
2694196008Smjacob */
2695196008Smjacobvoid
2696289838Smavisp_del_wwn_entry(ispsoftc_t *isp, int chan, uint64_t wwpn, uint16_t nphdl, uint32_t s_id)
2697196008Smjacob{
2698196008Smjacob	fcparam *fcp;
2699196008Smjacob	fcportdb_t *lp;
2700196008Smjacob
2701196008Smjacob	if (nphdl >= MAX_NPORT_HANDLE) {
2702285459Smav		isp_prt(isp, ISP_LOGWARN, "Chan %d WWPN 0x%016llx PortID 0x%06x bad handle 0x%x",
2703289838Smav		    chan, (unsigned long long) wwpn, s_id, nphdl);
2704196008Smjacob		return;
2705196008Smjacob	}
2706196008Smjacob
2707196008Smjacob	fcp = FCPARAM(isp, chan);
2708285459Smav	if (isp_find_pdb_by_handle(isp, chan, nphdl, &lp) == 0) {
2709285459Smav		isp_prt(isp, ISP_LOGWARN, "Chan %d WWPN 0x%016llx PortID 0x%06x handle 0x%x cannot be found to be deleted",
2710289838Smav		    chan, (unsigned long long) wwpn, s_id, nphdl);
2711196008Smjacob		isp_dump_portdb(isp, chan);
2712196008Smjacob		return;
2713196008Smjacob	}
2714285459Smav	isp_prt(isp, ISP_LOGTINFO, "Chan %d WWPN 0x%016llx PortID 0x%06x handle 0x%x vtgt %d deleted",
2715285459Smav	    chan, (unsigned long long) lp->port_wwn, lp->portid, nphdl, FC_PORTDB_TGT(isp, chan, lp));
2716285459Smav	lp->state = FC_PORTDB_STATE_NIL;
2717196008Smjacob
2718285459Smav	/* Notify above levels about gone port. */
2719285459Smav	isp_async(isp, ISPASYNC_DEV_GONE, chan, lp);
2720196008Smjacob}
2721196008Smjacob
2722196008Smjacobvoid
2723196008Smjacobisp_del_all_wwn_entries(ispsoftc_t *isp, int chan)
2724196008Smjacob{
2725196008Smjacob	fcparam *fcp;
2726196008Smjacob	int i;
2727196008Smjacob
2728196008Smjacob	if (!IS_FC(isp)) {
2729196008Smjacob		return;
2730196008Smjacob	}
2731196008Smjacob
2732196008Smjacob	/*
2733196008Smjacob	 * Handle iterations over all channels via recursion
2734196008Smjacob	 */
2735196008Smjacob	if (chan == ISP_NOCHAN) {
2736196008Smjacob		for (chan = 0; chan < isp->isp_nchan; chan++) {
2737196008Smjacob			isp_del_all_wwn_entries(isp, chan);
2738196008Smjacob		}
2739196008Smjacob		return;
2740196008Smjacob	}
2741196008Smjacob
2742196008Smjacob	if (chan > isp->isp_nchan) {
2743196008Smjacob		return;
2744196008Smjacob	}
2745196008Smjacob
2746196008Smjacob	fcp = FCPARAM(isp, chan);
2747196008Smjacob	if (fcp == NULL) {
2748196008Smjacob		return;
2749196008Smjacob	}
2750285459Smav	for (i = 0; i < MAX_FC_TARG; i++) {
2751285459Smav		fcportdb_t *lp = &fcp->portdb[i];
2752285459Smav
2753285459Smav		if (lp->state != FC_PORTDB_STATE_NIL)
2754196008Smjacob			isp_del_wwn_entry(isp, chan, lp->port_wwn, lp->handle, lp->portid);
2755196008Smjacob	}
2756196008Smjacob}
2757196008Smjacob
2758196008Smjacobvoid
2759196008Smjacobisp_del_wwn_entries(ispsoftc_t *isp, isp_notify_t *mp)
2760196008Smjacob{
2761196008Smjacob	fcportdb_t *lp;
2762196008Smjacob
2763196008Smjacob	/*
2764196008Smjacob	 * Handle iterations over all channels via recursion
2765196008Smjacob	 */
2766196008Smjacob	if (mp->nt_channel == ISP_NOCHAN) {
2767196008Smjacob		for (mp->nt_channel = 0; mp->nt_channel < isp->isp_nchan; mp->nt_channel++) {
2768196008Smjacob			isp_del_wwn_entries(isp, mp);
2769196008Smjacob		}
2770196008Smjacob		mp->nt_channel = ISP_NOCHAN;
2771196008Smjacob		return;
2772196008Smjacob	}
2773196008Smjacob
2774196008Smjacob	/*
2775196008Smjacob	 * We have an entry which is only partially identified.
2776196008Smjacob	 *
2777196008Smjacob	 * It's only known by WWN, N-Port handle, or Port ID.
2778196008Smjacob	 * We need to find the actual entry so we can delete it.
2779196008Smjacob	 */
2780196008Smjacob	if (mp->nt_nphdl != NIL_HANDLE) {
2781285459Smav		if (isp_find_pdb_by_handle(isp, mp->nt_channel, mp->nt_nphdl, &lp)) {
2782196008Smjacob			isp_del_wwn_entry(isp, mp->nt_channel, lp->port_wwn, lp->handle, lp->portid);
2783196008Smjacob			return;
2784196008Smjacob		}
2785196008Smjacob	}
2786196008Smjacob	if (mp->nt_wwn != INI_ANY) {
2787196008Smjacob		if (isp_find_pdb_by_wwn(isp, mp->nt_channel, mp->nt_wwn, &lp)) {
2788196008Smjacob			isp_del_wwn_entry(isp, mp->nt_channel, lp->port_wwn, lp->handle, lp->portid);
2789196008Smjacob			return;
2790196008Smjacob		}
2791196008Smjacob	}
2792196008Smjacob	if (mp->nt_sid != PORT_ANY && mp->nt_sid != PORT_NONE) {
2793196008Smjacob		if (isp_find_pdb_by_sid(isp, mp->nt_channel, mp->nt_sid, &lp)) {
2794196008Smjacob			isp_del_wwn_entry(isp, mp->nt_channel, lp->port_wwn, lp->handle, lp->portid);
2795196008Smjacob			return;
2796196008Smjacob		}
2797196008Smjacob	}
2798285459Smav	isp_prt(isp, ISP_LOGWARN, "Chan %d unable to find entry to delete WWPN 0x%016jx PortID 0x%06x handle 0x%x",
2799285459Smav	    mp->nt_channel, mp->nt_wwn, mp->nt_sid, mp->nt_nphdl);
2800196008Smjacob}
2801196008Smjacob
2802196008Smjacobvoid
2803163899Smjacobisp_put_atio(ispsoftc_t *isp, at_entry_t *src, at_entry_t *dst)
2804155228Smjacob{
2805155228Smjacob	int i;
2806163899Smjacob	isp_put_hdr(isp, &src->at_header, &dst->at_header);
2807163899Smjacob	ISP_IOXPUT_16(isp, src->at_reserved, &dst->at_reserved);
2808163899Smjacob	ISP_IOXPUT_16(isp, src->at_handle, &dst->at_handle);
2809155228Smjacob	if (ISP_IS_SBUS(isp)) {
2810163899Smjacob		ISP_IOXPUT_8(isp, src->at_lun, &dst->at_iid);
2811163899Smjacob		ISP_IOXPUT_8(isp, src->at_iid, &dst->at_lun);
2812163899Smjacob		ISP_IOXPUT_8(isp, src->at_cdblen, &dst->at_tgt);
2813163899Smjacob		ISP_IOXPUT_8(isp, src->at_tgt, &dst->at_cdblen);
2814163899Smjacob		ISP_IOXPUT_8(isp, src->at_status, &dst->at_scsi_status);
2815163899Smjacob		ISP_IOXPUT_8(isp, src->at_scsi_status, &dst->at_status);
2816163899Smjacob		ISP_IOXPUT_8(isp, src->at_tag_val, &dst->at_tag_type);
2817163899Smjacob		ISP_IOXPUT_8(isp, src->at_tag_type, &dst->at_tag_val);
2818155228Smjacob	} else {
2819163899Smjacob		ISP_IOXPUT_8(isp, src->at_lun, &dst->at_lun);
2820163899Smjacob		ISP_IOXPUT_8(isp, src->at_iid, &dst->at_iid);
2821163899Smjacob		ISP_IOXPUT_8(isp, src->at_cdblen, &dst->at_cdblen);
2822163899Smjacob		ISP_IOXPUT_8(isp, src->at_tgt, &dst->at_tgt);
2823163899Smjacob		ISP_IOXPUT_8(isp, src->at_status, &dst->at_status);
2824196008Smjacob		ISP_IOXPUT_8(isp, src->at_scsi_status, &dst->at_scsi_status);
2825163899Smjacob		ISP_IOXPUT_8(isp, src->at_tag_val, &dst->at_tag_val);
2826163899Smjacob		ISP_IOXPUT_8(isp, src->at_tag_type, &dst->at_tag_type);
2827155228Smjacob	}
2828163899Smjacob	ISP_IOXPUT_32(isp, src->at_flags, &dst->at_flags);
2829155228Smjacob	for (i = 0; i < ATIO_CDBLEN; i++) {
2830163899Smjacob		ISP_IOXPUT_8(isp, src->at_cdb[i], &dst->at_cdb[i]);
2831155228Smjacob	}
2832155228Smjacob	for (i = 0; i < QLTM_SENSELEN; i++) {
2833163899Smjacob		ISP_IOXPUT_8(isp, src->at_sense[i], &dst->at_sense[i]);
2834155228Smjacob	}
2835155228Smjacob}
2836155228Smjacob
2837155228Smjacobvoid
2838163899Smjacobisp_get_atio(ispsoftc_t *isp, at_entry_t *src, at_entry_t *dst)
2839155228Smjacob{
2840155228Smjacob	int i;
2841163899Smjacob	isp_get_hdr(isp, &src->at_header, &dst->at_header);
2842163899Smjacob	ISP_IOXGET_16(isp, &src->at_reserved, dst->at_reserved);
2843163899Smjacob	ISP_IOXGET_16(isp, &src->at_handle, dst->at_handle);
2844155228Smjacob	if (ISP_IS_SBUS(isp)) {
2845163899Smjacob		ISP_IOXGET_8(isp, &src->at_lun, dst->at_iid);
2846163899Smjacob		ISP_IOXGET_8(isp, &src->at_iid, dst->at_lun);
2847163899Smjacob		ISP_IOXGET_8(isp, &src->at_cdblen, dst->at_tgt);
2848163899Smjacob		ISP_IOXGET_8(isp, &src->at_tgt, dst->at_cdblen);
2849163899Smjacob		ISP_IOXGET_8(isp, &src->at_status, dst->at_scsi_status);
2850163899Smjacob		ISP_IOXGET_8(isp, &src->at_scsi_status, dst->at_status);
2851163899Smjacob		ISP_IOXGET_8(isp, &src->at_tag_val, dst->at_tag_type);
2852163899Smjacob		ISP_IOXGET_8(isp, &src->at_tag_type, dst->at_tag_val);
2853155228Smjacob	} else {
2854163899Smjacob		ISP_IOXGET_8(isp, &src->at_lun, dst->at_lun);
2855163899Smjacob		ISP_IOXGET_8(isp, &src->at_iid, dst->at_iid);
2856163899Smjacob		ISP_IOXGET_8(isp, &src->at_cdblen, dst->at_cdblen);
2857163899Smjacob		ISP_IOXGET_8(isp, &src->at_tgt, dst->at_tgt);
2858163899Smjacob		ISP_IOXGET_8(isp, &src->at_status, dst->at_status);
2859196008Smjacob		ISP_IOXGET_8(isp, &src->at_scsi_status, dst->at_scsi_status);
2860163899Smjacob		ISP_IOXGET_8(isp, &src->at_tag_val, dst->at_tag_val);
2861163899Smjacob		ISP_IOXGET_8(isp, &src->at_tag_type, dst->at_tag_type);
2862155228Smjacob	}
2863163899Smjacob	ISP_IOXGET_32(isp, &src->at_flags, dst->at_flags);
2864155228Smjacob	for (i = 0; i < ATIO_CDBLEN; i++) {
2865163899Smjacob		ISP_IOXGET_8(isp, &src->at_cdb[i], dst->at_cdb[i]);
2866155228Smjacob	}
2867155228Smjacob	for (i = 0; i < QLTM_SENSELEN; i++) {
2868163899Smjacob		ISP_IOXGET_8(isp, &src->at_sense[i], dst->at_sense[i]);
2869155228Smjacob	}
2870155228Smjacob}
2871155228Smjacob
2872155228Smjacobvoid
2873163899Smjacobisp_put_atio2(ispsoftc_t *isp, at2_entry_t *src, at2_entry_t *dst)
2874155228Smjacob{
2875155228Smjacob	int i;
2876163899Smjacob	isp_put_hdr(isp, &src->at_header, &dst->at_header);
2877163899Smjacob	ISP_IOXPUT_32(isp, src->at_reserved, &dst->at_reserved);
2878163899Smjacob	ISP_IOXPUT_8(isp, src->at_lun, &dst->at_lun);
2879163899Smjacob	ISP_IOXPUT_8(isp, src->at_iid, &dst->at_iid);
2880163899Smjacob	ISP_IOXPUT_16(isp, src->at_rxid, &dst->at_rxid);
2881163899Smjacob	ISP_IOXPUT_16(isp, src->at_flags, &dst->at_flags);
2882163899Smjacob	ISP_IOXPUT_16(isp, src->at_status, &dst->at_status);
2883163899Smjacob	ISP_IOXPUT_8(isp, src->at_crn, &dst->at_crn);
2884163899Smjacob	ISP_IOXPUT_8(isp, src->at_taskcodes, &dst->at_taskcodes);
2885163899Smjacob	ISP_IOXPUT_8(isp, src->at_taskflags, &dst->at_taskflags);
2886163899Smjacob	ISP_IOXPUT_8(isp, src->at_execodes, &dst->at_execodes);
2887155228Smjacob	for (i = 0; i < ATIO2_CDBLEN; i++) {
2888163899Smjacob		ISP_IOXPUT_8(isp, src->at_cdb[i], &dst->at_cdb[i]);
2889155228Smjacob	}
2890163899Smjacob	ISP_IOXPUT_32(isp, src->at_datalen, &dst->at_datalen);
2891163899Smjacob	ISP_IOXPUT_16(isp, src->at_scclun, &dst->at_scclun);
2892155228Smjacob	for (i = 0; i < 4; i++) {
2893163899Smjacob		ISP_IOXPUT_16(isp, src->at_wwpn[i], &dst->at_wwpn[i]);
2894155228Smjacob	}
2895155228Smjacob	for (i = 0; i < 6; i++) {
2896196008Smjacob		ISP_IOXPUT_16(isp, src->at_reserved2[i], &dst->at_reserved2[i]);
2897155228Smjacob	}
2898163899Smjacob	ISP_IOXPUT_16(isp, src->at_oxid, &dst->at_oxid);
2899155228Smjacob}
2900155228Smjacob
2901155228Smjacobvoid
2902163899Smjacobisp_put_atio2e(ispsoftc_t *isp, at2e_entry_t *src, at2e_entry_t *dst)
2903155228Smjacob{
2904155228Smjacob	int i;
2905163899Smjacob	isp_put_hdr(isp, &src->at_header, &dst->at_header);
2906163899Smjacob	ISP_IOXPUT_32(isp, src->at_reserved, &dst->at_reserved);
2907163899Smjacob	ISP_IOXPUT_16(isp, src->at_iid, &dst->at_iid);
2908163899Smjacob	ISP_IOXPUT_16(isp, src->at_rxid, &dst->at_rxid);
2909163899Smjacob	ISP_IOXPUT_16(isp, src->at_flags, &dst->at_flags);
2910163899Smjacob	ISP_IOXPUT_16(isp, src->at_status, &dst->at_status);
2911163899Smjacob	ISP_IOXPUT_8(isp, src->at_crn, &dst->at_crn);
2912163899Smjacob	ISP_IOXPUT_8(isp, src->at_taskcodes, &dst->at_taskcodes);
2913163899Smjacob	ISP_IOXPUT_8(isp, src->at_taskflags, &dst->at_taskflags);
2914163899Smjacob	ISP_IOXPUT_8(isp, src->at_execodes, &dst->at_execodes);
2915155228Smjacob	for (i = 0; i < ATIO2_CDBLEN; i++) {
2916163899Smjacob		ISP_IOXPUT_8(isp, src->at_cdb[i], &dst->at_cdb[i]);
2917155228Smjacob	}
2918163899Smjacob	ISP_IOXPUT_32(isp, src->at_datalen, &dst->at_datalen);
2919163899Smjacob	ISP_IOXPUT_16(isp, src->at_scclun, &dst->at_scclun);
2920155228Smjacob	for (i = 0; i < 4; i++) {
2921163899Smjacob		ISP_IOXPUT_16(isp, src->at_wwpn[i], &dst->at_wwpn[i]);
2922155228Smjacob	}
2923155228Smjacob	for (i = 0; i < 6; i++) {
2924196008Smjacob		ISP_IOXPUT_16(isp, src->at_reserved2[i], &dst->at_reserved2[i]);
2925155228Smjacob	}
2926163899Smjacob	ISP_IOXPUT_16(isp, src->at_oxid, &dst->at_oxid);
2927155228Smjacob}
2928155228Smjacob
2929155228Smjacobvoid
2930163899Smjacobisp_get_atio2(ispsoftc_t *isp, at2_entry_t *src, at2_entry_t *dst)
2931155228Smjacob{
2932155228Smjacob	int i;
2933163899Smjacob	isp_get_hdr(isp, &src->at_header, &dst->at_header);
2934163899Smjacob	ISP_IOXGET_32(isp, &src->at_reserved, dst->at_reserved);
2935163899Smjacob	ISP_IOXGET_8(isp, &src->at_lun, dst->at_lun);
2936163899Smjacob	ISP_IOXGET_8(isp, &src->at_iid, dst->at_iid);
2937163899Smjacob	ISP_IOXGET_16(isp, &src->at_rxid, dst->at_rxid);
2938163899Smjacob	ISP_IOXGET_16(isp, &src->at_flags, dst->at_flags);
2939163899Smjacob	ISP_IOXGET_16(isp, &src->at_status, dst->at_status);
2940163899Smjacob	ISP_IOXGET_8(isp, &src->at_crn, dst->at_crn);
2941163899Smjacob	ISP_IOXGET_8(isp, &src->at_taskcodes, dst->at_taskcodes);
2942163899Smjacob	ISP_IOXGET_8(isp, &src->at_taskflags, dst->at_taskflags);
2943163899Smjacob	ISP_IOXGET_8(isp, &src->at_execodes, dst->at_execodes);
2944155228Smjacob	for (i = 0; i < ATIO2_CDBLEN; i++) {
2945163899Smjacob		ISP_IOXGET_8(isp, &src->at_cdb[i], dst->at_cdb[i]);
2946155228Smjacob	}
2947163899Smjacob	ISP_IOXGET_32(isp, &src->at_datalen, dst->at_datalen);
2948163899Smjacob	ISP_IOXGET_16(isp, &src->at_scclun, dst->at_scclun);
2949155228Smjacob	for (i = 0; i < 4; i++) {
2950163899Smjacob		ISP_IOXGET_16(isp, &src->at_wwpn[i], dst->at_wwpn[i]);
2951155228Smjacob	}
2952155228Smjacob	for (i = 0; i < 6; i++) {
2953196008Smjacob		ISP_IOXGET_16(isp, &src->at_reserved2[i], dst->at_reserved2[i]);
2954155228Smjacob	}
2955163899Smjacob	ISP_IOXGET_16(isp, &src->at_oxid, dst->at_oxid);
2956155228Smjacob}
2957155228Smjacob
2958155228Smjacobvoid
2959163899Smjacobisp_get_atio2e(ispsoftc_t *isp, at2e_entry_t *src, at2e_entry_t *dst)
2960155228Smjacob{
2961155228Smjacob	int i;
2962163899Smjacob	isp_get_hdr(isp, &src->at_header, &dst->at_header);
2963163899Smjacob	ISP_IOXGET_32(isp, &src->at_reserved, dst->at_reserved);
2964163899Smjacob	ISP_IOXGET_16(isp, &src->at_iid, dst->at_iid);
2965163899Smjacob	ISP_IOXGET_16(isp, &src->at_rxid, dst->at_rxid);
2966163899Smjacob	ISP_IOXGET_16(isp, &src->at_flags, dst->at_flags);
2967163899Smjacob	ISP_IOXGET_16(isp, &src->at_status, dst->at_status);
2968163899Smjacob	ISP_IOXGET_8(isp, &src->at_crn, dst->at_crn);
2969163899Smjacob	ISP_IOXGET_8(isp, &src->at_taskcodes, dst->at_taskcodes);
2970163899Smjacob	ISP_IOXGET_8(isp, &src->at_taskflags, dst->at_taskflags);
2971163899Smjacob	ISP_IOXGET_8(isp, &src->at_execodes, dst->at_execodes);
2972155228Smjacob	for (i = 0; i < ATIO2_CDBLEN; i++) {
2973163899Smjacob		ISP_IOXGET_8(isp, &src->at_cdb[i], dst->at_cdb[i]);
2974155228Smjacob	}
2975163899Smjacob	ISP_IOXGET_32(isp, &src->at_datalen, dst->at_datalen);
2976163899Smjacob	ISP_IOXGET_16(isp, &src->at_scclun, dst->at_scclun);
2977155228Smjacob	for (i = 0; i < 4; i++) {
2978163899Smjacob		ISP_IOXGET_16(isp, &src->at_wwpn[i], dst->at_wwpn[i]);
2979155228Smjacob	}
2980155228Smjacob	for (i = 0; i < 6; i++) {
2981196008Smjacob		ISP_IOXGET_16(isp, &src->at_reserved2[i], dst->at_reserved2[i]);
2982155228Smjacob	}
2983163899Smjacob	ISP_IOXGET_16(isp, &src->at_oxid, dst->at_oxid);
2984155228Smjacob}
2985155228Smjacob
2986155228Smjacobvoid
2987163899Smjacobisp_get_atio7(ispsoftc_t *isp, at7_entry_t *src, at7_entry_t *dst)
2988155228Smjacob{
2989163899Smjacob	ISP_IOXGET_8(isp, &src->at_type, dst->at_type);
2990163899Smjacob	ISP_IOXGET_8(isp, &src->at_count, dst->at_count);
2991163899Smjacob	ISP_IOXGET_16(isp, &src->at_ta_len, dst->at_ta_len);
2992163899Smjacob	ISP_IOXGET_32(isp, &src->at_rxid, dst->at_rxid);
2993163899Smjacob	isp_get_fc_hdr(isp, &src->at_hdr, &dst->at_hdr);
2994163899Smjacob	isp_get_fcp_cmnd_iu(isp, &src->at_cmnd, &dst->at_cmnd);
2995163899Smjacob}
2996163899Smjacob
2997163899Smjacobvoid
2998163899Smjacobisp_put_ctio(ispsoftc_t *isp, ct_entry_t *src, ct_entry_t *dst)
2999163899Smjacob{
3000155228Smjacob	int i;
3001163899Smjacob	isp_put_hdr(isp, &src->ct_header, &dst->ct_header);
3002163899Smjacob	ISP_IOXPUT_16(isp, src->ct_syshandle, &dst->ct_syshandle);
3003163899Smjacob	ISP_IOXPUT_16(isp, src->ct_fwhandle, &dst->ct_fwhandle);
3004155228Smjacob	if (ISP_IS_SBUS(isp)) {
3005163899Smjacob		ISP_IOXPUT_8(isp, src->ct_iid, &dst->ct_lun);
3006163899Smjacob		ISP_IOXPUT_8(isp, src->ct_lun, &dst->ct_iid);
3007163899Smjacob		ISP_IOXPUT_8(isp, src->ct_tgt, &dst->ct_reserved2);
3008163899Smjacob		ISP_IOXPUT_8(isp, src->ct_reserved2, &dst->ct_tgt);
3009163899Smjacob		ISP_IOXPUT_8(isp, src->ct_status, &dst->ct_scsi_status);
3010163899Smjacob		ISP_IOXPUT_8(isp, src->ct_scsi_status, &dst->ct_status);
3011163899Smjacob		ISP_IOXPUT_8(isp, src->ct_tag_type, &dst->ct_tag_val);
3012163899Smjacob		ISP_IOXPUT_8(isp, src->ct_tag_val, &dst->ct_tag_type);
3013155228Smjacob	} else {
3014163899Smjacob		ISP_IOXPUT_8(isp, src->ct_iid, &dst->ct_iid);
3015163899Smjacob		ISP_IOXPUT_8(isp, src->ct_lun, &dst->ct_lun);
3016163899Smjacob		ISP_IOXPUT_8(isp, src->ct_tgt, &dst->ct_tgt);
3017163899Smjacob		ISP_IOXPUT_8(isp, src->ct_reserved2, &dst->ct_reserved2);
3018163899Smjacob		ISP_IOXPUT_8(isp, src->ct_scsi_status,
3019163899Smjacob		    &dst->ct_scsi_status);
3020163899Smjacob		ISP_IOXPUT_8(isp, src->ct_status, &dst->ct_status);
3021163899Smjacob		ISP_IOXPUT_8(isp, src->ct_tag_type, &dst->ct_tag_type);
3022163899Smjacob		ISP_IOXPUT_8(isp, src->ct_tag_val, &dst->ct_tag_val);
3023155228Smjacob	}
3024163899Smjacob	ISP_IOXPUT_32(isp, src->ct_flags, &dst->ct_flags);
3025163899Smjacob	ISP_IOXPUT_32(isp, src->ct_xfrlen, &dst->ct_xfrlen);
3026163899Smjacob	ISP_IOXPUT_32(isp, src->ct_resid, &dst->ct_resid);
3027163899Smjacob	ISP_IOXPUT_16(isp, src->ct_timeout, &dst->ct_timeout);
3028163899Smjacob	ISP_IOXPUT_16(isp, src->ct_seg_count, &dst->ct_seg_count);
3029155228Smjacob	for (i = 0; i < ISP_RQDSEG; i++) {
3030196008Smjacob		ISP_IOXPUT_32(isp, src->ct_dataseg[i].ds_base, &dst->ct_dataseg[i].ds_base);
3031196008Smjacob		ISP_IOXPUT_32(isp, src->ct_dataseg[i].ds_count, &dst->ct_dataseg[i].ds_count);
3032155228Smjacob	}
3033155228Smjacob}
3034155228Smjacob
3035155228Smjacobvoid
3036163899Smjacobisp_get_ctio(ispsoftc_t *isp, ct_entry_t *src, ct_entry_t *dst)
3037155228Smjacob{
3038155228Smjacob	int i;
3039163899Smjacob	isp_get_hdr(isp, &src->ct_header, &dst->ct_header);
3040163899Smjacob	ISP_IOXGET_16(isp, &src->ct_syshandle, dst->ct_syshandle);
3041163899Smjacob	ISP_IOXGET_16(isp, &src->ct_fwhandle, dst->ct_fwhandle);
3042155228Smjacob	if (ISP_IS_SBUS(isp)) {
3043163899Smjacob		ISP_IOXGET_8(isp, &src->ct_lun, dst->ct_iid);
3044163899Smjacob		ISP_IOXGET_8(isp, &src->ct_iid, dst->ct_lun);
3045163899Smjacob		ISP_IOXGET_8(isp, &src->ct_reserved2, dst->ct_tgt);
3046163899Smjacob		ISP_IOXGET_8(isp, &src->ct_tgt, dst->ct_reserved2);
3047163899Smjacob		ISP_IOXGET_8(isp, &src->ct_status, dst->ct_scsi_status);
3048163899Smjacob		ISP_IOXGET_8(isp, &src->ct_scsi_status, dst->ct_status);
3049163899Smjacob		ISP_IOXGET_8(isp, &src->ct_tag_val, dst->ct_tag_type);
3050163899Smjacob		ISP_IOXGET_8(isp, &src->ct_tag_type, dst->ct_tag_val);
3051155228Smjacob	} else {
3052163899Smjacob		ISP_IOXGET_8(isp, &src->ct_lun, dst->ct_lun);
3053163899Smjacob		ISP_IOXGET_8(isp, &src->ct_iid, dst->ct_iid);
3054163899Smjacob		ISP_IOXGET_8(isp, &src->ct_reserved2, dst->ct_reserved2);
3055163899Smjacob		ISP_IOXGET_8(isp, &src->ct_tgt, dst->ct_tgt);
3056163899Smjacob		ISP_IOXGET_8(isp, &src->ct_status, dst->ct_status);
3057196008Smjacob		ISP_IOXGET_8(isp, &src->ct_scsi_status, dst->ct_scsi_status);
3058163899Smjacob		ISP_IOXGET_8(isp, &src->ct_tag_val, dst->ct_tag_val);
3059163899Smjacob		ISP_IOXGET_8(isp, &src->ct_tag_type, dst->ct_tag_type);
3060155228Smjacob	}
3061163899Smjacob	ISP_IOXGET_32(isp, &src->ct_flags, dst->ct_flags);
3062163899Smjacob	ISP_IOXGET_32(isp, &src->ct_xfrlen, dst->ct_xfrlen);
3063163899Smjacob	ISP_IOXGET_32(isp, &src->ct_resid, dst->ct_resid);
3064163899Smjacob	ISP_IOXGET_16(isp, &src->ct_timeout, dst->ct_timeout);
3065163899Smjacob	ISP_IOXGET_16(isp, &src->ct_seg_count, dst->ct_seg_count);
3066155228Smjacob	for (i = 0; i < ISP_RQDSEG; i++) {
3067196008Smjacob		ISP_IOXGET_32(isp, &src->ct_dataseg[i].ds_base, dst->ct_dataseg[i].ds_base);
3068196008Smjacob		ISP_IOXGET_32(isp, &src->ct_dataseg[i].ds_count, dst->ct_dataseg[i].ds_count);
3069155228Smjacob	}
3070155228Smjacob}
3071155228Smjacob
3072155228Smjacobvoid
3073163899Smjacobisp_put_ctio2(ispsoftc_t *isp, ct2_entry_t *src, ct2_entry_t *dst)
3074155228Smjacob{
3075155228Smjacob	int i;
3076163899Smjacob	isp_put_hdr(isp, &src->ct_header, &dst->ct_header);
3077163899Smjacob	ISP_IOXPUT_32(isp, src->ct_syshandle, &dst->ct_syshandle);
3078163899Smjacob	ISP_IOXPUT_8(isp, src->ct_lun, &dst->ct_lun);
3079163899Smjacob	ISP_IOXPUT_8(isp, src->ct_iid, &dst->ct_iid);
3080163899Smjacob	ISP_IOXPUT_16(isp, src->ct_rxid, &dst->ct_rxid);
3081163899Smjacob	ISP_IOXPUT_16(isp, src->ct_flags, &dst->ct_flags);
3082163899Smjacob	ISP_IOXPUT_16(isp, src->ct_timeout, &dst->ct_timeout);
3083163899Smjacob	ISP_IOXPUT_16(isp, src->ct_seg_count, &dst->ct_seg_count);
3084163899Smjacob	ISP_IOXPUT_32(isp, src->ct_resid, &dst->ct_resid);
3085163899Smjacob	ISP_IOXPUT_32(isp, src->ct_reloff, &dst->ct_reloff);
3086163899Smjacob	if ((src->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) {
3087196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0._reserved, &dst->rsp.m0._reserved);
3088196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m0._reserved2, &dst->rsp.m0._reserved2);
3089196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m0.ct_scsi_status, &dst->rsp.m0.ct_scsi_status);
3090196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ct_xfrlen, &dst->rsp.m0.ct_xfrlen);
3091163899Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
3092155228Smjacob			for (i = 0; i < ISP_RQDSEG_T2; i++) {
3093196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg[i].ds_base, &dst->rsp.m0.u.ct_dataseg[i].ds_base);
3094196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg[i].ds_count, &dst->rsp.m0.u.ct_dataseg[i].ds_count);
3095155228Smjacob			}
3096163899Smjacob		} else if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO3) {
3097155228Smjacob			for (i = 0; i < ISP_RQDSEG_T3; i++) {
3098196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_base, &dst->rsp.m0.u.ct_dataseg64[i].ds_base);
3099196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_basehi, &dst->rsp.m0.u.ct_dataseg64[i].ds_basehi);
3100196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_count, &dst->rsp.m0.u.ct_dataseg64[i].ds_count);
3101155228Smjacob			}
3102163899Smjacob		} else if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO4) {
3103196008Smjacob			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,
3104163899Smjacob			    &dst->rsp.m0.u.ct_dslist.ds_segment);
3105196008Smjacob			ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dslist.ds_base, &dst->rsp.m0.u.ct_dslist.ds_base);
3106155228Smjacob		}
3107163899Smjacob	} else if ((src->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) {
3108196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1._reserved, &dst->rsp.m1._reserved);
3109196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1._reserved2, &dst->rsp.m1._reserved2);
3110196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_senselen, &dst->rsp.m1.ct_senselen);
3111196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_scsi_status, &dst->rsp.m1.ct_scsi_status);
3112196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_resplen, &dst->rsp.m1.ct_resplen);
3113155228Smjacob		for (i = 0; i < MAXRESPLEN; i++) {
3114196008Smjacob			ISP_IOXPUT_8(isp, src->rsp.m1.ct_resp[i], &dst->rsp.m1.ct_resp[i]);
3115155228Smjacob		}
3116155228Smjacob	} else {
3117196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2._reserved, &dst->rsp.m2._reserved);
3118196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m2._reserved2, &dst->rsp.m2._reserved2);
3119196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m2._reserved3, &dst->rsp.m2._reserved3);
3120196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_datalen, &dst->rsp.m2.ct_datalen);
3121238869Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
3122238869Smjacob			ISP_IOXPUT_32(isp, src->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_base, &dst->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_base);
3123238869Smjacob			ISP_IOXPUT_32(isp, src->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_count, &dst->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_count);
3124238869Smjacob		} else {
3125238869Smjacob			ISP_IOXPUT_32(isp, src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_base, &dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_base);
3126238869Smjacob			ISP_IOXPUT_32(isp, src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_basehi, &dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_basehi);
3127238869Smjacob			ISP_IOXPUT_32(isp, src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_count, &dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_count);
3128238869Smjacob		}
3129155228Smjacob	}
3130155228Smjacob}
3131155228Smjacob
3132155228Smjacobvoid
3133163899Smjacobisp_put_ctio2e(ispsoftc_t *isp, ct2e_entry_t *src, ct2e_entry_t *dst)
3134155228Smjacob{
3135155228Smjacob	int i;
3136163899Smjacob	isp_put_hdr(isp, &src->ct_header, &dst->ct_header);
3137163899Smjacob	ISP_IOXPUT_32(isp, src->ct_syshandle, &dst->ct_syshandle);
3138163899Smjacob	ISP_IOXPUT_16(isp, src->ct_iid, &dst->ct_iid);
3139163899Smjacob	ISP_IOXPUT_16(isp, src->ct_rxid, &dst->ct_rxid);
3140163899Smjacob	ISP_IOXPUT_16(isp, src->ct_flags, &dst->ct_flags);
3141163899Smjacob	ISP_IOXPUT_16(isp, src->ct_timeout, &dst->ct_timeout);
3142163899Smjacob	ISP_IOXPUT_16(isp, src->ct_seg_count, &dst->ct_seg_count);
3143163899Smjacob	ISP_IOXPUT_32(isp, src->ct_resid, &dst->ct_resid);
3144163899Smjacob	ISP_IOXPUT_32(isp, src->ct_reloff, &dst->ct_reloff);
3145163899Smjacob	if ((src->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) {
3146196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0._reserved, &dst->rsp.m0._reserved);
3147196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m0._reserved2, &dst->rsp.m0._reserved2);
3148196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m0.ct_scsi_status, &dst->rsp.m0.ct_scsi_status);
3149196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ct_xfrlen, &dst->rsp.m0.ct_xfrlen);
3150163899Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
3151155228Smjacob			for (i = 0; i < ISP_RQDSEG_T2; i++) {
3152196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg[i].ds_base, &dst->rsp.m0.u.ct_dataseg[i].ds_base);
3153196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg[i].ds_count, &dst->rsp.m0.u.ct_dataseg[i].ds_count);
3154155228Smjacob			}
3155163899Smjacob		} else if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO3) {
3156155228Smjacob			for (i = 0; i < ISP_RQDSEG_T3; i++) {
3157196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_base, &dst->rsp.m0.u.ct_dataseg64[i].ds_base);
3158196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_basehi, &dst->rsp.m0.u.ct_dataseg64[i].ds_basehi);
3159196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_count, &dst->rsp.m0.u.ct_dataseg64[i].ds_count);
3160155228Smjacob			}
3161163899Smjacob		} else if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO4) {
3162196008Smjacob			ISP_IOXPUT_16(isp, src->rsp.m0.u.ct_dslist.ds_type, &dst->rsp.m0.u.ct_dslist.ds_type);
3163196008Smjacob			ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dslist.ds_segment, &dst->rsp.m0.u.ct_dslist.ds_segment);
3164196008Smjacob			ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dslist.ds_base, &dst->rsp.m0.u.ct_dslist.ds_base);
3165155228Smjacob		}
3166163899Smjacob	} else if ((src->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) {
3167196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1._reserved, &dst->rsp.m1._reserved);
3168196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1._reserved2, &dst->rsp.m1._reserved2);
3169196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_senselen, &dst->rsp.m1.ct_senselen);
3170196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_scsi_status, &dst->rsp.m1.ct_scsi_status);
3171196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_resplen, &dst->rsp.m1.ct_resplen);
3172155228Smjacob		for (i = 0; i < MAXRESPLEN; i++) {
3173196008Smjacob			ISP_IOXPUT_8(isp, src->rsp.m1.ct_resp[i], &dst->rsp.m1.ct_resp[i]);
3174155228Smjacob		}
3175155228Smjacob	} else {
3176196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2._reserved, &dst->rsp.m2._reserved);
3177196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m2._reserved2, &dst->rsp.m2._reserved2);
3178196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m2._reserved3, &dst->rsp.m2._reserved3);
3179196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_datalen, &dst->rsp.m2.ct_datalen);
3180238869Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
3181238869Smjacob			ISP_IOXPUT_32(isp, src->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_base, &dst->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_base);
3182238869Smjacob			ISP_IOXPUT_32(isp, src->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_count, &dst->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_count);
3183238869Smjacob		} else {
3184238869Smjacob			ISP_IOXPUT_32(isp, src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_base, &dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_base);
3185238869Smjacob			ISP_IOXPUT_32(isp, src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_basehi, &dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_basehi);
3186238869Smjacob			ISP_IOXPUT_32(isp, src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_count, &dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_count);
3187238869Smjacob		}
3188155228Smjacob	}
3189155228Smjacob}
3190155228Smjacob
3191155228Smjacobvoid
3192163899Smjacobisp_put_ctio7(ispsoftc_t *isp, ct7_entry_t *src, ct7_entry_t *dst)
3193155228Smjacob{
3194163899Smjacob	int i;
3195163899Smjacob
3196163899Smjacob	isp_put_hdr(isp, &src->ct_header, &dst->ct_header);
3197163899Smjacob	ISP_IOXPUT_32(isp, src->ct_syshandle, &dst->ct_syshandle);
3198163899Smjacob	ISP_IOXPUT_16(isp, src->ct_nphdl, &dst->ct_nphdl);
3199163899Smjacob	ISP_IOXPUT_16(isp, src->ct_timeout, &dst->ct_timeout);
3200163899Smjacob	ISP_IOXPUT_16(isp, src->ct_seg_count, &dst->ct_seg_count);
3201196008Smjacob	ISP_IOXPUT_8(isp, src->ct_vpidx, &dst->ct_vpidx);
3202163899Smjacob	ISP_IOXPUT_8(isp, src->ct_xflags, &dst->ct_xflags);
3203163899Smjacob	ISP_IOXPUT_16(isp, src->ct_iid_lo, &dst->ct_iid_lo);
3204163899Smjacob	ISP_IOXPUT_8(isp, src->ct_iid_hi, &dst->ct_iid_hi);
3205163899Smjacob	ISP_IOXPUT_8(isp, src->ct_reserved, &dst->ct_reserved);
3206163899Smjacob	ISP_IOXPUT_32(isp, src->ct_rxid, &dst->ct_rxid);
3207163899Smjacob	ISP_IOXPUT_16(isp, src->ct_senselen, &dst->ct_senselen);
3208163899Smjacob	ISP_IOXPUT_16(isp, src->ct_flags, &dst->ct_flags);
3209163899Smjacob	ISP_IOXPUT_32(isp, src->ct_resid, &dst->ct_resid);
3210163899Smjacob	ISP_IOXPUT_16(isp, src->ct_oxid, &dst->ct_oxid);
3211163899Smjacob	ISP_IOXPUT_16(isp, src->ct_scsi_status, &dst->ct_scsi_status);
3212163899Smjacob	if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE0) {
3213163899Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.reloff, &dst->rsp.m0.reloff);
3214196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.reserved0, &dst->rsp.m0.reserved0);
3215196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ct_xfrlen, &dst->rsp.m0.ct_xfrlen);
3216196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.reserved1, &dst->rsp.m0.reserved1);
3217196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_base, &dst->rsp.m0.ds.ds_base);
3218196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_basehi, &dst->rsp.m0.ds.ds_basehi);
3219196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_count, &dst->rsp.m0.ds.ds_count);
3220163899Smjacob	} else if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE1) {
3221196008Smjacob		uint32_t *a, *b;
3222196008Smjacob
3223196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_resplen, &dst->rsp.m1.ct_resplen);
3224163899Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.reserved, &dst->rsp.m1.reserved);
3225196008Smjacob		a = (uint32_t *) src->rsp.m1.ct_resp;
3226196008Smjacob		b = (uint32_t *) dst->rsp.m1.ct_resp;
3227196008Smjacob		for (i = 0; i < (ASIZE(src->rsp.m1.ct_resp) >> 2); i++) {
3228196008Smjacob			*b++ = ISP_SWAP32(isp, *a++);
3229163899Smjacob		}
3230163899Smjacob	} else {
3231196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.reserved0, &dst->rsp.m2.reserved0);
3232238869Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.reserved1, &dst->rsp.m2.reserved1);
3233196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_datalen, &dst->rsp.m2.ct_datalen);
3234238869Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.reserved2, &dst->rsp.m2.reserved2);
3235196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_base, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_base);
3236196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_basehi, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_basehi);
3237196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_count, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_count);
3238163899Smjacob	}
3239155228Smjacob}
3240155228Smjacob
3241163899Smjacob
3242155228Smjacobvoid
3243163899Smjacobisp_get_ctio2(ispsoftc_t *isp, ct2_entry_t *src, ct2_entry_t *dst)
3244155228Smjacob{
3245163899Smjacob	int i;
3246163899Smjacob
3247163899Smjacob	isp_get_hdr(isp, &src->ct_header, &dst->ct_header);
3248163899Smjacob	ISP_IOXGET_32(isp, &src->ct_syshandle, dst->ct_syshandle);
3249163899Smjacob	ISP_IOXGET_8(isp, &src->ct_lun, dst->ct_lun);
3250163899Smjacob	ISP_IOXGET_8(isp, &src->ct_iid, dst->ct_iid);
3251163899Smjacob	ISP_IOXGET_16(isp, &src->ct_rxid, dst->ct_rxid);
3252163899Smjacob	ISP_IOXGET_16(isp, &src->ct_flags, dst->ct_flags);
3253163899Smjacob	ISP_IOXGET_16(isp, &src->ct_status, dst->ct_status);
3254163899Smjacob	ISP_IOXGET_16(isp, &src->ct_timeout, dst->ct_timeout);
3255163899Smjacob	ISP_IOXGET_16(isp, &src->ct_seg_count, dst->ct_seg_count);
3256163899Smjacob	ISP_IOXGET_32(isp, &src->ct_reloff, dst->ct_reloff);
3257163899Smjacob	ISP_IOXGET_32(isp, &src->ct_resid, dst->ct_resid);
3258163899Smjacob	if ((dst->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) {
3259196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0._reserved, dst->rsp.m0._reserved);
3260196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m0._reserved2, dst->rsp.m0._reserved2);
3261196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m0.ct_scsi_status, dst->rsp.m0.ct_scsi_status);
3262196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ct_xfrlen, dst->rsp.m0.ct_xfrlen);
3263163899Smjacob		if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
3264163899Smjacob			for (i = 0; i < ISP_RQDSEG_T2; i++) {
3265196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg[i].ds_base, dst->rsp.m0.u.ct_dataseg[i].ds_base);
3266196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg[i].ds_count, dst->rsp.m0.u.ct_dataseg[i].ds_count);
3267163899Smjacob			}
3268163899Smjacob		} else if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO3) {
3269163899Smjacob			for (i = 0; i < ISP_RQDSEG_T3; i++) {
3270196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_base, dst->rsp.m0.u.ct_dataseg64[i].ds_base);
3271196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_basehi, dst->rsp.m0.u.ct_dataseg64[i].ds_basehi);
3272196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_count, dst->rsp.m0.u.ct_dataseg64[i].ds_count);
3273163899Smjacob			}
3274163899Smjacob		} else if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO4) {
3275196008Smjacob			ISP_IOXGET_16(isp, &src->rsp.m0.u.ct_dslist.ds_type, dst->rsp.m0.u.ct_dslist.ds_type);
3276196008Smjacob			ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dslist.ds_segment, dst->rsp.m0.u.ct_dslist.ds_segment);
3277196008Smjacob			ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dslist.ds_base, dst->rsp.m0.u.ct_dslist.ds_base);
3278163899Smjacob		}
3279163899Smjacob	} else if ((dst->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) {
3280196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1._reserved, dst->rsp.m1._reserved);
3281196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1._reserved2, dst->rsp.m1._reserved2);
3282196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_senselen, dst->rsp.m1.ct_senselen);
3283196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_scsi_status, dst->rsp.m1.ct_scsi_status);
3284196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_resplen, dst->rsp.m1.ct_resplen);
3285163899Smjacob		for (i = 0; i < MAXRESPLEN; i++) {
3286196008Smjacob			ISP_IOXGET_8(isp, &src->rsp.m1.ct_resp[i], dst->rsp.m1.ct_resp[i]);
3287163899Smjacob		}
3288163899Smjacob	} else {
3289196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2._reserved, dst->rsp.m2._reserved);
3290196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m2._reserved2, dst->rsp.m2._reserved2);
3291196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m2._reserved3, dst->rsp.m2._reserved3);
3292196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_datalen, dst->rsp.m2.ct_datalen);
3293238869Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
3294238869Smjacob			ISP_IOXGET_32(isp, &src->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_base, dst->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_base);
3295238869Smjacob			ISP_IOXGET_32(isp, &src->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_count, dst->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_count);
3296238869Smjacob		} else {
3297238869Smjacob			ISP_IOXGET_32(isp, &src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_base, dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_base);
3298238869Smjacob			ISP_IOXGET_32(isp, &src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_basehi, dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_basehi);
3299238869Smjacob			ISP_IOXGET_32(isp, &src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_count, dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_count);
3300238869Smjacob		}
3301163899Smjacob	}
3302155228Smjacob}
3303155228Smjacob
3304155228Smjacobvoid
3305163899Smjacobisp_get_ctio2e(ispsoftc_t *isp, ct2e_entry_t *src, ct2e_entry_t *dst)
3306163899Smjacob{
3307163899Smjacob	int i;
3308163899Smjacob
3309163899Smjacob	isp_get_hdr(isp, &src->ct_header, &dst->ct_header);
3310163899Smjacob	ISP_IOXGET_32(isp, &src->ct_syshandle, dst->ct_syshandle);
3311163899Smjacob	ISP_IOXGET_16(isp, &src->ct_iid, dst->ct_iid);
3312163899Smjacob	ISP_IOXGET_16(isp, &src->ct_rxid, dst->ct_rxid);
3313163899Smjacob	ISP_IOXGET_16(isp, &src->ct_flags, dst->ct_flags);
3314163899Smjacob	ISP_IOXGET_16(isp, &src->ct_status, dst->ct_status);
3315163899Smjacob	ISP_IOXGET_16(isp, &src->ct_timeout, dst->ct_timeout);
3316163899Smjacob	ISP_IOXGET_16(isp, &src->ct_seg_count, dst->ct_seg_count);
3317163899Smjacob	ISP_IOXGET_32(isp, &src->ct_reloff, dst->ct_reloff);
3318163899Smjacob	ISP_IOXGET_32(isp, &src->ct_resid, dst->ct_resid);
3319163899Smjacob	if ((dst->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) {
3320196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0._reserved, dst->rsp.m0._reserved);
3321196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m0._reserved2, dst->rsp.m0._reserved2);
3322196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m0.ct_scsi_status, dst->rsp.m0.ct_scsi_status);
3323196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ct_xfrlen, dst->rsp.m0.ct_xfrlen);
3324163899Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
3325163899Smjacob			for (i = 0; i < ISP_RQDSEG_T2; i++) {
3326196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg[i].ds_base, dst->rsp.m0.u.ct_dataseg[i].ds_base);
3327196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg[i].ds_count, dst->rsp.m0.u.ct_dataseg[i].ds_count);
3328163899Smjacob			}
3329163899Smjacob		} else if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO3) {
3330163899Smjacob			for (i = 0; i < ISP_RQDSEG_T3; i++) {
3331196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_base, dst->rsp.m0.u.ct_dataseg64[i].ds_base);
3332196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_basehi, dst->rsp.m0.u.ct_dataseg64[i].ds_basehi);
3333196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_count, dst->rsp.m0.u.ct_dataseg64[i].ds_count);
3334163899Smjacob			}
3335163899Smjacob		} else if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO4) {
3336196008Smjacob			ISP_IOXGET_16(isp, &src->rsp.m0.u.ct_dslist.ds_type, dst->rsp.m0.u.ct_dslist.ds_type);
3337196008Smjacob			ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dslist.ds_segment, dst->rsp.m0.u.ct_dslist.ds_segment);
3338196008Smjacob			ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dslist.ds_base, dst->rsp.m0.u.ct_dslist.ds_base);
3339163899Smjacob		}
3340163899Smjacob	} else if ((dst->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) {
3341196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1._reserved, dst->rsp.m1._reserved);
3342196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1._reserved2, dst->rsp.m1._reserved2);
3343196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_senselen, dst->rsp.m1.ct_senselen);
3344196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_scsi_status, dst->rsp.m1.ct_scsi_status);
3345196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_resplen, dst->rsp.m1.ct_resplen);
3346163899Smjacob		for (i = 0; i < MAXRESPLEN; i++) {
3347196008Smjacob			ISP_IOXGET_8(isp, &src->rsp.m1.ct_resp[i], dst->rsp.m1.ct_resp[i]);
3348163899Smjacob		}
3349163899Smjacob	} else {
3350196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2._reserved, dst->rsp.m2._reserved);
3351196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m2._reserved2, dst->rsp.m2._reserved2);
3352196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m2._reserved3, dst->rsp.m2._reserved3);
3353196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_datalen, dst->rsp.m2.ct_datalen);
3354238869Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
3355238869Smjacob			ISP_IOXGET_32(isp, &src->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_base, dst->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_base);
3356238869Smjacob			ISP_IOXGET_32(isp, &src->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_count, dst->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_count);
3357238869Smjacob		} else {
3358238869Smjacob			ISP_IOXGET_32(isp, &src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_base, dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_base);
3359238869Smjacob			ISP_IOXGET_32(isp, &src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_basehi, dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_basehi);
3360238869Smjacob			ISP_IOXGET_32(isp, &src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_count, dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_count);
3361238869Smjacob		}
3362163899Smjacob	}
3363163899Smjacob}
3364163899Smjacob
3365163899Smjacobvoid
3366163899Smjacobisp_get_ctio7(ispsoftc_t *isp, ct7_entry_t *src, ct7_entry_t *dst)
3367163899Smjacob{
3368163899Smjacob	int i;
3369163899Smjacob
3370163899Smjacob	isp_get_hdr(isp, &src->ct_header, &dst->ct_header);
3371163899Smjacob	ISP_IOXGET_32(isp, &src->ct_syshandle, dst->ct_syshandle);
3372163899Smjacob	ISP_IOXGET_16(isp, &src->ct_nphdl, dst->ct_nphdl);
3373163899Smjacob	ISP_IOXGET_16(isp, &src->ct_timeout, dst->ct_timeout);
3374163899Smjacob	ISP_IOXGET_16(isp, &src->ct_seg_count, dst->ct_seg_count);
3375196008Smjacob	ISP_IOXGET_8(isp, &src->ct_vpidx, dst->ct_vpidx);
3376163899Smjacob	ISP_IOXGET_8(isp, &src->ct_xflags, dst->ct_xflags);
3377163899Smjacob	ISP_IOXGET_16(isp, &src->ct_iid_lo, dst->ct_iid_lo);
3378163899Smjacob	ISP_IOXGET_8(isp, &src->ct_iid_hi, dst->ct_iid_hi);
3379163899Smjacob	ISP_IOXGET_8(isp, &src->ct_reserved, dst->ct_reserved);
3380163899Smjacob	ISP_IOXGET_32(isp, &src->ct_rxid, dst->ct_rxid);
3381163899Smjacob	ISP_IOXGET_16(isp, &src->ct_senselen, dst->ct_senselen);
3382163899Smjacob	ISP_IOXGET_16(isp, &src->ct_flags, dst->ct_flags);
3383163899Smjacob	ISP_IOXGET_32(isp, &src->ct_resid, dst->ct_resid);
3384163899Smjacob	ISP_IOXGET_16(isp, &src->ct_oxid, dst->ct_oxid);
3385163899Smjacob	ISP_IOXGET_16(isp, &src->ct_scsi_status, dst->ct_scsi_status);
3386163899Smjacob	if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE0) {
3387163899Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.reloff, dst->rsp.m0.reloff);
3388196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.reserved0, dst->rsp.m0.reserved0);
3389196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ct_xfrlen, dst->rsp.m0.ct_xfrlen);
3390196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.reserved1, dst->rsp.m0.reserved1);
3391196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_base, dst->rsp.m0.ds.ds_base);
3392196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_basehi, dst->rsp.m0.ds.ds_basehi);
3393196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_count, dst->rsp.m0.ds.ds_count);
3394163899Smjacob	} else if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE1) {
3395196008Smjacob		uint32_t *a, *b;
3396196008Smjacob
3397196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_resplen, dst->rsp.m1.ct_resplen);
3398163899Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.reserved, dst->rsp.m1.reserved);
3399196008Smjacob		a = (uint32_t *) src->rsp.m1.ct_resp;
3400196008Smjacob		b = (uint32_t *) dst->rsp.m1.ct_resp;
3401163899Smjacob		for (i = 0; i < MAXRESPLEN_24XX; i++) {
3402196008Smjacob			ISP_IOXGET_8(isp, &src->rsp.m1.ct_resp[i], dst->rsp.m1.ct_resp[i]);
3403163899Smjacob		}
3404196008Smjacob		for (i = 0; i < (ASIZE(src->rsp.m1.ct_resp) >> 2); i++) {
3405196008Smjacob			*b++ = ISP_SWAP32(isp, *a++);
3406196008Smjacob		}
3407163899Smjacob	} else {
3408196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.reserved0, dst->rsp.m2.reserved0);
3409196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_datalen, dst->rsp.m2.ct_datalen);
3410196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.reserved1, dst->rsp.m2.reserved1);
3411196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_base, dst->rsp.m2.ct_fcp_rsp_iudata.ds_base);
3412196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_basehi, dst->rsp.m2.ct_fcp_rsp_iudata.ds_basehi);
3413196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_count, dst->rsp.m2.ct_fcp_rsp_iudata.ds_count);
3414163899Smjacob	}
3415163899Smjacob}
3416163899Smjacob
3417163899Smjacobvoid
3418155704Smjacobisp_put_enable_lun(ispsoftc_t *isp, lun_entry_t *lesrc, lun_entry_t *ledst)
3419155228Smjacob{
3420155228Smjacob	int i;
3421163899Smjacob	isp_put_hdr(isp, &lesrc->le_header, &ledst->le_header);
3422155228Smjacob	ISP_IOXPUT_32(isp, lesrc->le_reserved, &ledst->le_reserved);
3423155228Smjacob	if (ISP_IS_SBUS(isp)) {
3424155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_lun, &ledst->le_rsvd);
3425155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_rsvd, &ledst->le_lun);
3426155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_ops, &ledst->le_tgt);
3427155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_tgt, &ledst->le_ops);
3428155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_status, &ledst->le_reserved2);
3429155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_reserved2, &ledst->le_status);
3430155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_cmd_count, &ledst->le_in_count);
3431155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_in_count, &ledst->le_cmd_count);
3432155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_cdb6len, &ledst->le_cdb7len);
3433155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_cdb7len, &ledst->le_cdb6len);
3434155228Smjacob	} else {
3435155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_lun, &ledst->le_lun);
3436155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_rsvd, &ledst->le_rsvd);
3437155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_ops, &ledst->le_ops);
3438155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_tgt, &ledst->le_tgt);
3439155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_status, &ledst->le_status);
3440155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_reserved2, &ledst->le_reserved2);
3441155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_cmd_count, &ledst->le_cmd_count);
3442155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_in_count, &ledst->le_in_count);
3443155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_cdb6len, &ledst->le_cdb6len);
3444155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_cdb7len, &ledst->le_cdb7len);
3445155228Smjacob	}
3446155228Smjacob	ISP_IOXPUT_32(isp, lesrc->le_flags, &ledst->le_flags);
3447155228Smjacob	ISP_IOXPUT_16(isp, lesrc->le_timeout, &ledst->le_timeout);
3448155228Smjacob	for (i = 0; i < 20; i++) {
3449196008Smjacob		ISP_IOXPUT_8(isp, lesrc->le_reserved3[i], &ledst->le_reserved3[i]);
3450155228Smjacob	}
3451155228Smjacob}
3452155228Smjacob
3453155228Smjacobvoid
3454155704Smjacobisp_get_enable_lun(ispsoftc_t *isp, lun_entry_t *lesrc, lun_entry_t *ledst)
3455155228Smjacob{
3456155228Smjacob	int i;
3457163899Smjacob	isp_get_hdr(isp, &lesrc->le_header, &ledst->le_header);
3458155228Smjacob	ISP_IOXGET_32(isp, &lesrc->le_reserved, ledst->le_reserved);
3459155228Smjacob	if (ISP_IS_SBUS(isp)) {
3460155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_lun, ledst->le_rsvd);
3461155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_rsvd, ledst->le_lun);
3462155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_ops, ledst->le_tgt);
3463155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_tgt, ledst->le_ops);
3464155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_status, ledst->le_reserved2);
3465155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_reserved2, ledst->le_status);
3466155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_cmd_count, ledst->le_in_count);
3467155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_in_count, ledst->le_cmd_count);
3468155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_cdb6len, ledst->le_cdb7len);
3469155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_cdb7len, ledst->le_cdb6len);
3470155228Smjacob	} else {
3471155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_lun, ledst->le_lun);
3472155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_rsvd, ledst->le_rsvd);
3473155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_ops, ledst->le_ops);
3474155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_tgt, ledst->le_tgt);
3475155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_status, ledst->le_status);
3476155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_reserved2, ledst->le_reserved2);
3477155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_cmd_count, ledst->le_cmd_count);
3478155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_in_count, ledst->le_in_count);
3479155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_cdb6len, ledst->le_cdb6len);
3480155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_cdb7len, ledst->le_cdb7len);
3481155228Smjacob	}
3482155228Smjacob	ISP_IOXGET_32(isp, &lesrc->le_flags, ledst->le_flags);
3483155228Smjacob	ISP_IOXGET_16(isp, &lesrc->le_timeout, ledst->le_timeout);
3484155228Smjacob	for (i = 0; i < 20; i++) {
3485196008Smjacob		ISP_IOXGET_8(isp, &lesrc->le_reserved3[i], ledst->le_reserved3[i]);
3486155228Smjacob	}
3487155228Smjacob}
3488155228Smjacob
3489155228Smjacobvoid
3490163899Smjacobisp_put_notify(ispsoftc_t *isp, in_entry_t *src, in_entry_t *dst)
3491155228Smjacob{
3492155228Smjacob	int i;
3493163899Smjacob	isp_put_hdr(isp, &src->in_header, &dst->in_header);
3494163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved, &dst->in_reserved);
3495155228Smjacob	if (ISP_IS_SBUS(isp)) {
3496163899Smjacob		ISP_IOXPUT_8(isp, src->in_lun, &dst->in_iid);
3497163899Smjacob		ISP_IOXPUT_8(isp, src->in_iid, &dst->in_lun);
3498163899Smjacob		ISP_IOXPUT_8(isp, src->in_reserved2, &dst->in_tgt);
3499163899Smjacob		ISP_IOXPUT_8(isp, src->in_tgt, &dst->in_reserved2);
3500163899Smjacob		ISP_IOXPUT_8(isp, src->in_status, &dst->in_rsvd2);
3501163899Smjacob		ISP_IOXPUT_8(isp, src->in_rsvd2, &dst->in_status);
3502163899Smjacob		ISP_IOXPUT_8(isp, src->in_tag_val, &dst->in_tag_type);
3503163899Smjacob		ISP_IOXPUT_8(isp, src->in_tag_type, &dst->in_tag_val);
3504155228Smjacob	} else {
3505163899Smjacob		ISP_IOXPUT_8(isp, src->in_lun, &dst->in_lun);
3506163899Smjacob		ISP_IOXPUT_8(isp, src->in_iid, &dst->in_iid);
3507163899Smjacob		ISP_IOXPUT_8(isp, src->in_reserved2, &dst->in_reserved2);
3508163899Smjacob		ISP_IOXPUT_8(isp, src->in_tgt, &dst->in_tgt);
3509163899Smjacob		ISP_IOXPUT_8(isp, src->in_status, &dst->in_status);
3510163899Smjacob		ISP_IOXPUT_8(isp, src->in_rsvd2, &dst->in_rsvd2);
3511163899Smjacob		ISP_IOXPUT_8(isp, src->in_tag_val, &dst->in_tag_val);
3512163899Smjacob		ISP_IOXPUT_8(isp, src->in_tag_type, &dst->in_tag_type);
3513155228Smjacob	}
3514163899Smjacob	ISP_IOXPUT_32(isp, src->in_flags, &dst->in_flags);
3515163899Smjacob	ISP_IOXPUT_16(isp, src->in_seqid, &dst->in_seqid);
3516155228Smjacob	for (i = 0; i < IN_MSGLEN; i++) {
3517163899Smjacob		ISP_IOXPUT_8(isp, src->in_msg[i], &dst->in_msg[i]);
3518155228Smjacob	}
3519155228Smjacob	for (i = 0; i < IN_RSVDLEN; i++) {
3520196008Smjacob		ISP_IOXPUT_8(isp, src->in_reserved3[i], &dst->in_reserved3[i]);
3521155228Smjacob	}
3522155228Smjacob	for (i = 0; i < QLTM_SENSELEN; i++) {
3523196008Smjacob		ISP_IOXPUT_8(isp, src->in_sense[i], &dst->in_sense[i]);
3524155228Smjacob	}
3525155228Smjacob}
3526155228Smjacob
3527155228Smjacobvoid
3528163899Smjacobisp_get_notify(ispsoftc_t *isp, in_entry_t *src, in_entry_t *dst)
3529155228Smjacob{
3530155228Smjacob	int i;
3531163899Smjacob	isp_get_hdr(isp, &src->in_header, &dst->in_header);
3532163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved, dst->in_reserved);
3533155228Smjacob	if (ISP_IS_SBUS(isp)) {
3534163899Smjacob		ISP_IOXGET_8(isp, &src->in_lun, dst->in_iid);
3535163899Smjacob		ISP_IOXGET_8(isp, &src->in_iid, dst->in_lun);
3536163899Smjacob		ISP_IOXGET_8(isp, &src->in_reserved2, dst->in_tgt);
3537163899Smjacob		ISP_IOXGET_8(isp, &src->in_tgt, dst->in_reserved2);
3538163899Smjacob		ISP_IOXGET_8(isp, &src->in_status, dst->in_rsvd2);
3539163899Smjacob		ISP_IOXGET_8(isp, &src->in_rsvd2, dst->in_status);
3540163899Smjacob		ISP_IOXGET_8(isp, &src->in_tag_val, dst->in_tag_type);
3541163899Smjacob		ISP_IOXGET_8(isp, &src->in_tag_type, dst->in_tag_val);
3542155228Smjacob	} else {
3543163899Smjacob		ISP_IOXGET_8(isp, &src->in_lun, dst->in_lun);
3544163899Smjacob		ISP_IOXGET_8(isp, &src->in_iid, dst->in_iid);
3545163899Smjacob		ISP_IOXGET_8(isp, &src->in_reserved2, dst->in_reserved2);
3546163899Smjacob		ISP_IOXGET_8(isp, &src->in_tgt, dst->in_tgt);
3547163899Smjacob		ISP_IOXGET_8(isp, &src->in_status, dst->in_status);
3548163899Smjacob		ISP_IOXGET_8(isp, &src->in_rsvd2, dst->in_rsvd2);
3549163899Smjacob		ISP_IOXGET_8(isp, &src->in_tag_val, dst->in_tag_val);
3550163899Smjacob		ISP_IOXGET_8(isp, &src->in_tag_type, dst->in_tag_type);
3551155228Smjacob	}
3552163899Smjacob	ISP_IOXGET_32(isp, &src->in_flags, dst->in_flags);
3553163899Smjacob	ISP_IOXGET_16(isp, &src->in_seqid, dst->in_seqid);
3554155228Smjacob	for (i = 0; i < IN_MSGLEN; i++) {
3555163899Smjacob		ISP_IOXGET_8(isp, &src->in_msg[i], dst->in_msg[i]);
3556155228Smjacob	}
3557155228Smjacob	for (i = 0; i < IN_RSVDLEN; i++) {
3558196008Smjacob		ISP_IOXGET_8(isp, &src->in_reserved3[i], dst->in_reserved3[i]);
3559155228Smjacob	}
3560155228Smjacob	for (i = 0; i < QLTM_SENSELEN; i++) {
3561196008Smjacob		ISP_IOXGET_8(isp, &src->in_sense[i], dst->in_sense[i]);
3562155228Smjacob	}
3563155228Smjacob}
3564155228Smjacob
3565155228Smjacobvoid
3566196008Smjacobisp_put_notify_fc(ispsoftc_t *isp, in_fcentry_t *src, in_fcentry_t *dst)
3567155228Smjacob{
3568163899Smjacob	isp_put_hdr(isp, &src->in_header, &dst->in_header);
3569163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved, &dst->in_reserved);
3570163899Smjacob	ISP_IOXPUT_8(isp, src->in_lun, &dst->in_lun);
3571163899Smjacob	ISP_IOXPUT_8(isp, src->in_iid, &dst->in_iid);
3572163899Smjacob	ISP_IOXPUT_16(isp, src->in_scclun, &dst->in_scclun);
3573163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved2, &dst->in_reserved2);
3574163899Smjacob	ISP_IOXPUT_16(isp, src->in_status, &dst->in_status);
3575163899Smjacob	ISP_IOXPUT_16(isp, src->in_task_flags, &dst->in_task_flags);
3576163899Smjacob	ISP_IOXPUT_16(isp, src->in_seqid, &dst->in_seqid);
3577155228Smjacob}
3578155228Smjacob
3579155228Smjacobvoid
3580196008Smjacobisp_put_notify_fc_e(ispsoftc_t *isp, in_fcentry_e_t *src, in_fcentry_e_t *dst)
3581155228Smjacob{
3582163899Smjacob	isp_put_hdr(isp, &src->in_header, &dst->in_header);
3583163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved, &dst->in_reserved);
3584163899Smjacob	ISP_IOXPUT_16(isp, src->in_iid, &dst->in_iid);
3585163899Smjacob	ISP_IOXPUT_16(isp, src->in_scclun, &dst->in_scclun);
3586163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved2, &dst->in_reserved2);
3587163899Smjacob	ISP_IOXPUT_16(isp, src->in_status, &dst->in_status);
3588163899Smjacob	ISP_IOXPUT_16(isp, src->in_task_flags, &dst->in_task_flags);
3589163899Smjacob	ISP_IOXPUT_16(isp, src->in_seqid, &dst->in_seqid);
3590155228Smjacob}
3591155228Smjacob
3592155228Smjacobvoid
3593196008Smjacobisp_put_notify_24xx(ispsoftc_t *isp, in_fcentry_24xx_t *src, in_fcentry_24xx_t *dst)
3594155228Smjacob{
3595163899Smjacob	int i;
3596163899Smjacob
3597163899Smjacob	isp_put_hdr(isp, &src->in_header, &dst->in_header);
3598163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved, &dst->in_reserved);
3599163899Smjacob	ISP_IOXPUT_16(isp, src->in_nphdl, &dst->in_nphdl);
3600163899Smjacob	ISP_IOXPUT_16(isp, src->in_reserved1, &dst->in_reserved1);
3601163899Smjacob	ISP_IOXPUT_16(isp, src->in_flags, &dst->in_flags);
3602163899Smjacob	ISP_IOXPUT_16(isp, src->in_srr_rxid, &dst->in_srr_rxid);
3603163899Smjacob	ISP_IOXPUT_16(isp, src->in_status, &dst->in_status);
3604163899Smjacob	ISP_IOXPUT_8(isp, src->in_status_subcode, &dst->in_status_subcode);
3605289838Smav	ISP_IOXPUT_8(isp, src->in_fwhandle, &dst->in_fwhandle);
3606163899Smjacob	ISP_IOXPUT_32(isp, src->in_rxid, &dst->in_rxid);
3607163899Smjacob	ISP_IOXPUT_16(isp, src->in_srr_reloff_hi, &dst->in_srr_reloff_hi);
3608163899Smjacob	ISP_IOXPUT_16(isp, src->in_srr_reloff_lo, &dst->in_srr_reloff_lo);
3609163899Smjacob	ISP_IOXPUT_16(isp, src->in_srr_iu, &dst->in_srr_iu);
3610163899Smjacob	ISP_IOXPUT_16(isp, src->in_srr_oxid, &dst->in_srr_oxid);
3611196008Smjacob	ISP_IOXPUT_16(isp, src->in_nport_id_hi, &dst->in_nport_id_hi);
3612196008Smjacob	ISP_IOXPUT_8(isp, src->in_nport_id_lo, &dst->in_nport_id_lo);
3613196008Smjacob	ISP_IOXPUT_8(isp, src->in_reserved3, &dst->in_reserved3);
3614196008Smjacob	ISP_IOXPUT_16(isp, src->in_np_handle, &dst->in_np_handle);
3615196008Smjacob	for (i = 0; i < ASIZE(src->in_reserved4); i++) {
3616196008Smjacob		ISP_IOXPUT_8(isp, src->in_reserved4[i], &dst->in_reserved4[i]);
3617163899Smjacob	}
3618196008Smjacob	ISP_IOXPUT_8(isp, src->in_reserved5, &dst->in_reserved5);
3619196008Smjacob	ISP_IOXPUT_8(isp, src->in_vpidx, &dst->in_vpidx);
3620196008Smjacob	ISP_IOXPUT_32(isp, src->in_reserved6, &dst->in_reserved6);
3621163899Smjacob	ISP_IOXPUT_16(isp, src->in_portid_lo, &dst->in_portid_lo);
3622163899Smjacob	ISP_IOXPUT_8(isp, src->in_portid_hi, &dst->in_portid_hi);
3623196008Smjacob	ISP_IOXPUT_8(isp, src->in_reserved7, &dst->in_reserved7);
3624196008Smjacob	ISP_IOXPUT_16(isp, src->in_reserved8, &dst->in_reserved8);
3625163899Smjacob	ISP_IOXPUT_16(isp, src->in_oxid, &dst->in_oxid);
3626155228Smjacob}
3627155228Smjacob
3628155228Smjacobvoid
3629196008Smjacobisp_get_notify_fc(ispsoftc_t *isp, in_fcentry_t *src, in_fcentry_t *dst)
3630155228Smjacob{
3631163899Smjacob	isp_get_hdr(isp, &src->in_header, &dst->in_header);
3632163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved, dst->in_reserved);
3633163899Smjacob	ISP_IOXGET_8(isp, &src->in_lun, dst->in_lun);
3634163899Smjacob	ISP_IOXGET_8(isp, &src->in_iid, dst->in_iid);
3635163899Smjacob	ISP_IOXGET_16(isp, &src->in_scclun, dst->in_scclun);
3636163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved2, dst->in_reserved2);
3637163899Smjacob	ISP_IOXGET_16(isp, &src->in_status, dst->in_status);
3638163899Smjacob	ISP_IOXGET_16(isp, &src->in_task_flags, dst->in_task_flags);
3639163899Smjacob	ISP_IOXGET_16(isp, &src->in_seqid, dst->in_seqid);
3640155228Smjacob}
3641155228Smjacob
3642155228Smjacobvoid
3643196008Smjacobisp_get_notify_fc_e(ispsoftc_t *isp, in_fcentry_e_t *src, in_fcentry_e_t *dst)
3644155228Smjacob{
3645163899Smjacob	isp_get_hdr(isp, &src->in_header, &dst->in_header);
3646163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved, dst->in_reserved);
3647163899Smjacob	ISP_IOXGET_16(isp, &src->in_iid, dst->in_iid);
3648163899Smjacob	ISP_IOXGET_16(isp, &src->in_scclun, dst->in_scclun);
3649163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved2, dst->in_reserved2);
3650163899Smjacob	ISP_IOXGET_16(isp, &src->in_status, dst->in_status);
3651163899Smjacob	ISP_IOXGET_16(isp, &src->in_task_flags, dst->in_task_flags);
3652163899Smjacob	ISP_IOXGET_16(isp, &src->in_seqid, dst->in_seqid);
3653163899Smjacob}
3654163899Smjacob
3655163899Smjacobvoid
3656196008Smjacobisp_get_notify_24xx(ispsoftc_t *isp, in_fcentry_24xx_t *src, in_fcentry_24xx_t *dst)
3657163899Smjacob{
3658155228Smjacob	int i;
3659163899Smjacob
3660163899Smjacob	isp_get_hdr(isp, &src->in_header, &dst->in_header);
3661163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved, dst->in_reserved);
3662163899Smjacob	ISP_IOXGET_16(isp, &src->in_nphdl, dst->in_nphdl);
3663163899Smjacob	ISP_IOXGET_16(isp, &src->in_reserved1, dst->in_reserved1);
3664163899Smjacob	ISP_IOXGET_16(isp, &src->in_flags, dst->in_flags);
3665163899Smjacob	ISP_IOXGET_16(isp, &src->in_srr_rxid, dst->in_srr_rxid);
3666163899Smjacob	ISP_IOXGET_16(isp, &src->in_status, dst->in_status);
3667163899Smjacob	ISP_IOXGET_8(isp, &src->in_status_subcode, dst->in_status_subcode);
3668289838Smav	ISP_IOXGET_8(isp, &src->in_fwhandle, dst->in_fwhandle);
3669163899Smjacob	ISP_IOXGET_32(isp, &src->in_rxid, dst->in_rxid);
3670163899Smjacob	ISP_IOXGET_16(isp, &src->in_srr_reloff_hi, dst->in_srr_reloff_hi);
3671163899Smjacob	ISP_IOXGET_16(isp, &src->in_srr_reloff_lo, dst->in_srr_reloff_lo);
3672163899Smjacob	ISP_IOXGET_16(isp, &src->in_srr_iu, dst->in_srr_iu);
3673163899Smjacob	ISP_IOXGET_16(isp, &src->in_srr_oxid, dst->in_srr_oxid);
3674196008Smjacob	ISP_IOXGET_16(isp, &src->in_nport_id_hi, dst->in_nport_id_hi);
3675196008Smjacob	ISP_IOXGET_8(isp, &src->in_nport_id_lo, dst->in_nport_id_lo);
3676196008Smjacob	ISP_IOXGET_8(isp, &src->in_reserved3, dst->in_reserved3);
3677196008Smjacob	ISP_IOXGET_16(isp, &src->in_np_handle, dst->in_np_handle);
3678196008Smjacob	for (i = 0; i < ASIZE(src->in_reserved4); i++) {
3679196008Smjacob		ISP_IOXGET_8(isp, &src->in_reserved4[i], dst->in_reserved4[i]);
3680163899Smjacob	}
3681196008Smjacob	ISP_IOXGET_8(isp, &src->in_reserved5, dst->in_reserved5);
3682196008Smjacob	ISP_IOXGET_8(isp, &src->in_vpidx, dst->in_vpidx);
3683196008Smjacob	ISP_IOXGET_32(isp, &src->in_reserved6, dst->in_reserved6);
3684163899Smjacob	ISP_IOXGET_16(isp, &src->in_portid_lo, dst->in_portid_lo);
3685163899Smjacob	ISP_IOXGET_8(isp, &src->in_portid_hi, dst->in_portid_hi);
3686196008Smjacob	ISP_IOXGET_8(isp, &src->in_reserved7, dst->in_reserved7);
3687196008Smjacob	ISP_IOXGET_16(isp, &src->in_reserved8, dst->in_reserved8);
3688163899Smjacob	ISP_IOXGET_16(isp, &src->in_oxid, dst->in_oxid);
3689163899Smjacob}
3690163899Smjacob
3691163899Smjacobvoid
3692163899Smjacobisp_put_notify_ack(ispsoftc_t *isp, na_entry_t *src,  na_entry_t *dst)
3693163899Smjacob{
3694163899Smjacob	int i;
3695163899Smjacob	isp_put_hdr(isp, &src->na_header, &dst->na_header);
3696163899Smjacob	ISP_IOXPUT_32(isp, src->na_reserved, &dst->na_reserved);
3697155228Smjacob	if (ISP_IS_SBUS(isp)) {
3698163899Smjacob		ISP_IOXPUT_8(isp, src->na_lun, &dst->na_iid);
3699163899Smjacob		ISP_IOXPUT_8(isp, src->na_iid, &dst->na_lun);
3700163899Smjacob		ISP_IOXPUT_8(isp, src->na_status, &dst->na_event);
3701163899Smjacob		ISP_IOXPUT_8(isp, src->na_event, &dst->na_status);
3702155228Smjacob	} else {
3703163899Smjacob		ISP_IOXPUT_8(isp, src->na_lun, &dst->na_lun);
3704163899Smjacob		ISP_IOXPUT_8(isp, src->na_iid, &dst->na_iid);
3705163899Smjacob		ISP_IOXPUT_8(isp, src->na_status, &dst->na_status);
3706163899Smjacob		ISP_IOXPUT_8(isp, src->na_event, &dst->na_event);
3707155228Smjacob	}
3708163899Smjacob	ISP_IOXPUT_32(isp, src->na_flags, &dst->na_flags);
3709155228Smjacob	for (i = 0; i < NA_RSVDLEN; i++) {
3710196008Smjacob		ISP_IOXPUT_16(isp, src->na_reserved3[i], &dst->na_reserved3[i]);
3711155228Smjacob	}
3712155228Smjacob}
3713155228Smjacob
3714155228Smjacobvoid
3715163899Smjacobisp_get_notify_ack(ispsoftc_t *isp, na_entry_t *src, na_entry_t *dst)
3716155228Smjacob{
3717155228Smjacob	int i;
3718163899Smjacob	isp_get_hdr(isp, &src->na_header, &dst->na_header);
3719163899Smjacob	ISP_IOXGET_32(isp, &src->na_reserved, dst->na_reserved);
3720155228Smjacob	if (ISP_IS_SBUS(isp)) {
3721163899Smjacob		ISP_IOXGET_8(isp, &src->na_lun, dst->na_iid);
3722163899Smjacob		ISP_IOXGET_8(isp, &src->na_iid, dst->na_lun);
3723163899Smjacob		ISP_IOXGET_8(isp, &src->na_status, dst->na_event);
3724163899Smjacob		ISP_IOXGET_8(isp, &src->na_event, dst->na_status);
3725155228Smjacob	} else {
3726163899Smjacob		ISP_IOXGET_8(isp, &src->na_lun, dst->na_lun);
3727163899Smjacob		ISP_IOXGET_8(isp, &src->na_iid, dst->na_iid);
3728163899Smjacob		ISP_IOXGET_8(isp, &src->na_status, dst->na_status);
3729163899Smjacob		ISP_IOXGET_8(isp, &src->na_event, dst->na_event);
3730155228Smjacob	}
3731163899Smjacob	ISP_IOXGET_32(isp, &src->na_flags, dst->na_flags);
3732155228Smjacob	for (i = 0; i < NA_RSVDLEN; i++) {
3733196008Smjacob		ISP_IOXGET_16(isp, &src->na_reserved3[i], dst->na_reserved3[i]);
3734155228Smjacob	}
3735155228Smjacob}
3736155228Smjacob
3737155228Smjacobvoid
3738196008Smjacobisp_put_notify_ack_fc(ispsoftc_t *isp, na_fcentry_t *src, na_fcentry_t *dst)
3739155228Smjacob{
3740155228Smjacob	int i;
3741163899Smjacob	isp_put_hdr(isp, &src->na_header, &dst->na_header);
3742163899Smjacob	ISP_IOXPUT_32(isp, src->na_reserved, &dst->na_reserved);
3743163899Smjacob	ISP_IOXPUT_8(isp, src->na_reserved1, &dst->na_reserved1);
3744163899Smjacob	ISP_IOXPUT_8(isp, src->na_iid, &dst->na_iid);
3745163899Smjacob	ISP_IOXPUT_16(isp, src->na_response, &dst->na_response);
3746163899Smjacob	ISP_IOXPUT_16(isp, src->na_flags, &dst->na_flags);
3747163899Smjacob	ISP_IOXPUT_16(isp, src->na_reserved2, &dst->na_reserved2);
3748163899Smjacob	ISP_IOXPUT_16(isp, src->na_status, &dst->na_status);
3749163899Smjacob	ISP_IOXPUT_16(isp, src->na_task_flags, &dst->na_task_flags);
3750163899Smjacob	ISP_IOXPUT_16(isp, src->na_seqid, &dst->na_seqid);
3751155228Smjacob	for (i = 0; i < NA2_RSVDLEN; i++) {
3752196008Smjacob		ISP_IOXPUT_16(isp, src->na_reserved3[i], &dst->na_reserved3[i]);
3753155228Smjacob	}
3754155228Smjacob}
3755155228Smjacob
3756155228Smjacobvoid
3757196008Smjacobisp_put_notify_ack_fc_e(ispsoftc_t *isp, na_fcentry_e_t *src, na_fcentry_e_t *dst)
3758155228Smjacob{
3759155228Smjacob	int i;
3760163899Smjacob	isp_put_hdr(isp, &src->na_header, &dst->na_header);
3761163899Smjacob	ISP_IOXPUT_32(isp, src->na_reserved, &dst->na_reserved);
3762163899Smjacob	ISP_IOXPUT_16(isp, src->na_iid, &dst->na_iid);
3763163899Smjacob	ISP_IOXPUT_16(isp, src->na_response, &dst->na_response);
3764163899Smjacob	ISP_IOXPUT_16(isp, src->na_flags, &dst->na_flags);
3765163899Smjacob	ISP_IOXPUT_16(isp, src->na_reserved2, &dst->na_reserved2);
3766163899Smjacob	ISP_IOXPUT_16(isp, src->na_status, &dst->na_status);
3767163899Smjacob	ISP_IOXPUT_16(isp, src->na_task_flags, &dst->na_task_flags);
3768163899Smjacob	ISP_IOXPUT_16(isp, src->na_seqid, &dst->na_seqid);
3769155228Smjacob	for (i = 0; i < NA2_RSVDLEN; i++) {
3770196008Smjacob		ISP_IOXPUT_16(isp, src->na_reserved3[i], &dst->na_reserved3[i]);
3771155228Smjacob	}
3772155228Smjacob}
3773155228Smjacob
3774155228Smjacobvoid
3775196008Smjacobisp_put_notify_24xx_ack(ispsoftc_t *isp, na_fcentry_24xx_t *src, na_fcentry_24xx_t *dst)
3776155228Smjacob{
3777155228Smjacob	int i;
3778163899Smjacob
3779163899Smjacob	isp_put_hdr(isp, &src->na_header, &dst->na_header);
3780163899Smjacob	ISP_IOXPUT_32(isp, src->na_handle, &dst->na_handle);
3781163899Smjacob	ISP_IOXPUT_16(isp, src->na_nphdl, &dst->na_nphdl);
3782163899Smjacob	ISP_IOXPUT_16(isp, src->na_reserved1, &dst->na_reserved1);
3783163899Smjacob	ISP_IOXPUT_16(isp, src->na_flags, &dst->na_flags);
3784163899Smjacob	ISP_IOXPUT_16(isp, src->na_srr_rxid, &dst->na_srr_rxid);
3785163899Smjacob	ISP_IOXPUT_16(isp, src->na_status, &dst->na_status);
3786163899Smjacob	ISP_IOXPUT_8(isp, src->na_status_subcode, &dst->na_status_subcode);
3787289838Smav	ISP_IOXPUT_8(isp, src->na_fwhandle, &dst->na_fwhandle);
3788163899Smjacob	ISP_IOXPUT_32(isp, src->na_rxid, &dst->na_rxid);
3789163899Smjacob	ISP_IOXPUT_16(isp, src->na_srr_reloff_hi, &dst->na_srr_reloff_hi);
3790163899Smjacob	ISP_IOXPUT_16(isp, src->na_srr_reloff_lo, &dst->na_srr_reloff_lo);
3791163899Smjacob	ISP_IOXPUT_16(isp, src->na_srr_iu, &dst->na_srr_iu);
3792163899Smjacob	ISP_IOXPUT_16(isp, src->na_srr_flags, &dst->na_srr_flags);
3793163899Smjacob	for (i = 0; i < 18; i++) {
3794163899Smjacob		ISP_IOXPUT_8(isp, src->na_reserved3[i], &dst->na_reserved3[i]);
3795163899Smjacob	}
3796163899Smjacob	ISP_IOXPUT_8(isp, src->na_reserved4, &dst->na_reserved4);
3797196008Smjacob	ISP_IOXPUT_8(isp, src->na_vpidx, &dst->na_vpidx);
3798196008Smjacob	ISP_IOXPUT_8(isp, src->na_srr_reject_vunique, &dst->na_srr_reject_vunique);
3799196008Smjacob	ISP_IOXPUT_8(isp, src->na_srr_reject_explanation, &dst->na_srr_reject_explanation);
3800163899Smjacob	ISP_IOXPUT_8(isp, src->na_srr_reject_code, &dst->na_srr_reject_code);
3801163899Smjacob	ISP_IOXPUT_8(isp, src->na_reserved5, &dst->na_reserved5);
3802163899Smjacob	for (i = 0; i < 6; i++) {
3803163899Smjacob		ISP_IOXPUT_8(isp, src->na_reserved6[i], &dst->na_reserved6[i]);
3804163899Smjacob	}
3805163899Smjacob	ISP_IOXPUT_16(isp, src->na_oxid, &dst->na_oxid);
3806163899Smjacob}
3807163899Smjacob
3808163899Smjacobvoid
3809196008Smjacobisp_get_notify_ack_fc(ispsoftc_t *isp, na_fcentry_t *src, na_fcentry_t *dst)
3810163899Smjacob{
3811163899Smjacob	int i;
3812163899Smjacob	isp_get_hdr(isp, &src->na_header, &dst->na_header);
3813163899Smjacob	ISP_IOXGET_32(isp, &src->na_reserved, dst->na_reserved);
3814163899Smjacob	ISP_IOXGET_8(isp, &src->na_reserved1, dst->na_reserved1);
3815163899Smjacob	ISP_IOXGET_8(isp, &src->na_iid, dst->na_iid);
3816163899Smjacob	ISP_IOXGET_16(isp, &src->na_response, dst->na_response);
3817163899Smjacob	ISP_IOXGET_16(isp, &src->na_flags, dst->na_flags);
3818163899Smjacob	ISP_IOXGET_16(isp, &src->na_reserved2, dst->na_reserved2);
3819163899Smjacob	ISP_IOXGET_16(isp, &src->na_status, dst->na_status);
3820163899Smjacob	ISP_IOXGET_16(isp, &src->na_task_flags, dst->na_task_flags);
3821163899Smjacob	ISP_IOXGET_16(isp, &src->na_seqid, dst->na_seqid);
3822155228Smjacob	for (i = 0; i < NA2_RSVDLEN; i++) {
3823196008Smjacob		ISP_IOXGET_16(isp, &src->na_reserved3[i], dst->na_reserved3[i]);
3824155228Smjacob	}
3825155228Smjacob}
3826155228Smjacob
3827155228Smjacobvoid
3828196008Smjacobisp_get_notify_ack_fc_e(ispsoftc_t *isp, na_fcentry_e_t *src, na_fcentry_e_t *dst)
3829155228Smjacob{
3830155228Smjacob	int i;
3831163899Smjacob	isp_get_hdr(isp, &src->na_header, &dst->na_header);
3832163899Smjacob	ISP_IOXGET_32(isp, &src->na_reserved, dst->na_reserved);
3833163899Smjacob	ISP_IOXGET_16(isp, &src->na_iid, dst->na_iid);
3834163899Smjacob	ISP_IOXGET_16(isp, &src->na_response, dst->na_response);
3835163899Smjacob	ISP_IOXGET_16(isp, &src->na_flags, dst->na_flags);
3836163899Smjacob	ISP_IOXGET_16(isp, &src->na_reserved2, dst->na_reserved2);
3837163899Smjacob	ISP_IOXGET_16(isp, &src->na_status, dst->na_status);
3838163899Smjacob	ISP_IOXGET_16(isp, &src->na_task_flags, dst->na_task_flags);
3839163899Smjacob	ISP_IOXGET_16(isp, &src->na_seqid, dst->na_seqid);
3840155228Smjacob	for (i = 0; i < NA2_RSVDLEN; i++) {
3841196008Smjacob		ISP_IOXGET_16(isp, &src->na_reserved3[i], dst->na_reserved3[i]);
3842155228Smjacob	}
3843155228Smjacob}
3844163899Smjacob
3845163899Smjacobvoid
3846196008Smjacobisp_get_notify_ack_24xx(ispsoftc_t *isp, na_fcentry_24xx_t *src, na_fcentry_24xx_t *dst)
3847163899Smjacob{
3848163899Smjacob	int i;
3849163899Smjacob
3850163899Smjacob	isp_get_hdr(isp, &src->na_header, &dst->na_header);
3851163899Smjacob	ISP_IOXGET_32(isp, &src->na_handle, dst->na_handle);
3852163899Smjacob	ISP_IOXGET_16(isp, &src->na_nphdl, dst->na_nphdl);
3853163899Smjacob	ISP_IOXGET_16(isp, &src->na_reserved1, dst->na_reserved1);
3854163899Smjacob	ISP_IOXGET_16(isp, &src->na_flags, dst->na_flags);
3855163899Smjacob	ISP_IOXGET_16(isp, &src->na_srr_rxid, dst->na_srr_rxid);
3856163899Smjacob	ISP_IOXGET_16(isp, &src->na_status, dst->na_status);
3857163899Smjacob	ISP_IOXGET_8(isp, &src->na_status_subcode, dst->na_status_subcode);
3858289838Smav	ISP_IOXGET_8(isp, &src->na_fwhandle, dst->na_fwhandle);
3859163899Smjacob	ISP_IOXGET_32(isp, &src->na_rxid, dst->na_rxid);
3860163899Smjacob	ISP_IOXGET_16(isp, &src->na_srr_reloff_hi, dst->na_srr_reloff_hi);
3861163899Smjacob	ISP_IOXGET_16(isp, &src->na_srr_reloff_lo, dst->na_srr_reloff_lo);
3862163899Smjacob	ISP_IOXGET_16(isp, &src->na_srr_iu, dst->na_srr_iu);
3863163899Smjacob	ISP_IOXGET_16(isp, &src->na_srr_flags, dst->na_srr_flags);
3864163899Smjacob	for (i = 0; i < 18; i++) {
3865163899Smjacob		ISP_IOXGET_8(isp, &src->na_reserved3[i], dst->na_reserved3[i]);
3866163899Smjacob	}
3867163899Smjacob	ISP_IOXGET_8(isp, &src->na_reserved4, dst->na_reserved4);
3868196008Smjacob	ISP_IOXGET_8(isp, &src->na_vpidx, dst->na_vpidx);
3869196008Smjacob	ISP_IOXGET_8(isp, &src->na_srr_reject_vunique, dst->na_srr_reject_vunique);
3870196008Smjacob	ISP_IOXGET_8(isp, &src->na_srr_reject_explanation, dst->na_srr_reject_explanation);
3871163899Smjacob	ISP_IOXGET_8(isp, &src->na_srr_reject_code, dst->na_srr_reject_code);
3872163899Smjacob	ISP_IOXGET_8(isp, &src->na_reserved5, dst->na_reserved5);
3873163899Smjacob	for (i = 0; i < 6; i++) {
3874163899Smjacob		ISP_IOXGET_8(isp, &src->na_reserved6[i], dst->na_reserved6[i]);
3875163899Smjacob	}
3876163899Smjacob	ISP_IOXGET_16(isp, &src->na_oxid, dst->na_oxid);
3877163899Smjacob}
3878163899Smjacob
3879163899Smjacobvoid
3880163899Smjacobisp_get_abts(ispsoftc_t *isp, abts_t *src, abts_t *dst)
3881163899Smjacob{
3882163899Smjacob	int i;
3883163899Smjacob
3884163899Smjacob	isp_get_hdr(isp, &src->abts_header, &dst->abts_header);
3885163899Smjacob	for (i = 0; i < 6; i++) {
3886196008Smjacob		ISP_IOXGET_8(isp, &src->abts_reserved0[i], dst->abts_reserved0[i]);
3887163899Smjacob	}
3888163899Smjacob	ISP_IOXGET_16(isp, &src->abts_nphdl, dst->abts_nphdl);
3889163899Smjacob	ISP_IOXGET_16(isp, &src->abts_reserved1, dst->abts_reserved1);
3890163899Smjacob	ISP_IOXGET_16(isp, &src->abts_sof, dst->abts_sof);
3891163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rxid_abts, dst->abts_rxid_abts);
3892163899Smjacob	ISP_IOXGET_16(isp, &src->abts_did_lo, dst->abts_did_lo);
3893163899Smjacob	ISP_IOXGET_8(isp, &src->abts_did_hi, dst->abts_did_hi);
3894163899Smjacob	ISP_IOXGET_8(isp, &src->abts_r_ctl, dst->abts_r_ctl);
3895163899Smjacob	ISP_IOXGET_16(isp, &src->abts_sid_lo, dst->abts_sid_lo);
3896163899Smjacob	ISP_IOXGET_8(isp, &src->abts_sid_hi, dst->abts_sid_hi);
3897163899Smjacob	ISP_IOXGET_8(isp, &src->abts_cs_ctl, dst->abts_cs_ctl);
3898163899Smjacob	ISP_IOXGET_16(isp, &src->abts_fs_ctl, dst->abts_fs_ctl);
3899163899Smjacob	ISP_IOXGET_8(isp, &src->abts_f_ctl, dst->abts_f_ctl);
3900163899Smjacob	ISP_IOXGET_8(isp, &src->abts_type, dst->abts_type);
3901163899Smjacob	ISP_IOXGET_16(isp, &src->abts_seq_cnt, dst->abts_seq_cnt);
3902163899Smjacob	ISP_IOXGET_8(isp, &src->abts_df_ctl, dst->abts_df_ctl);
3903163899Smjacob	ISP_IOXGET_8(isp, &src->abts_seq_id, dst->abts_seq_id);
3904163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rx_id, dst->abts_rx_id);
3905163899Smjacob	ISP_IOXGET_16(isp, &src->abts_ox_id, dst->abts_ox_id);
3906163899Smjacob	ISP_IOXGET_32(isp, &src->abts_param, dst->abts_param);
3907163899Smjacob	for (i = 0; i < 16; i++) {
3908196008Smjacob		ISP_IOXGET_8(isp, &src->abts_reserved2[i], dst->abts_reserved2[i]);
3909163899Smjacob	}
3910163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rxid_task, dst->abts_rxid_task);
3911163899Smjacob}
3912163899Smjacob
3913163899Smjacobvoid
3914163899Smjacobisp_put_abts_rsp(ispsoftc_t *isp, abts_rsp_t *src, abts_rsp_t *dst)
3915163899Smjacob{
3916163899Smjacob	int i;
3917163899Smjacob
3918163899Smjacob	isp_put_hdr(isp, &src->abts_rsp_header, &dst->abts_rsp_header);
3919163899Smjacob	ISP_IOXPUT_32(isp, src->abts_rsp_handle, &dst->abts_rsp_handle);
3920163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_status, &dst->abts_rsp_status);
3921163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_nphdl, &dst->abts_rsp_nphdl);
3922163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_ctl_flags, &dst->abts_rsp_ctl_flags);
3923163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_sof, &dst->abts_rsp_sof);
3924163899Smjacob	ISP_IOXPUT_32(isp, src->abts_rsp_rxid_abts, &dst->abts_rsp_rxid_abts);
3925163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_did_lo, &dst->abts_rsp_did_lo);
3926163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_did_hi, &dst->abts_rsp_did_hi);
3927163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_r_ctl, &dst->abts_rsp_r_ctl);
3928163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_sid_lo, &dst->abts_rsp_sid_lo);
3929163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_sid_hi, &dst->abts_rsp_sid_hi);
3930163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_cs_ctl, &dst->abts_rsp_cs_ctl);
3931163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_f_ctl_lo, &dst->abts_rsp_f_ctl_lo);
3932163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_f_ctl_hi, &dst->abts_rsp_f_ctl_hi);
3933163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_type, &dst->abts_rsp_type);
3934163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_seq_cnt, &dst->abts_rsp_seq_cnt);
3935163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_df_ctl, &dst->abts_rsp_df_ctl);
3936163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_seq_id, &dst->abts_rsp_seq_id);
3937163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_rx_id, &dst->abts_rsp_rx_id);
3938163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_ox_id, &dst->abts_rsp_ox_id);
3939163899Smjacob	ISP_IOXPUT_32(isp, src->abts_rsp_param, &dst->abts_rsp_param);
3940163899Smjacob	if (src->abts_rsp_r_ctl == BA_ACC) {
3941196008Smjacob		ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.reserved, &dst->abts_rsp_payload.ba_acc.reserved);
3942196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_acc.last_seq_id, &dst->abts_rsp_payload.ba_acc.last_seq_id);
3943196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_acc.seq_id_valid, &dst->abts_rsp_payload.ba_acc.seq_id_valid);
3944196008Smjacob		ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.aborted_rx_id, &dst->abts_rsp_payload.ba_acc.aborted_rx_id);
3945196008Smjacob		ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.aborted_ox_id, &dst->abts_rsp_payload.ba_acc.aborted_ox_id);
3946196008Smjacob		ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.high_seq_cnt, &dst->abts_rsp_payload.ba_acc.high_seq_cnt);
3947196008Smjacob		ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.low_seq_cnt, &dst->abts_rsp_payload.ba_acc.low_seq_cnt);
3948163899Smjacob		for (i = 0; i < 4; i++) {
3949196008Smjacob			ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.reserved2[i], &dst->abts_rsp_payload.ba_acc.reserved2[i]);
3950163899Smjacob		}
3951163899Smjacob	} else if (src->abts_rsp_r_ctl == BA_RJT) {
3952196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.vendor_unique, &dst->abts_rsp_payload.ba_rjt.vendor_unique);
3953196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.explanation, &dst->abts_rsp_payload.ba_rjt.explanation);
3954196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.reason, &dst->abts_rsp_payload.ba_rjt.reason);
3955196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.reserved, &dst->abts_rsp_payload.ba_rjt.reserved);
3956163899Smjacob		for (i = 0; i < 12; i++) {
3957196008Smjacob			ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_rjt.reserved2[i], &dst->abts_rsp_payload.ba_rjt.reserved2[i]);
3958163899Smjacob		}
3959163899Smjacob	} else {
3960163899Smjacob		for (i = 0; i < 16; i++) {
3961196008Smjacob			ISP_IOXPUT_8(isp, src->abts_rsp_payload.reserved[i], &dst->abts_rsp_payload.reserved[i]);
3962163899Smjacob		}
3963163899Smjacob	}
3964163899Smjacob	ISP_IOXPUT_32(isp, src->abts_rsp_rxid_task, &dst->abts_rsp_rxid_task);
3965163899Smjacob}
3966163899Smjacob
3967163899Smjacobvoid
3968163899Smjacobisp_get_abts_rsp(ispsoftc_t *isp, abts_rsp_t *src, abts_rsp_t *dst)
3969163899Smjacob{
3970163899Smjacob	int i;
3971163899Smjacob
3972163899Smjacob	isp_get_hdr(isp, &src->abts_rsp_header, &dst->abts_rsp_header);
3973163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_handle, dst->abts_rsp_handle);
3974163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_status, dst->abts_rsp_status);
3975163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_nphdl, dst->abts_rsp_nphdl);
3976163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_ctl_flags, dst->abts_rsp_ctl_flags);
3977163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_sof, dst->abts_rsp_sof);
3978163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_rxid_abts, dst->abts_rsp_rxid_abts);
3979163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_did_lo, dst->abts_rsp_did_lo);
3980163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_did_hi, dst->abts_rsp_did_hi);
3981163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_r_ctl, dst->abts_rsp_r_ctl);
3982163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_sid_lo, dst->abts_rsp_sid_lo);
3983163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_sid_hi, dst->abts_rsp_sid_hi);
3984163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_cs_ctl, dst->abts_rsp_cs_ctl);
3985163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_f_ctl_lo, dst->abts_rsp_f_ctl_lo);
3986163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_f_ctl_hi, dst->abts_rsp_f_ctl_hi);
3987163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_type, dst->abts_rsp_type);
3988163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_seq_cnt, dst->abts_rsp_seq_cnt);
3989163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_df_ctl, dst->abts_rsp_df_ctl);
3990163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_seq_id, dst->abts_rsp_seq_id);
3991163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_rx_id, dst->abts_rsp_rx_id);
3992163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_ox_id, dst->abts_rsp_ox_id);
3993163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_param, dst->abts_rsp_param);
3994163899Smjacob	for (i = 0; i < 8; i++) {
3995196008Smjacob		ISP_IOXGET_8(isp, &src->abts_rsp_payload.rsp.reserved[i], dst->abts_rsp_payload.rsp.reserved[i]);
3996163899Smjacob	}
3997196008Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_payload.rsp.subcode1, dst->abts_rsp_payload.rsp.subcode1);
3998196008Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_payload.rsp.subcode2, dst->abts_rsp_payload.rsp.subcode2);
3999163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_rxid_task, dst->abts_rsp_rxid_task);
4000163899Smjacob}
4001155228Smjacob#endif	/* ISP_TARGET_MODE */
4002163899Smjacob/*
4003163899Smjacob * vim:ts=8:sw=8
4004163899Smjacob */
4005