isp_library.c revision 291209
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 291209 2015-11-23 15:49:50Z 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) {
568291080Smav	case TOPO_NL_PORT:      return "Private Loop (NL_Port)";
569291080Smav	case TOPO_FL_PORT:      return "Public Loop (FL_Port)";
570291080Smav	case TOPO_N_PORT:       return "Point-to-Point (N_Port)";
571291080Smav	case TOPO_F_PORT:       return "Fabric (F_Port)";
572291080Smav	case TOPO_PTP_STUB:     return "Point-to-Point (no 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;
781291188Smav		} else {
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		}
787196008Smjacob		isp_async(isp, ISPASYNC_TARGET_ACTION, local);
788196008Smjacob	}
789196008Smjacob	for (tmp = 0; tmp < isp->isp_nchan; tmp++) {
790196008Smjacob		ISP_MEMZERO(&notify, sizeof (isp_notify_t));
791196008Smjacob		notify.nt_ncode = NT_HBA_RESET;
792196008Smjacob		notify.nt_hba = isp;
793196008Smjacob		notify.nt_wwn = INI_ANY;
794196008Smjacob		notify.nt_nphdl = NIL_HANDLE;
795196008Smjacob		notify.nt_sid = PORT_ANY;
796196008Smjacob		notify.nt_did = PORT_ANY;
797196008Smjacob		notify.nt_tgt = TGT_ANY;
798196008Smjacob		notify.nt_channel = tmp;
799196008Smjacob		notify.nt_lun = LUN_ANY;
800196008Smjacob		notify.nt_tagval = TAG_ANY;
801196008Smjacob		isp_async(isp, ISPASYNC_TARGET_NOTIFY, &notify);
802196008Smjacob	}
803196008Smjacob#endif
804196008Smjacob}
805196008Smjacob
806196008Smjacobvoid
807163899Smjacobisp_shutdown(ispsoftc_t *isp)
808163899Smjacob{
809163899Smjacob	if (IS_FC(isp)) {
810163899Smjacob		if (IS_24XX(isp)) {
811163899Smjacob			ISP_WRITE(isp, BIU2400_ICR, 0);
812163899Smjacob			ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_PAUSE);
813163899Smjacob		} else {
814163899Smjacob			ISP_WRITE(isp, BIU_ICR, 0);
815163899Smjacob			ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
816163899Smjacob			ISP_WRITE(isp, BIU2100_CSR, BIU2100_FPM0_REGS);
817163899Smjacob			ISP_WRITE(isp, FPM_DIAG_CONFIG, FPM_SOFT_RESET);
818163899Smjacob			ISP_WRITE(isp, BIU2100_CSR, BIU2100_FB_REGS);
819163899Smjacob			ISP_WRITE(isp, FBM_CMD, FBMCMD_FIFO_RESET_ALL);
820163899Smjacob			ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS);
821163899Smjacob		}
822163899Smjacob	} else {
823163899Smjacob		ISP_WRITE(isp, BIU_ICR, 0);
824163899Smjacob		ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
825163899Smjacob	}
826163899Smjacob}
827163899Smjacob
828155228Smjacob/*
829155228Smjacob * Functions to move stuff to a form that the QLogic RISC engine understands
830155228Smjacob * and functions to move stuff back to a form the processor understands.
831155228Smjacob *
832155228Smjacob * Each platform is required to provide the 8, 16 and 32 bit
833155228Smjacob * swizzle and unswizzle macros (ISP_IOX{PUT|GET}_{8,16,32})
834155228Smjacob *
835155228Smjacob * The assumption is that swizzling and unswizzling is mostly done 'in place'
836155228Smjacob * (with a few exceptions for efficiency).
837155228Smjacob */
838155228Smjacob
839196008Smjacob#define	ISP_IS_SBUS(isp)	(ISP_SBUS_SUPPORTED && (isp)->isp_bustype == ISP_BT_SBUS)
840155228Smjacob
841163899Smjacob#define	ASIZE(x)	(sizeof (x) / sizeof (x[0]))
842155228Smjacob/*
843155228Smjacob * Swizzle/Copy Functions
844155228Smjacob */
845155228Smjacobvoid
846163899Smjacobisp_put_hdr(ispsoftc_t *isp, isphdr_t *hpsrc, isphdr_t *hpdst)
847155228Smjacob{
848155228Smjacob	if (ISP_IS_SBUS(isp)) {
849196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_entry_type, &hpdst->rqs_entry_count);
850196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_entry_count, &hpdst->rqs_entry_type);
851196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_seqno, &hpdst->rqs_flags);
852196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_flags, &hpdst->rqs_seqno);
853155228Smjacob	} else {
854196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_entry_type, &hpdst->rqs_entry_type);
855196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_entry_count, &hpdst->rqs_entry_count);
856196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_seqno, &hpdst->rqs_seqno);
857196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_flags, &hpdst->rqs_flags);
858155228Smjacob	}
859155228Smjacob}
860155228Smjacob
861155228Smjacobvoid
862163899Smjacobisp_get_hdr(ispsoftc_t *isp, isphdr_t *hpsrc, isphdr_t *hpdst)
863155228Smjacob{
864155228Smjacob	if (ISP_IS_SBUS(isp)) {
865196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_entry_type, hpdst->rqs_entry_count);
866196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_entry_count, hpdst->rqs_entry_type);
867196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_seqno, hpdst->rqs_flags);
868196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_flags, hpdst->rqs_seqno);
869155228Smjacob	} else {
870196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_entry_type, hpdst->rqs_entry_type);
871196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_entry_count, hpdst->rqs_entry_count);
872196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_seqno, hpdst->rqs_seqno);
873196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_flags, hpdst->rqs_flags);
874155228Smjacob	}
875155228Smjacob}
876155228Smjacob
877155228Smjacobint
878155704Smjacobisp_get_response_type(ispsoftc_t *isp, isphdr_t *hp)
879155228Smjacob{
880155704Smjacob	uint8_t type;
881155228Smjacob	if (ISP_IS_SBUS(isp)) {
882155228Smjacob		ISP_IOXGET_8(isp, &hp->rqs_entry_count, type);
883155228Smjacob	} else {
884155228Smjacob		ISP_IOXGET_8(isp, &hp->rqs_entry_type, type);
885155228Smjacob	}
886155228Smjacob	return ((int)type);
887155228Smjacob}
888155228Smjacob
889155228Smjacobvoid
890155704Smjacobisp_put_request(ispsoftc_t *isp, ispreq_t *rqsrc, ispreq_t *rqdst)
891155228Smjacob{
892155228Smjacob	int i;
893163899Smjacob	isp_put_hdr(isp, &rqsrc->req_header, &rqdst->req_header);
894155228Smjacob	ISP_IOXPUT_32(isp, rqsrc->req_handle, &rqdst->req_handle);
895155228Smjacob	if (ISP_IS_SBUS(isp)) {
896155228Smjacob		ISP_IOXPUT_8(isp, rqsrc->req_lun_trn, &rqdst->req_target);
897155228Smjacob		ISP_IOXPUT_8(isp, rqsrc->req_target, &rqdst->req_lun_trn);
898155228Smjacob	} else {
899155228Smjacob		ISP_IOXPUT_8(isp, rqsrc->req_lun_trn, &rqdst->req_lun_trn);
900155228Smjacob		ISP_IOXPUT_8(isp, rqsrc->req_target, &rqdst->req_target);
901155228Smjacob	}
902155228Smjacob	ISP_IOXPUT_16(isp, rqsrc->req_cdblen, &rqdst->req_cdblen);
903155228Smjacob	ISP_IOXPUT_16(isp, rqsrc->req_flags, &rqdst->req_flags);
904155228Smjacob	ISP_IOXPUT_16(isp, rqsrc->req_time, &rqdst->req_time);
905155228Smjacob	ISP_IOXPUT_16(isp, rqsrc->req_seg_count, &rqdst->req_seg_count);
906163899Smjacob	for (i = 0; i < ASIZE(rqsrc->req_cdb); i++) {
907155228Smjacob		ISP_IOXPUT_8(isp, rqsrc->req_cdb[i], &rqdst->req_cdb[i]);
908155228Smjacob	}
909155228Smjacob	for (i = 0; i < ISP_RQDSEG; i++) {
910196008Smjacob		ISP_IOXPUT_32(isp, rqsrc->req_dataseg[i].ds_base, &rqdst->req_dataseg[i].ds_base);
911196008Smjacob		ISP_IOXPUT_32(isp, rqsrc->req_dataseg[i].ds_count, &rqdst->req_dataseg[i].ds_count);
912155228Smjacob	}
913155228Smjacob}
914155228Smjacob
915155228Smjacobvoid
916163899Smjacobisp_put_marker(ispsoftc_t *isp, isp_marker_t *src, isp_marker_t *dst)
917155228Smjacob{
918155228Smjacob	int i;
919163899Smjacob	isp_put_hdr(isp, &src->mrk_header, &dst->mrk_header);
920163899Smjacob	ISP_IOXPUT_32(isp, src->mrk_handle, &dst->mrk_handle);
921163899Smjacob	if (ISP_IS_SBUS(isp)) {
922163899Smjacob		ISP_IOXPUT_8(isp, src->mrk_reserved0, &dst->mrk_target);
923163899Smjacob		ISP_IOXPUT_8(isp, src->mrk_target, &dst->mrk_reserved0);
924163899Smjacob	} else {
925163899Smjacob		ISP_IOXPUT_8(isp, src->mrk_reserved0, &dst->mrk_reserved0);
926163899Smjacob		ISP_IOXPUT_8(isp, src->mrk_target, &dst->mrk_target);
927155228Smjacob	}
928163899Smjacob	ISP_IOXPUT_16(isp, src->mrk_modifier, &dst->mrk_modifier);
929163899Smjacob	ISP_IOXPUT_16(isp, src->mrk_flags, &dst->mrk_flags);
930163899Smjacob	ISP_IOXPUT_16(isp, src->mrk_lun, &dst->mrk_lun);
931163899Smjacob	for (i = 0; i < ASIZE(src->mrk_reserved1); i++) {
932196008Smjacob		ISP_IOXPUT_8(isp, src->mrk_reserved1[i], &dst->mrk_reserved1[i]);
933163899Smjacob	}
934163899Smjacob}
935163899Smjacob
936163899Smjacobvoid
937196008Smjacobisp_put_marker_24xx(ispsoftc_t *isp, isp_marker_24xx_t *src, isp_marker_24xx_t *dst)
938163899Smjacob{
939163899Smjacob	int i;
940163899Smjacob	isp_put_hdr(isp, &src->mrk_header, &dst->mrk_header);
941163899Smjacob	ISP_IOXPUT_32(isp, src->mrk_handle, &dst->mrk_handle);
942163899Smjacob	ISP_IOXPUT_16(isp, src->mrk_nphdl, &dst->mrk_nphdl);
943163899Smjacob	ISP_IOXPUT_8(isp, src->mrk_modifier, &dst->mrk_modifier);
944163899Smjacob	ISP_IOXPUT_8(isp, src->mrk_reserved0, &dst->mrk_reserved0);
945163899Smjacob	ISP_IOXPUT_8(isp, src->mrk_reserved1, &dst->mrk_reserved1);
946163899Smjacob	ISP_IOXPUT_8(isp, src->mrk_vphdl, &dst->mrk_vphdl);
947163899Smjacob	ISP_IOXPUT_8(isp, src->mrk_reserved2, &dst->mrk_reserved2);
948163899Smjacob	for (i = 0; i < ASIZE(src->mrk_lun); i++) {
949163899Smjacob		ISP_IOXPUT_8(isp, src->mrk_lun[i], &dst->mrk_lun[i]);
950163899Smjacob	}
951163899Smjacob	for (i = 0; i < ASIZE(src->mrk_reserved3); i++) {
952196008Smjacob		ISP_IOXPUT_8(isp, src->mrk_reserved3[i], &dst->mrk_reserved3[i]);
953163899Smjacob	}
954163899Smjacob}
955163899Smjacob
956163899Smjacobvoid
957163899Smjacobisp_put_request_t2(ispsoftc_t *isp, ispreqt2_t *src, ispreqt2_t *dst)
958163899Smjacob{
959163899Smjacob	int i;
960163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
961163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
962163899Smjacob	ISP_IOXPUT_8(isp, src->req_lun_trn, &dst->req_lun_trn);
963163899Smjacob	ISP_IOXPUT_8(isp, src->req_target, &dst->req_target);
964163899Smjacob	ISP_IOXPUT_16(isp, src->req_scclun, &dst->req_scclun);
965163899Smjacob	ISP_IOXPUT_16(isp, src->req_flags,  &dst->req_flags);
966291209Smav	ISP_IOXPUT_8(isp, src->req_crn, &dst->req_crn);
967291209Smav	ISP_IOXPUT_8(isp, src->req_reserved, &dst->req_reserved);
968163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
969163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
970163899Smjacob	for (i = 0; i < ASIZE(src->req_cdb); i++) {
971163899Smjacob		ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]);
972163899Smjacob	}
973163899Smjacob	ISP_IOXPUT_32(isp, src->req_totalcnt, &dst->req_totalcnt);
974155228Smjacob	for (i = 0; i < ISP_RQDSEG_T2; i++) {
975196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
976196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
977155228Smjacob	}
978155228Smjacob}
979155228Smjacob
980155228Smjacobvoid
981163899Smjacobisp_put_request_t2e(ispsoftc_t *isp, ispreqt2e_t *src, ispreqt2e_t *dst)
982155228Smjacob{
983155228Smjacob	int i;
984163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
985163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
986163899Smjacob	ISP_IOXPUT_16(isp, src->req_target, &dst->req_target);
987163899Smjacob	ISP_IOXPUT_16(isp, src->req_scclun, &dst->req_scclun);
988163899Smjacob	ISP_IOXPUT_16(isp, src->req_flags,  &dst->req_flags);
989291209Smav	ISP_IOXPUT_8(isp, src->req_crn, &dst->req_crn);
990291209Smav	ISP_IOXPUT_8(isp, src->req_reserved, &dst->req_reserved);
991163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
992163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
993163899Smjacob	for (i = 0; i < ASIZE(src->req_cdb); i++) {
994163899Smjacob		ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]);
995155228Smjacob	}
996163899Smjacob	ISP_IOXPUT_32(isp, src->req_totalcnt, &dst->req_totalcnt);
997155228Smjacob	for (i = 0; i < ISP_RQDSEG_T2; i++) {
998196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
999196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
1000155228Smjacob	}
1001155228Smjacob}
1002155228Smjacob
1003155228Smjacobvoid
1004163899Smjacobisp_put_request_t3(ispsoftc_t *isp, ispreqt3_t *src, ispreqt3_t *dst)
1005155228Smjacob{
1006155228Smjacob	int i;
1007163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
1008163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
1009163899Smjacob	ISP_IOXPUT_8(isp, src->req_lun_trn, &dst->req_lun_trn);
1010163899Smjacob	ISP_IOXPUT_8(isp, src->req_target, &dst->req_target);
1011163899Smjacob	ISP_IOXPUT_16(isp, src->req_scclun, &dst->req_scclun);
1012163899Smjacob	ISP_IOXPUT_16(isp, src->req_flags,  &dst->req_flags);
1013238869Smjacob	ISP_IOXPUT_8(isp, src->req_crn, &dst->req_crn);
1014238869Smjacob	ISP_IOXPUT_8(isp, src->req_reserved, &dst->req_reserved);
1015163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
1016163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
1017163899Smjacob	for (i = 0; i < ASIZE(src->req_cdb); i++) {
1018163899Smjacob		ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]);
1019155228Smjacob	}
1020163899Smjacob	ISP_IOXPUT_32(isp, src->req_totalcnt, &dst->req_totalcnt);
1021155228Smjacob	for (i = 0; i < ISP_RQDSEG_T3; i++) {
1022196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
1023196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_basehi, &dst->req_dataseg[i].ds_basehi);
1024196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
1025155228Smjacob	}
1026155228Smjacob}
1027155228Smjacob
1028155228Smjacobvoid
1029163899Smjacobisp_put_request_t3e(ispsoftc_t *isp, ispreqt3e_t *src, ispreqt3e_t *dst)
1030155228Smjacob{
1031155228Smjacob	int i;
1032163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
1033163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
1034163899Smjacob	ISP_IOXPUT_16(isp, src->req_target, &dst->req_target);
1035163899Smjacob	ISP_IOXPUT_16(isp, src->req_scclun, &dst->req_scclun);
1036163899Smjacob	ISP_IOXPUT_16(isp, src->req_flags,  &dst->req_flags);
1037238869Smjacob	ISP_IOXPUT_8(isp, src->req_crn, &dst->req_crn);
1038238869Smjacob	ISP_IOXPUT_8(isp, src->req_reserved, &dst->req_reserved);
1039163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
1040163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
1041163899Smjacob	for (i = 0; i < ASIZE(src->req_cdb); i++) {
1042163899Smjacob		ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]);
1043155228Smjacob	}
1044163899Smjacob	ISP_IOXPUT_32(isp, src->req_totalcnt, &dst->req_totalcnt);
1045155228Smjacob	for (i = 0; i < ISP_RQDSEG_T3; i++) {
1046196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
1047196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_basehi, &dst->req_dataseg[i].ds_basehi);
1048196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
1049155228Smjacob	}
1050155228Smjacob}
1051155228Smjacob
1052155228Smjacobvoid
1053163899Smjacobisp_put_extended_request(ispsoftc_t *isp, ispextreq_t *src, ispextreq_t *dst)
1054155228Smjacob{
1055155228Smjacob	int i;
1056163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
1057163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
1058155228Smjacob	if (ISP_IS_SBUS(isp)) {
1059163899Smjacob		ISP_IOXPUT_8(isp, src->req_lun_trn, &dst->req_target);
1060163899Smjacob		ISP_IOXPUT_8(isp, src->req_target, &dst->req_lun_trn);
1061155228Smjacob	} else {
1062163899Smjacob		ISP_IOXPUT_8(isp, src->req_lun_trn, &dst->req_lun_trn);
1063163899Smjacob		ISP_IOXPUT_8(isp, src->req_target, &dst->req_target);
1064155228Smjacob	}
1065163899Smjacob	ISP_IOXPUT_16(isp, src->req_cdblen, &dst->req_cdblen);
1066163899Smjacob	ISP_IOXPUT_16(isp, src->req_flags, &dst->req_flags);
1067163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
1068163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
1069163899Smjacob	for (i = 0; i < ASIZE(src->req_cdb); i++) {
1070163899Smjacob		ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]);
1071155228Smjacob	}
1072155228Smjacob}
1073155228Smjacob
1074155228Smjacobvoid
1075163899Smjacobisp_put_request_t7(ispsoftc_t *isp, ispreqt7_t *src, ispreqt7_t *dst)
1076155228Smjacob{
1077155228Smjacob	int i;
1078163899Smjacob	uint32_t *a, *b;
1079163899Smjacob
1080163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
1081163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
1082163899Smjacob	ISP_IOXPUT_16(isp, src->req_nphdl, &dst->req_nphdl);
1083163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
1084163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
1085163899Smjacob	ISP_IOXPUT_16(isp, src->req_reserved, &dst->req_reserved);
1086163899Smjacob	a = (uint32_t *) src->req_lun;
1087163899Smjacob	b = (uint32_t *) dst->req_lun;
1088163899Smjacob	for (i = 0; i < (ASIZE(src->req_lun) >> 2); i++ ) {
1089171159Smjacob		*b++ = ISP_SWAP32(isp, *a++);
1090163899Smjacob	}
1091163899Smjacob	ISP_IOXPUT_8(isp, src->req_alen_datadir, &dst->req_alen_datadir);
1092163899Smjacob	ISP_IOXPUT_8(isp, src->req_task_management, &dst->req_task_management);
1093163899Smjacob	ISP_IOXPUT_8(isp, src->req_task_attribute, &dst->req_task_attribute);
1094163899Smjacob	ISP_IOXPUT_8(isp, src->req_crn, &dst->req_crn);
1095163899Smjacob	a = (uint32_t *) src->req_cdb;
1096163899Smjacob	b = (uint32_t *) dst->req_cdb;
1097171159Smjacob	for (i = 0; i < (ASIZE(src->req_cdb) >> 2); i++) {
1098171159Smjacob		*b++ = ISP_SWAP32(isp, *a++);
1099163899Smjacob	}
1100163899Smjacob	ISP_IOXPUT_32(isp, src->req_dl, &dst->req_dl);
1101163899Smjacob	ISP_IOXPUT_16(isp, src->req_tidlo, &dst->req_tidlo);
1102163899Smjacob	ISP_IOXPUT_8(isp, src->req_tidhi, &dst->req_tidhi);
1103163899Smjacob	ISP_IOXPUT_8(isp, src->req_vpidx, &dst->req_vpidx);
1104196008Smjacob	ISP_IOXPUT_32(isp, src->req_dataseg.ds_base, &dst->req_dataseg.ds_base);
1105196008Smjacob	ISP_IOXPUT_32(isp, src->req_dataseg.ds_basehi, &dst->req_dataseg.ds_basehi);
1106196008Smjacob	ISP_IOXPUT_32(isp, src->req_dataseg.ds_count, &dst->req_dataseg.ds_count);
1107163899Smjacob}
1108163899Smjacob
1109163899Smjacobvoid
1110196008Smjacobisp_put_24xx_tmf(ispsoftc_t *isp, isp24xx_tmf_t *src, isp24xx_tmf_t *dst)
1111196008Smjacob{
1112196008Smjacob	int i;
1113196008Smjacob	uint32_t *a, *b;
1114196008Smjacob
1115196008Smjacob	isp_put_hdr(isp, &src->tmf_header, &dst->tmf_header);
1116196008Smjacob	ISP_IOXPUT_32(isp, src->tmf_handle, &dst->tmf_handle);
1117196008Smjacob	ISP_IOXPUT_16(isp, src->tmf_nphdl, &dst->tmf_nphdl);
1118196008Smjacob	ISP_IOXPUT_16(isp, src->tmf_delay, &dst->tmf_delay);
1119196008Smjacob	ISP_IOXPUT_16(isp, src->tmf_timeout, &dst->tmf_timeout);
1120196008Smjacob	for (i = 0; i < ASIZE(src->tmf_reserved0); i++) {
1121196008Smjacob		ISP_IOXPUT_8(isp, src->tmf_reserved0[i], &dst->tmf_reserved0[i]);
1122196008Smjacob	}
1123196008Smjacob	a = (uint32_t *) src->tmf_lun;
1124196008Smjacob	b = (uint32_t *) dst->tmf_lun;
1125196008Smjacob	for (i = 0; i < (ASIZE(src->tmf_lun) >> 2); i++ ) {
1126196008Smjacob		*b++ = ISP_SWAP32(isp, *a++);
1127196008Smjacob	}
1128196008Smjacob	ISP_IOXPUT_32(isp, src->tmf_flags, &dst->tmf_flags);
1129196008Smjacob	for (i = 0; i < ASIZE(src->tmf_reserved1); i++) {
1130196008Smjacob		ISP_IOXPUT_8(isp, src->tmf_reserved1[i], &dst->tmf_reserved1[i]);
1131196008Smjacob	}
1132196008Smjacob	ISP_IOXPUT_16(isp, src->tmf_tidlo, &dst->tmf_tidlo);
1133196008Smjacob	ISP_IOXPUT_8(isp, src->tmf_tidhi, &dst->tmf_tidhi);
1134196008Smjacob	ISP_IOXPUT_8(isp, src->tmf_vpidx, &dst->tmf_vpidx);
1135196008Smjacob	for (i = 0; i < ASIZE(src->tmf_reserved2); i++) {
1136196008Smjacob		ISP_IOXPUT_8(isp, src->tmf_reserved2[i], &dst->tmf_reserved2[i]);
1137196008Smjacob	}
1138196008Smjacob}
1139196008Smjacob
1140196008Smjacobvoid
1141163899Smjacobisp_put_24xx_abrt(ispsoftc_t *isp, isp24xx_abrt_t *src, isp24xx_abrt_t *dst)
1142163899Smjacob{
1143163899Smjacob	int i;
1144163899Smjacob	isp_put_hdr(isp, &src->abrt_header, &dst->abrt_header);
1145163899Smjacob	ISP_IOXPUT_32(isp, src->abrt_handle, &dst->abrt_handle);
1146163899Smjacob	ISP_IOXPUT_16(isp, src->abrt_nphdl, &dst->abrt_nphdl);
1147163899Smjacob	ISP_IOXPUT_16(isp, src->abrt_options, &dst->abrt_options);
1148163899Smjacob	ISP_IOXPUT_32(isp, src->abrt_cmd_handle, &dst->abrt_cmd_handle);
1149289886Smav	ISP_IOXPUT_16(isp, src->abrt_queue_number, &dst->abrt_queue_number);
1150163899Smjacob	for (i = 0; i < ASIZE(src->abrt_reserved); i++) {
1151196008Smjacob		ISP_IOXPUT_8(isp, src->abrt_reserved[i], &dst->abrt_reserved[i]);
1152163899Smjacob	}
1153163899Smjacob	ISP_IOXPUT_16(isp, src->abrt_tidlo, &dst->abrt_tidlo);
1154163899Smjacob	ISP_IOXPUT_8(isp, src->abrt_tidhi, &dst->abrt_tidhi);
1155163899Smjacob	ISP_IOXPUT_8(isp, src->abrt_vpidx, &dst->abrt_vpidx);
1156163899Smjacob	for (i = 0; i < ASIZE(src->abrt_reserved1); i++) {
1157196008Smjacob		ISP_IOXPUT_8(isp, src->abrt_reserved1[i], &dst->abrt_reserved1[i]);
1158163899Smjacob	}
1159163899Smjacob}
1160163899Smjacob
1161163899Smjacobvoid
1162163899Smjacobisp_put_cont_req(ispsoftc_t *isp, ispcontreq_t *src, ispcontreq_t *dst)
1163163899Smjacob{
1164163899Smjacob	int i;
1165163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
1166155228Smjacob	for (i = 0; i < ISP_CDSEG; i++) {
1167196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
1168196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
1169155228Smjacob	}
1170155228Smjacob}
1171155228Smjacob
1172155228Smjacobvoid
1173163899Smjacobisp_put_cont64_req(ispsoftc_t *isp, ispcontreq64_t *src, ispcontreq64_t *dst)
1174155228Smjacob{
1175155228Smjacob	int i;
1176163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
1177155228Smjacob	for (i = 0; i < ISP_CDSEG64; i++) {
1178196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
1179196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_basehi, &dst->req_dataseg[i].ds_basehi);
1180196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
1181155228Smjacob	}
1182155228Smjacob}
1183155228Smjacob
1184155228Smjacobvoid
1185163899Smjacobisp_get_response(ispsoftc_t *isp, ispstatusreq_t *src, ispstatusreq_t *dst)
1186155228Smjacob{
1187155228Smjacob	int i;
1188163899Smjacob	isp_get_hdr(isp, &src->req_header, &dst->req_header);
1189163899Smjacob	ISP_IOXGET_32(isp, &src->req_handle, dst->req_handle);
1190163899Smjacob	ISP_IOXGET_16(isp, &src->req_scsi_status, dst->req_scsi_status);
1191196008Smjacob	ISP_IOXGET_16(isp, &src->req_completion_status, dst->req_completion_status);
1192163899Smjacob	ISP_IOXGET_16(isp, &src->req_state_flags, dst->req_state_flags);
1193163899Smjacob	ISP_IOXGET_16(isp, &src->req_status_flags, dst->req_status_flags);
1194163899Smjacob	ISP_IOXGET_16(isp, &src->req_time, dst->req_time);
1195163899Smjacob	ISP_IOXGET_16(isp, &src->req_sense_len, dst->req_sense_len);
1196163899Smjacob	ISP_IOXGET_32(isp, &src->req_resid, dst->req_resid);
1197238869Smjacob	for (i = 0; i < sizeof (src->req_response); i++) {
1198196008Smjacob		ISP_IOXGET_8(isp, &src->req_response[i], dst->req_response[i]);
1199155228Smjacob	}
1200238869Smjacob	for (i = 0; i < sizeof (src->req_sense_data); i++) {
1201196008Smjacob		ISP_IOXGET_8(isp, &src->req_sense_data[i], dst->req_sense_data[i]);
1202155228Smjacob	}
1203155228Smjacob}
1204155228Smjacob
1205155228Smjacobvoid
1206238869Smjacobisp_get_cont_response(ispsoftc_t *isp, ispstatus_cont_t *src, ispstatus_cont_t *dst)
1207238869Smjacob{
1208238869Smjacob	int i;
1209238869Smjacob	isp_get_hdr(isp, &src->req_header, &dst->req_header);
1210238869Smjacob	if (IS_24XX(isp)) {
1211238869Smjacob		uint32_t *a, *b;
1212238869Smjacob		a = (uint32_t *) src->req_sense_data;
1213238869Smjacob		b = (uint32_t *) dst->req_sense_data;
1214238869Smjacob		for (i = 0; i < (sizeof (src->req_sense_data) / sizeof (uint32_t)); i++) {
1215238869Smjacob			ISP_IOZGET_32(isp, a++, *b++);
1216238869Smjacob		}
1217238869Smjacob	} else {
1218238869Smjacob		for (i = 0; i < sizeof (src->req_sense_data); i++) {
1219238869Smjacob			ISP_IOXGET_8(isp, &src->req_sense_data[i], dst->req_sense_data[i]);
1220238869Smjacob		}
1221238869Smjacob	}
1222238869Smjacob}
1223238869Smjacob
1224238869Smjacobvoid
1225196008Smjacobisp_get_24xx_response(ispsoftc_t *isp, isp24xx_statusreq_t *src, isp24xx_statusreq_t *dst)
1226155228Smjacob{
1227155228Smjacob	int i;
1228171159Smjacob	uint32_t *s, *d;
1229171159Smjacob
1230163899Smjacob	isp_get_hdr(isp, &src->req_header, &dst->req_header);
1231163899Smjacob	ISP_IOXGET_32(isp, &src->req_handle, dst->req_handle);
1232196008Smjacob	ISP_IOXGET_16(isp, &src->req_completion_status, dst->req_completion_status);
1233163899Smjacob	ISP_IOXGET_16(isp, &src->req_oxid, dst->req_oxid);
1234163899Smjacob	ISP_IOXGET_32(isp, &src->req_resid, dst->req_resid);
1235163899Smjacob	ISP_IOXGET_16(isp, &src->req_reserved0, dst->req_reserved0);
1236163899Smjacob	ISP_IOXGET_16(isp, &src->req_state_flags, dst->req_state_flags);
1237289855Smav	ISP_IOXGET_16(isp, &src->req_retry_delay, dst->req_retry_delay);
1238163899Smjacob	ISP_IOXGET_16(isp, &src->req_scsi_status, dst->req_scsi_status);
1239163899Smjacob	ISP_IOXGET_32(isp, &src->req_fcp_residual, dst->req_fcp_residual);
1240163899Smjacob	ISP_IOXGET_32(isp, &src->req_sense_len, dst->req_sense_len);
1241163899Smjacob	ISP_IOXGET_32(isp, &src->req_response_len, dst->req_response_len);
1242171159Smjacob	s = (uint32_t *)src->req_rsp_sense;
1243171159Smjacob	d = (uint32_t *)dst->req_rsp_sense;
1244171159Smjacob	for (i = 0; i < (ASIZE(src->req_rsp_sense) >> 2); i++) {
1245171159Smjacob		d[i] = ISP_SWAP32(isp, s[i]);
1246155228Smjacob	}
1247155228Smjacob}
1248155228Smjacob
1249155228Smjacobvoid
1250163899Smjacobisp_get_24xx_abrt(ispsoftc_t *isp, isp24xx_abrt_t *src, isp24xx_abrt_t *dst)
1251163899Smjacob{
1252163899Smjacob	int i;
1253163899Smjacob	isp_get_hdr(isp, &src->abrt_header, &dst->abrt_header);
1254163899Smjacob	ISP_IOXGET_32(isp, &src->abrt_handle, dst->abrt_handle);
1255163899Smjacob	ISP_IOXGET_16(isp, &src->abrt_nphdl, dst->abrt_nphdl);
1256163899Smjacob	ISP_IOXGET_16(isp, &src->abrt_options, dst->abrt_options);
1257163899Smjacob	ISP_IOXGET_32(isp, &src->abrt_cmd_handle, dst->abrt_cmd_handle);
1258289886Smav	ISP_IOXGET_16(isp, &src->abrt_queue_number, dst->abrt_queue_number);
1259171159Smjacob	for (i = 0; i < ASIZE(src->abrt_reserved); i++) {
1260196008Smjacob		ISP_IOXGET_8(isp, &src->abrt_reserved[i], dst->abrt_reserved[i]);
1261163899Smjacob	}
1262163899Smjacob	ISP_IOXGET_16(isp, &src->abrt_tidlo, dst->abrt_tidlo);
1263163899Smjacob	ISP_IOXGET_8(isp, &src->abrt_tidhi, dst->abrt_tidhi);
1264163899Smjacob	ISP_IOXGET_8(isp, &src->abrt_vpidx, dst->abrt_vpidx);
1265171159Smjacob	for (i = 0; i < ASIZE(src->abrt_reserved1); i++) {
1266196008Smjacob		ISP_IOXGET_8(isp, &src->abrt_reserved1[i], dst->abrt_reserved1[i]);
1267163899Smjacob	}
1268163899Smjacob}
1269163899Smjacob
1270163899Smjacob
1271163899Smjacobvoid
1272204397Smjacobisp_get_rio1(ispsoftc_t *isp, isp_rio1_t *r1src, isp_rio1_t *r1dst)
1273204397Smjacob{
1274204397Smjacob	const int lim = sizeof (r1dst->req_handles) / sizeof (r1dst->req_handles[0]);
1275204397Smjacob	int i;
1276204397Smjacob	isp_get_hdr(isp, &r1src->req_header, &r1dst->req_header);
1277204397Smjacob	if (r1dst->req_header.rqs_seqno > lim) {
1278204397Smjacob		r1dst->req_header.rqs_seqno = lim;
1279204397Smjacob	}
1280204397Smjacob	for (i = 0; i < r1dst->req_header.rqs_seqno; i++) {
1281204397Smjacob		ISP_IOXGET_32(isp, &r1src->req_handles[i], r1dst->req_handles[i]);
1282204397Smjacob	}
1283204397Smjacob	while (i < lim) {
1284204397Smjacob		r1dst->req_handles[i++] = 0;
1285204397Smjacob	}
1286204397Smjacob}
1287204397Smjacob
1288204397Smjacobvoid
1289155704Smjacobisp_get_rio2(ispsoftc_t *isp, isp_rio2_t *r2src, isp_rio2_t *r2dst)
1290155228Smjacob{
1291204397Smjacob	const int lim = sizeof (r2dst->req_handles) / sizeof (r2dst->req_handles[0]);
1292155228Smjacob	int i;
1293204397Smjacob
1294163899Smjacob	isp_get_hdr(isp, &r2src->req_header, &r2dst->req_header);
1295204397Smjacob	if (r2dst->req_header.rqs_seqno > lim) {
1296204397Smjacob		r2dst->req_header.rqs_seqno = lim;
1297163899Smjacob	}
1298155228Smjacob	for (i = 0; i < r2dst->req_header.rqs_seqno; i++) {
1299196008Smjacob		ISP_IOXGET_16(isp, &r2src->req_handles[i], r2dst->req_handles[i]);
1300155228Smjacob	}
1301204397Smjacob	while (i < lim) {
1302155228Smjacob		r2dst->req_handles[i++] = 0;
1303155228Smjacob	}
1304155228Smjacob}
1305155228Smjacob
1306155228Smjacobvoid
1307163899Smjacobisp_put_icb(ispsoftc_t *isp, isp_icb_t *src, isp_icb_t *dst)
1308155228Smjacob{
1309155228Smjacob	int i;
1310155228Smjacob	if (ISP_IS_SBUS(isp)) {
1311163899Smjacob		ISP_IOXPUT_8(isp, src->icb_version, &dst->icb_reserved0);
1312163899Smjacob		ISP_IOXPUT_8(isp, src->icb_reserved0, &dst->icb_version);
1313155228Smjacob	} else {
1314163899Smjacob		ISP_IOXPUT_8(isp, src->icb_version, &dst->icb_version);
1315163899Smjacob		ISP_IOXPUT_8(isp, src->icb_reserved0, &dst->icb_reserved0);
1316155228Smjacob	}
1317163899Smjacob	ISP_IOXPUT_16(isp, src->icb_fwoptions, &dst->icb_fwoptions);
1318163899Smjacob	ISP_IOXPUT_16(isp, src->icb_maxfrmlen, &dst->icb_maxfrmlen);
1319163899Smjacob	ISP_IOXPUT_16(isp, src->icb_maxalloc, &dst->icb_maxalloc);
1320163899Smjacob	ISP_IOXPUT_16(isp, src->icb_execthrottle, &dst->icb_execthrottle);
1321155228Smjacob	if (ISP_IS_SBUS(isp)) {
1322163899Smjacob		ISP_IOXPUT_8(isp, src->icb_retry_count, &dst->icb_retry_delay);
1323163899Smjacob		ISP_IOXPUT_8(isp, src->icb_retry_delay, &dst->icb_retry_count);
1324155228Smjacob	} else {
1325163899Smjacob		ISP_IOXPUT_8(isp, src->icb_retry_count, &dst->icb_retry_count);
1326163899Smjacob		ISP_IOXPUT_8(isp, src->icb_retry_delay, &dst->icb_retry_delay);
1327155228Smjacob	}
1328155228Smjacob	for (i = 0; i < 8; i++) {
1329163899Smjacob		ISP_IOXPUT_8(isp, src->icb_portname[i], &dst->icb_portname[i]);
1330155228Smjacob	}
1331163899Smjacob	ISP_IOXPUT_16(isp, src->icb_hardaddr, &dst->icb_hardaddr);
1332155228Smjacob	if (ISP_IS_SBUS(isp)) {
1333163899Smjacob		ISP_IOXPUT_8(isp, src->icb_iqdevtype, &dst->icb_logintime);
1334163899Smjacob		ISP_IOXPUT_8(isp, src->icb_logintime, &dst->icb_iqdevtype);
1335155228Smjacob	} else {
1336163899Smjacob		ISP_IOXPUT_8(isp, src->icb_iqdevtype, &dst->icb_iqdevtype);
1337163899Smjacob		ISP_IOXPUT_8(isp, src->icb_logintime, &dst->icb_logintime);
1338155228Smjacob	}
1339155228Smjacob	for (i = 0; i < 8; i++) {
1340163899Smjacob		ISP_IOXPUT_8(isp, src->icb_nodename[i], &dst->icb_nodename[i]);
1341155228Smjacob	}
1342163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rqstout, &dst->icb_rqstout);
1343163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rspnsin, &dst->icb_rspnsin);
1344163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rqstqlen, &dst->icb_rqstqlen);
1345163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rsltqlen, &dst->icb_rsltqlen);
1346155228Smjacob	for (i = 0; i < 4; i++) {
1347163899Smjacob		ISP_IOXPUT_16(isp, src->icb_rqstaddr[i], &dst->icb_rqstaddr[i]);
1348155228Smjacob	}
1349155228Smjacob	for (i = 0; i < 4; i++) {
1350163899Smjacob		ISP_IOXPUT_16(isp, src->icb_respaddr[i], &dst->icb_respaddr[i]);
1351155228Smjacob	}
1352163899Smjacob	ISP_IOXPUT_16(isp, src->icb_lunenables, &dst->icb_lunenables);
1353155228Smjacob	if (ISP_IS_SBUS(isp)) {
1354163899Smjacob		ISP_IOXPUT_8(isp, src->icb_ccnt, &dst->icb_icnt);
1355163899Smjacob		ISP_IOXPUT_8(isp, src->icb_icnt, &dst->icb_ccnt);
1356155228Smjacob	} else {
1357163899Smjacob		ISP_IOXPUT_8(isp, src->icb_ccnt, &dst->icb_ccnt);
1358163899Smjacob		ISP_IOXPUT_8(isp, src->icb_icnt, &dst->icb_icnt);
1359155228Smjacob	}
1360163899Smjacob	ISP_IOXPUT_16(isp, src->icb_lunetimeout, &dst->icb_lunetimeout);
1361163899Smjacob	ISP_IOXPUT_16(isp, src->icb_reserved1, &dst->icb_reserved1);
1362163899Smjacob	ISP_IOXPUT_16(isp, src->icb_xfwoptions, &dst->icb_xfwoptions);
1363155228Smjacob	if (ISP_IS_SBUS(isp)) {
1364163899Smjacob		ISP_IOXPUT_8(isp, src->icb_racctimer, &dst->icb_idelaytimer);
1365163899Smjacob		ISP_IOXPUT_8(isp, src->icb_idelaytimer, &dst->icb_racctimer);
1366155228Smjacob	} else {
1367163899Smjacob		ISP_IOXPUT_8(isp, src->icb_racctimer, &dst->icb_racctimer);
1368163899Smjacob		ISP_IOXPUT_8(isp, src->icb_idelaytimer, &dst->icb_idelaytimer);
1369155228Smjacob	}
1370163899Smjacob	ISP_IOXPUT_16(isp, src->icb_zfwoptions, &dst->icb_zfwoptions);
1371155228Smjacob}
1372155228Smjacob
1373155228Smjacobvoid
1374163899Smjacobisp_put_icb_2400(ispsoftc_t *isp, isp_icb_2400_t *src, isp_icb_2400_t *dst)
1375155228Smjacob{
1376155228Smjacob	int i;
1377163899Smjacob	ISP_IOXPUT_16(isp, src->icb_version, &dst->icb_version);
1378163899Smjacob	ISP_IOXPUT_16(isp, src->icb_reserved0, &dst->icb_reserved0);
1379163899Smjacob	ISP_IOXPUT_16(isp, src->icb_maxfrmlen, &dst->icb_maxfrmlen);
1380163899Smjacob	ISP_IOXPUT_16(isp, src->icb_execthrottle, &dst->icb_execthrottle);
1381163899Smjacob	ISP_IOXPUT_16(isp, src->icb_xchgcnt, &dst->icb_xchgcnt);
1382163899Smjacob	ISP_IOXPUT_16(isp, src->icb_hardaddr, &dst->icb_hardaddr);
1383163899Smjacob	for (i = 0; i < 8; i++) {
1384163899Smjacob		ISP_IOXPUT_8(isp, src->icb_portname[i], &dst->icb_portname[i]);
1385163899Smjacob	}
1386163899Smjacob	for (i = 0; i < 8; i++) {
1387163899Smjacob		ISP_IOXPUT_8(isp, src->icb_nodename[i], &dst->icb_nodename[i]);
1388163899Smjacob	}
1389163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rspnsin, &dst->icb_rspnsin);
1390163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rqstout, &dst->icb_rqstout);
1391163899Smjacob	ISP_IOXPUT_16(isp, src->icb_retry_count, &dst->icb_retry_count);
1392163899Smjacob	ISP_IOXPUT_16(isp, src->icb_priout, &dst->icb_priout);
1393163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rsltqlen, &dst->icb_rsltqlen);
1394163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rqstqlen, &dst->icb_rqstqlen);
1395163899Smjacob	ISP_IOXPUT_16(isp, src->icb_ldn_nols, &dst->icb_ldn_nols);
1396163899Smjacob	ISP_IOXPUT_16(isp, src->icb_prqstqlen, &dst->icb_prqstqlen);
1397163899Smjacob	for (i = 0; i < 4; i++) {
1398163899Smjacob		ISP_IOXPUT_16(isp, src->icb_rqstaddr[i], &dst->icb_rqstaddr[i]);
1399163899Smjacob	}
1400163899Smjacob	for (i = 0; i < 4; i++) {
1401163899Smjacob		ISP_IOXPUT_16(isp, src->icb_respaddr[i], &dst->icb_respaddr[i]);
1402163899Smjacob	}
1403163899Smjacob	for (i = 0; i < 4; i++) {
1404163899Smjacob		ISP_IOXPUT_16(isp, src->icb_priaddr[i], &dst->icb_priaddr[i]);
1405163899Smjacob	}
1406163899Smjacob	for (i = 0; i < 4; i++) {
1407196008Smjacob		ISP_IOXPUT_16(isp, src->icb_reserved1[i], &dst->icb_reserved1[i]);
1408163899Smjacob	}
1409163899Smjacob	ISP_IOXPUT_16(isp, src->icb_atio_in, &dst->icb_atio_in);
1410163899Smjacob	ISP_IOXPUT_16(isp, src->icb_atioqlen, &dst->icb_atioqlen);
1411163899Smjacob	for (i = 0; i < 4; i++) {
1412196008Smjacob		ISP_IOXPUT_16(isp, src->icb_atioqaddr[i], &dst->icb_atioqaddr[i]);
1413163899Smjacob	}
1414163899Smjacob	ISP_IOXPUT_16(isp, src->icb_idelaytimer, &dst->icb_idelaytimer);
1415163899Smjacob	ISP_IOXPUT_16(isp, src->icb_logintime, &dst->icb_logintime);
1416163899Smjacob	ISP_IOXPUT_32(isp, src->icb_fwoptions1, &dst->icb_fwoptions1);
1417163899Smjacob	ISP_IOXPUT_32(isp, src->icb_fwoptions2, &dst->icb_fwoptions2);
1418163899Smjacob	ISP_IOXPUT_32(isp, src->icb_fwoptions3, &dst->icb_fwoptions3);
1419163899Smjacob	for (i = 0; i < 12; i++) {
1420196008Smjacob		ISP_IOXPUT_16(isp, src->icb_reserved2[i], &dst->icb_reserved2[i]);
1421163899Smjacob	}
1422163899Smjacob}
1423163899Smjacob
1424163899Smjacobvoid
1425196008Smjacobisp_put_icb_2400_vpinfo(ispsoftc_t *isp, isp_icb_2400_vpinfo_t *src, isp_icb_2400_vpinfo_t *dst)
1426196008Smjacob{
1427196008Smjacob	ISP_IOXPUT_16(isp, src->vp_count, &dst->vp_count);
1428196008Smjacob	ISP_IOXPUT_16(isp, src->vp_global_options, &dst->vp_global_options);
1429196008Smjacob}
1430196008Smjacob
1431196008Smjacobvoid
1432196008Smjacobisp_put_vp_port_info(ispsoftc_t *isp, vp_port_info_t *src, vp_port_info_t *dst)
1433196008Smjacob{
1434196008Smjacob	int i;
1435196008Smjacob	ISP_IOXPUT_16(isp, src->vp_port_status, &dst->vp_port_status);
1436196008Smjacob	ISP_IOXPUT_8(isp, src->vp_port_options, &dst->vp_port_options);
1437196008Smjacob	ISP_IOXPUT_8(isp, src->vp_port_loopid, &dst->vp_port_loopid);
1438196008Smjacob	for (i = 0; i < 8; i++) {
1439196008Smjacob		ISP_IOXPUT_8(isp, src->vp_port_portname[i], &dst->vp_port_portname[i]);
1440196008Smjacob	}
1441196008Smjacob	for (i = 0; i < 8; i++) {
1442196008Smjacob		ISP_IOXPUT_8(isp, src->vp_port_nodename[i], &dst->vp_port_nodename[i]);
1443196008Smjacob	}
1444196008Smjacob	/* we never *put* portid_lo/portid_hi */
1445196008Smjacob}
1446196008Smjacob
1447196008Smjacobvoid
1448196008Smjacobisp_get_vp_port_info(ispsoftc_t *isp, vp_port_info_t *src, vp_port_info_t *dst)
1449196008Smjacob{
1450196008Smjacob	int i;
1451196008Smjacob	ISP_IOXGET_16(isp, &src->vp_port_status, dst->vp_port_status);
1452196008Smjacob	ISP_IOXGET_8(isp, &src->vp_port_options, dst->vp_port_options);
1453196008Smjacob	ISP_IOXGET_8(isp, &src->vp_port_loopid, dst->vp_port_loopid);
1454196008Smjacob	for (i = 0; i < ASIZE(src->vp_port_portname); i++) {
1455196008Smjacob		ISP_IOXGET_8(isp, &src->vp_port_portname[i], dst->vp_port_portname[i]);
1456196008Smjacob	}
1457196008Smjacob	for (i = 0; i < ASIZE(src->vp_port_nodename); i++) {
1458196008Smjacob		ISP_IOXGET_8(isp, &src->vp_port_nodename[i], dst->vp_port_nodename[i]);
1459196008Smjacob	}
1460196008Smjacob	ISP_IOXGET_16(isp, &src->vp_port_portid_lo, dst->vp_port_portid_lo);
1461196008Smjacob	ISP_IOXGET_16(isp, &src->vp_port_portid_hi, dst->vp_port_portid_hi);
1462196008Smjacob}
1463196008Smjacob
1464196008Smjacobvoid
1465196008Smjacobisp_put_vp_ctrl_info(ispsoftc_t *isp, vp_ctrl_info_t *src, vp_ctrl_info_t *dst)
1466196008Smjacob{
1467196008Smjacob	int i;
1468196008Smjacob	isp_put_hdr(isp, &src->vp_ctrl_hdr, &dst->vp_ctrl_hdr);
1469196008Smjacob	ISP_IOXPUT_32(isp, src->vp_ctrl_handle, &dst->vp_ctrl_handle);
1470196008Smjacob	ISP_IOXPUT_16(isp, src->vp_ctrl_index_fail, &dst->vp_ctrl_index_fail);
1471196008Smjacob	ISP_IOXPUT_16(isp, src->vp_ctrl_status, &dst->vp_ctrl_status);
1472196008Smjacob	ISP_IOXPUT_16(isp, src->vp_ctrl_command, &dst->vp_ctrl_command);
1473196008Smjacob	ISP_IOXPUT_16(isp, src->vp_ctrl_vp_count, &dst->vp_ctrl_vp_count);
1474196008Smjacob	for (i = 0; i < ASIZE(src->vp_ctrl_idmap); i++) {
1475196008Smjacob		ISP_IOXPUT_16(isp, src->vp_ctrl_idmap[i], &dst->vp_ctrl_idmap[i]);
1476196008Smjacob	}
1477196008Smjacob	for (i = 0; i < ASIZE(src->vp_ctrl_reserved); i++) {
1478290018Smav		ISP_IOXPUT_16(isp, src->vp_ctrl_reserved[i], &dst->vp_ctrl_reserved[i]);
1479196008Smjacob	}
1480290018Smav	ISP_IOXPUT_16(isp, src->vp_ctrl_fcf_index, &dst->vp_ctrl_fcf_index);
1481196008Smjacob}
1482196008Smjacob
1483196008Smjacobvoid
1484196008Smjacobisp_get_vp_ctrl_info(ispsoftc_t *isp, vp_ctrl_info_t *src, vp_ctrl_info_t *dst)
1485196008Smjacob{
1486196008Smjacob	int i;
1487196008Smjacob	isp_get_hdr(isp, &src->vp_ctrl_hdr, &dst->vp_ctrl_hdr);
1488196008Smjacob	ISP_IOXGET_32(isp, &src->vp_ctrl_handle, dst->vp_ctrl_handle);
1489196008Smjacob	ISP_IOXGET_16(isp, &src->vp_ctrl_index_fail, dst->vp_ctrl_index_fail);
1490196008Smjacob	ISP_IOXGET_16(isp, &src->vp_ctrl_status, dst->vp_ctrl_status);
1491196008Smjacob	ISP_IOXGET_16(isp, &src->vp_ctrl_command, dst->vp_ctrl_command);
1492196008Smjacob	ISP_IOXGET_16(isp, &src->vp_ctrl_vp_count, dst->vp_ctrl_vp_count);
1493196008Smjacob	for (i = 0; i < ASIZE(src->vp_ctrl_idmap); i++) {
1494196008Smjacob		ISP_IOXGET_16(isp, &src->vp_ctrl_idmap[i], dst->vp_ctrl_idmap[i]);
1495196008Smjacob	}
1496196008Smjacob	for (i = 0; i < ASIZE(src->vp_ctrl_reserved); i++) {
1497290018Smav		ISP_IOXGET_16(isp, &src->vp_ctrl_reserved[i], dst->vp_ctrl_reserved[i]);
1498196008Smjacob	}
1499290018Smav	ISP_IOXGET_16(isp, &src->vp_ctrl_fcf_index, dst->vp_ctrl_fcf_index);
1500196008Smjacob}
1501196008Smjacob
1502196008Smjacobvoid
1503196008Smjacobisp_put_vp_modify(ispsoftc_t *isp, vp_modify_t *src, vp_modify_t *dst)
1504196008Smjacob{
1505196008Smjacob	int i, j;
1506196008Smjacob	isp_put_hdr(isp, &src->vp_mod_hdr, &dst->vp_mod_hdr);
1507196008Smjacob	ISP_IOXPUT_32(isp, src->vp_mod_hdl, &dst->vp_mod_hdl);
1508196008Smjacob	ISP_IOXPUT_16(isp, src->vp_mod_reserved0, &dst->vp_mod_reserved0);
1509196008Smjacob	ISP_IOXPUT_16(isp, src->vp_mod_status, &dst->vp_mod_status);
1510196008Smjacob	ISP_IOXPUT_8(isp, src->vp_mod_cmd, &dst->vp_mod_cmd);
1511196008Smjacob	ISP_IOXPUT_8(isp, src->vp_mod_cnt, &dst->vp_mod_cnt);
1512196008Smjacob	ISP_IOXPUT_8(isp, src->vp_mod_idx0, &dst->vp_mod_idx0);
1513196008Smjacob	ISP_IOXPUT_8(isp, src->vp_mod_idx1, &dst->vp_mod_idx1);
1514196008Smjacob	for (i = 0; i < ASIZE(src->vp_mod_ports); i++) {
1515196008Smjacob		ISP_IOXPUT_8(isp, src->vp_mod_ports[i].options, &dst->vp_mod_ports[i].options);
1516196008Smjacob		ISP_IOXPUT_8(isp, src->vp_mod_ports[i].loopid, &dst->vp_mod_ports[i].loopid);
1517196008Smjacob		ISP_IOXPUT_16(isp, src->vp_mod_ports[i].reserved1, &dst->vp_mod_ports[i].reserved1);
1518196008Smjacob		for (j = 0; j < ASIZE(src->vp_mod_ports[i].wwpn); j++) {
1519196008Smjacob			ISP_IOXPUT_8(isp, src->vp_mod_ports[i].wwpn[j], &dst->vp_mod_ports[i].wwpn[j]);
1520196008Smjacob		}
1521196008Smjacob		for (j = 0; j < ASIZE(src->vp_mod_ports[i].wwnn); j++) {
1522196008Smjacob			ISP_IOXPUT_8(isp, src->vp_mod_ports[i].wwnn[j], &dst->vp_mod_ports[i].wwnn[j]);
1523196008Smjacob		}
1524196008Smjacob	}
1525196008Smjacob	for (i = 0; i < ASIZE(src->vp_mod_reserved2); i++) {
1526196008Smjacob		ISP_IOXPUT_8(isp, src->vp_mod_reserved2[i], &dst->vp_mod_reserved2[i]);
1527196008Smjacob	}
1528196008Smjacob}
1529196008Smjacob
1530196008Smjacobvoid
1531196008Smjacobisp_get_vp_modify(ispsoftc_t *isp, vp_modify_t *src, vp_modify_t *dst)
1532196008Smjacob{
1533196008Smjacob	int i, j;
1534196008Smjacob	isp_get_hdr(isp, &src->vp_mod_hdr, &dst->vp_mod_hdr);
1535196008Smjacob	ISP_IOXGET_32(isp, &src->vp_mod_hdl, dst->vp_mod_hdl);
1536196008Smjacob	ISP_IOXGET_16(isp, &src->vp_mod_reserved0, dst->vp_mod_reserved0);
1537196008Smjacob	ISP_IOXGET_16(isp, &src->vp_mod_status, dst->vp_mod_status);
1538196008Smjacob	ISP_IOXGET_8(isp, &src->vp_mod_cmd, dst->vp_mod_cmd);
1539196008Smjacob	ISP_IOXGET_8(isp, &src->vp_mod_cnt, dst->vp_mod_cnt);
1540196008Smjacob	ISP_IOXGET_8(isp, &src->vp_mod_idx0, dst->vp_mod_idx0);
1541196008Smjacob	ISP_IOXGET_8(isp, &src->vp_mod_idx1, dst->vp_mod_idx1);
1542196008Smjacob	for (i = 0; i < ASIZE(src->vp_mod_ports); i++) {
1543196008Smjacob		ISP_IOXGET_8(isp, &src->vp_mod_ports[i].options, dst->vp_mod_ports[i].options);
1544196008Smjacob		ISP_IOXGET_8(isp, &src->vp_mod_ports[i].loopid, dst->vp_mod_ports[i].loopid);
1545196008Smjacob		ISP_IOXGET_16(isp, &src->vp_mod_ports[i].reserved1, dst->vp_mod_ports[i].reserved1);
1546196008Smjacob		for (j = 0; j < ASIZE(src->vp_mod_ports[i].wwpn); j++) {
1547196008Smjacob			ISP_IOXGET_8(isp, &src->vp_mod_ports[i].wwpn[j], dst->vp_mod_ports[i].wwpn[j]);
1548196008Smjacob		}
1549196008Smjacob		for (j = 0; j < ASIZE(src->vp_mod_ports[i].wwnn); j++) {
1550196008Smjacob			ISP_IOXGET_8(isp, &src->vp_mod_ports[i].wwnn[j], dst->vp_mod_ports[i].wwnn[j]);
1551196008Smjacob		}
1552196008Smjacob	}
1553196008Smjacob	for (i = 0; i < ASIZE(src->vp_mod_reserved2); i++) {
1554196008Smjacob		ISP_IOXGET_8(isp, &src->vp_mod_reserved2[i], dst->vp_mod_reserved2[i]);
1555196008Smjacob	}
1556196008Smjacob}
1557196008Smjacob
1558196008Smjacobvoid
1559163899Smjacobisp_get_pdb_21xx(ispsoftc_t *isp, isp_pdb_21xx_t *src, isp_pdb_21xx_t *dst)
1560163899Smjacob{
1561163899Smjacob	int i;
1562155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_options, dst->pdb_options);
1563155228Smjacob        ISP_IOXGET_8(isp, &src->pdb_mstate, dst->pdb_mstate);
1564155228Smjacob        ISP_IOXGET_8(isp, &src->pdb_sstate, dst->pdb_sstate);
1565155228Smjacob	for (i = 0; i < 4; i++) {
1566196008Smjacob		ISP_IOXGET_8(isp, &src->pdb_hardaddr_bits[i], dst->pdb_hardaddr_bits[i]);
1567155228Smjacob	}
1568155228Smjacob	for (i = 0; i < 4; i++) {
1569196008Smjacob		ISP_IOXGET_8(isp, &src->pdb_portid_bits[i], dst->pdb_portid_bits[i]);
1570155228Smjacob	}
1571155228Smjacob	for (i = 0; i < 8; i++) {
1572155228Smjacob		ISP_IOXGET_8(isp, &src->pdb_nodename[i], dst->pdb_nodename[i]);
1573155228Smjacob	}
1574155228Smjacob	for (i = 0; i < 8; i++) {
1575155228Smjacob		ISP_IOXGET_8(isp, &src->pdb_portname[i], dst->pdb_portname[i]);
1576155228Smjacob	}
1577155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_execthrottle, dst->pdb_execthrottle);
1578155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_exec_count, dst->pdb_exec_count);
1579155228Smjacob	ISP_IOXGET_8(isp, &src->pdb_retry_count, dst->pdb_retry_count);
1580155228Smjacob	ISP_IOXGET_8(isp, &src->pdb_retry_delay, dst->pdb_retry_delay);
1581155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_resalloc, dst->pdb_resalloc);
1582155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_curalloc, dst->pdb_curalloc);
1583155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_qhead, dst->pdb_qhead);
1584155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_qtail, dst->pdb_qtail);
1585155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_tl_next, dst->pdb_tl_next);
1586155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_tl_last, dst->pdb_tl_last);
1587155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_features, dst->pdb_features);
1588155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_pconcurrnt, dst->pdb_pconcurrnt);
1589155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_roi, dst->pdb_roi);
1590155228Smjacob	ISP_IOXGET_8(isp, &src->pdb_target, dst->pdb_target);
1591155228Smjacob	ISP_IOXGET_8(isp, &src->pdb_initiator, dst->pdb_initiator);
1592155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_rdsiz, dst->pdb_rdsiz);
1593155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_ncseq, dst->pdb_ncseq);
1594155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_noseq, dst->pdb_noseq);
1595155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_labrtflg, dst->pdb_labrtflg);
1596155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_lstopflg, dst->pdb_lstopflg);
1597155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_sqhead, dst->pdb_sqhead);
1598155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_sqtail, dst->pdb_sqtail);
1599155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_ptimer, dst->pdb_ptimer);
1600155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_nxt_seqid, dst->pdb_nxt_seqid);
1601155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_fcount, dst->pdb_fcount);
1602155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_prli_len, dst->pdb_prli_len);
1603155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_prli_svc0, dst->pdb_prli_svc0);
1604155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_prli_svc3, dst->pdb_prli_svc3);
1605155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_loopid, dst->pdb_loopid);
1606155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_il_ptr, dst->pdb_il_ptr);
1607155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_sl_ptr, dst->pdb_sl_ptr);
1608155228Smjacob}
1609155228Smjacob
1610163899Smjacobvoid
1611163899Smjacobisp_get_pdb_24xx(ispsoftc_t *isp, isp_pdb_24xx_t *src, isp_pdb_24xx_t *dst)
1612163899Smjacob{
1613163899Smjacob	int i;
1614163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_flags, dst->pdb_flags);
1615163899Smjacob        ISP_IOXGET_8(isp, &src->pdb_curstate, dst->pdb_curstate);
1616163899Smjacob        ISP_IOXGET_8(isp, &src->pdb_laststate, dst->pdb_laststate);
1617163899Smjacob	for (i = 0; i < 4; i++) {
1618196008Smjacob		ISP_IOXGET_8(isp, &src->pdb_hardaddr_bits[i], dst->pdb_hardaddr_bits[i]);
1619163899Smjacob	}
1620163899Smjacob	for (i = 0; i < 4; i++) {
1621196008Smjacob		ISP_IOXGET_8(isp, &src->pdb_portid_bits[i], dst->pdb_portid_bits[i]);
1622163899Smjacob	}
1623163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_retry_timer, dst->pdb_retry_timer);
1624163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_handle, dst->pdb_handle);
1625163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_rcv_dsize, dst->pdb_rcv_dsize);
1626163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_reserved0, dst->pdb_reserved0);
1627163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_prli_svc0, dst->pdb_prli_svc0);
1628163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_prli_svc3, dst->pdb_prli_svc3);
1629163899Smjacob	for (i = 0; i < 8; i++) {
1630163899Smjacob		ISP_IOXGET_8(isp, &src->pdb_nodename[i], dst->pdb_nodename[i]);
1631163899Smjacob	}
1632163899Smjacob	for (i = 0; i < 8; i++) {
1633163899Smjacob		ISP_IOXGET_8(isp, &src->pdb_portname[i], dst->pdb_portname[i]);
1634163899Smjacob	}
1635163899Smjacob	for (i = 0; i < 24; i++) {
1636196008Smjacob		ISP_IOXGET_8(isp, &src->pdb_reserved1[i], dst->pdb_reserved1[i]);
1637163899Smjacob	}
1638163899Smjacob}
1639155228Smjacob
1640290104Smavvoid
1641290104Smavisp_get_pnhle_21xx(ispsoftc_t *isp, isp_pnhle_21xx_t *src, isp_pnhle_21xx_t *dst)
1642290104Smav{
1643290104Smav
1644290104Smav	ISP_IOXGET_16(isp, &src->pnhle_port_id_lo, dst->pnhle_port_id_lo);
1645290104Smav	ISP_IOXGET_16(isp, &src->pnhle_port_id_hi_handle, dst->pnhle_port_id_hi_handle);
1646290104Smav}
1647290104Smav
1648290104Smavvoid
1649290104Smavisp_get_pnhle_23xx(ispsoftc_t *isp, isp_pnhle_23xx_t *src, isp_pnhle_23xx_t *dst)
1650290104Smav{
1651290104Smav
1652290104Smav	ISP_IOXGET_16(isp, &src->pnhle_port_id_lo, dst->pnhle_port_id_lo);
1653290104Smav	ISP_IOXGET_16(isp, &src->pnhle_port_id_hi, dst->pnhle_port_id_hi);
1654290104Smav	ISP_IOXGET_16(isp, &src->pnhle_handle, dst->pnhle_handle);
1655290104Smav}
1656290104Smav
1657290104Smavvoid
1658290104Smavisp_get_pnhle_24xx(ispsoftc_t *isp, isp_pnhle_24xx_t *src, isp_pnhle_24xx_t *dst)
1659290104Smav{
1660290104Smav
1661290104Smav	ISP_IOXGET_16(isp, &src->pnhle_port_id_lo, dst->pnhle_port_id_lo);
1662290104Smav	ISP_IOXGET_16(isp, &src->pnhle_port_id_hi, dst->pnhle_port_id_hi);
1663290104Smav	ISP_IOXGET_16(isp, &src->pnhle_handle, dst->pnhle_handle);
1664290104Smav	ISP_IOXGET_16(isp, &src->pnhle_reserved, dst->pnhle_reserved);
1665290104Smav}
1666290104Smav
1667290104Smavvoid
1668290104Smavisp_get_pnnle(ispsoftc_t *isp, isp_pnnle_t *src, isp_pnnle_t *dst)
1669290104Smav{
1670290104Smav	int i;
1671290104Smav
1672290104Smav	for (i = 0; i < 8; i++)
1673290104Smav		ISP_IOXGET_8(isp, &src->pnnle_name[i], dst->pnnle_name[i]);
1674290104Smav	ISP_IOXGET_16(isp, &src->pnnle_handle, dst->pnnle_handle);
1675290104Smav	ISP_IOXGET_16(isp, &src->pnnle_reserved, dst->pnnle_reserved);
1676290104Smav}
1677290104Smav
1678155228Smjacob/*
1679163899Smjacob * PLOGI/LOGO IOCB canonicalization
1680155228Smjacob */
1681163899Smjacob
1682155228Smjacobvoid
1683163899Smjacobisp_get_plogx(ispsoftc_t *isp, isp_plogx_t *src, isp_plogx_t *dst)
1684155228Smjacob{
1685163899Smjacob	int i;
1686163899Smjacob	isp_get_hdr(isp, &src->plogx_header, &dst->plogx_header);
1687163899Smjacob	ISP_IOXGET_32(isp, &src->plogx_handle, dst->plogx_handle);
1688163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_status, dst->plogx_status);
1689163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_nphdl, dst->plogx_nphdl);
1690163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_flags, dst->plogx_flags);
1691163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_vphdl, dst->plogx_vphdl);
1692163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_portlo, dst->plogx_portlo);
1693163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_rspsz_porthi, dst->plogx_rspsz_porthi);
1694163899Smjacob	for (i = 0; i < 11; i++) {
1695196008Smjacob		ISP_IOXGET_16(isp, &src->plogx_ioparm[i].lo16, dst->plogx_ioparm[i].lo16);
1696196008Smjacob		ISP_IOXGET_16(isp, &src->plogx_ioparm[i].hi16, dst->plogx_ioparm[i].hi16);
1697163899Smjacob	}
1698155228Smjacob}
1699155228Smjacob
1700163899Smjacobvoid
1701163899Smjacobisp_put_plogx(ispsoftc_t *isp, isp_plogx_t *src, isp_plogx_t *dst)
1702163899Smjacob{
1703163899Smjacob	int i;
1704163899Smjacob	isp_put_hdr(isp, &src->plogx_header, &dst->plogx_header);
1705163899Smjacob	ISP_IOXPUT_32(isp, src->plogx_handle, &dst->plogx_handle);
1706163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_status, &dst->plogx_status);
1707163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_nphdl, &dst->plogx_nphdl);
1708163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_flags, &dst->plogx_flags);
1709163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_vphdl, &dst->plogx_vphdl);
1710163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_portlo, &dst->plogx_portlo);
1711163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_rspsz_porthi, &dst->plogx_rspsz_porthi);
1712163899Smjacob	for (i = 0; i < 11; i++) {
1713196008Smjacob		ISP_IOXPUT_16(isp, src->plogx_ioparm[i].lo16, &dst->plogx_ioparm[i].lo16);
1714196008Smjacob		ISP_IOXPUT_16(isp, src->plogx_ioparm[i].hi16, &dst->plogx_ioparm[i].hi16);
1715163899Smjacob	}
1716163899Smjacob}
1717163899Smjacob
1718155228Smjacob/*
1719196008Smjacob * Report ID canonicalization
1720196008Smjacob */
1721196008Smjacobvoid
1722196008Smjacobisp_get_ridacq(ispsoftc_t *isp, isp_ridacq_t *src, isp_ridacq_t *dst)
1723196008Smjacob{
1724196008Smjacob	int i;
1725196008Smjacob	isp_get_hdr(isp, &src->ridacq_hdr, &dst->ridacq_hdr);
1726196008Smjacob	ISP_IOXGET_32(isp, &src->ridacq_handle, dst->ridacq_handle);
1727290978Smav	ISP_IOXGET_8(isp, &src->ridacq_vp_acquired, dst->ridacq_vp_acquired);
1728290978Smav	ISP_IOXGET_8(isp, &src->ridacq_vp_setup, dst->ridacq_vp_setup);
1729290978Smav	ISP_IOXGET_8(isp, &src->ridacq_vp_index, dst->ridacq_vp_index);
1730290978Smav	ISP_IOXGET_8(isp, &src->ridacq_vp_status, dst->ridacq_vp_status);
1731196008Smjacob	ISP_IOXGET_16(isp, &src->ridacq_vp_port_lo, dst->ridacq_vp_port_lo);
1732196008Smjacob	ISP_IOXGET_8(isp, &src->ridacq_vp_port_hi, dst->ridacq_vp_port_hi);
1733196008Smjacob	ISP_IOXGET_8(isp, &src->ridacq_format, dst->ridacq_format);
1734196008Smjacob	for (i = 0; i < sizeof (src->ridacq_map) / sizeof (src->ridacq_map[0]); i++) {
1735196008Smjacob		ISP_IOXGET_16(isp, &src->ridacq_map[i], dst->ridacq_map[i]);
1736196008Smjacob	}
1737196008Smjacob	for (i = 0; i < sizeof (src->ridacq_reserved1) / sizeof (src->ridacq_reserved1[0]); i++) {
1738196008Smjacob		ISP_IOXGET_16(isp, &src->ridacq_reserved1[i], dst->ridacq_reserved1[i]);
1739196008Smjacob	}
1740196008Smjacob}
1741196008Smjacob
1742196008Smjacob
1743196008Smjacob/*
1744163899Smjacob * CT Passthru canonicalization
1745163899Smjacob */
1746163899Smjacobvoid
1747163899Smjacobisp_get_ct_pt(ispsoftc_t *isp, isp_ct_pt_t *src, isp_ct_pt_t *dst)
1748163899Smjacob{
1749163899Smjacob	int i;
1750163899Smjacob
1751163899Smjacob	isp_get_hdr(isp, &src->ctp_header, &dst->ctp_header);
1752163899Smjacob	ISP_IOXGET_32(isp, &src->ctp_handle, dst->ctp_handle);
1753163899Smjacob	ISP_IOXGET_16(isp, &src->ctp_status, dst->ctp_status);
1754163899Smjacob	ISP_IOXGET_16(isp, &src->ctp_nphdl, dst->ctp_nphdl);
1755163899Smjacob	ISP_IOXGET_16(isp, &src->ctp_cmd_cnt, dst->ctp_cmd_cnt);
1756196008Smjacob	ISP_IOXGET_8(isp, &src->ctp_vpidx, dst->ctp_vpidx);
1757196008Smjacob	ISP_IOXGET_8(isp, &src->ctp_reserved0, dst->ctp_reserved0);
1758163899Smjacob	ISP_IOXGET_16(isp, &src->ctp_time, dst->ctp_time);
1759196008Smjacob	ISP_IOXGET_16(isp, &src->ctp_reserved1, dst->ctp_reserved1);
1760163899Smjacob	ISP_IOXGET_16(isp, &src->ctp_rsp_cnt, dst->ctp_rsp_cnt);
1761163899Smjacob	for (i = 0; i < 5; i++) {
1762196008Smjacob		ISP_IOXGET_16(isp, &src->ctp_reserved2[i], dst->ctp_reserved2[i]);
1763163899Smjacob	}
1764163899Smjacob	ISP_IOXGET_32(isp, &src->ctp_rsp_bcnt, dst->ctp_rsp_bcnt);
1765163899Smjacob	ISP_IOXGET_32(isp, &src->ctp_cmd_bcnt, dst->ctp_cmd_bcnt);
1766163899Smjacob	for (i = 0; i < 2; i++) {
1767196008Smjacob		ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_base, dst->ctp_dataseg[i].ds_base);
1768196008Smjacob		ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_basehi, dst->ctp_dataseg[i].ds_basehi);
1769196008Smjacob		ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_count, dst->ctp_dataseg[i].ds_count);
1770163899Smjacob	}
1771163899Smjacob}
1772163899Smjacob
1773163899Smjacobvoid
1774164370Smjacobisp_get_ms(ispsoftc_t *isp, isp_ms_t *src, isp_ms_t *dst)
1775164370Smjacob{
1776164370Smjacob	int i;
1777164370Smjacob
1778164370Smjacob	isp_get_hdr(isp, &src->ms_header, &dst->ms_header);
1779164370Smjacob	ISP_IOXGET_32(isp, &src->ms_handle, dst->ms_handle);
1780164370Smjacob	ISP_IOXGET_16(isp, &src->ms_nphdl, dst->ms_nphdl);
1781164370Smjacob	ISP_IOXGET_16(isp, &src->ms_status, dst->ms_status);
1782164370Smjacob	ISP_IOXGET_16(isp, &src->ms_flags, dst->ms_flags);
1783164370Smjacob	ISP_IOXGET_16(isp, &src->ms_reserved1, dst->ms_reserved1);
1784164370Smjacob	ISP_IOXGET_16(isp, &src->ms_time, dst->ms_time);
1785164370Smjacob	ISP_IOXGET_16(isp, &src->ms_cmd_cnt, dst->ms_cmd_cnt);
1786164370Smjacob	ISP_IOXGET_16(isp, &src->ms_tot_cnt, dst->ms_tot_cnt);
1787164370Smjacob	ISP_IOXGET_8(isp, &src->ms_type, dst->ms_type);
1788164370Smjacob	ISP_IOXGET_8(isp, &src->ms_r_ctl, dst->ms_r_ctl);
1789164370Smjacob	ISP_IOXGET_16(isp, &src->ms_rxid, dst->ms_rxid);
1790164370Smjacob	ISP_IOXGET_16(isp, &src->ms_reserved2, dst->ms_reserved2);
1791164370Smjacob	ISP_IOXGET_32(isp, &src->ms_rsp_bcnt, dst->ms_rsp_bcnt);
1792164370Smjacob	ISP_IOXGET_32(isp, &src->ms_cmd_bcnt, dst->ms_cmd_bcnt);
1793164370Smjacob	for (i = 0; i < 2; i++) {
1794196008Smjacob		ISP_IOXGET_32(isp, &src->ms_dataseg[i].ds_base, dst->ms_dataseg[i].ds_base);
1795196008Smjacob		ISP_IOXGET_32(isp, &src->ms_dataseg[i].ds_basehi, dst->ms_dataseg[i].ds_basehi);
1796196008Smjacob		ISP_IOXGET_32(isp, &src->ms_dataseg[i].ds_count, dst->ms_dataseg[i].ds_count);
1797164370Smjacob	}
1798164370Smjacob}
1799164370Smjacob
1800164370Smjacobvoid
1801163899Smjacobisp_put_ct_pt(ispsoftc_t *isp, isp_ct_pt_t *src, isp_ct_pt_t *dst)
1802163899Smjacob{
1803163899Smjacob	int i;
1804163899Smjacob
1805163899Smjacob	isp_put_hdr(isp, &src->ctp_header, &dst->ctp_header);
1806163899Smjacob	ISP_IOXPUT_32(isp, src->ctp_handle, &dst->ctp_handle);
1807163899Smjacob	ISP_IOXPUT_16(isp, src->ctp_status, &dst->ctp_status);
1808163899Smjacob	ISP_IOXPUT_16(isp, src->ctp_nphdl, &dst->ctp_nphdl);
1809163899Smjacob	ISP_IOXPUT_16(isp, src->ctp_cmd_cnt, &dst->ctp_cmd_cnt);
1810196008Smjacob	ISP_IOXPUT_8(isp, src->ctp_vpidx, &dst->ctp_vpidx);
1811196008Smjacob	ISP_IOXPUT_8(isp, src->ctp_reserved0, &dst->ctp_reserved0);
1812163899Smjacob	ISP_IOXPUT_16(isp, src->ctp_time, &dst->ctp_time);
1813196008Smjacob	ISP_IOXPUT_16(isp, src->ctp_reserved1, &dst->ctp_reserved1);
1814163899Smjacob	ISP_IOXPUT_16(isp, src->ctp_rsp_cnt, &dst->ctp_rsp_cnt);
1815163899Smjacob	for (i = 0; i < 5; i++) {
1816196008Smjacob		ISP_IOXPUT_16(isp, src->ctp_reserved2[i], &dst->ctp_reserved2[i]);
1817163899Smjacob	}
1818163899Smjacob	ISP_IOXPUT_32(isp, src->ctp_rsp_bcnt, &dst->ctp_rsp_bcnt);
1819163899Smjacob	ISP_IOXPUT_32(isp, src->ctp_cmd_bcnt, &dst->ctp_cmd_bcnt);
1820163899Smjacob	for (i = 0; i < 2; i++) {
1821196008Smjacob		ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_base, &dst->ctp_dataseg[i].ds_base);
1822196008Smjacob		ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_basehi, &dst->ctp_dataseg[i].ds_basehi);
1823196008Smjacob		ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_count, &dst->ctp_dataseg[i].ds_count);
1824163899Smjacob	}
1825163899Smjacob}
1826163899Smjacob
1827164370Smjacobvoid
1828164370Smjacobisp_put_ms(ispsoftc_t *isp, isp_ms_t *src, isp_ms_t *dst)
1829164370Smjacob{
1830164370Smjacob	int i;
1831164370Smjacob
1832164370Smjacob	isp_put_hdr(isp, &src->ms_header, &dst->ms_header);
1833164370Smjacob	ISP_IOXPUT_32(isp, src->ms_handle, &dst->ms_handle);
1834164370Smjacob	ISP_IOXPUT_16(isp, src->ms_nphdl, &dst->ms_nphdl);
1835164370Smjacob	ISP_IOXPUT_16(isp, src->ms_status, &dst->ms_status);
1836164370Smjacob	ISP_IOXPUT_16(isp, src->ms_flags, &dst->ms_flags);
1837164370Smjacob	ISP_IOXPUT_16(isp, src->ms_reserved1, &dst->ms_reserved1);
1838164370Smjacob	ISP_IOXPUT_16(isp, src->ms_time, &dst->ms_time);
1839164370Smjacob	ISP_IOXPUT_16(isp, src->ms_cmd_cnt, &dst->ms_cmd_cnt);
1840164370Smjacob	ISP_IOXPUT_16(isp, src->ms_tot_cnt, &dst->ms_tot_cnt);
1841164370Smjacob	ISP_IOXPUT_8(isp, src->ms_type, &dst->ms_type);
1842164370Smjacob	ISP_IOXPUT_8(isp, src->ms_r_ctl, &dst->ms_r_ctl);
1843164370Smjacob	ISP_IOXPUT_16(isp, src->ms_rxid, &dst->ms_rxid);
1844164370Smjacob	ISP_IOXPUT_16(isp, src->ms_reserved2, &dst->ms_reserved2);
1845164370Smjacob	ISP_IOXPUT_32(isp, src->ms_rsp_bcnt, &dst->ms_rsp_bcnt);
1846164370Smjacob	ISP_IOXPUT_32(isp, src->ms_cmd_bcnt, &dst->ms_cmd_bcnt);
1847164370Smjacob	for (i = 0; i < 2; i++) {
1848196008Smjacob		ISP_IOXPUT_32(isp, src->ms_dataseg[i].ds_base, &dst->ms_dataseg[i].ds_base);
1849196008Smjacob		ISP_IOXPUT_32(isp, src->ms_dataseg[i].ds_basehi, &dst->ms_dataseg[i].ds_basehi);
1850196008Smjacob		ISP_IOXPUT_32(isp, src->ms_dataseg[i].ds_count, &dst->ms_dataseg[i].ds_count);
1851164370Smjacob	}
1852164370Smjacob}
1853164370Smjacob
1854163899Smjacob/*
1855155228Smjacob * Generic SNS request - not particularly useful since the per-command data
1856155228Smjacob * isn't always 16 bit words.
1857155228Smjacob */
1858155228Smjacobvoid
1859155704Smjacobisp_put_sns_request(ispsoftc_t *isp, sns_screq_t *src, sns_screq_t *dst)
1860155228Smjacob{
1861155228Smjacob	int i, nw = (int) src->snscb_sblen;
1862155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
1863155228Smjacob	for (i = 0; i < 4; i++) {
1864155228Smjacob		ISP_IOXPUT_16(isp, src->snscb_addr[i], &dst->snscb_addr[i]);
1865155228Smjacob	}
1866155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
1867155228Smjacob	for (i = 0; i < nw; i++) {
1868155228Smjacob		ISP_IOXPUT_16(isp, src->snscb_data[i], &dst->snscb_data[i]);
1869155228Smjacob	}
1870155228Smjacob}
1871155228Smjacob
1872155228Smjacobvoid
1873196008Smjacobisp_put_gid_ft_request(ispsoftc_t *isp, sns_gid_ft_req_t *src, sns_gid_ft_req_t *dst)
1874155228Smjacob{
1875155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
1876163899Smjacob	ISP_IOXPUT_16(isp, src->snscb_reserved0, &dst->snscb_reserved0);
1877155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[0], &dst->snscb_addr[0]);
1878155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[1], &dst->snscb_addr[1]);
1879155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[2], &dst->snscb_addr[2]);
1880155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[3], &dst->snscb_addr[3]);
1881155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
1882163899Smjacob	ISP_IOXPUT_16(isp, src->snscb_reserved1, &dst->snscb_reserved1);
1883155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_cmd, &dst->snscb_cmd);
1884155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_mword_div_2, &dst->snscb_mword_div_2);
1885163899Smjacob	ISP_IOXPUT_32(isp, src->snscb_reserved3, &dst->snscb_reserved3);
1886155228Smjacob	ISP_IOXPUT_32(isp, src->snscb_fc4_type, &dst->snscb_fc4_type);
1887155228Smjacob}
1888155228Smjacob
1889155228Smjacobvoid
1890196008Smjacobisp_put_gxn_id_request(ispsoftc_t *isp, sns_gxn_id_req_t *src, sns_gxn_id_req_t *dst)
1891155228Smjacob{
1892155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
1893163899Smjacob	ISP_IOXPUT_16(isp, src->snscb_reserved0, &dst->snscb_reserved0);
1894155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[0], &dst->snscb_addr[0]);
1895155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[1], &dst->snscb_addr[1]);
1896155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[2], &dst->snscb_addr[2]);
1897155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[3], &dst->snscb_addr[3]);
1898155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
1899163899Smjacob	ISP_IOXPUT_16(isp, src->snscb_reserved1, &dst->snscb_reserved1);
1900155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_cmd, &dst->snscb_cmd);
1901163899Smjacob	ISP_IOXPUT_16(isp, src->snscb_reserved2, &dst->snscb_reserved2);
1902163899Smjacob	ISP_IOXPUT_32(isp, src->snscb_reserved3, &dst->snscb_reserved3);
1903155228Smjacob	ISP_IOXPUT_32(isp, src->snscb_portid, &dst->snscb_portid);
1904155228Smjacob}
1905155228Smjacob
1906155228Smjacob/*
1907155228Smjacob * Generic SNS response - not particularly useful since the per-command data
1908155228Smjacob * isn't always 16 bit words.
1909155228Smjacob */
1910155228Smjacobvoid
1911196008Smjacobisp_get_sns_response(ispsoftc_t *isp, sns_scrsp_t *src, sns_scrsp_t *dst, int nwords)
1912155228Smjacob{
1913155228Smjacob	int i;
1914155228Smjacob	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1915155228Smjacob	ISP_IOXGET_8(isp, &src->snscb_port_type, dst->snscb_port_type);
1916155228Smjacob	for (i = 0; i < 3; i++) {
1917155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_port_id[i],
1918155228Smjacob		    dst->snscb_port_id[i]);
1919155228Smjacob	}
1920155228Smjacob	for (i = 0; i < 8; i++) {
1921155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_portname[i],
1922155228Smjacob		    dst->snscb_portname[i]);
1923155228Smjacob	}
1924155228Smjacob	for (i = 0; i < nwords; i++) {
1925155228Smjacob		ISP_IOXGET_16(isp, &src->snscb_data[i], dst->snscb_data[i]);
1926155228Smjacob	}
1927155228Smjacob}
1928155228Smjacob
1929155228Smjacobvoid
1930196008Smjacobisp_get_gid_ft_response(ispsoftc_t *isp, sns_gid_ft_rsp_t *src, sns_gid_ft_rsp_t *dst, int nwords)
1931155228Smjacob{
1932155228Smjacob	int i;
1933155228Smjacob	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1934155228Smjacob	for (i = 0; i < nwords; i++) {
1935155228Smjacob		int j;
1936196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_ports[i].control, dst->snscb_ports[i].control);
1937155228Smjacob		for (j = 0; j < 3; j++) {
1938196008Smjacob			ISP_IOXGET_8(isp, &src->snscb_ports[i].portid[j], dst->snscb_ports[i].portid[j]);
1939155228Smjacob		}
1940155228Smjacob		if (dst->snscb_ports[i].control & 0x80) {
1941155228Smjacob			break;
1942155228Smjacob		}
1943155228Smjacob	}
1944155228Smjacob}
1945155228Smjacob
1946155228Smjacobvoid
1947196008Smjacobisp_get_gxn_id_response(ispsoftc_t *isp, sns_gxn_id_rsp_t *src, sns_gxn_id_rsp_t *dst)
1948155228Smjacob{
1949155228Smjacob	int i;
1950155228Smjacob	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1951196008Smjacob	for (i = 0; i < 8; i++) {
1952155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_wwn[i], dst->snscb_wwn[i]);
1953196008Smjacob	}
1954155228Smjacob}
1955155228Smjacob
1956155228Smjacobvoid
1957196008Smjacobisp_get_gff_id_response(ispsoftc_t *isp, sns_gff_id_rsp_t *src, sns_gff_id_rsp_t *dst)
1958155228Smjacob{
1959155228Smjacob	int i;
1960155228Smjacob	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1961155228Smjacob	for (i = 0; i < 32; i++) {
1962196008Smjacob		ISP_IOXGET_32(isp, &src->snscb_fc4_features[i], dst->snscb_fc4_features[i]);
1963155228Smjacob	}
1964155228Smjacob}
1965155228Smjacob
1966155228Smjacobvoid
1967196008Smjacobisp_get_ga_nxt_response(ispsoftc_t *isp, sns_ga_nxt_rsp_t *src, sns_ga_nxt_rsp_t *dst)
1968155228Smjacob{
1969155228Smjacob	int i;
1970155228Smjacob	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1971155228Smjacob	ISP_IOXGET_8(isp, &src->snscb_port_type, dst->snscb_port_type);
1972155228Smjacob	for (i = 0; i < 3; i++) {
1973196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_port_id[i], dst->snscb_port_id[i]);
1974155228Smjacob	}
1975155228Smjacob	for (i = 0; i < 8; i++) {
1976196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_portname[i], dst->snscb_portname[i]);
1977155228Smjacob	}
1978155228Smjacob	ISP_IOXGET_8(isp, &src->snscb_pnlen, dst->snscb_pnlen);
1979155228Smjacob	for (i = 0; i < 255; i++) {
1980155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_pname[i], dst->snscb_pname[i]);
1981155228Smjacob	}
1982155228Smjacob	for (i = 0; i < 8; i++) {
1983196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_nodename[i], dst->snscb_nodename[i]);
1984155228Smjacob	}
1985155228Smjacob	ISP_IOXGET_8(isp, &src->snscb_nnlen, dst->snscb_nnlen);
1986155228Smjacob	for (i = 0; i < 255; i++) {
1987155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_nname[i], dst->snscb_nname[i]);
1988155228Smjacob	}
1989155228Smjacob	for (i = 0; i < 8; i++) {
1990196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_ipassoc[i], dst->snscb_ipassoc[i]);
1991155228Smjacob	}
1992155228Smjacob	for (i = 0; i < 16; i++) {
1993155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_ipaddr[i], dst->snscb_ipaddr[i]);
1994155228Smjacob	}
1995155228Smjacob	for (i = 0; i < 4; i++) {
1996196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_svc_class[i], dst->snscb_svc_class[i]);
1997155228Smjacob	}
1998155228Smjacob	for (i = 0; i < 32; i++) {
1999196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_fc4_types[i], dst->snscb_fc4_types[i]);
2000155228Smjacob	}
2001155228Smjacob	for (i = 0; i < 8; i++) {
2002155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_fpname[i], dst->snscb_fpname[i]);
2003155228Smjacob	}
2004155228Smjacob	ISP_IOXGET_8(isp, &src->snscb_reserved, dst->snscb_reserved);
2005155228Smjacob	for (i = 0; i < 3; i++) {
2006196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_hardaddr[i], dst->snscb_hardaddr[i]);
2007155228Smjacob	}
2008155228Smjacob}
2009155228Smjacob
2010163899Smjacobvoid
2011163899Smjacobisp_get_els(ispsoftc_t *isp, els_t *src, els_t *dst)
2012163899Smjacob{
2013163899Smjacob	int i;
2014163899Smjacob
2015163899Smjacob	isp_get_hdr(isp, &src->els_hdr, &dst->els_hdr);
2016163899Smjacob	ISP_IOXGET_32(isp, &src->els_handle, dst->els_handle);
2017163899Smjacob	ISP_IOXGET_16(isp, &src->els_status, dst->els_status);
2018163899Smjacob	ISP_IOXGET_16(isp, &src->els_nphdl, dst->els_nphdl);
2019163899Smjacob	ISP_IOXGET_16(isp, &src->els_xmit_dsd_count, dst->els_xmit_dsd_count);
2020163899Smjacob	ISP_IOXGET_8(isp, &src->els_vphdl, dst->els_vphdl);
2021163899Smjacob	ISP_IOXGET_8(isp, &src->els_sof, dst->els_sof);
2022163899Smjacob	ISP_IOXGET_32(isp, &src->els_rxid, dst->els_rxid);
2023163899Smjacob	ISP_IOXGET_16(isp, &src->els_recv_dsd_count, dst->els_recv_dsd_count);
2024163899Smjacob	ISP_IOXGET_8(isp, &src->els_opcode, dst->els_opcode);
2025163899Smjacob	ISP_IOXGET_8(isp, &src->els_reserved2, dst->els_reserved1);
2026163899Smjacob	ISP_IOXGET_8(isp, &src->els_did_lo, dst->els_did_lo);
2027163899Smjacob	ISP_IOXGET_8(isp, &src->els_did_mid, dst->els_did_mid);
2028163899Smjacob	ISP_IOXGET_8(isp, &src->els_did_hi, dst->els_did_hi);
2029163899Smjacob	ISP_IOXGET_8(isp, &src->els_reserved2, dst->els_reserved2);
2030163899Smjacob	ISP_IOXGET_16(isp, &src->els_reserved3, dst->els_reserved3);
2031163899Smjacob	ISP_IOXGET_16(isp, &src->els_ctl_flags, dst->els_ctl_flags);
2032163899Smjacob	ISP_IOXGET_32(isp, &src->els_bytecnt, dst->els_bytecnt);
2033163899Smjacob	ISP_IOXGET_32(isp, &src->els_subcode1, dst->els_subcode1);
2034163899Smjacob	ISP_IOXGET_32(isp, &src->els_subcode2, dst->els_subcode2);
2035163899Smjacob	for (i = 0; i < 20; i++) {
2036196008Smjacob		ISP_IOXGET_8(isp, &src->els_reserved4[i], dst->els_reserved4[i]);
2037163899Smjacob	}
2038163899Smjacob}
2039163899Smjacob
2040163899Smjacobvoid
2041163899Smjacobisp_put_els(ispsoftc_t *isp, els_t *src, els_t *dst)
2042163899Smjacob{
2043163899Smjacob	isp_put_hdr(isp, &src->els_hdr, &dst->els_hdr);
2044163899Smjacob	ISP_IOXPUT_32(isp, src->els_handle, &dst->els_handle);
2045163899Smjacob	ISP_IOXPUT_16(isp, src->els_status, &dst->els_status);
2046163899Smjacob	ISP_IOXPUT_16(isp, src->els_nphdl, &dst->els_nphdl);
2047163899Smjacob	ISP_IOXPUT_16(isp, src->els_xmit_dsd_count, &dst->els_xmit_dsd_count);
2048163899Smjacob	ISP_IOXPUT_8(isp, src->els_vphdl, &dst->els_vphdl);
2049163899Smjacob	ISP_IOXPUT_8(isp, src->els_sof, &dst->els_sof);
2050163899Smjacob	ISP_IOXPUT_32(isp, src->els_rxid, &dst->els_rxid);
2051163899Smjacob	ISP_IOXPUT_16(isp, src->els_recv_dsd_count, &dst->els_recv_dsd_count);
2052163899Smjacob	ISP_IOXPUT_8(isp, src->els_opcode, &dst->els_opcode);
2053163899Smjacob	ISP_IOXPUT_8(isp, src->els_reserved2, &dst->els_reserved1);
2054163899Smjacob	ISP_IOXPUT_8(isp, src->els_did_lo, &dst->els_did_lo);
2055163899Smjacob	ISP_IOXPUT_8(isp, src->els_did_mid, &dst->els_did_mid);
2056163899Smjacob	ISP_IOXPUT_8(isp, src->els_did_hi, &dst->els_did_hi);
2057163899Smjacob	ISP_IOXPUT_8(isp, src->els_reserved2, &dst->els_reserved2);
2058163899Smjacob	ISP_IOXPUT_16(isp, src->els_reserved3, &dst->els_reserved3);
2059163899Smjacob	ISP_IOXPUT_16(isp, src->els_ctl_flags, &dst->els_ctl_flags);
2060163899Smjacob	ISP_IOXPUT_32(isp, src->els_recv_bytecnt, &dst->els_recv_bytecnt);
2061163899Smjacob	ISP_IOXPUT_32(isp, src->els_xmit_bytecnt, &dst->els_xmit_bytecnt);
2062163899Smjacob	ISP_IOXPUT_32(isp, src->els_xmit_dsd_length, &dst->els_xmit_dsd_length);
2063163899Smjacob	ISP_IOXPUT_16(isp, src->els_xmit_dsd_a1500, &dst->els_xmit_dsd_a1500);
2064163899Smjacob	ISP_IOXPUT_16(isp, src->els_xmit_dsd_a3116, &dst->els_xmit_dsd_a3116);
2065163899Smjacob	ISP_IOXPUT_16(isp, src->els_xmit_dsd_a4732, &dst->els_xmit_dsd_a4732);
2066163899Smjacob	ISP_IOXPUT_16(isp, src->els_xmit_dsd_a6348, &dst->els_xmit_dsd_a6348);
2067163899Smjacob	ISP_IOXPUT_32(isp, src->els_recv_dsd_length, &dst->els_recv_dsd_length);
2068163899Smjacob	ISP_IOXPUT_16(isp, src->els_recv_dsd_a1500, &dst->els_recv_dsd_a1500);
2069163899Smjacob	ISP_IOXPUT_16(isp, src->els_recv_dsd_a3116, &dst->els_recv_dsd_a3116);
2070163899Smjacob	ISP_IOXPUT_16(isp, src->els_recv_dsd_a4732, &dst->els_recv_dsd_a4732);
2071163899Smjacob	ISP_IOXPUT_16(isp, src->els_recv_dsd_a6348, &dst->els_recv_dsd_a6348);
2072163899Smjacob}
2073163899Smjacob
2074163899Smjacob/*
2075163899Smjacob * FC Structure Canonicalization
2076163899Smjacob */
2077163899Smjacob
2078163899Smjacobvoid
2079163899Smjacobisp_get_fc_hdr(ispsoftc_t *isp, fc_hdr_t *src, fc_hdr_t *dst)
2080163899Smjacob{
2081163899Smjacob        ISP_IOZGET_8(isp, &src->r_ctl, dst->r_ctl);
2082163899Smjacob        ISP_IOZGET_8(isp, &src->d_id[0], dst->d_id[0]);
2083163899Smjacob        ISP_IOZGET_8(isp, &src->d_id[1], dst->d_id[1]);
2084163899Smjacob        ISP_IOZGET_8(isp, &src->d_id[2], dst->d_id[2]);
2085163899Smjacob        ISP_IOZGET_8(isp, &src->cs_ctl, dst->cs_ctl);
2086163899Smjacob        ISP_IOZGET_8(isp, &src->s_id[0], dst->s_id[0]);
2087163899Smjacob        ISP_IOZGET_8(isp, &src->s_id[1], dst->s_id[1]);
2088163899Smjacob        ISP_IOZGET_8(isp, &src->s_id[2], dst->s_id[2]);
2089163899Smjacob        ISP_IOZGET_8(isp, &src->type, dst->type);
2090196008Smjacob        ISP_IOZGET_8(isp, &src->f_ctl[0], dst->f_ctl[0]);
2091196008Smjacob        ISP_IOZGET_8(isp, &src->f_ctl[1], dst->f_ctl[1]);
2092196008Smjacob        ISP_IOZGET_8(isp, &src->f_ctl[2], dst->f_ctl[2]);
2093163899Smjacob        ISP_IOZGET_8(isp, &src->seq_id, dst->seq_id);
2094163899Smjacob        ISP_IOZGET_8(isp, &src->df_ctl, dst->df_ctl);
2095163899Smjacob        ISP_IOZGET_16(isp, &src->seq_cnt, dst->seq_cnt);
2096163899Smjacob        ISP_IOZGET_16(isp, &src->ox_id, dst->ox_id);
2097163899Smjacob        ISP_IOZGET_16(isp, &src->rx_id, dst->rx_id);
2098163899Smjacob        ISP_IOZGET_32(isp, &src->parameter, dst->parameter);
2099163899Smjacob}
2100163899Smjacob
2101163899Smjacobvoid
2102238869Smjacobisp_put_fc_hdr(ispsoftc_t *isp, fc_hdr_t *src, fc_hdr_t *dst)
2103238869Smjacob{
2104238869Smjacob        ISP_IOZPUT_8(isp, src->r_ctl, &dst->r_ctl);
2105238869Smjacob        ISP_IOZPUT_8(isp, src->d_id[0], &dst->d_id[0]);
2106238869Smjacob        ISP_IOZPUT_8(isp, src->d_id[1], &dst->d_id[1]);
2107238869Smjacob        ISP_IOZPUT_8(isp, src->d_id[2], &dst->d_id[2]);
2108238869Smjacob        ISP_IOZPUT_8(isp, src->cs_ctl, &dst->cs_ctl);
2109238869Smjacob        ISP_IOZPUT_8(isp, src->s_id[0], &dst->s_id[0]);
2110238869Smjacob        ISP_IOZPUT_8(isp, src->s_id[1], &dst->s_id[1]);
2111238869Smjacob        ISP_IOZPUT_8(isp, src->s_id[2], &dst->s_id[2]);
2112238869Smjacob        ISP_IOZPUT_8(isp, src->type, &dst->type);
2113238869Smjacob        ISP_IOZPUT_8(isp, src->f_ctl[0], &dst->f_ctl[0]);
2114238869Smjacob        ISP_IOZPUT_8(isp, src->f_ctl[1], &dst->f_ctl[1]);
2115238869Smjacob        ISP_IOZPUT_8(isp, src->f_ctl[2], &dst->f_ctl[2]);
2116238869Smjacob        ISP_IOZPUT_8(isp, src->seq_id, &dst->seq_id);
2117238869Smjacob        ISP_IOZPUT_8(isp, src->df_ctl, &dst->df_ctl);
2118238869Smjacob        ISP_IOZPUT_16(isp, src->seq_cnt, &dst->seq_cnt);
2119238869Smjacob        ISP_IOZPUT_16(isp, src->ox_id, &dst->ox_id);
2120238869Smjacob        ISP_IOZPUT_16(isp, src->rx_id, &dst->rx_id);
2121238869Smjacob        ISP_IOZPUT_32(isp, src->parameter, &dst->parameter);
2122238869Smjacob}
2123238869Smjacob
2124238869Smjacobvoid
2125163899Smjacobisp_get_fcp_cmnd_iu(ispsoftc_t *isp, fcp_cmnd_iu_t *src, fcp_cmnd_iu_t *dst)
2126163899Smjacob{
2127163899Smjacob	int i;
2128163899Smjacob
2129163899Smjacob	for (i = 0; i < 8; i++) {
2130163899Smjacob		ISP_IOZGET_8(isp, &src->fcp_cmnd_lun[i], dst->fcp_cmnd_lun[i]);
2131163899Smjacob	}
2132163899Smjacob        ISP_IOZGET_8(isp, &src->fcp_cmnd_crn, dst->fcp_cmnd_crn);
2133196008Smjacob        ISP_IOZGET_8(isp, &src->fcp_cmnd_task_attribute, dst->fcp_cmnd_task_attribute);
2134196008Smjacob        ISP_IOZGET_8(isp, &src->fcp_cmnd_task_management, dst->fcp_cmnd_task_management);
2135196008Smjacob        ISP_IOZGET_8(isp, &src->fcp_cmnd_alen_datadir, dst->fcp_cmnd_alen_datadir);
2136163899Smjacob	for (i = 0; i < 16; i++) {
2137196008Smjacob		ISP_IOZGET_8(isp, &src->cdb_dl.sf.fcp_cmnd_cdb[i], dst->cdb_dl.sf.fcp_cmnd_cdb[i]);
2138163899Smjacob	}
2139196008Smjacob	ISP_IOZGET_32(isp, &src->cdb_dl.sf.fcp_cmnd_dl, dst->cdb_dl.sf.fcp_cmnd_dl);
2140163899Smjacob}
2141163899Smjacob
2142163899Smjacobvoid
2143163899Smjacobisp_put_rft_id(ispsoftc_t *isp, rft_id_t *src, rft_id_t *dst)
2144163899Smjacob{
2145163899Smjacob	int i;
2146163899Smjacob	isp_put_ct_hdr(isp, &src->rftid_hdr, &dst->rftid_hdr);
2147163899Smjacob	ISP_IOZPUT_8(isp, src->rftid_reserved, &dst->rftid_reserved);
2148163899Smjacob	for (i = 0; i < 3; i++) {
2149163899Smjacob		ISP_IOZPUT_8(isp, src->rftid_portid[i], &dst->rftid_portid[i]);
2150163899Smjacob	}
2151163899Smjacob	for (i = 0; i < 8; i++) {
2152196008Smjacob		ISP_IOZPUT_32(isp, src->rftid_fc4types[i], &dst->rftid_fc4types[i]);
2153163899Smjacob	}
2154163899Smjacob}
2155163899Smjacob
2156163899Smjacobvoid
2157291000Smavisp_put_rff_id(ispsoftc_t *isp, rff_id_t *src, rff_id_t *dst)
2158291000Smav{
2159291000Smav	int i;
2160291000Smav
2161291000Smav	isp_put_ct_hdr(isp, &src->rffid_hdr, &dst->rffid_hdr);
2162291000Smav	ISP_IOZPUT_8(isp, src->rffid_reserved, &dst->rffid_reserved);
2163291000Smav	for (i = 0; i < 3; i++)
2164291000Smav		ISP_IOZPUT_8(isp, src->rffid_portid[i], &dst->rffid_portid[i]);
2165291000Smav	ISP_IOZPUT_16(isp, src->rffid_reserved2, &dst->rffid_reserved2);
2166291000Smav	ISP_IOZPUT_8(isp, src->rffid_fc4features, &dst->rffid_fc4features);
2167291000Smav	ISP_IOZPUT_8(isp, src->rffid_fc4type, &dst->rffid_fc4type);
2168291000Smav}
2169291000Smav
2170291000Smavvoid
2171163899Smjacobisp_get_ct_hdr(ispsoftc_t *isp, ct_hdr_t *src, ct_hdr_t *dst)
2172163899Smjacob{
2173163899Smjacob	ISP_IOZGET_8(isp, &src->ct_revision, dst->ct_revision);
2174163899Smjacob	ISP_IOZGET_8(isp, &src->ct_in_id[0], dst->ct_in_id[0]);
2175163899Smjacob	ISP_IOZGET_8(isp, &src->ct_in_id[1], dst->ct_in_id[1]);
2176163899Smjacob	ISP_IOZGET_8(isp, &src->ct_in_id[2], dst->ct_in_id[2]);
2177163899Smjacob	ISP_IOZGET_8(isp, &src->ct_fcs_type, dst->ct_fcs_type);
2178163899Smjacob	ISP_IOZGET_8(isp, &src->ct_fcs_subtype, dst->ct_fcs_subtype);
2179163899Smjacob	ISP_IOZGET_8(isp, &src->ct_options, dst->ct_options);
2180163899Smjacob	ISP_IOZGET_8(isp, &src->ct_reserved0, dst->ct_reserved0);
2181163899Smjacob	ISP_IOZGET_16(isp, &src->ct_cmd_resp, dst->ct_cmd_resp);
2182163899Smjacob	ISP_IOZGET_16(isp, &src->ct_bcnt_resid, dst->ct_bcnt_resid);
2183163899Smjacob	ISP_IOZGET_8(isp, &src->ct_reserved1, dst->ct_reserved1);
2184163899Smjacob	ISP_IOZGET_8(isp, &src->ct_reason, dst->ct_reason);
2185163899Smjacob	ISP_IOZGET_8(isp, &src->ct_explanation, dst->ct_explanation);
2186163899Smjacob	ISP_IOZGET_8(isp, &src->ct_vunique, dst->ct_vunique);
2187163899Smjacob}
2188163899Smjacob
2189163899Smjacobvoid
2190163899Smjacobisp_put_ct_hdr(ispsoftc_t *isp, ct_hdr_t *src, ct_hdr_t *dst)
2191163899Smjacob{
2192163899Smjacob	ISP_IOZPUT_8(isp, src->ct_revision, &dst->ct_revision);
2193163899Smjacob	ISP_IOZPUT_8(isp, src->ct_in_id[0], &dst->ct_in_id[0]);
2194163899Smjacob	ISP_IOZPUT_8(isp, src->ct_in_id[1], &dst->ct_in_id[1]);
2195163899Smjacob	ISP_IOZPUT_8(isp, src->ct_in_id[2], &dst->ct_in_id[2]);
2196163899Smjacob	ISP_IOZPUT_8(isp, src->ct_fcs_type, &dst->ct_fcs_type);
2197163899Smjacob	ISP_IOZPUT_8(isp, src->ct_fcs_subtype, &dst->ct_fcs_subtype);
2198163899Smjacob	ISP_IOZPUT_8(isp, src->ct_options, &dst->ct_options);
2199163899Smjacob	ISP_IOZPUT_8(isp, src->ct_reserved0, &dst->ct_reserved0);
2200163899Smjacob	ISP_IOZPUT_16(isp, src->ct_cmd_resp, &dst->ct_cmd_resp);
2201163899Smjacob	ISP_IOZPUT_16(isp, src->ct_bcnt_resid, &dst->ct_bcnt_resid);
2202163899Smjacob	ISP_IOZPUT_8(isp, src->ct_reserved1, &dst->ct_reserved1);
2203163899Smjacob	ISP_IOZPUT_8(isp, src->ct_reason, &dst->ct_reason);
2204163899Smjacob	ISP_IOZPUT_8(isp, src->ct_explanation, &dst->ct_explanation);
2205163899Smjacob	ISP_IOZPUT_8(isp, src->ct_vunique, &dst->ct_vunique);
2206163899Smjacob}
2207163899Smjacob
2208238869Smjacobvoid
2209238869Smjacobisp_put_fcp_rsp_iu(ispsoftc_t *isp, fcp_rsp_iu_t *src, fcp_rsp_iu_t *dst)
2210238869Smjacob{
2211238869Smjacob	int i;
2212238869Smjacob	for (i = 0; i < ((sizeof (src->fcp_rsp_reserved))/(sizeof (src->fcp_rsp_reserved[0]))); i++) {
2213238869Smjacob		ISP_IOZPUT_8(isp, src->fcp_rsp_reserved[i], &dst->fcp_rsp_reserved[i]);
2214238869Smjacob	}
2215238869Smjacob	ISP_IOZPUT_16(isp, src->fcp_rsp_status_qualifier, &dst->fcp_rsp_status_qualifier);
2216238869Smjacob	ISP_IOZPUT_8(isp, src->fcp_rsp_bits, &dst->fcp_rsp_bits);
2217238869Smjacob	ISP_IOZPUT_8(isp, src->fcp_rsp_scsi_status, &dst->fcp_rsp_scsi_status);
2218238869Smjacob	ISP_IOZPUT_32(isp, src->fcp_rsp_resid, &dst->fcp_rsp_resid);
2219238869Smjacob	ISP_IOZPUT_32(isp, src->fcp_rsp_snslen, &dst->fcp_rsp_snslen);
2220238869Smjacob	ISP_IOZPUT_32(isp, src->fcp_rsp_rsplen, &dst->fcp_rsp_rsplen);
2221238869Smjacob}
2222238869Smjacob
2223155228Smjacob#ifdef	ISP_TARGET_MODE
2224196008Smjacob
2225196008Smjacob/*
2226196008Smjacob * Command shipping- finish off first queue entry and do dma mapping and
2227196008Smjacob * additional segments as needed.
2228196008Smjacob *
2229238869Smjacob * Called with the first queue entry mostly filled out.
2230238869Smjacob * Our job here is to finish that and add additional data
2231238869Smjacob * segments if needed.
2232238869Smjacob *
2233238869Smjacob * We used to do synthetic entries to split data and status
2234238869Smjacob * at this level, but that started getting too tricky.
2235196008Smjacob */
2236155228Smjacobint
2237196008Smjacobisp_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)
2238196008Smjacob{
2239238869Smjacob	uint8_t storage[QENTRY_LEN];
2240196008Smjacob	uint8_t type, nqe;
2241196008Smjacob	uint32_t seg, curseg, seglim, nxt, nxtnxt;
2242196008Smjacob	ispds_t *dsp = NULL;
2243196008Smjacob	ispds64_t *dsp64 = NULL;
2244238869Smjacob	void *qe0, *qe1;
2245196008Smjacob
2246196008Smjacob	qe0 = isp_getrqentry(isp);
2247196008Smjacob	if (qe0 == NULL) {
2248196008Smjacob		return (CMD_EAGAIN);
2249196008Smjacob	}
2250196008Smjacob	nxt = ISP_NXT_QENTRY(isp->isp_reqidx, RQUEST_QUEUE_LEN(isp));
2251196008Smjacob
2252196008Smjacob	type = ((isphdr_t *)fqe)->rqs_entry_type;
2253196008Smjacob	nqe = 1;
2254196008Smjacob	seglim = 0;
2255196008Smjacob
2256196008Smjacob	/*
2257238869Smjacob	 * If we have data to transmit, figure out how many segments can fit into the first entry.
2258196008Smjacob	 */
2259196008Smjacob	if (ddir != ISP_NOXFR) {
2260196008Smjacob		/*
2261196008Smjacob		 * First, figure out how many pieces of data to transfer and what kind and how many we can put into the first queue entry.
2262196008Smjacob		 */
2263196008Smjacob		switch (type) {
2264196008Smjacob		case RQSTYPE_CTIO2:
2265238869Smjacob			dsp = ((ct2_entry_t *)fqe)->rsp.m0.u.ct_dataseg;
2266238869Smjacob			seglim = ISP_RQDSEG_T2;
2267238869Smjacob			break;
2268196008Smjacob		case RQSTYPE_CTIO3:
2269238869Smjacob			dsp64 = ((ct2_entry_t *)fqe)->rsp.m0.u.ct_dataseg64;
2270238869Smjacob			seglim = ISP_RQDSEG_T3;
2271196008Smjacob			break;
2272196008Smjacob		case RQSTYPE_CTIO7:
2273238869Smjacob			dsp64 = &((ct7_entry_t *)fqe)->rsp.m0.ds;
2274196008Smjacob			seglim = 1;
2275196008Smjacob			break;
2276196008Smjacob		default:
2277196008Smjacob			return (CMD_COMPLETE);
2278196008Smjacob		}
2279196008Smjacob	}
2280196008Smjacob
2281196008Smjacob	/*
2282238869Smjacob	 * First, fill out any of the data transfer stuff that fits
2283238869Smjacob	 * in the first queue entry.
2284196008Smjacob	 */
2285196008Smjacob	if (seglim > nsegs) {
2286196008Smjacob		seglim = nsegs;
2287196008Smjacob	}
2288196008Smjacob
2289196008Smjacob	for (seg = curseg = 0; curseg < seglim; curseg++) {
2290196008Smjacob		if (dsp64) {
2291196008Smjacob			XS_GET_DMA64_SEG(dsp64++, segp, seg++);
2292196008Smjacob		} else {
2293196008Smjacob			XS_GET_DMA_SEG(dsp++, segp, seg++);
2294196008Smjacob		}
2295196008Smjacob	}
2296196008Smjacob
2297196008Smjacob	/*
2298196008Smjacob	 * Second, start building additional continuation segments as needed.
2299196008Smjacob	 */
2300196008Smjacob	while (seg < nsegs) {
2301196008Smjacob		nxtnxt = ISP_NXT_QENTRY(nxt, RQUEST_QUEUE_LEN(isp));
2302196008Smjacob		if (nxtnxt == isp->isp_reqodx) {
2303261515Smav			isp->isp_reqodx = ISP_READ(isp, isp->isp_rqstoutrp);
2304261515Smav			if (nxtnxt == isp->isp_reqodx)
2305261515Smav				return (CMD_EAGAIN);
2306196008Smjacob		}
2307196008Smjacob		ISP_MEMZERO(storage, QENTRY_LEN);
2308196008Smjacob		qe1 = ISP_QUEUE_ENTRY(isp->isp_rquest, nxt);
2309196008Smjacob		nxt = nxtnxt;
2310196008Smjacob		if (dsp64) {
2311196008Smjacob			ispcontreq64_t *crq = (ispcontreq64_t *) storage;
2312196008Smjacob			seglim = ISP_CDSEG64;
2313196008Smjacob			crq->req_header.rqs_entry_type = RQSTYPE_A64_CONT;
2314196008Smjacob			crq->req_header.rqs_entry_count = 1;
2315196008Smjacob			dsp64 = crq->req_dataseg;
2316196008Smjacob		} else {
2317196008Smjacob			ispcontreq_t *crq = (ispcontreq_t *) storage;
2318196008Smjacob			seglim = ISP_CDSEG;
2319196008Smjacob			crq->req_header.rqs_entry_type = RQSTYPE_DATASEG;
2320196008Smjacob			crq->req_header.rqs_entry_count = 1;
2321196008Smjacob			dsp = crq->req_dataseg;
2322196008Smjacob		}
2323196008Smjacob		if (seg + seglim > nsegs) {
2324196008Smjacob			seglim = nsegs - seg;
2325196008Smjacob		}
2326196008Smjacob		for (curseg = 0; curseg < seglim; curseg++) {
2327196008Smjacob			if (dsp64) {
2328196008Smjacob				XS_GET_DMA64_SEG(dsp64++, segp, seg++);
2329196008Smjacob			} else {
2330196008Smjacob				XS_GET_DMA_SEG(dsp++, segp, seg++);
2331196008Smjacob			}
2332196008Smjacob		}
2333196008Smjacob		if (dsp64) {
2334196008Smjacob			isp_put_cont64_req(isp, (ispcontreq64_t *)storage, qe1);
2335196008Smjacob		} else {
2336196008Smjacob			isp_put_cont_req(isp, (ispcontreq_t *)storage, qe1);
2337196008Smjacob		}
2338196008Smjacob		if (isp->isp_dblev & ISP_LOGTDEBUG1) {
2339196008Smjacob			isp_print_bytes(isp, "additional queue entry", QENTRY_LEN, storage);
2340196008Smjacob		}
2341196008Smjacob		nqe++;
2342196008Smjacob        }
2343196008Smjacob
2344196008Smjacob	/*
2345238869Smjacob	 * Third, not patch up the first queue entry with the number of segments
2346238869Smjacob	 * we actually are going to be transmitting. At the same time, handle
2347238869Smjacob	 * any mode 2 requests.
2348196008Smjacob	 */
2349196008Smjacob	((isphdr_t *)fqe)->rqs_entry_count = nqe;
2350196008Smjacob	switch (type) {
2351196008Smjacob	case RQSTYPE_CTIO2:
2352196008Smjacob	case RQSTYPE_CTIO3:
2353238869Smjacob		if (((ct2_entry_t *)fqe)->ct_flags & CT2_FLAG_MODE2) {
2354238869Smjacob			((ct2_entry_t *)fqe)->ct_seg_count = 1;
2355238869Smjacob		} else {
2356238869Smjacob			((ct2_entry_t *)fqe)->ct_seg_count = nsegs;
2357238869Smjacob		}
2358196008Smjacob		if (ISP_CAP_2KLOGIN(isp)) {
2359196008Smjacob			isp_put_ctio2e(isp, fqe, qe0);
2360196008Smjacob		} else {
2361196008Smjacob			isp_put_ctio2(isp, fqe, qe0);
2362196008Smjacob		}
2363196008Smjacob		break;
2364196008Smjacob	case RQSTYPE_CTIO7:
2365238869Smjacob		if (((ct7_entry_t *)fqe)->ct_flags & CT7_FLAG_MODE2) {
2366238869Smjacob			((ct7_entry_t *)fqe)->ct_seg_count = 1;
2367238869Smjacob		} else {
2368238869Smjacob			((ct7_entry_t *)fqe)->ct_seg_count = nsegs;
2369238869Smjacob		}
2370196008Smjacob		isp_put_ctio7(isp, fqe, qe0);
2371196008Smjacob		break;
2372196008Smjacob	default:
2373196008Smjacob		return (CMD_COMPLETE);
2374196008Smjacob	}
2375196008Smjacob	if (isp->isp_dblev & ISP_LOGTDEBUG1) {
2376196008Smjacob		isp_print_bytes(isp, "first queue entry", QENTRY_LEN, fqe);
2377196008Smjacob	}
2378196008Smjacob	ISP_ADD_REQUEST(isp, nxt);
2379196008Smjacob	return (CMD_QUEUED);
2380196008Smjacob}
2381196008Smjacob
2382196008Smjacobint
2383203444Smjacobisp_allocate_xs_tgt(ispsoftc_t *isp, void *xs, uint32_t *handlep)
2384155228Smjacob{
2385203444Smjacob	isp_hdl_t *hdp;
2386155228Smjacob
2387203444Smjacob	hdp = isp->isp_tgtfree;
2388203444Smjacob	if (hdp == NULL) {
2389155228Smjacob		return (-1);
2390155228Smjacob	}
2391203444Smjacob	isp->isp_tgtfree = hdp->cmd;
2392203444Smjacob	hdp->cmd = xs;
2393203444Smjacob	hdp->handle = (hdp - isp->isp_tgtlist);
2394203444Smjacob	hdp->handle |= (ISP_HANDLE_TARGET << ISP_HANDLE_USAGE_SHIFT);
2395204397Smjacob	/*
2396204397Smjacob	 * Target handles for SCSI cards are only 16 bits, so
2397204397Smjacob	 * sequence number protection will be ommitted.
2398204397Smjacob	 */
2399204397Smjacob	if (IS_FC(isp)) {
2400204397Smjacob		hdp->handle |= (isp->isp_seqno++ << ISP_HANDLE_SEQ_SHIFT);
2401204397Smjacob	}
2402203444Smjacob	*handlep = hdp->handle;
2403155228Smjacob	return (0);
2404155228Smjacob}
2405155228Smjacob
2406155228Smjacobvoid *
2407163899Smjacobisp_find_xs_tgt(ispsoftc_t *isp, uint32_t handle)
2408155228Smjacob{
2409203444Smjacob	if (!ISP_VALID_TGT_HANDLE(isp, handle)) {
2410203444Smjacob		isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle);
2411155228Smjacob		return (NULL);
2412155228Smjacob	}
2413203444Smjacob	return (isp->isp_tgtlist[(handle & ISP_HANDLE_CMD_MASK)].cmd);
2414155228Smjacob}
2415155228Smjacob
2416163899Smjacobuint32_t
2417155704Smjacobisp_find_tgt_handle(ispsoftc_t *isp, void *xs)
2418155228Smjacob{
2419203444Smjacob	uint32_t i, foundhdl = ISP_HANDLE_FREE;
2420203444Smjacob
2421155228Smjacob	if (xs != NULL) {
2422155228Smjacob		for (i = 0; i < isp->isp_maxcmds; i++) {
2423203444Smjacob			if (isp->isp_tgtlist[i].cmd != xs) {
2424203444Smjacob				continue;
2425155228Smjacob			}
2426203444Smjacob			foundhdl = isp->isp_tgtlist[i].handle;
2427203444Smjacob			break;
2428155228Smjacob		}
2429155228Smjacob	}
2430203444Smjacob	return (foundhdl);
2431155228Smjacob}
2432155228Smjacob
2433155228Smjacobvoid
2434163899Smjacobisp_destroy_tgt_handle(ispsoftc_t *isp, uint32_t handle)
2435155228Smjacob{
2436203463Smjacob	if (!ISP_VALID_TGT_HANDLE(isp, handle)) {
2437203444Smjacob		isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle);
2438163899Smjacob	} else {
2439203444Smjacob		isp->isp_tgtlist[(handle & ISP_HANDLE_CMD_MASK)].handle = ISP_HANDLE_FREE;
2440203444Smjacob		isp->isp_tgtlist[(handle & ISP_HANDLE_CMD_MASK)].cmd = isp->isp_tgtfree;
2441203444Smjacob		isp->isp_tgtfree = &isp->isp_tgtlist[(handle & ISP_HANDLE_CMD_MASK)];
2442155228Smjacob	}
2443155228Smjacob}
2444163899Smjacob
2445285459Smav#endif
2446285459Smav
2447196008Smjacob/*
2448285459Smav * Find port database entries
2449196008Smjacob */
2450196008Smjacobint
2451291080Smavisp_find_pdb_empty(ispsoftc_t *isp, int chan, fcportdb_t **lptr)
2452196008Smjacob{
2453291080Smav	fcparam *fcp = FCPARAM(isp, chan);
2454196008Smjacob	int i;
2455196008Smjacob
2456285459Smav	for (i = 0; i < MAX_FC_TARG; i++) {
2457284681Smav		fcportdb_t *lp = &fcp->portdb[i];
2458196008Smjacob
2459291080Smav		if (lp->state == FC_PORTDB_STATE_NIL) {
2460291080Smav			*lptr = lp;
2461291080Smav			return (1);
2462291080Smav		}
2463291080Smav	}
2464291080Smav	return (0);
2465291080Smav}
2466291080Smav
2467291080Smavint
2468291080Smavisp_find_pdb_by_wwpn(ispsoftc_t *isp, int chan, uint64_t wwpn, fcportdb_t **lptr)
2469291080Smav{
2470291080Smav	fcparam *fcp = FCPARAM(isp, chan);
2471291080Smav	int i;
2472291080Smav
2473291080Smav	for (i = 0; i < MAX_FC_TARG; i++) {
2474291080Smav		fcportdb_t *lp = &fcp->portdb[i];
2475291080Smav
2476285459Smav		if (lp->state == FC_PORTDB_STATE_NIL)
2477284681Smav			continue;
2478291080Smav		if (lp->port_wwn == wwpn) {
2479284681Smav			*lptr = lp;
2480284681Smav			return (1);
2481196008Smjacob		}
2482196008Smjacob	}
2483196008Smjacob	return (0);
2484196008Smjacob}
2485196008Smjacob
2486196008Smjacobint
2487291080Smavisp_find_pdb_by_handle(ispsoftc_t *isp, int chan, uint16_t handle,
2488291080Smav    fcportdb_t **lptr)
2489196008Smjacob{
2490291080Smav	fcparam *fcp = FCPARAM(isp, chan);
2491196008Smjacob	int i;
2492196008Smjacob
2493285459Smav	for (i = 0; i < MAX_FC_TARG; i++) {
2494285459Smav		fcportdb_t *lp = &fcp->portdb[i];
2495285459Smav
2496285459Smav		if (lp->state == FC_PORTDB_STATE_NIL)
2497285459Smav			continue;
2498285459Smav		if (lp->handle == handle) {
2499285459Smav			*lptr = lp;
2500285459Smav			return (1);
2501285459Smav		}
2502196008Smjacob	}
2503196008Smjacob	return (0);
2504196008Smjacob}
2505196008Smjacob
2506196008Smjacobint
2507291080Smavisp_find_pdb_by_portid(ispsoftc_t *isp, int chan, uint32_t portid,
2508291080Smav    fcportdb_t **lptr)
2509196008Smjacob{
2510291080Smav	fcparam *fcp = FCPARAM(isp, chan);
2511196008Smjacob	int i;
2512196008Smjacob
2513285459Smav	for (i = 0; i < MAX_FC_TARG; i++) {
2514196008Smjacob		fcportdb_t *lp = &fcp->portdb[i];
2515196008Smjacob
2516285459Smav		if (lp->state == FC_PORTDB_STATE_NIL)
2517196008Smjacob			continue;
2518291080Smav		if (lp->portid == portid) {
2519196008Smjacob			*lptr = lp;
2520196008Smjacob			return (1);
2521196008Smjacob		}
2522196008Smjacob	}
2523196008Smjacob	return (0);
2524196008Smjacob}
2525196008Smjacob
2526291080Smav#ifdef	ISP_TARGET_MODE
2527155228Smjacobvoid
2528196008Smjacobisp_find_chan_by_did(ispsoftc_t *isp, uint32_t did, uint16_t *cp)
2529196008Smjacob{
2530196008Smjacob	uint16_t chan;
2531196008Smjacob
2532196008Smjacob	*cp = ISP_NOCHAN;
2533196008Smjacob	for (chan = 0; chan < isp->isp_nchan; chan++) {
2534196008Smjacob		fcparam *fcp = FCPARAM(isp, chan);
2535290993Smav		if ((fcp->role & ISP_ROLE_TARGET) == 0 ||
2536290993Smav		    fcp->isp_loopstate < LOOP_LTEST_DONE) {
2537196008Smjacob			continue;
2538196008Smjacob		}
2539196008Smjacob		if (fcp->isp_portid == did) {
2540196008Smjacob			*cp = chan;
2541196008Smjacob			break;
2542196008Smjacob		}
2543196008Smjacob	}
2544196008Smjacob}
2545196008Smjacob
2546196008Smjacob/*
2547196008Smjacob * Add an initiator device to the port database
2548196008Smjacob */
2549196008Smjacobvoid
2550289838Smavisp_add_wwn_entry(ispsoftc_t *isp, int chan, uint64_t wwpn, uint64_t wwnn,
2551289838Smav    uint16_t nphdl, uint32_t s_id, uint16_t prli_params)
2552196008Smjacob{
2553238869Smjacob	char buf[64];
2554196008Smjacob	fcparam *fcp;
2555196008Smjacob	fcportdb_t *lp;
2556285459Smav	int i, change;
2557196008Smjacob
2558196008Smjacob	fcp = FCPARAM(isp, chan);
2559196008Smjacob	if (nphdl >= MAX_NPORT_HANDLE) {
2560285459Smav		isp_prt(isp, ISP_LOGTINFO|ISP_LOGWARN, "Chan %d WWPN 0x%016llx "
2561285459Smav		    "PortID 0x%06x handle 0x%x -- bad handle",
2562289838Smav		    chan, (unsigned long long) wwpn, s_id, nphdl);
2563196008Smjacob		return;
2564196008Smjacob	}
2565196008Smjacob
2566284681Smav	/*
2567284681Smav	 * If valid record for requested handle already exists, update it
2568284681Smav	 * with new parameters.  Some cases of update can be suspicious,
2569284681Smav	 * so log them verbosely and dump the whole port database.
2570284681Smav	 */
2571291080Smav	if ((VALID_INI(wwpn) && isp_find_pdb_by_wwpn(isp, chan, wwpn, &lp)) ||
2572291144Smav	    (VALID_PORT(s_id) && isp_find_pdb_by_portid(isp, chan, s_id, &lp))) {
2573285459Smav		change = 0;
2574285459Smav		lp->new_portid = lp->portid;
2575285459Smav		lp->new_prli_word3 = lp->prli_word3;
2576291144Smav		if (VALID_PORT(s_id) && lp->portid != s_id) {
2577291144Smav			if (!VALID_PORT(lp->portid)) {
2578284681Smav				isp_prt(isp, ISP_LOGTINFO,
2579285459Smav				    "Chan %d WWPN 0x%016llx handle 0x%x "
2580285459Smav				    "gets PortID 0x%06x",
2581284681Smav				    chan, (unsigned long long) lp->port_wwn,
2582284681Smav				    nphdl, s_id);
2583284681Smav			} else {
2584284681Smav				isp_prt(isp, ISP_LOGTINFO|ISP_LOGWARN,
2585285459Smav				    "Chan %d WWPN 0x%016llx handle 0x%x "
2586285459Smav				    "changes PortID 0x%06x to 0x%06x",
2587284681Smav				    chan, (unsigned long long) lp->port_wwn,
2588284681Smav				    nphdl, lp->portid, s_id);
2589284681Smav				if (isp->isp_dblev & (ISP_LOGTINFO|ISP_LOGWARN))
2590284681Smav					isp_dump_portdb(isp, chan);
2591196008Smjacob			}
2592285459Smav			lp->new_portid = s_id;
2593285459Smav			change++;
2594196008Smjacob		}
2595289838Smav		if (VALID_INI(wwpn) && lp->port_wwn != wwpn) {
2596196008Smjacob			if (!VALID_INI(lp->port_wwn)) {
2597284681Smav				isp_prt(isp, ISP_LOGTINFO,
2598285459Smav				    "Chan %d PortID 0x%06x handle 0x%x "
2599289838Smav				    "gets WWPN 0x%016llxx",
2600285459Smav				    chan, lp->portid, nphdl,
2601289838Smav				    (unsigned long long) wwpn);
2602289838Smav			} else if (lp->port_wwn != wwpn) {
2603284681Smav				isp_prt(isp, ISP_LOGTINFO|ISP_LOGWARN,
2604285459Smav				    "Chan %d PortID 0x%06x handle 0x%x "
2605289838Smav				    "changes WWPN 0x%016llx to 0x%016llx",
2606285459Smav				    chan, lp->portid, nphdl,
2607284681Smav				    (unsigned long long) lp->port_wwn,
2608289838Smav				    (unsigned long long) wwpn);
2609284681Smav				if (isp->isp_dblev & (ISP_LOGTINFO|ISP_LOGWARN))
2610284681Smav					isp_dump_portdb(isp, chan);
2611196008Smjacob			}
2612289838Smav			lp->port_wwn = wwpn;
2613285459Smav			change++;
2614196008Smjacob		}
2615289838Smav		if (VALID_INI(wwnn) && lp->node_wwn != wwnn) {
2616289838Smav			if (!VALID_INI(lp->node_wwn)) {
2617289838Smav				isp_prt(isp, ISP_LOGTINFO,
2618289838Smav				    "Chan %d PortID 0x%06x handle 0x%x "
2619289838Smav				    "gets WWNN 0x%016llxx",
2620289838Smav				    chan, lp->portid, nphdl,
2621289838Smav				    (unsigned long long) wwnn);
2622289838Smav			} else if (lp->port_wwn != wwnn) {
2623289838Smav				isp_prt(isp, ISP_LOGTINFO,
2624289838Smav				    "Chan %d PortID 0x%06x handle 0x%x "
2625289838Smav				    "changes WWNN 0x%016llx to 0x%016llx",
2626289838Smav				    chan, lp->portid, nphdl,
2627289838Smav				    (unsigned long long) lp->node_wwn,
2628289838Smav				    (unsigned long long) wwnn);
2629289838Smav			}
2630289838Smav			lp->node_wwn = wwnn;
2631289838Smav			change++;
2632289838Smav		}
2633285459Smav		if (prli_params != 0 && lp->prli_word3 != prli_params) {
2634285459Smav			isp_gen_role_str(buf, sizeof (buf), prli_params);
2635284681Smav			isp_prt(isp, ISP_LOGTINFO|ISP_LOGCONFIG,
2636285459Smav			    "Chan %d WWPN 0x%016llx PortID 0x%06x "
2637285459Smav			    "handle 0x%x changes PRLI Word 3 %s",
2638284681Smav			    chan, (unsigned long long) lp->port_wwn,
2639285459Smav			    lp->portid, lp->handle, buf);
2640285459Smav			lp->new_prli_word3 = prli_params;
2641285459Smav			change++;
2642238869Smjacob		}
2643285459Smav		if (lp->handle != nphdl) {
2644285459Smav			isp_prt(isp, ISP_LOGTINFO|ISP_LOGCONFIG,
2645285459Smav			    "Chan %d WWPN 0x%016llx PortID 0x%06x "
2646285459Smav			    "changes handle 0x%x to 0x%x",
2647284681Smav			    chan, (unsigned long long) lp->port_wwn,
2648285459Smav			    lp->portid, lp->handle, nphdl);
2649285459Smav			lp->handle = nphdl;
2650285459Smav			change++;
2651196008Smjacob		}
2652285459Smav		lp->state = FC_PORTDB_STATE_VALID;
2653285459Smav		if (change) {
2654285459Smav			isp_async(isp, ISPASYNC_DEV_CHANGED, chan, lp);
2655285459Smav			lp->portid = lp->new_portid;
2656285459Smav			lp->prli_word3 = lp->new_prli_word3;
2657285459Smav		} else {
2658285459Smav			isp_prt(isp, ISP_LOGTINFO,
2659285459Smav			    "Chan %d WWPN 0x%016llx PortID 0x%06x "
2660285459Smav			    "handle 0x%x reentered",
2661284681Smav			    chan, (unsigned long long) lp->port_wwn,
2662285459Smav			    lp->portid, lp->handle);
2663285459Smav			isp_async(isp, ISPASYNC_DEV_STAYED, chan, lp);
2664196008Smjacob		}
2665285459Smav		return;
2666284681Smav	}
2667284681Smav
2668284681Smav	/* Search for room to insert new record. */
2669285459Smav	for (i = 0; i < MAX_FC_TARG; i++) {
2670285459Smav		if (fcp->portdb[i].state == FC_PORTDB_STATE_NIL)
2671285459Smav			break;
2672196008Smjacob	}
2673285459Smav	if (i >= MAX_FC_TARG) {
2674284681Smav		isp_prt(isp, ISP_LOGTINFO|ISP_LOGWARN,
2675285459Smav		    "Chan %d WWPN 0x%016llx PortID 0x%06x handle 0x%x "
2676284681Smav		    "-- no room in port database",
2677289838Smav		    chan, (unsigned long long) wwpn, s_id, nphdl);
2678284681Smav		if (isp->isp_dblev & (ISP_LOGTINFO|ISP_LOGWARN))
2679284681Smav			isp_dump_portdb(isp, chan);
2680196008Smjacob		return;
2681196008Smjacob	}
2682196008Smjacob
2683284681Smav	/* Insert new record and mark it valid. */
2684285459Smav	lp = &fcp->portdb[i];
2685196008Smjacob	ISP_MEMZERO(lp, sizeof (fcportdb_t));
2686196008Smjacob	lp->handle = nphdl;
2687196008Smjacob	lp->portid = s_id;
2688289838Smav	lp->port_wwn = wwpn;
2689289838Smav	lp->node_wwn = wwnn;
2690285459Smav	lp->prli_word3 = (prli_params != 0) ? prli_params : PRLI_WD3_INITIATOR_FUNCTION;
2691284681Smav	lp->state = FC_PORTDB_STATE_VALID;
2692284681Smav
2693238869Smjacob	isp_gen_role_str(buf, sizeof (buf), lp->prli_word3);
2694285459Smav	isp_prt(isp, ISP_LOGTINFO, "Chan %d WWPN 0x%016llx "
2695285459Smav	    "PortID 0x%06x handle 0x%x vtgt %d %s added", chan,
2696289838Smav	    (unsigned long long) wwpn, s_id, nphdl, i, buf);
2697196008Smjacob
2698285459Smav	/* Notify above levels about new port arrival. */
2699285459Smav	isp_async(isp, ISPASYNC_DEV_ARRIVED, chan, lp);
2700196008Smjacob}
2701196008Smjacob
2702196008Smjacob/*
2703196008Smjacob * Remove a target device to the port database
2704196008Smjacob */
2705196008Smjacobvoid
2706289838Smavisp_del_wwn_entry(ispsoftc_t *isp, int chan, uint64_t wwpn, uint16_t nphdl, uint32_t s_id)
2707196008Smjacob{
2708196008Smjacob	fcparam *fcp;
2709196008Smjacob	fcportdb_t *lp;
2710196008Smjacob
2711196008Smjacob	if (nphdl >= MAX_NPORT_HANDLE) {
2712285459Smav		isp_prt(isp, ISP_LOGWARN, "Chan %d WWPN 0x%016llx PortID 0x%06x bad handle 0x%x",
2713289838Smav		    chan, (unsigned long long) wwpn, s_id, nphdl);
2714196008Smjacob		return;
2715196008Smjacob	}
2716196008Smjacob
2717196008Smjacob	fcp = FCPARAM(isp, chan);
2718285459Smav	if (isp_find_pdb_by_handle(isp, chan, nphdl, &lp) == 0) {
2719285459Smav		isp_prt(isp, ISP_LOGWARN, "Chan %d WWPN 0x%016llx PortID 0x%06x handle 0x%x cannot be found to be deleted",
2720289838Smav		    chan, (unsigned long long) wwpn, s_id, nphdl);
2721196008Smjacob		isp_dump_portdb(isp, chan);
2722196008Smjacob		return;
2723196008Smjacob	}
2724285459Smav	isp_prt(isp, ISP_LOGTINFO, "Chan %d WWPN 0x%016llx PortID 0x%06x handle 0x%x vtgt %d deleted",
2725285459Smav	    chan, (unsigned long long) lp->port_wwn, lp->portid, nphdl, FC_PORTDB_TGT(isp, chan, lp));
2726285459Smav	lp->state = FC_PORTDB_STATE_NIL;
2727196008Smjacob
2728285459Smav	/* Notify above levels about gone port. */
2729285459Smav	isp_async(isp, ISPASYNC_DEV_GONE, chan, lp);
2730196008Smjacob}
2731196008Smjacob
2732196008Smjacobvoid
2733196008Smjacobisp_del_all_wwn_entries(ispsoftc_t *isp, int chan)
2734196008Smjacob{
2735196008Smjacob	fcparam *fcp;
2736196008Smjacob	int i;
2737196008Smjacob
2738196008Smjacob	if (!IS_FC(isp)) {
2739196008Smjacob		return;
2740196008Smjacob	}
2741196008Smjacob
2742196008Smjacob	/*
2743196008Smjacob	 * Handle iterations over all channels via recursion
2744196008Smjacob	 */
2745196008Smjacob	if (chan == ISP_NOCHAN) {
2746196008Smjacob		for (chan = 0; chan < isp->isp_nchan; chan++) {
2747196008Smjacob			isp_del_all_wwn_entries(isp, chan);
2748196008Smjacob		}
2749196008Smjacob		return;
2750196008Smjacob	}
2751196008Smjacob
2752196008Smjacob	if (chan > isp->isp_nchan) {
2753196008Smjacob		return;
2754196008Smjacob	}
2755196008Smjacob
2756196008Smjacob	fcp = FCPARAM(isp, chan);
2757196008Smjacob	if (fcp == NULL) {
2758196008Smjacob		return;
2759196008Smjacob	}
2760285459Smav	for (i = 0; i < MAX_FC_TARG; i++) {
2761285459Smav		fcportdb_t *lp = &fcp->portdb[i];
2762285459Smav
2763285459Smav		if (lp->state != FC_PORTDB_STATE_NIL)
2764196008Smjacob			isp_del_wwn_entry(isp, chan, lp->port_wwn, lp->handle, lp->portid);
2765196008Smjacob	}
2766196008Smjacob}
2767196008Smjacob
2768196008Smjacobvoid
2769196008Smjacobisp_del_wwn_entries(ispsoftc_t *isp, isp_notify_t *mp)
2770196008Smjacob{
2771196008Smjacob	fcportdb_t *lp;
2772196008Smjacob
2773196008Smjacob	/*
2774196008Smjacob	 * Handle iterations over all channels via recursion
2775196008Smjacob	 */
2776196008Smjacob	if (mp->nt_channel == ISP_NOCHAN) {
2777196008Smjacob		for (mp->nt_channel = 0; mp->nt_channel < isp->isp_nchan; mp->nt_channel++) {
2778196008Smjacob			isp_del_wwn_entries(isp, mp);
2779196008Smjacob		}
2780196008Smjacob		mp->nt_channel = ISP_NOCHAN;
2781196008Smjacob		return;
2782196008Smjacob	}
2783196008Smjacob
2784196008Smjacob	/*
2785196008Smjacob	 * We have an entry which is only partially identified.
2786196008Smjacob	 *
2787196008Smjacob	 * It's only known by WWN, N-Port handle, or Port ID.
2788196008Smjacob	 * We need to find the actual entry so we can delete it.
2789196008Smjacob	 */
2790196008Smjacob	if (mp->nt_nphdl != NIL_HANDLE) {
2791285459Smav		if (isp_find_pdb_by_handle(isp, mp->nt_channel, mp->nt_nphdl, &lp)) {
2792196008Smjacob			isp_del_wwn_entry(isp, mp->nt_channel, lp->port_wwn, lp->handle, lp->portid);
2793196008Smjacob			return;
2794196008Smjacob		}
2795196008Smjacob	}
2796291144Smav	if (VALID_INI(mp->nt_wwn)) {
2797291080Smav		if (isp_find_pdb_by_wwpn(isp, mp->nt_channel, mp->nt_wwn, &lp)) {
2798196008Smjacob			isp_del_wwn_entry(isp, mp->nt_channel, lp->port_wwn, lp->handle, lp->portid);
2799196008Smjacob			return;
2800196008Smjacob		}
2801196008Smjacob	}
2802291144Smav	if (VALID_PORT(mp->nt_sid)) {
2803291080Smav		if (isp_find_pdb_by_portid(isp, mp->nt_channel, mp->nt_sid, &lp)) {
2804196008Smjacob			isp_del_wwn_entry(isp, mp->nt_channel, lp->port_wwn, lp->handle, lp->portid);
2805196008Smjacob			return;
2806196008Smjacob		}
2807196008Smjacob	}
2808285459Smav	isp_prt(isp, ISP_LOGWARN, "Chan %d unable to find entry to delete WWPN 0x%016jx PortID 0x%06x handle 0x%x",
2809285459Smav	    mp->nt_channel, mp->nt_wwn, mp->nt_sid, mp->nt_nphdl);
2810196008Smjacob}
2811196008Smjacob
2812196008Smjacobvoid
2813163899Smjacobisp_put_atio2(ispsoftc_t *isp, at2_entry_t *src, at2_entry_t *dst)
2814155228Smjacob{
2815155228Smjacob	int i;
2816163899Smjacob	isp_put_hdr(isp, &src->at_header, &dst->at_header);
2817163899Smjacob	ISP_IOXPUT_32(isp, src->at_reserved, &dst->at_reserved);
2818163899Smjacob	ISP_IOXPUT_8(isp, src->at_lun, &dst->at_lun);
2819163899Smjacob	ISP_IOXPUT_8(isp, src->at_iid, &dst->at_iid);
2820163899Smjacob	ISP_IOXPUT_16(isp, src->at_rxid, &dst->at_rxid);
2821163899Smjacob	ISP_IOXPUT_16(isp, src->at_flags, &dst->at_flags);
2822163899Smjacob	ISP_IOXPUT_16(isp, src->at_status, &dst->at_status);
2823163899Smjacob	ISP_IOXPUT_8(isp, src->at_crn, &dst->at_crn);
2824163899Smjacob	ISP_IOXPUT_8(isp, src->at_taskcodes, &dst->at_taskcodes);
2825163899Smjacob	ISP_IOXPUT_8(isp, src->at_taskflags, &dst->at_taskflags);
2826163899Smjacob	ISP_IOXPUT_8(isp, src->at_execodes, &dst->at_execodes);
2827155228Smjacob	for (i = 0; i < ATIO2_CDBLEN; i++) {
2828163899Smjacob		ISP_IOXPUT_8(isp, src->at_cdb[i], &dst->at_cdb[i]);
2829155228Smjacob	}
2830163899Smjacob	ISP_IOXPUT_32(isp, src->at_datalen, &dst->at_datalen);
2831163899Smjacob	ISP_IOXPUT_16(isp, src->at_scclun, &dst->at_scclun);
2832155228Smjacob	for (i = 0; i < 4; i++) {
2833163899Smjacob		ISP_IOXPUT_16(isp, src->at_wwpn[i], &dst->at_wwpn[i]);
2834155228Smjacob	}
2835155228Smjacob	for (i = 0; i < 6; i++) {
2836196008Smjacob		ISP_IOXPUT_16(isp, src->at_reserved2[i], &dst->at_reserved2[i]);
2837155228Smjacob	}
2838163899Smjacob	ISP_IOXPUT_16(isp, src->at_oxid, &dst->at_oxid);
2839155228Smjacob}
2840155228Smjacob
2841155228Smjacobvoid
2842163899Smjacobisp_put_atio2e(ispsoftc_t *isp, at2e_entry_t *src, at2e_entry_t *dst)
2843155228Smjacob{
2844155228Smjacob	int i;
2845163899Smjacob	isp_put_hdr(isp, &src->at_header, &dst->at_header);
2846163899Smjacob	ISP_IOXPUT_32(isp, src->at_reserved, &dst->at_reserved);
2847163899Smjacob	ISP_IOXPUT_16(isp, src->at_iid, &dst->at_iid);
2848163899Smjacob	ISP_IOXPUT_16(isp, src->at_rxid, &dst->at_rxid);
2849163899Smjacob	ISP_IOXPUT_16(isp, src->at_flags, &dst->at_flags);
2850163899Smjacob	ISP_IOXPUT_16(isp, src->at_status, &dst->at_status);
2851163899Smjacob	ISP_IOXPUT_8(isp, src->at_crn, &dst->at_crn);
2852163899Smjacob	ISP_IOXPUT_8(isp, src->at_taskcodes, &dst->at_taskcodes);
2853163899Smjacob	ISP_IOXPUT_8(isp, src->at_taskflags, &dst->at_taskflags);
2854163899Smjacob	ISP_IOXPUT_8(isp, src->at_execodes, &dst->at_execodes);
2855155228Smjacob	for (i = 0; i < ATIO2_CDBLEN; i++) {
2856163899Smjacob		ISP_IOXPUT_8(isp, src->at_cdb[i], &dst->at_cdb[i]);
2857155228Smjacob	}
2858163899Smjacob	ISP_IOXPUT_32(isp, src->at_datalen, &dst->at_datalen);
2859163899Smjacob	ISP_IOXPUT_16(isp, src->at_scclun, &dst->at_scclun);
2860155228Smjacob	for (i = 0; i < 4; i++) {
2861163899Smjacob		ISP_IOXPUT_16(isp, src->at_wwpn[i], &dst->at_wwpn[i]);
2862155228Smjacob	}
2863155228Smjacob	for (i = 0; i < 6; i++) {
2864196008Smjacob		ISP_IOXPUT_16(isp, src->at_reserved2[i], &dst->at_reserved2[i]);
2865155228Smjacob	}
2866163899Smjacob	ISP_IOXPUT_16(isp, src->at_oxid, &dst->at_oxid);
2867155228Smjacob}
2868155228Smjacob
2869155228Smjacobvoid
2870163899Smjacobisp_get_atio2(ispsoftc_t *isp, at2_entry_t *src, at2_entry_t *dst)
2871155228Smjacob{
2872155228Smjacob	int i;
2873163899Smjacob	isp_get_hdr(isp, &src->at_header, &dst->at_header);
2874163899Smjacob	ISP_IOXGET_32(isp, &src->at_reserved, dst->at_reserved);
2875163899Smjacob	ISP_IOXGET_8(isp, &src->at_lun, dst->at_lun);
2876163899Smjacob	ISP_IOXGET_8(isp, &src->at_iid, dst->at_iid);
2877163899Smjacob	ISP_IOXGET_16(isp, &src->at_rxid, dst->at_rxid);
2878163899Smjacob	ISP_IOXGET_16(isp, &src->at_flags, dst->at_flags);
2879163899Smjacob	ISP_IOXGET_16(isp, &src->at_status, dst->at_status);
2880163899Smjacob	ISP_IOXGET_8(isp, &src->at_crn, dst->at_crn);
2881163899Smjacob	ISP_IOXGET_8(isp, &src->at_taskcodes, dst->at_taskcodes);
2882163899Smjacob	ISP_IOXGET_8(isp, &src->at_taskflags, dst->at_taskflags);
2883163899Smjacob	ISP_IOXGET_8(isp, &src->at_execodes, dst->at_execodes);
2884155228Smjacob	for (i = 0; i < ATIO2_CDBLEN; i++) {
2885163899Smjacob		ISP_IOXGET_8(isp, &src->at_cdb[i], dst->at_cdb[i]);
2886155228Smjacob	}
2887163899Smjacob	ISP_IOXGET_32(isp, &src->at_datalen, dst->at_datalen);
2888163899Smjacob	ISP_IOXGET_16(isp, &src->at_scclun, dst->at_scclun);
2889155228Smjacob	for (i = 0; i < 4; i++) {
2890163899Smjacob		ISP_IOXGET_16(isp, &src->at_wwpn[i], dst->at_wwpn[i]);
2891155228Smjacob	}
2892155228Smjacob	for (i = 0; i < 6; i++) {
2893196008Smjacob		ISP_IOXGET_16(isp, &src->at_reserved2[i], dst->at_reserved2[i]);
2894155228Smjacob	}
2895163899Smjacob	ISP_IOXGET_16(isp, &src->at_oxid, dst->at_oxid);
2896155228Smjacob}
2897155228Smjacob
2898155228Smjacobvoid
2899163899Smjacobisp_get_atio2e(ispsoftc_t *isp, at2e_entry_t *src, at2e_entry_t *dst)
2900155228Smjacob{
2901155228Smjacob	int i;
2902163899Smjacob	isp_get_hdr(isp, &src->at_header, &dst->at_header);
2903163899Smjacob	ISP_IOXGET_32(isp, &src->at_reserved, dst->at_reserved);
2904163899Smjacob	ISP_IOXGET_16(isp, &src->at_iid, dst->at_iid);
2905163899Smjacob	ISP_IOXGET_16(isp, &src->at_rxid, dst->at_rxid);
2906163899Smjacob	ISP_IOXGET_16(isp, &src->at_flags, dst->at_flags);
2907163899Smjacob	ISP_IOXGET_16(isp, &src->at_status, dst->at_status);
2908163899Smjacob	ISP_IOXGET_8(isp, &src->at_crn, dst->at_crn);
2909163899Smjacob	ISP_IOXGET_8(isp, &src->at_taskcodes, dst->at_taskcodes);
2910163899Smjacob	ISP_IOXGET_8(isp, &src->at_taskflags, dst->at_taskflags);
2911163899Smjacob	ISP_IOXGET_8(isp, &src->at_execodes, dst->at_execodes);
2912155228Smjacob	for (i = 0; i < ATIO2_CDBLEN; i++) {
2913163899Smjacob		ISP_IOXGET_8(isp, &src->at_cdb[i], dst->at_cdb[i]);
2914155228Smjacob	}
2915163899Smjacob	ISP_IOXGET_32(isp, &src->at_datalen, dst->at_datalen);
2916163899Smjacob	ISP_IOXGET_16(isp, &src->at_scclun, dst->at_scclun);
2917155228Smjacob	for (i = 0; i < 4; i++) {
2918163899Smjacob		ISP_IOXGET_16(isp, &src->at_wwpn[i], dst->at_wwpn[i]);
2919155228Smjacob	}
2920155228Smjacob	for (i = 0; i < 6; i++) {
2921196008Smjacob		ISP_IOXGET_16(isp, &src->at_reserved2[i], dst->at_reserved2[i]);
2922155228Smjacob	}
2923163899Smjacob	ISP_IOXGET_16(isp, &src->at_oxid, dst->at_oxid);
2924155228Smjacob}
2925155228Smjacob
2926155228Smjacobvoid
2927163899Smjacobisp_get_atio7(ispsoftc_t *isp, at7_entry_t *src, at7_entry_t *dst)
2928155228Smjacob{
2929163899Smjacob	ISP_IOXGET_8(isp, &src->at_type, dst->at_type);
2930163899Smjacob	ISP_IOXGET_8(isp, &src->at_count, dst->at_count);
2931163899Smjacob	ISP_IOXGET_16(isp, &src->at_ta_len, dst->at_ta_len);
2932163899Smjacob	ISP_IOXGET_32(isp, &src->at_rxid, dst->at_rxid);
2933163899Smjacob	isp_get_fc_hdr(isp, &src->at_hdr, &dst->at_hdr);
2934163899Smjacob	isp_get_fcp_cmnd_iu(isp, &src->at_cmnd, &dst->at_cmnd);
2935163899Smjacob}
2936163899Smjacob
2937163899Smjacobvoid
2938163899Smjacobisp_put_ctio2(ispsoftc_t *isp, ct2_entry_t *src, ct2_entry_t *dst)
2939155228Smjacob{
2940155228Smjacob	int i;
2941163899Smjacob	isp_put_hdr(isp, &src->ct_header, &dst->ct_header);
2942163899Smjacob	ISP_IOXPUT_32(isp, src->ct_syshandle, &dst->ct_syshandle);
2943163899Smjacob	ISP_IOXPUT_8(isp, src->ct_lun, &dst->ct_lun);
2944163899Smjacob	ISP_IOXPUT_8(isp, src->ct_iid, &dst->ct_iid);
2945163899Smjacob	ISP_IOXPUT_16(isp, src->ct_rxid, &dst->ct_rxid);
2946163899Smjacob	ISP_IOXPUT_16(isp, src->ct_flags, &dst->ct_flags);
2947163899Smjacob	ISP_IOXPUT_16(isp, src->ct_timeout, &dst->ct_timeout);
2948163899Smjacob	ISP_IOXPUT_16(isp, src->ct_seg_count, &dst->ct_seg_count);
2949163899Smjacob	ISP_IOXPUT_32(isp, src->ct_resid, &dst->ct_resid);
2950163899Smjacob	ISP_IOXPUT_32(isp, src->ct_reloff, &dst->ct_reloff);
2951163899Smjacob	if ((src->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) {
2952196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0._reserved, &dst->rsp.m0._reserved);
2953196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m0._reserved2, &dst->rsp.m0._reserved2);
2954196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m0.ct_scsi_status, &dst->rsp.m0.ct_scsi_status);
2955196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ct_xfrlen, &dst->rsp.m0.ct_xfrlen);
2956163899Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
2957155228Smjacob			for (i = 0; i < ISP_RQDSEG_T2; i++) {
2958196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg[i].ds_base, &dst->rsp.m0.u.ct_dataseg[i].ds_base);
2959196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg[i].ds_count, &dst->rsp.m0.u.ct_dataseg[i].ds_count);
2960155228Smjacob			}
2961163899Smjacob		} else if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO3) {
2962155228Smjacob			for (i = 0; i < ISP_RQDSEG_T3; i++) {
2963196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_base, &dst->rsp.m0.u.ct_dataseg64[i].ds_base);
2964196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_basehi, &dst->rsp.m0.u.ct_dataseg64[i].ds_basehi);
2965196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_count, &dst->rsp.m0.u.ct_dataseg64[i].ds_count);
2966155228Smjacob			}
2967163899Smjacob		} else if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO4) {
2968196008Smjacob			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,
2969163899Smjacob			    &dst->rsp.m0.u.ct_dslist.ds_segment);
2970196008Smjacob			ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dslist.ds_base, &dst->rsp.m0.u.ct_dslist.ds_base);
2971155228Smjacob		}
2972163899Smjacob	} else if ((src->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) {
2973196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1._reserved, &dst->rsp.m1._reserved);
2974196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1._reserved2, &dst->rsp.m1._reserved2);
2975196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_senselen, &dst->rsp.m1.ct_senselen);
2976196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_scsi_status, &dst->rsp.m1.ct_scsi_status);
2977196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_resplen, &dst->rsp.m1.ct_resplen);
2978155228Smjacob		for (i = 0; i < MAXRESPLEN; i++) {
2979196008Smjacob			ISP_IOXPUT_8(isp, src->rsp.m1.ct_resp[i], &dst->rsp.m1.ct_resp[i]);
2980155228Smjacob		}
2981155228Smjacob	} else {
2982196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2._reserved, &dst->rsp.m2._reserved);
2983196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m2._reserved2, &dst->rsp.m2._reserved2);
2984196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m2._reserved3, &dst->rsp.m2._reserved3);
2985196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_datalen, &dst->rsp.m2.ct_datalen);
2986238869Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
2987238869Smjacob			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);
2988238869Smjacob			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);
2989238869Smjacob		} else {
2990238869Smjacob			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);
2991238869Smjacob			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);
2992238869Smjacob			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);
2993238869Smjacob		}
2994155228Smjacob	}
2995155228Smjacob}
2996155228Smjacob
2997155228Smjacobvoid
2998163899Smjacobisp_put_ctio2e(ispsoftc_t *isp, ct2e_entry_t *src, ct2e_entry_t *dst)
2999155228Smjacob{
3000155228Smjacob	int i;
3001163899Smjacob	isp_put_hdr(isp, &src->ct_header, &dst->ct_header);
3002163899Smjacob	ISP_IOXPUT_32(isp, src->ct_syshandle, &dst->ct_syshandle);
3003163899Smjacob	ISP_IOXPUT_16(isp, src->ct_iid, &dst->ct_iid);
3004163899Smjacob	ISP_IOXPUT_16(isp, src->ct_rxid, &dst->ct_rxid);
3005163899Smjacob	ISP_IOXPUT_16(isp, src->ct_flags, &dst->ct_flags);
3006163899Smjacob	ISP_IOXPUT_16(isp, src->ct_timeout, &dst->ct_timeout);
3007163899Smjacob	ISP_IOXPUT_16(isp, src->ct_seg_count, &dst->ct_seg_count);
3008163899Smjacob	ISP_IOXPUT_32(isp, src->ct_resid, &dst->ct_resid);
3009163899Smjacob	ISP_IOXPUT_32(isp, src->ct_reloff, &dst->ct_reloff);
3010163899Smjacob	if ((src->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) {
3011196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0._reserved, &dst->rsp.m0._reserved);
3012196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m0._reserved2, &dst->rsp.m0._reserved2);
3013196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m0.ct_scsi_status, &dst->rsp.m0.ct_scsi_status);
3014196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ct_xfrlen, &dst->rsp.m0.ct_xfrlen);
3015163899Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
3016155228Smjacob			for (i = 0; i < ISP_RQDSEG_T2; i++) {
3017196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg[i].ds_base, &dst->rsp.m0.u.ct_dataseg[i].ds_base);
3018196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg[i].ds_count, &dst->rsp.m0.u.ct_dataseg[i].ds_count);
3019155228Smjacob			}
3020163899Smjacob		} else if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO3) {
3021155228Smjacob			for (i = 0; i < ISP_RQDSEG_T3; i++) {
3022196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_base, &dst->rsp.m0.u.ct_dataseg64[i].ds_base);
3023196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_basehi, &dst->rsp.m0.u.ct_dataseg64[i].ds_basehi);
3024196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_count, &dst->rsp.m0.u.ct_dataseg64[i].ds_count);
3025155228Smjacob			}
3026163899Smjacob		} else if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO4) {
3027196008Smjacob			ISP_IOXPUT_16(isp, src->rsp.m0.u.ct_dslist.ds_type, &dst->rsp.m0.u.ct_dslist.ds_type);
3028196008Smjacob			ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dslist.ds_segment, &dst->rsp.m0.u.ct_dslist.ds_segment);
3029196008Smjacob			ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dslist.ds_base, &dst->rsp.m0.u.ct_dslist.ds_base);
3030155228Smjacob		}
3031163899Smjacob	} else if ((src->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) {
3032196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1._reserved, &dst->rsp.m1._reserved);
3033196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1._reserved2, &dst->rsp.m1._reserved2);
3034196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_senselen, &dst->rsp.m1.ct_senselen);
3035196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_scsi_status, &dst->rsp.m1.ct_scsi_status);
3036196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_resplen, &dst->rsp.m1.ct_resplen);
3037155228Smjacob		for (i = 0; i < MAXRESPLEN; i++) {
3038196008Smjacob			ISP_IOXPUT_8(isp, src->rsp.m1.ct_resp[i], &dst->rsp.m1.ct_resp[i]);
3039155228Smjacob		}
3040155228Smjacob	} else {
3041196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2._reserved, &dst->rsp.m2._reserved);
3042196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m2._reserved2, &dst->rsp.m2._reserved2);
3043196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m2._reserved3, &dst->rsp.m2._reserved3);
3044196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_datalen, &dst->rsp.m2.ct_datalen);
3045238869Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
3046238869Smjacob			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);
3047238869Smjacob			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);
3048238869Smjacob		} else {
3049238869Smjacob			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);
3050238869Smjacob			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);
3051238869Smjacob			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);
3052238869Smjacob		}
3053155228Smjacob	}
3054155228Smjacob}
3055155228Smjacob
3056155228Smjacobvoid
3057163899Smjacobisp_put_ctio7(ispsoftc_t *isp, ct7_entry_t *src, ct7_entry_t *dst)
3058155228Smjacob{
3059163899Smjacob	int i;
3060163899Smjacob
3061163899Smjacob	isp_put_hdr(isp, &src->ct_header, &dst->ct_header);
3062163899Smjacob	ISP_IOXPUT_32(isp, src->ct_syshandle, &dst->ct_syshandle);
3063163899Smjacob	ISP_IOXPUT_16(isp, src->ct_nphdl, &dst->ct_nphdl);
3064163899Smjacob	ISP_IOXPUT_16(isp, src->ct_timeout, &dst->ct_timeout);
3065163899Smjacob	ISP_IOXPUT_16(isp, src->ct_seg_count, &dst->ct_seg_count);
3066196008Smjacob	ISP_IOXPUT_8(isp, src->ct_vpidx, &dst->ct_vpidx);
3067163899Smjacob	ISP_IOXPUT_8(isp, src->ct_xflags, &dst->ct_xflags);
3068163899Smjacob	ISP_IOXPUT_16(isp, src->ct_iid_lo, &dst->ct_iid_lo);
3069163899Smjacob	ISP_IOXPUT_8(isp, src->ct_iid_hi, &dst->ct_iid_hi);
3070163899Smjacob	ISP_IOXPUT_8(isp, src->ct_reserved, &dst->ct_reserved);
3071163899Smjacob	ISP_IOXPUT_32(isp, src->ct_rxid, &dst->ct_rxid);
3072163899Smjacob	ISP_IOXPUT_16(isp, src->ct_senselen, &dst->ct_senselen);
3073163899Smjacob	ISP_IOXPUT_16(isp, src->ct_flags, &dst->ct_flags);
3074163899Smjacob	ISP_IOXPUT_32(isp, src->ct_resid, &dst->ct_resid);
3075163899Smjacob	ISP_IOXPUT_16(isp, src->ct_oxid, &dst->ct_oxid);
3076163899Smjacob	ISP_IOXPUT_16(isp, src->ct_scsi_status, &dst->ct_scsi_status);
3077163899Smjacob	if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE0) {
3078163899Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.reloff, &dst->rsp.m0.reloff);
3079196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.reserved0, &dst->rsp.m0.reserved0);
3080196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ct_xfrlen, &dst->rsp.m0.ct_xfrlen);
3081196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.reserved1, &dst->rsp.m0.reserved1);
3082196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_base, &dst->rsp.m0.ds.ds_base);
3083196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_basehi, &dst->rsp.m0.ds.ds_basehi);
3084196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_count, &dst->rsp.m0.ds.ds_count);
3085163899Smjacob	} else if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE1) {
3086196008Smjacob		uint32_t *a, *b;
3087196008Smjacob
3088196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_resplen, &dst->rsp.m1.ct_resplen);
3089163899Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.reserved, &dst->rsp.m1.reserved);
3090196008Smjacob		a = (uint32_t *) src->rsp.m1.ct_resp;
3091196008Smjacob		b = (uint32_t *) dst->rsp.m1.ct_resp;
3092196008Smjacob		for (i = 0; i < (ASIZE(src->rsp.m1.ct_resp) >> 2); i++) {
3093196008Smjacob			*b++ = ISP_SWAP32(isp, *a++);
3094163899Smjacob		}
3095163899Smjacob	} else {
3096196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.reserved0, &dst->rsp.m2.reserved0);
3097238869Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.reserved1, &dst->rsp.m2.reserved1);
3098196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_datalen, &dst->rsp.m2.ct_datalen);
3099238869Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.reserved2, &dst->rsp.m2.reserved2);
3100196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_base, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_base);
3101196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_basehi, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_basehi);
3102196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_count, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_count);
3103163899Smjacob	}
3104155228Smjacob}
3105155228Smjacob
3106163899Smjacob
3107155228Smjacobvoid
3108163899Smjacobisp_get_ctio2(ispsoftc_t *isp, ct2_entry_t *src, ct2_entry_t *dst)
3109155228Smjacob{
3110163899Smjacob	int i;
3111163899Smjacob
3112163899Smjacob	isp_get_hdr(isp, &src->ct_header, &dst->ct_header);
3113163899Smjacob	ISP_IOXGET_32(isp, &src->ct_syshandle, dst->ct_syshandle);
3114163899Smjacob	ISP_IOXGET_8(isp, &src->ct_lun, dst->ct_lun);
3115163899Smjacob	ISP_IOXGET_8(isp, &src->ct_iid, dst->ct_iid);
3116163899Smjacob	ISP_IOXGET_16(isp, &src->ct_rxid, dst->ct_rxid);
3117163899Smjacob	ISP_IOXGET_16(isp, &src->ct_flags, dst->ct_flags);
3118163899Smjacob	ISP_IOXGET_16(isp, &src->ct_status, dst->ct_status);
3119163899Smjacob	ISP_IOXGET_16(isp, &src->ct_timeout, dst->ct_timeout);
3120163899Smjacob	ISP_IOXGET_16(isp, &src->ct_seg_count, dst->ct_seg_count);
3121163899Smjacob	ISP_IOXGET_32(isp, &src->ct_reloff, dst->ct_reloff);
3122163899Smjacob	ISP_IOXGET_32(isp, &src->ct_resid, dst->ct_resid);
3123163899Smjacob	if ((dst->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) {
3124196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0._reserved, dst->rsp.m0._reserved);
3125196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m0._reserved2, dst->rsp.m0._reserved2);
3126196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m0.ct_scsi_status, dst->rsp.m0.ct_scsi_status);
3127196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ct_xfrlen, dst->rsp.m0.ct_xfrlen);
3128163899Smjacob		if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
3129163899Smjacob			for (i = 0; i < ISP_RQDSEG_T2; i++) {
3130196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg[i].ds_base, dst->rsp.m0.u.ct_dataseg[i].ds_base);
3131196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg[i].ds_count, dst->rsp.m0.u.ct_dataseg[i].ds_count);
3132163899Smjacob			}
3133163899Smjacob		} else if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO3) {
3134163899Smjacob			for (i = 0; i < ISP_RQDSEG_T3; i++) {
3135196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_base, dst->rsp.m0.u.ct_dataseg64[i].ds_base);
3136196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_basehi, dst->rsp.m0.u.ct_dataseg64[i].ds_basehi);
3137196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_count, dst->rsp.m0.u.ct_dataseg64[i].ds_count);
3138163899Smjacob			}
3139163899Smjacob		} else if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO4) {
3140196008Smjacob			ISP_IOXGET_16(isp, &src->rsp.m0.u.ct_dslist.ds_type, dst->rsp.m0.u.ct_dslist.ds_type);
3141196008Smjacob			ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dslist.ds_segment, dst->rsp.m0.u.ct_dslist.ds_segment);
3142196008Smjacob			ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dslist.ds_base, dst->rsp.m0.u.ct_dslist.ds_base);
3143163899Smjacob		}
3144163899Smjacob	} else if ((dst->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) {
3145196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1._reserved, dst->rsp.m1._reserved);
3146196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1._reserved2, dst->rsp.m1._reserved2);
3147196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_senselen, dst->rsp.m1.ct_senselen);
3148196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_scsi_status, dst->rsp.m1.ct_scsi_status);
3149196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_resplen, dst->rsp.m1.ct_resplen);
3150163899Smjacob		for (i = 0; i < MAXRESPLEN; i++) {
3151196008Smjacob			ISP_IOXGET_8(isp, &src->rsp.m1.ct_resp[i], dst->rsp.m1.ct_resp[i]);
3152163899Smjacob		}
3153163899Smjacob	} else {
3154196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2._reserved, dst->rsp.m2._reserved);
3155196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m2._reserved2, dst->rsp.m2._reserved2);
3156196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m2._reserved3, dst->rsp.m2._reserved3);
3157196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_datalen, dst->rsp.m2.ct_datalen);
3158238869Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
3159238869Smjacob			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);
3160238869Smjacob			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);
3161238869Smjacob		} else {
3162238869Smjacob			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);
3163238869Smjacob			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);
3164238869Smjacob			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);
3165238869Smjacob		}
3166163899Smjacob	}
3167155228Smjacob}
3168155228Smjacob
3169155228Smjacobvoid
3170163899Smjacobisp_get_ctio2e(ispsoftc_t *isp, ct2e_entry_t *src, ct2e_entry_t *dst)
3171163899Smjacob{
3172163899Smjacob	int i;
3173163899Smjacob
3174163899Smjacob	isp_get_hdr(isp, &src->ct_header, &dst->ct_header);
3175163899Smjacob	ISP_IOXGET_32(isp, &src->ct_syshandle, dst->ct_syshandle);
3176163899Smjacob	ISP_IOXGET_16(isp, &src->ct_iid, dst->ct_iid);
3177163899Smjacob	ISP_IOXGET_16(isp, &src->ct_rxid, dst->ct_rxid);
3178163899Smjacob	ISP_IOXGET_16(isp, &src->ct_flags, dst->ct_flags);
3179163899Smjacob	ISP_IOXGET_16(isp, &src->ct_status, dst->ct_status);
3180163899Smjacob	ISP_IOXGET_16(isp, &src->ct_timeout, dst->ct_timeout);
3181163899Smjacob	ISP_IOXGET_16(isp, &src->ct_seg_count, dst->ct_seg_count);
3182163899Smjacob	ISP_IOXGET_32(isp, &src->ct_reloff, dst->ct_reloff);
3183163899Smjacob	ISP_IOXGET_32(isp, &src->ct_resid, dst->ct_resid);
3184163899Smjacob	if ((dst->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) {
3185196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0._reserved, dst->rsp.m0._reserved);
3186196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m0._reserved2, dst->rsp.m0._reserved2);
3187196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m0.ct_scsi_status, dst->rsp.m0.ct_scsi_status);
3188196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ct_xfrlen, dst->rsp.m0.ct_xfrlen);
3189163899Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
3190163899Smjacob			for (i = 0; i < ISP_RQDSEG_T2; i++) {
3191196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg[i].ds_base, dst->rsp.m0.u.ct_dataseg[i].ds_base);
3192196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg[i].ds_count, dst->rsp.m0.u.ct_dataseg[i].ds_count);
3193163899Smjacob			}
3194163899Smjacob		} else if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO3) {
3195163899Smjacob			for (i = 0; i < ISP_RQDSEG_T3; i++) {
3196196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_base, dst->rsp.m0.u.ct_dataseg64[i].ds_base);
3197196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_basehi, dst->rsp.m0.u.ct_dataseg64[i].ds_basehi);
3198196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_count, dst->rsp.m0.u.ct_dataseg64[i].ds_count);
3199163899Smjacob			}
3200163899Smjacob		} else if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO4) {
3201196008Smjacob			ISP_IOXGET_16(isp, &src->rsp.m0.u.ct_dslist.ds_type, dst->rsp.m0.u.ct_dslist.ds_type);
3202196008Smjacob			ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dslist.ds_segment, dst->rsp.m0.u.ct_dslist.ds_segment);
3203196008Smjacob			ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dslist.ds_base, dst->rsp.m0.u.ct_dslist.ds_base);
3204163899Smjacob		}
3205163899Smjacob	} else if ((dst->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) {
3206196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1._reserved, dst->rsp.m1._reserved);
3207196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1._reserved2, dst->rsp.m1._reserved2);
3208196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_senselen, dst->rsp.m1.ct_senselen);
3209196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_scsi_status, dst->rsp.m1.ct_scsi_status);
3210196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_resplen, dst->rsp.m1.ct_resplen);
3211163899Smjacob		for (i = 0; i < MAXRESPLEN; i++) {
3212196008Smjacob			ISP_IOXGET_8(isp, &src->rsp.m1.ct_resp[i], dst->rsp.m1.ct_resp[i]);
3213163899Smjacob		}
3214163899Smjacob	} else {
3215196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2._reserved, dst->rsp.m2._reserved);
3216196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m2._reserved2, dst->rsp.m2._reserved2);
3217196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m2._reserved3, dst->rsp.m2._reserved3);
3218196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_datalen, dst->rsp.m2.ct_datalen);
3219238869Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
3220238869Smjacob			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);
3221238869Smjacob			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);
3222238869Smjacob		} else {
3223238869Smjacob			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);
3224238869Smjacob			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);
3225238869Smjacob			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);
3226238869Smjacob		}
3227163899Smjacob	}
3228163899Smjacob}
3229163899Smjacob
3230163899Smjacobvoid
3231163899Smjacobisp_get_ctio7(ispsoftc_t *isp, ct7_entry_t *src, ct7_entry_t *dst)
3232163899Smjacob{
3233163899Smjacob	int i;
3234163899Smjacob
3235163899Smjacob	isp_get_hdr(isp, &src->ct_header, &dst->ct_header);
3236163899Smjacob	ISP_IOXGET_32(isp, &src->ct_syshandle, dst->ct_syshandle);
3237163899Smjacob	ISP_IOXGET_16(isp, &src->ct_nphdl, dst->ct_nphdl);
3238163899Smjacob	ISP_IOXGET_16(isp, &src->ct_timeout, dst->ct_timeout);
3239163899Smjacob	ISP_IOXGET_16(isp, &src->ct_seg_count, dst->ct_seg_count);
3240196008Smjacob	ISP_IOXGET_8(isp, &src->ct_vpidx, dst->ct_vpidx);
3241163899Smjacob	ISP_IOXGET_8(isp, &src->ct_xflags, dst->ct_xflags);
3242163899Smjacob	ISP_IOXGET_16(isp, &src->ct_iid_lo, dst->ct_iid_lo);
3243163899Smjacob	ISP_IOXGET_8(isp, &src->ct_iid_hi, dst->ct_iid_hi);
3244163899Smjacob	ISP_IOXGET_8(isp, &src->ct_reserved, dst->ct_reserved);
3245163899Smjacob	ISP_IOXGET_32(isp, &src->ct_rxid, dst->ct_rxid);
3246163899Smjacob	ISP_IOXGET_16(isp, &src->ct_senselen, dst->ct_senselen);
3247163899Smjacob	ISP_IOXGET_16(isp, &src->ct_flags, dst->ct_flags);
3248163899Smjacob	ISP_IOXGET_32(isp, &src->ct_resid, dst->ct_resid);
3249163899Smjacob	ISP_IOXGET_16(isp, &src->ct_oxid, dst->ct_oxid);
3250163899Smjacob	ISP_IOXGET_16(isp, &src->ct_scsi_status, dst->ct_scsi_status);
3251163899Smjacob	if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE0) {
3252163899Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.reloff, dst->rsp.m0.reloff);
3253196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.reserved0, dst->rsp.m0.reserved0);
3254196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ct_xfrlen, dst->rsp.m0.ct_xfrlen);
3255196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.reserved1, dst->rsp.m0.reserved1);
3256196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_base, dst->rsp.m0.ds.ds_base);
3257196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_basehi, dst->rsp.m0.ds.ds_basehi);
3258196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_count, dst->rsp.m0.ds.ds_count);
3259163899Smjacob	} else if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE1) {
3260196008Smjacob		uint32_t *a, *b;
3261196008Smjacob
3262196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_resplen, dst->rsp.m1.ct_resplen);
3263163899Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.reserved, dst->rsp.m1.reserved);
3264196008Smjacob		a = (uint32_t *) src->rsp.m1.ct_resp;
3265196008Smjacob		b = (uint32_t *) dst->rsp.m1.ct_resp;
3266163899Smjacob		for (i = 0; i < MAXRESPLEN_24XX; i++) {
3267196008Smjacob			ISP_IOXGET_8(isp, &src->rsp.m1.ct_resp[i], dst->rsp.m1.ct_resp[i]);
3268163899Smjacob		}
3269196008Smjacob		for (i = 0; i < (ASIZE(src->rsp.m1.ct_resp) >> 2); i++) {
3270196008Smjacob			*b++ = ISP_SWAP32(isp, *a++);
3271196008Smjacob		}
3272163899Smjacob	} else {
3273196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.reserved0, dst->rsp.m2.reserved0);
3274196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_datalen, dst->rsp.m2.ct_datalen);
3275196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.reserved1, dst->rsp.m2.reserved1);
3276196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_base, dst->rsp.m2.ct_fcp_rsp_iudata.ds_base);
3277196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_basehi, dst->rsp.m2.ct_fcp_rsp_iudata.ds_basehi);
3278196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_count, dst->rsp.m2.ct_fcp_rsp_iudata.ds_count);
3279163899Smjacob	}
3280163899Smjacob}
3281163899Smjacob
3282163899Smjacobvoid
3283155704Smjacobisp_put_enable_lun(ispsoftc_t *isp, lun_entry_t *lesrc, lun_entry_t *ledst)
3284155228Smjacob{
3285155228Smjacob	int i;
3286163899Smjacob	isp_put_hdr(isp, &lesrc->le_header, &ledst->le_header);
3287155228Smjacob	ISP_IOXPUT_32(isp, lesrc->le_reserved, &ledst->le_reserved);
3288155228Smjacob	if (ISP_IS_SBUS(isp)) {
3289155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_lun, &ledst->le_rsvd);
3290155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_rsvd, &ledst->le_lun);
3291155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_ops, &ledst->le_tgt);
3292155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_tgt, &ledst->le_ops);
3293155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_status, &ledst->le_reserved2);
3294155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_reserved2, &ledst->le_status);
3295155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_cmd_count, &ledst->le_in_count);
3296155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_in_count, &ledst->le_cmd_count);
3297155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_cdb6len, &ledst->le_cdb7len);
3298155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_cdb7len, &ledst->le_cdb6len);
3299155228Smjacob	} else {
3300155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_lun, &ledst->le_lun);
3301155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_rsvd, &ledst->le_rsvd);
3302155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_ops, &ledst->le_ops);
3303155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_tgt, &ledst->le_tgt);
3304155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_status, &ledst->le_status);
3305155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_reserved2, &ledst->le_reserved2);
3306155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_cmd_count, &ledst->le_cmd_count);
3307155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_in_count, &ledst->le_in_count);
3308155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_cdb6len, &ledst->le_cdb6len);
3309155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_cdb7len, &ledst->le_cdb7len);
3310155228Smjacob	}
3311155228Smjacob	ISP_IOXPUT_32(isp, lesrc->le_flags, &ledst->le_flags);
3312155228Smjacob	ISP_IOXPUT_16(isp, lesrc->le_timeout, &ledst->le_timeout);
3313155228Smjacob	for (i = 0; i < 20; i++) {
3314196008Smjacob		ISP_IOXPUT_8(isp, lesrc->le_reserved3[i], &ledst->le_reserved3[i]);
3315155228Smjacob	}
3316155228Smjacob}
3317155228Smjacob
3318155228Smjacobvoid
3319155704Smjacobisp_get_enable_lun(ispsoftc_t *isp, lun_entry_t *lesrc, lun_entry_t *ledst)
3320155228Smjacob{
3321155228Smjacob	int i;
3322163899Smjacob	isp_get_hdr(isp, &lesrc->le_header, &ledst->le_header);
3323155228Smjacob	ISP_IOXGET_32(isp, &lesrc->le_reserved, ledst->le_reserved);
3324155228Smjacob	if (ISP_IS_SBUS(isp)) {
3325155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_lun, ledst->le_rsvd);
3326155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_rsvd, ledst->le_lun);
3327155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_ops, ledst->le_tgt);
3328155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_tgt, ledst->le_ops);
3329155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_status, ledst->le_reserved2);
3330155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_reserved2, ledst->le_status);
3331155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_cmd_count, ledst->le_in_count);
3332155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_in_count, ledst->le_cmd_count);
3333155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_cdb6len, ledst->le_cdb7len);
3334155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_cdb7len, ledst->le_cdb6len);
3335155228Smjacob	} else {
3336155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_lun, ledst->le_lun);
3337155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_rsvd, ledst->le_rsvd);
3338155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_ops, ledst->le_ops);
3339155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_tgt, ledst->le_tgt);
3340155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_status, ledst->le_status);
3341155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_reserved2, ledst->le_reserved2);
3342155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_cmd_count, ledst->le_cmd_count);
3343155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_in_count, ledst->le_in_count);
3344155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_cdb6len, ledst->le_cdb6len);
3345155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_cdb7len, ledst->le_cdb7len);
3346155228Smjacob	}
3347155228Smjacob	ISP_IOXGET_32(isp, &lesrc->le_flags, ledst->le_flags);
3348155228Smjacob	ISP_IOXGET_16(isp, &lesrc->le_timeout, ledst->le_timeout);
3349155228Smjacob	for (i = 0; i < 20; i++) {
3350196008Smjacob		ISP_IOXGET_8(isp, &lesrc->le_reserved3[i], ledst->le_reserved3[i]);
3351155228Smjacob	}
3352155228Smjacob}
3353155228Smjacob
3354155228Smjacobvoid
3355196008Smjacobisp_put_notify_fc(ispsoftc_t *isp, in_fcentry_t *src, in_fcentry_t *dst)
3356155228Smjacob{
3357163899Smjacob	isp_put_hdr(isp, &src->in_header, &dst->in_header);
3358163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved, &dst->in_reserved);
3359163899Smjacob	ISP_IOXPUT_8(isp, src->in_lun, &dst->in_lun);
3360163899Smjacob	ISP_IOXPUT_8(isp, src->in_iid, &dst->in_iid);
3361163899Smjacob	ISP_IOXPUT_16(isp, src->in_scclun, &dst->in_scclun);
3362163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved2, &dst->in_reserved2);
3363163899Smjacob	ISP_IOXPUT_16(isp, src->in_status, &dst->in_status);
3364163899Smjacob	ISP_IOXPUT_16(isp, src->in_task_flags, &dst->in_task_flags);
3365163899Smjacob	ISP_IOXPUT_16(isp, src->in_seqid, &dst->in_seqid);
3366155228Smjacob}
3367155228Smjacob
3368155228Smjacobvoid
3369196008Smjacobisp_put_notify_fc_e(ispsoftc_t *isp, in_fcentry_e_t *src, in_fcentry_e_t *dst)
3370155228Smjacob{
3371163899Smjacob	isp_put_hdr(isp, &src->in_header, &dst->in_header);
3372163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved, &dst->in_reserved);
3373163899Smjacob	ISP_IOXPUT_16(isp, src->in_iid, &dst->in_iid);
3374163899Smjacob	ISP_IOXPUT_16(isp, src->in_scclun, &dst->in_scclun);
3375163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved2, &dst->in_reserved2);
3376163899Smjacob	ISP_IOXPUT_16(isp, src->in_status, &dst->in_status);
3377163899Smjacob	ISP_IOXPUT_16(isp, src->in_task_flags, &dst->in_task_flags);
3378163899Smjacob	ISP_IOXPUT_16(isp, src->in_seqid, &dst->in_seqid);
3379155228Smjacob}
3380155228Smjacob
3381155228Smjacobvoid
3382196008Smjacobisp_put_notify_24xx(ispsoftc_t *isp, in_fcentry_24xx_t *src, in_fcentry_24xx_t *dst)
3383155228Smjacob{
3384163899Smjacob	int i;
3385163899Smjacob
3386163899Smjacob	isp_put_hdr(isp, &src->in_header, &dst->in_header);
3387163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved, &dst->in_reserved);
3388163899Smjacob	ISP_IOXPUT_16(isp, src->in_nphdl, &dst->in_nphdl);
3389163899Smjacob	ISP_IOXPUT_16(isp, src->in_reserved1, &dst->in_reserved1);
3390163899Smjacob	ISP_IOXPUT_16(isp, src->in_flags, &dst->in_flags);
3391163899Smjacob	ISP_IOXPUT_16(isp, src->in_srr_rxid, &dst->in_srr_rxid);
3392163899Smjacob	ISP_IOXPUT_16(isp, src->in_status, &dst->in_status);
3393163899Smjacob	ISP_IOXPUT_8(isp, src->in_status_subcode, &dst->in_status_subcode);
3394289838Smav	ISP_IOXPUT_8(isp, src->in_fwhandle, &dst->in_fwhandle);
3395163899Smjacob	ISP_IOXPUT_32(isp, src->in_rxid, &dst->in_rxid);
3396163899Smjacob	ISP_IOXPUT_16(isp, src->in_srr_reloff_hi, &dst->in_srr_reloff_hi);
3397163899Smjacob	ISP_IOXPUT_16(isp, src->in_srr_reloff_lo, &dst->in_srr_reloff_lo);
3398163899Smjacob	ISP_IOXPUT_16(isp, src->in_srr_iu, &dst->in_srr_iu);
3399163899Smjacob	ISP_IOXPUT_16(isp, src->in_srr_oxid, &dst->in_srr_oxid);
3400196008Smjacob	ISP_IOXPUT_16(isp, src->in_nport_id_hi, &dst->in_nport_id_hi);
3401196008Smjacob	ISP_IOXPUT_8(isp, src->in_nport_id_lo, &dst->in_nport_id_lo);
3402196008Smjacob	ISP_IOXPUT_8(isp, src->in_reserved3, &dst->in_reserved3);
3403196008Smjacob	ISP_IOXPUT_16(isp, src->in_np_handle, &dst->in_np_handle);
3404196008Smjacob	for (i = 0; i < ASIZE(src->in_reserved4); i++) {
3405196008Smjacob		ISP_IOXPUT_8(isp, src->in_reserved4[i], &dst->in_reserved4[i]);
3406163899Smjacob	}
3407196008Smjacob	ISP_IOXPUT_8(isp, src->in_reserved5, &dst->in_reserved5);
3408196008Smjacob	ISP_IOXPUT_8(isp, src->in_vpidx, &dst->in_vpidx);
3409196008Smjacob	ISP_IOXPUT_32(isp, src->in_reserved6, &dst->in_reserved6);
3410163899Smjacob	ISP_IOXPUT_16(isp, src->in_portid_lo, &dst->in_portid_lo);
3411163899Smjacob	ISP_IOXPUT_8(isp, src->in_portid_hi, &dst->in_portid_hi);
3412196008Smjacob	ISP_IOXPUT_8(isp, src->in_reserved7, &dst->in_reserved7);
3413196008Smjacob	ISP_IOXPUT_16(isp, src->in_reserved8, &dst->in_reserved8);
3414163899Smjacob	ISP_IOXPUT_16(isp, src->in_oxid, &dst->in_oxid);
3415155228Smjacob}
3416155228Smjacob
3417155228Smjacobvoid
3418196008Smjacobisp_get_notify_fc(ispsoftc_t *isp, in_fcentry_t *src, in_fcentry_t *dst)
3419155228Smjacob{
3420163899Smjacob	isp_get_hdr(isp, &src->in_header, &dst->in_header);
3421163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved, dst->in_reserved);
3422163899Smjacob	ISP_IOXGET_8(isp, &src->in_lun, dst->in_lun);
3423163899Smjacob	ISP_IOXGET_8(isp, &src->in_iid, dst->in_iid);
3424163899Smjacob	ISP_IOXGET_16(isp, &src->in_scclun, dst->in_scclun);
3425163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved2, dst->in_reserved2);
3426163899Smjacob	ISP_IOXGET_16(isp, &src->in_status, dst->in_status);
3427163899Smjacob	ISP_IOXGET_16(isp, &src->in_task_flags, dst->in_task_flags);
3428163899Smjacob	ISP_IOXGET_16(isp, &src->in_seqid, dst->in_seqid);
3429155228Smjacob}
3430155228Smjacob
3431155228Smjacobvoid
3432196008Smjacobisp_get_notify_fc_e(ispsoftc_t *isp, in_fcentry_e_t *src, in_fcentry_e_t *dst)
3433155228Smjacob{
3434163899Smjacob	isp_get_hdr(isp, &src->in_header, &dst->in_header);
3435163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved, dst->in_reserved);
3436163899Smjacob	ISP_IOXGET_16(isp, &src->in_iid, dst->in_iid);
3437163899Smjacob	ISP_IOXGET_16(isp, &src->in_scclun, dst->in_scclun);
3438163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved2, dst->in_reserved2);
3439163899Smjacob	ISP_IOXGET_16(isp, &src->in_status, dst->in_status);
3440163899Smjacob	ISP_IOXGET_16(isp, &src->in_task_flags, dst->in_task_flags);
3441163899Smjacob	ISP_IOXGET_16(isp, &src->in_seqid, dst->in_seqid);
3442163899Smjacob}
3443163899Smjacob
3444163899Smjacobvoid
3445196008Smjacobisp_get_notify_24xx(ispsoftc_t *isp, in_fcentry_24xx_t *src, in_fcentry_24xx_t *dst)
3446163899Smjacob{
3447155228Smjacob	int i;
3448163899Smjacob
3449163899Smjacob	isp_get_hdr(isp, &src->in_header, &dst->in_header);
3450163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved, dst->in_reserved);
3451163899Smjacob	ISP_IOXGET_16(isp, &src->in_nphdl, dst->in_nphdl);
3452163899Smjacob	ISP_IOXGET_16(isp, &src->in_reserved1, dst->in_reserved1);
3453163899Smjacob	ISP_IOXGET_16(isp, &src->in_flags, dst->in_flags);
3454163899Smjacob	ISP_IOXGET_16(isp, &src->in_srr_rxid, dst->in_srr_rxid);
3455163899Smjacob	ISP_IOXGET_16(isp, &src->in_status, dst->in_status);
3456163899Smjacob	ISP_IOXGET_8(isp, &src->in_status_subcode, dst->in_status_subcode);
3457289838Smav	ISP_IOXGET_8(isp, &src->in_fwhandle, dst->in_fwhandle);
3458163899Smjacob	ISP_IOXGET_32(isp, &src->in_rxid, dst->in_rxid);
3459163899Smjacob	ISP_IOXGET_16(isp, &src->in_srr_reloff_hi, dst->in_srr_reloff_hi);
3460163899Smjacob	ISP_IOXGET_16(isp, &src->in_srr_reloff_lo, dst->in_srr_reloff_lo);
3461163899Smjacob	ISP_IOXGET_16(isp, &src->in_srr_iu, dst->in_srr_iu);
3462163899Smjacob	ISP_IOXGET_16(isp, &src->in_srr_oxid, dst->in_srr_oxid);
3463196008Smjacob	ISP_IOXGET_16(isp, &src->in_nport_id_hi, dst->in_nport_id_hi);
3464196008Smjacob	ISP_IOXGET_8(isp, &src->in_nport_id_lo, dst->in_nport_id_lo);
3465196008Smjacob	ISP_IOXGET_8(isp, &src->in_reserved3, dst->in_reserved3);
3466196008Smjacob	ISP_IOXGET_16(isp, &src->in_np_handle, dst->in_np_handle);
3467196008Smjacob	for (i = 0; i < ASIZE(src->in_reserved4); i++) {
3468196008Smjacob		ISP_IOXGET_8(isp, &src->in_reserved4[i], dst->in_reserved4[i]);
3469163899Smjacob	}
3470196008Smjacob	ISP_IOXGET_8(isp, &src->in_reserved5, dst->in_reserved5);
3471196008Smjacob	ISP_IOXGET_8(isp, &src->in_vpidx, dst->in_vpidx);
3472196008Smjacob	ISP_IOXGET_32(isp, &src->in_reserved6, dst->in_reserved6);
3473163899Smjacob	ISP_IOXGET_16(isp, &src->in_portid_lo, dst->in_portid_lo);
3474163899Smjacob	ISP_IOXGET_8(isp, &src->in_portid_hi, dst->in_portid_hi);
3475196008Smjacob	ISP_IOXGET_8(isp, &src->in_reserved7, dst->in_reserved7);
3476196008Smjacob	ISP_IOXGET_16(isp, &src->in_reserved8, dst->in_reserved8);
3477163899Smjacob	ISP_IOXGET_16(isp, &src->in_oxid, dst->in_oxid);
3478163899Smjacob}
3479163899Smjacob
3480163899Smjacobvoid
3481196008Smjacobisp_put_notify_ack_fc(ispsoftc_t *isp, na_fcentry_t *src, na_fcentry_t *dst)
3482155228Smjacob{
3483155228Smjacob	int i;
3484163899Smjacob	isp_put_hdr(isp, &src->na_header, &dst->na_header);
3485163899Smjacob	ISP_IOXPUT_32(isp, src->na_reserved, &dst->na_reserved);
3486163899Smjacob	ISP_IOXPUT_8(isp, src->na_reserved1, &dst->na_reserved1);
3487163899Smjacob	ISP_IOXPUT_8(isp, src->na_iid, &dst->na_iid);
3488163899Smjacob	ISP_IOXPUT_16(isp, src->na_response, &dst->na_response);
3489163899Smjacob	ISP_IOXPUT_16(isp, src->na_flags, &dst->na_flags);
3490163899Smjacob	ISP_IOXPUT_16(isp, src->na_reserved2, &dst->na_reserved2);
3491163899Smjacob	ISP_IOXPUT_16(isp, src->na_status, &dst->na_status);
3492163899Smjacob	ISP_IOXPUT_16(isp, src->na_task_flags, &dst->na_task_flags);
3493163899Smjacob	ISP_IOXPUT_16(isp, src->na_seqid, &dst->na_seqid);
3494155228Smjacob	for (i = 0; i < NA2_RSVDLEN; i++) {
3495196008Smjacob		ISP_IOXPUT_16(isp, src->na_reserved3[i], &dst->na_reserved3[i]);
3496155228Smjacob	}
3497155228Smjacob}
3498155228Smjacob
3499155228Smjacobvoid
3500196008Smjacobisp_put_notify_ack_fc_e(ispsoftc_t *isp, na_fcentry_e_t *src, na_fcentry_e_t *dst)
3501155228Smjacob{
3502155228Smjacob	int i;
3503163899Smjacob	isp_put_hdr(isp, &src->na_header, &dst->na_header);
3504163899Smjacob	ISP_IOXPUT_32(isp, src->na_reserved, &dst->na_reserved);
3505163899Smjacob	ISP_IOXPUT_16(isp, src->na_iid, &dst->na_iid);
3506163899Smjacob	ISP_IOXPUT_16(isp, src->na_response, &dst->na_response);
3507163899Smjacob	ISP_IOXPUT_16(isp, src->na_flags, &dst->na_flags);
3508163899Smjacob	ISP_IOXPUT_16(isp, src->na_reserved2, &dst->na_reserved2);
3509163899Smjacob	ISP_IOXPUT_16(isp, src->na_status, &dst->na_status);
3510163899Smjacob	ISP_IOXPUT_16(isp, src->na_task_flags, &dst->na_task_flags);
3511163899Smjacob	ISP_IOXPUT_16(isp, src->na_seqid, &dst->na_seqid);
3512155228Smjacob	for (i = 0; i < NA2_RSVDLEN; i++) {
3513196008Smjacob		ISP_IOXPUT_16(isp, src->na_reserved3[i], &dst->na_reserved3[i]);
3514155228Smjacob	}
3515155228Smjacob}
3516155228Smjacob
3517155228Smjacobvoid
3518196008Smjacobisp_put_notify_24xx_ack(ispsoftc_t *isp, na_fcentry_24xx_t *src, na_fcentry_24xx_t *dst)
3519155228Smjacob{
3520155228Smjacob	int i;
3521163899Smjacob
3522163899Smjacob	isp_put_hdr(isp, &src->na_header, &dst->na_header);
3523163899Smjacob	ISP_IOXPUT_32(isp, src->na_handle, &dst->na_handle);
3524163899Smjacob	ISP_IOXPUT_16(isp, src->na_nphdl, &dst->na_nphdl);
3525163899Smjacob	ISP_IOXPUT_16(isp, src->na_reserved1, &dst->na_reserved1);
3526163899Smjacob	ISP_IOXPUT_16(isp, src->na_flags, &dst->na_flags);
3527163899Smjacob	ISP_IOXPUT_16(isp, src->na_srr_rxid, &dst->na_srr_rxid);
3528163899Smjacob	ISP_IOXPUT_16(isp, src->na_status, &dst->na_status);
3529163899Smjacob	ISP_IOXPUT_8(isp, src->na_status_subcode, &dst->na_status_subcode);
3530289838Smav	ISP_IOXPUT_8(isp, src->na_fwhandle, &dst->na_fwhandle);
3531163899Smjacob	ISP_IOXPUT_32(isp, src->na_rxid, &dst->na_rxid);
3532163899Smjacob	ISP_IOXPUT_16(isp, src->na_srr_reloff_hi, &dst->na_srr_reloff_hi);
3533163899Smjacob	ISP_IOXPUT_16(isp, src->na_srr_reloff_lo, &dst->na_srr_reloff_lo);
3534163899Smjacob	ISP_IOXPUT_16(isp, src->na_srr_iu, &dst->na_srr_iu);
3535163899Smjacob	ISP_IOXPUT_16(isp, src->na_srr_flags, &dst->na_srr_flags);
3536163899Smjacob	for (i = 0; i < 18; i++) {
3537163899Smjacob		ISP_IOXPUT_8(isp, src->na_reserved3[i], &dst->na_reserved3[i]);
3538163899Smjacob	}
3539163899Smjacob	ISP_IOXPUT_8(isp, src->na_reserved4, &dst->na_reserved4);
3540196008Smjacob	ISP_IOXPUT_8(isp, src->na_vpidx, &dst->na_vpidx);
3541196008Smjacob	ISP_IOXPUT_8(isp, src->na_srr_reject_vunique, &dst->na_srr_reject_vunique);
3542196008Smjacob	ISP_IOXPUT_8(isp, src->na_srr_reject_explanation, &dst->na_srr_reject_explanation);
3543163899Smjacob	ISP_IOXPUT_8(isp, src->na_srr_reject_code, &dst->na_srr_reject_code);
3544163899Smjacob	ISP_IOXPUT_8(isp, src->na_reserved5, &dst->na_reserved5);
3545163899Smjacob	for (i = 0; i < 6; i++) {
3546163899Smjacob		ISP_IOXPUT_8(isp, src->na_reserved6[i], &dst->na_reserved6[i]);
3547163899Smjacob	}
3548163899Smjacob	ISP_IOXPUT_16(isp, src->na_oxid, &dst->na_oxid);
3549163899Smjacob}
3550163899Smjacob
3551163899Smjacobvoid
3552196008Smjacobisp_get_notify_ack_fc(ispsoftc_t *isp, na_fcentry_t *src, na_fcentry_t *dst)
3553163899Smjacob{
3554163899Smjacob	int i;
3555163899Smjacob	isp_get_hdr(isp, &src->na_header, &dst->na_header);
3556163899Smjacob	ISP_IOXGET_32(isp, &src->na_reserved, dst->na_reserved);
3557163899Smjacob	ISP_IOXGET_8(isp, &src->na_reserved1, dst->na_reserved1);
3558163899Smjacob	ISP_IOXGET_8(isp, &src->na_iid, dst->na_iid);
3559163899Smjacob	ISP_IOXGET_16(isp, &src->na_response, dst->na_response);
3560163899Smjacob	ISP_IOXGET_16(isp, &src->na_flags, dst->na_flags);
3561163899Smjacob	ISP_IOXGET_16(isp, &src->na_reserved2, dst->na_reserved2);
3562163899Smjacob	ISP_IOXGET_16(isp, &src->na_status, dst->na_status);
3563163899Smjacob	ISP_IOXGET_16(isp, &src->na_task_flags, dst->na_task_flags);
3564163899Smjacob	ISP_IOXGET_16(isp, &src->na_seqid, dst->na_seqid);
3565155228Smjacob	for (i = 0; i < NA2_RSVDLEN; i++) {
3566196008Smjacob		ISP_IOXGET_16(isp, &src->na_reserved3[i], dst->na_reserved3[i]);
3567155228Smjacob	}
3568155228Smjacob}
3569155228Smjacob
3570155228Smjacobvoid
3571196008Smjacobisp_get_notify_ack_fc_e(ispsoftc_t *isp, na_fcentry_e_t *src, na_fcentry_e_t *dst)
3572155228Smjacob{
3573155228Smjacob	int i;
3574163899Smjacob	isp_get_hdr(isp, &src->na_header, &dst->na_header);
3575163899Smjacob	ISP_IOXGET_32(isp, &src->na_reserved, dst->na_reserved);
3576163899Smjacob	ISP_IOXGET_16(isp, &src->na_iid, dst->na_iid);
3577163899Smjacob	ISP_IOXGET_16(isp, &src->na_response, dst->na_response);
3578163899Smjacob	ISP_IOXGET_16(isp, &src->na_flags, dst->na_flags);
3579163899Smjacob	ISP_IOXGET_16(isp, &src->na_reserved2, dst->na_reserved2);
3580163899Smjacob	ISP_IOXGET_16(isp, &src->na_status, dst->na_status);
3581163899Smjacob	ISP_IOXGET_16(isp, &src->na_task_flags, dst->na_task_flags);
3582163899Smjacob	ISP_IOXGET_16(isp, &src->na_seqid, dst->na_seqid);
3583155228Smjacob	for (i = 0; i < NA2_RSVDLEN; i++) {
3584196008Smjacob		ISP_IOXGET_16(isp, &src->na_reserved3[i], dst->na_reserved3[i]);
3585155228Smjacob	}
3586155228Smjacob}
3587163899Smjacob
3588163899Smjacobvoid
3589196008Smjacobisp_get_notify_ack_24xx(ispsoftc_t *isp, na_fcentry_24xx_t *src, na_fcentry_24xx_t *dst)
3590163899Smjacob{
3591163899Smjacob	int i;
3592163899Smjacob
3593163899Smjacob	isp_get_hdr(isp, &src->na_header, &dst->na_header);
3594163899Smjacob	ISP_IOXGET_32(isp, &src->na_handle, dst->na_handle);
3595163899Smjacob	ISP_IOXGET_16(isp, &src->na_nphdl, dst->na_nphdl);
3596163899Smjacob	ISP_IOXGET_16(isp, &src->na_reserved1, dst->na_reserved1);
3597163899Smjacob	ISP_IOXGET_16(isp, &src->na_flags, dst->na_flags);
3598163899Smjacob	ISP_IOXGET_16(isp, &src->na_srr_rxid, dst->na_srr_rxid);
3599163899Smjacob	ISP_IOXGET_16(isp, &src->na_status, dst->na_status);
3600163899Smjacob	ISP_IOXGET_8(isp, &src->na_status_subcode, dst->na_status_subcode);
3601289838Smav	ISP_IOXGET_8(isp, &src->na_fwhandle, dst->na_fwhandle);
3602163899Smjacob	ISP_IOXGET_32(isp, &src->na_rxid, dst->na_rxid);
3603163899Smjacob	ISP_IOXGET_16(isp, &src->na_srr_reloff_hi, dst->na_srr_reloff_hi);
3604163899Smjacob	ISP_IOXGET_16(isp, &src->na_srr_reloff_lo, dst->na_srr_reloff_lo);
3605163899Smjacob	ISP_IOXGET_16(isp, &src->na_srr_iu, dst->na_srr_iu);
3606163899Smjacob	ISP_IOXGET_16(isp, &src->na_srr_flags, dst->na_srr_flags);
3607163899Smjacob	for (i = 0; i < 18; i++) {
3608163899Smjacob		ISP_IOXGET_8(isp, &src->na_reserved3[i], dst->na_reserved3[i]);
3609163899Smjacob	}
3610163899Smjacob	ISP_IOXGET_8(isp, &src->na_reserved4, dst->na_reserved4);
3611196008Smjacob	ISP_IOXGET_8(isp, &src->na_vpidx, dst->na_vpidx);
3612196008Smjacob	ISP_IOXGET_8(isp, &src->na_srr_reject_vunique, dst->na_srr_reject_vunique);
3613196008Smjacob	ISP_IOXGET_8(isp, &src->na_srr_reject_explanation, dst->na_srr_reject_explanation);
3614163899Smjacob	ISP_IOXGET_8(isp, &src->na_srr_reject_code, dst->na_srr_reject_code);
3615163899Smjacob	ISP_IOXGET_8(isp, &src->na_reserved5, dst->na_reserved5);
3616163899Smjacob	for (i = 0; i < 6; i++) {
3617163899Smjacob		ISP_IOXGET_8(isp, &src->na_reserved6[i], dst->na_reserved6[i]);
3618163899Smjacob	}
3619163899Smjacob	ISP_IOXGET_16(isp, &src->na_oxid, dst->na_oxid);
3620163899Smjacob}
3621163899Smjacob
3622163899Smjacobvoid
3623163899Smjacobisp_get_abts(ispsoftc_t *isp, abts_t *src, abts_t *dst)
3624163899Smjacob{
3625163899Smjacob	int i;
3626163899Smjacob
3627163899Smjacob	isp_get_hdr(isp, &src->abts_header, &dst->abts_header);
3628163899Smjacob	for (i = 0; i < 6; i++) {
3629196008Smjacob		ISP_IOXGET_8(isp, &src->abts_reserved0[i], dst->abts_reserved0[i]);
3630163899Smjacob	}
3631163899Smjacob	ISP_IOXGET_16(isp, &src->abts_nphdl, dst->abts_nphdl);
3632163899Smjacob	ISP_IOXGET_16(isp, &src->abts_reserved1, dst->abts_reserved1);
3633163899Smjacob	ISP_IOXGET_16(isp, &src->abts_sof, dst->abts_sof);
3634163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rxid_abts, dst->abts_rxid_abts);
3635163899Smjacob	ISP_IOXGET_16(isp, &src->abts_did_lo, dst->abts_did_lo);
3636163899Smjacob	ISP_IOXGET_8(isp, &src->abts_did_hi, dst->abts_did_hi);
3637163899Smjacob	ISP_IOXGET_8(isp, &src->abts_r_ctl, dst->abts_r_ctl);
3638163899Smjacob	ISP_IOXGET_16(isp, &src->abts_sid_lo, dst->abts_sid_lo);
3639163899Smjacob	ISP_IOXGET_8(isp, &src->abts_sid_hi, dst->abts_sid_hi);
3640163899Smjacob	ISP_IOXGET_8(isp, &src->abts_cs_ctl, dst->abts_cs_ctl);
3641163899Smjacob	ISP_IOXGET_16(isp, &src->abts_fs_ctl, dst->abts_fs_ctl);
3642163899Smjacob	ISP_IOXGET_8(isp, &src->abts_f_ctl, dst->abts_f_ctl);
3643163899Smjacob	ISP_IOXGET_8(isp, &src->abts_type, dst->abts_type);
3644163899Smjacob	ISP_IOXGET_16(isp, &src->abts_seq_cnt, dst->abts_seq_cnt);
3645163899Smjacob	ISP_IOXGET_8(isp, &src->abts_df_ctl, dst->abts_df_ctl);
3646163899Smjacob	ISP_IOXGET_8(isp, &src->abts_seq_id, dst->abts_seq_id);
3647163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rx_id, dst->abts_rx_id);
3648163899Smjacob	ISP_IOXGET_16(isp, &src->abts_ox_id, dst->abts_ox_id);
3649163899Smjacob	ISP_IOXGET_32(isp, &src->abts_param, dst->abts_param);
3650163899Smjacob	for (i = 0; i < 16; i++) {
3651196008Smjacob		ISP_IOXGET_8(isp, &src->abts_reserved2[i], dst->abts_reserved2[i]);
3652163899Smjacob	}
3653163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rxid_task, dst->abts_rxid_task);
3654163899Smjacob}
3655163899Smjacob
3656163899Smjacobvoid
3657163899Smjacobisp_put_abts_rsp(ispsoftc_t *isp, abts_rsp_t *src, abts_rsp_t *dst)
3658163899Smjacob{
3659163899Smjacob	int i;
3660163899Smjacob
3661163899Smjacob	isp_put_hdr(isp, &src->abts_rsp_header, &dst->abts_rsp_header);
3662163899Smjacob	ISP_IOXPUT_32(isp, src->abts_rsp_handle, &dst->abts_rsp_handle);
3663163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_status, &dst->abts_rsp_status);
3664163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_nphdl, &dst->abts_rsp_nphdl);
3665163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_ctl_flags, &dst->abts_rsp_ctl_flags);
3666163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_sof, &dst->abts_rsp_sof);
3667163899Smjacob	ISP_IOXPUT_32(isp, src->abts_rsp_rxid_abts, &dst->abts_rsp_rxid_abts);
3668163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_did_lo, &dst->abts_rsp_did_lo);
3669163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_did_hi, &dst->abts_rsp_did_hi);
3670163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_r_ctl, &dst->abts_rsp_r_ctl);
3671163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_sid_lo, &dst->abts_rsp_sid_lo);
3672163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_sid_hi, &dst->abts_rsp_sid_hi);
3673163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_cs_ctl, &dst->abts_rsp_cs_ctl);
3674163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_f_ctl_lo, &dst->abts_rsp_f_ctl_lo);
3675163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_f_ctl_hi, &dst->abts_rsp_f_ctl_hi);
3676163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_type, &dst->abts_rsp_type);
3677163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_seq_cnt, &dst->abts_rsp_seq_cnt);
3678163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_df_ctl, &dst->abts_rsp_df_ctl);
3679163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_seq_id, &dst->abts_rsp_seq_id);
3680163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_rx_id, &dst->abts_rsp_rx_id);
3681163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_ox_id, &dst->abts_rsp_ox_id);
3682163899Smjacob	ISP_IOXPUT_32(isp, src->abts_rsp_param, &dst->abts_rsp_param);
3683163899Smjacob	if (src->abts_rsp_r_ctl == BA_ACC) {
3684196008Smjacob		ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.reserved, &dst->abts_rsp_payload.ba_acc.reserved);
3685196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_acc.last_seq_id, &dst->abts_rsp_payload.ba_acc.last_seq_id);
3686196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_acc.seq_id_valid, &dst->abts_rsp_payload.ba_acc.seq_id_valid);
3687196008Smjacob		ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.aborted_rx_id, &dst->abts_rsp_payload.ba_acc.aborted_rx_id);
3688196008Smjacob		ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.aborted_ox_id, &dst->abts_rsp_payload.ba_acc.aborted_ox_id);
3689196008Smjacob		ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.high_seq_cnt, &dst->abts_rsp_payload.ba_acc.high_seq_cnt);
3690196008Smjacob		ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.low_seq_cnt, &dst->abts_rsp_payload.ba_acc.low_seq_cnt);
3691163899Smjacob		for (i = 0; i < 4; i++) {
3692196008Smjacob			ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.reserved2[i], &dst->abts_rsp_payload.ba_acc.reserved2[i]);
3693163899Smjacob		}
3694163899Smjacob	} else if (src->abts_rsp_r_ctl == BA_RJT) {
3695196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.vendor_unique, &dst->abts_rsp_payload.ba_rjt.vendor_unique);
3696196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.explanation, &dst->abts_rsp_payload.ba_rjt.explanation);
3697196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.reason, &dst->abts_rsp_payload.ba_rjt.reason);
3698196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.reserved, &dst->abts_rsp_payload.ba_rjt.reserved);
3699163899Smjacob		for (i = 0; i < 12; i++) {
3700196008Smjacob			ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_rjt.reserved2[i], &dst->abts_rsp_payload.ba_rjt.reserved2[i]);
3701163899Smjacob		}
3702163899Smjacob	} else {
3703163899Smjacob		for (i = 0; i < 16; i++) {
3704196008Smjacob			ISP_IOXPUT_8(isp, src->abts_rsp_payload.reserved[i], &dst->abts_rsp_payload.reserved[i]);
3705163899Smjacob		}
3706163899Smjacob	}
3707163899Smjacob	ISP_IOXPUT_32(isp, src->abts_rsp_rxid_task, &dst->abts_rsp_rxid_task);
3708163899Smjacob}
3709163899Smjacob
3710163899Smjacobvoid
3711163899Smjacobisp_get_abts_rsp(ispsoftc_t *isp, abts_rsp_t *src, abts_rsp_t *dst)
3712163899Smjacob{
3713163899Smjacob	int i;
3714163899Smjacob
3715163899Smjacob	isp_get_hdr(isp, &src->abts_rsp_header, &dst->abts_rsp_header);
3716163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_handle, dst->abts_rsp_handle);
3717163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_status, dst->abts_rsp_status);
3718163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_nphdl, dst->abts_rsp_nphdl);
3719163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_ctl_flags, dst->abts_rsp_ctl_flags);
3720163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_sof, dst->abts_rsp_sof);
3721163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_rxid_abts, dst->abts_rsp_rxid_abts);
3722163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_did_lo, dst->abts_rsp_did_lo);
3723163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_did_hi, dst->abts_rsp_did_hi);
3724163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_r_ctl, dst->abts_rsp_r_ctl);
3725163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_sid_lo, dst->abts_rsp_sid_lo);
3726163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_sid_hi, dst->abts_rsp_sid_hi);
3727163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_cs_ctl, dst->abts_rsp_cs_ctl);
3728163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_f_ctl_lo, dst->abts_rsp_f_ctl_lo);
3729163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_f_ctl_hi, dst->abts_rsp_f_ctl_hi);
3730163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_type, dst->abts_rsp_type);
3731163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_seq_cnt, dst->abts_rsp_seq_cnt);
3732163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_df_ctl, dst->abts_rsp_df_ctl);
3733163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_seq_id, dst->abts_rsp_seq_id);
3734163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_rx_id, dst->abts_rsp_rx_id);
3735163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_ox_id, dst->abts_rsp_ox_id);
3736163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_param, dst->abts_rsp_param);
3737163899Smjacob	for (i = 0; i < 8; i++) {
3738196008Smjacob		ISP_IOXGET_8(isp, &src->abts_rsp_payload.rsp.reserved[i], dst->abts_rsp_payload.rsp.reserved[i]);
3739163899Smjacob	}
3740196008Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_payload.rsp.subcode1, dst->abts_rsp_payload.rsp.subcode1);
3741196008Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_payload.rsp.subcode2, dst->abts_rsp_payload.rsp.subcode2);
3742163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_rxid_task, dst->abts_rsp_rxid_task);
3743163899Smjacob}
3744155228Smjacob#endif	/* ISP_TARGET_MODE */
3745163899Smjacob/*
3746163899Smjacob * vim:ts=8:sw=8
3747163899Smjacob */
3748