isp_library.c revision 208997
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 208997 2010-06-10 19:38:07Z mjacob $");
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
61196008Smjacobisp_send_cmd(ispsoftc_t *isp, void *fqe, void *segp, uint32_t nsegs, uint32_t totalcnt, isp_ddir_t ddir)
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) {
147196008Smjacob			return (CMD_EAGAIN);
148196008Smjacob		}
149196008Smjacob		ISP_MEMZERO(storage, QENTRY_LEN);
150196008Smjacob		qe1 = ISP_QUEUE_ENTRY(isp->isp_rquest, nxt);
151196008Smjacob		nxt = nxtnxt;
152196008Smjacob		if (dsp64) {
153196008Smjacob			ispcontreq64_t *crq = (ispcontreq64_t *) storage;
154196008Smjacob			seglim = ISP_CDSEG64;
155196008Smjacob			crq->req_header.rqs_entry_type = RQSTYPE_A64_CONT;
156196008Smjacob			crq->req_header.rqs_entry_count = 1;
157196008Smjacob			dsp64 = crq->req_dataseg;
158196008Smjacob		} else {
159196008Smjacob			ispcontreq_t *crq = (ispcontreq_t *) storage;
160196008Smjacob			seglim = ISP_CDSEG;
161196008Smjacob			crq->req_header.rqs_entry_type = RQSTYPE_DATASEG;
162196008Smjacob			crq->req_header.rqs_entry_count = 1;
163196008Smjacob			dsp = crq->req_dataseg;
164196008Smjacob		}
165196008Smjacob		if (seg + seglim > nsegs) {
166196008Smjacob			seglim = nsegs - seg;
167196008Smjacob		}
168196008Smjacob		for (curseg = 0; curseg < seglim; curseg++) {
169196008Smjacob			if (dsp64) {
170196008Smjacob				XS_GET_DMA64_SEG(dsp64++, segp, seg++);
171196008Smjacob			} else {
172196008Smjacob				XS_GET_DMA_SEG(dsp++, segp, seg++);
173196008Smjacob			}
174196008Smjacob		}
175196008Smjacob		if (dsp64) {
176196008Smjacob			isp_put_cont64_req(isp, (ispcontreq64_t *)storage, qe1);
177196008Smjacob		} else {
178196008Smjacob			isp_put_cont_req(isp, (ispcontreq_t *)storage, qe1);
179196008Smjacob		}
180196008Smjacob		if (isp->isp_dblev & ISP_LOGDEBUG1) {
181196008Smjacob			isp_print_bytes(isp, "additional queue entry", QENTRY_LEN, storage);
182196008Smjacob		}
183196008Smjacob		nqe++;
184196008Smjacob        }
185196008Smjacob
186196008Smjacobcopy_and_sync:
187196008Smjacob	((isphdr_t *)fqe)->rqs_entry_count = nqe;
188196008Smjacob	switch (type) {
189196008Smjacob	case RQSTYPE_REQUEST:
190196008Smjacob		((ispreq_t *)fqe)->req_flags |= ddf;
191196008Smjacob		/*
192196008Smjacob		 * This is historical and not clear whether really needed.
193196008Smjacob		 */
194196008Smjacob		if (nsegs == 0) {
195196008Smjacob			nsegs = 1;
196196008Smjacob		}
197196008Smjacob		((ispreq_t *)fqe)->req_seg_count = nsegs;
198196008Smjacob		isp_put_request(isp, fqe, qe0);
199196008Smjacob		break;
200196008Smjacob	case RQSTYPE_CMDONLY:
201196008Smjacob		((ispreq_t *)fqe)->req_flags |= ddf;
202196008Smjacob		/*
203196008Smjacob		 * This is historical and not clear whether really needed.
204196008Smjacob		 */
205196008Smjacob		if (nsegs == 0) {
206196008Smjacob			nsegs = 1;
207196008Smjacob		}
208196008Smjacob		((ispextreq_t *)fqe)->req_seg_count = nsegs;
209196008Smjacob		isp_put_extended_request(isp, fqe, qe0);
210196008Smjacob		break;
211196008Smjacob	case RQSTYPE_T2RQS:
212196008Smjacob		((ispreqt2_t *)fqe)->req_flags |= ddf;
213196008Smjacob		((ispreqt2_t *)fqe)->req_seg_count = nsegs;
214196008Smjacob		((ispreqt2_t *)fqe)->req_totalcnt = totalcnt;
215196008Smjacob		if (ISP_CAP_2KLOGIN(isp)) {
216196008Smjacob			isp_put_request_t2e(isp, fqe, qe0);
217196008Smjacob		} else {
218196008Smjacob			isp_put_request_t2(isp, fqe, qe0);
219196008Smjacob		}
220196008Smjacob		break;
221196008Smjacob	case RQSTYPE_A64:
222196008Smjacob	case RQSTYPE_T3RQS:
223196008Smjacob		((ispreqt3_t *)fqe)->req_flags |= ddf;
224196008Smjacob		((ispreqt3_t *)fqe)->req_seg_count = nsegs;
225196008Smjacob		((ispreqt3_t *)fqe)->req_totalcnt = totalcnt;
226196008Smjacob		if (ISP_CAP_2KLOGIN(isp)) {
227196008Smjacob			isp_put_request_t3e(isp, fqe, qe0);
228196008Smjacob		} else {
229196008Smjacob			isp_put_request_t3(isp, fqe, qe0);
230196008Smjacob		}
231196008Smjacob		break;
232196008Smjacob	case RQSTYPE_T7RQS:
233196008Smjacob        	((ispreqt7_t *)fqe)->req_alen_datadir = ddf;
234196008Smjacob		((ispreqt7_t *)fqe)->req_seg_count = nsegs;
235196008Smjacob		((ispreqt7_t *)fqe)->req_dl = totalcnt;
236196008Smjacob		isp_put_request_t7(isp, fqe, qe0);
237196008Smjacob		break;
238196008Smjacob	default:
239196008Smjacob		return (CMD_COMPLETE);
240196008Smjacob	}
241196008Smjacob	if (isp->isp_dblev & ISP_LOGDEBUG1) {
242196008Smjacob		isp_print_bytes(isp, "first queue entry", QENTRY_LEN, fqe);
243196008Smjacob	}
244196008Smjacob	ISP_ADD_REQUEST(isp, nxt);
245196008Smjacob	return (CMD_QUEUED);
246196008Smjacob}
247196008Smjacob
248196008Smjacobint
249203444Smjacobisp_allocate_xs(ispsoftc_t *isp, XS_T *xs, uint32_t *handlep)
250155228Smjacob{
251203444Smjacob	isp_hdl_t *hdp;
252155228Smjacob
253203444Smjacob	hdp = isp->isp_xffree;
254203444Smjacob	if (hdp == NULL) {
255155228Smjacob		return (-1);
256155228Smjacob	}
257203444Smjacob	isp->isp_xffree = hdp->cmd;
258203444Smjacob	hdp->cmd = xs;
259203444Smjacob	hdp->handle = (hdp - isp->isp_xflist);
260203444Smjacob	hdp->handle |= (ISP_HANDLE_INITIATOR << ISP_HANDLE_USAGE_SHIFT);
261203444Smjacob	hdp->handle |= (isp->isp_seqno++ << ISP_HANDLE_SEQ_SHIFT);
262203444Smjacob	*handlep = hdp->handle;
263155228Smjacob	return (0);
264155228Smjacob}
265155228Smjacob
266155228SmjacobXS_T *
267163899Smjacobisp_find_xs(ispsoftc_t *isp, uint32_t handle)
268155228Smjacob{
269203444Smjacob	if (!ISP_VALID_INI_HANDLE(isp, handle)) {
270203444Smjacob		isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle);
271155228Smjacob		return (NULL);
272155228Smjacob	}
273203444Smjacob	return (isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].cmd);
274155228Smjacob}
275155228Smjacob
276163899Smjacobuint32_t
277155704Smjacobisp_find_handle(ispsoftc_t *isp, XS_T *xs)
278155228Smjacob{
279203444Smjacob	uint32_t i, foundhdl = ISP_HANDLE_FREE;
280203444Smjacob
281155228Smjacob	if (xs != NULL) {
282155228Smjacob		for (i = 0; i < isp->isp_maxcmds; i++) {
283203444Smjacob			if (isp->isp_xflist[i].cmd != xs) {
284203444Smjacob				continue;
285155228Smjacob			}
286203444Smjacob			foundhdl = isp->isp_xflist[i].handle;
287203444Smjacob			break;
288155228Smjacob		}
289155228Smjacob	}
290203444Smjacob	return (foundhdl);
291155228Smjacob}
292155228Smjacob
293163899Smjacobuint32_t
294203444Smjacobisp_handle_index(ispsoftc_t *isp, uint32_t handle)
295155228Smjacob{
296203444Smjacob	if (!ISP_VALID_HANDLE(isp, handle)) {
297203444Smjacob		isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle);
298203444Smjacob		return (ISP_BAD_HANDLE_INDEX);
299205712Smjacob	} else {
300205712Smjacob		return (handle & ISP_HANDLE_CMD_MASK);
301203444Smjacob	}
302155228Smjacob}
303155228Smjacob
304155228Smjacobvoid
305163899Smjacobisp_destroy_handle(ispsoftc_t *isp, uint32_t handle)
306155228Smjacob{
307203444Smjacob	if (!ISP_VALID_INI_HANDLE(isp, handle)) {
308203444Smjacob		isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle);
309203444Smjacob	} else {
310203444Smjacob		isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].handle = ISP_HANDLE_FREE;
311203444Smjacob		isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].cmd = isp->isp_xffree;
312203444Smjacob		isp->isp_xffree = &isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)];
313155228Smjacob	}
314155228Smjacob}
315155228Smjacob
316196008Smjacob/*
317196008Smjacob * Make sure we have space to put something on the request queue.
318196008Smjacob * Return a pointer to that entry if we do. A side effect of this
319196008Smjacob * function is to update the output index. The input index
320196008Smjacob * stays the same.
321196008Smjacob */
322196008Smjacobvoid *
323196008Smjacobisp_getrqentry(ispsoftc_t *isp)
324155228Smjacob{
325196008Smjacob	isp->isp_reqodx = ISP_READ(isp, isp->isp_rqstoutrp);
326196008Smjacob	if (ISP_NXT_QENTRY(isp->isp_reqidx, RQUEST_QUEUE_LEN(isp)) == isp->isp_reqodx) {
327196008Smjacob		return (NULL);
328155228Smjacob	}
329196008Smjacob	return (ISP_QUEUE_ENTRY(isp->isp_rquest, isp->isp_reqidx));
330155228Smjacob}
331155228Smjacob
332155228Smjacob#define	TBA	(4 * (((QENTRY_LEN >> 2) * 3) + 1) + 1)
333155228Smjacobvoid
334196008Smjacobisp_print_qentry(ispsoftc_t *isp, const char *msg, int idx, void *arg)
335155228Smjacob{
336155228Smjacob	char buf[TBA];
337155228Smjacob	int amt, i, j;
338155704Smjacob	uint8_t *ptr = arg;
339155228Smjacob
340155228Smjacob	isp_prt(isp, ISP_LOGALL, "%s index %d=>", msg, idx);
341155228Smjacob	for (buf[0] = 0, amt = i = 0; i < 4; i++) {
342155228Smjacob		buf[0] = 0;
343196008Smjacob		ISP_SNPRINTF(buf, TBA, "  ");
344155228Smjacob		for (j = 0; j < (QENTRY_LEN >> 2); j++) {
345196008Smjacob			ISP_SNPRINTF(buf, TBA, "%s %02x", buf, ptr[amt++] & 0xff);
346155228Smjacob		}
347208997Smjacob		isp_prt(isp, ISP_LOGALL, "%s", buf);
348155228Smjacob	}
349155228Smjacob}
350155228Smjacob
351155228Smjacobvoid
352167821Smjacobisp_print_bytes(ispsoftc_t *isp, const char *msg, int amt, void *arg)
353155228Smjacob{
354155228Smjacob	char buf[128];
355155704Smjacob	uint8_t *ptr = arg;
356155228Smjacob	int off;
357155228Smjacob
358155228Smjacob	if (msg)
359155228Smjacob		isp_prt(isp, ISP_LOGALL, "%s:", msg);
360155228Smjacob	off = 0;
361155228Smjacob	buf[0] = 0;
362155228Smjacob	while (off < amt) {
363155228Smjacob		int j, to;
364155228Smjacob		to = off;
365155228Smjacob		for (j = 0; j < 16; j++) {
366196008Smjacob			ISP_SNPRINTF(buf, 128, "%s %02x", buf, ptr[off++] & 0xff);
367196008Smjacob			if (off == amt) {
368155228Smjacob				break;
369196008Smjacob			}
370155228Smjacob		}
371155228Smjacob		isp_prt(isp, ISP_LOGALL, "0x%08x:%s", to, buf);
372155228Smjacob		buf[0] = 0;
373155228Smjacob	}
374155228Smjacob}
375155228Smjacob
376155228Smjacob/*
377155228Smjacob * Do the common path to try and ensure that link is up, we've scanned
378155228Smjacob * the fabric (if we're on a fabric), and that we've synchronized this
379155228Smjacob * all with our own database and done the appropriate logins.
380155228Smjacob *
381155228Smjacob * We repeatedly check for firmware state and loop state after each
382155228Smjacob * action because things may have changed while we were doing this.
383155228Smjacob * Any failure or change of state causes us to return a nonzero value.
384155228Smjacob *
385155228Smjacob * We assume we enter here with any locks held.
386155228Smjacob */
387155228Smjacob
388155228Smjacobint
389196008Smjacobisp_fc_runstate(ispsoftc_t *isp, int chan, int tval)
390155228Smjacob{
391155228Smjacob	fcparam *fcp;
392155228Smjacob
393196008Smjacob	fcp = FCPARAM(isp, chan);
394196008Smjacob        if (fcp->role == ISP_ROLE_NONE) {
395155228Smjacob		return (0);
396155228Smjacob	}
397196008Smjacob	if (fcp->isp_fwstate < FW_READY || fcp->isp_loopstate < LOOP_PDB_RCVD) {
398196008Smjacob		if (isp_control(isp, ISPCTL_FCLINK_TEST, chan, tval) != 0) {
399196008Smjacob			isp_prt(isp, ISP_LOGSANCFG, "isp_fc_runstate: linktest failed for channel %d", chan);
400163899Smjacob			return (-1);
401163899Smjacob		}
402196008Smjacob		if (fcp->isp_fwstate != FW_READY || fcp->isp_loopstate < LOOP_PDB_RCVD) {
403196008Smjacob			isp_prt(isp, ISP_LOGSANCFG, "isp_fc_runstate: f/w not ready for channel %d", chan);
404163899Smjacob			return (-1);
405163899Smjacob		}
406155228Smjacob	}
407196008Smjacob
408196008Smjacob	if ((fcp->role & ISP_ROLE_INITIATOR) == 0) {
409155228Smjacob		return (0);
410155228Smjacob	}
411196008Smjacob
412196008Smjacob	if (isp_control(isp, ISPCTL_SCAN_LOOP, chan) != 0) {
413196008Smjacob		isp_prt(isp, ISP_LOGSANCFG, "isp_fc_runstate: scan loop fails on channel %d", chan);
414163899Smjacob		return (LOOP_PDB_RCVD);
415163899Smjacob	}
416196008Smjacob	if (isp_control(isp, ISPCTL_SCAN_FABRIC, chan) != 0) {
417196008Smjacob		isp_prt(isp, ISP_LOGSANCFG, "isp_fc_runstate: scan fabric fails on channel %d", chan);
418163899Smjacob		return (LOOP_LSCAN_DONE);
419163899Smjacob	}
420196008Smjacob	if (isp_control(isp, ISPCTL_PDB_SYNC, chan) != 0) {
421196008Smjacob		isp_prt(isp, ISP_LOGSANCFG, "isp_fc_runstate: pdb_sync fails on channel %d", chan);
422163899Smjacob		return (LOOP_FSCAN_DONE);
423155228Smjacob	}
424155228Smjacob	if (fcp->isp_fwstate != FW_READY || fcp->isp_loopstate != LOOP_READY) {
425196008Smjacob		isp_prt(isp, ISP_LOGSANCFG, "isp_fc_runstate: f/w not ready again on channel %d", chan);
426155228Smjacob		return (-1);
427155228Smjacob	}
428155228Smjacob	return (0);
429155228Smjacob}
430155228Smjacob
431164272Smjacob/*
432196008Smjacob * Fibre Channel Support routines
433164272Smjacob */
434163899Smjacobvoid
435196008Smjacobisp_dump_portdb(ispsoftc_t *isp, int chan)
436164272Smjacob{
437196008Smjacob	fcparam *fcp = FCPARAM(isp, chan);
438164272Smjacob	int i;
439164272Smjacob
440164272Smjacob	for (i = 0; i < MAX_FC_TARG; i++) {
441164272Smjacob		char mb[4];
442164272Smjacob		const char *dbs[8] = {
443164272Smjacob			"NIL ",
444164272Smjacob			"PROB",
445164272Smjacob			"DEAD",
446164272Smjacob			"CHGD",
447164272Smjacob			"NEW ",
448164272Smjacob			"PVLD",
449164272Smjacob			"ZOMB",
450164272Smjacob			"VLD "
451164272Smjacob		};
452164272Smjacob		const char *roles[4] = {
453164272Smjacob			" UNK", " TGT", " INI", "TINI"
454164272Smjacob		};
455164272Smjacob		fcportdb_t *lp = &fcp->portdb[i];
456164272Smjacob
457196008Smjacob		if (lp->state == FC_PORTDB_STATE_NIL && lp->target_mode == 0) {
458164272Smjacob			continue;
459164272Smjacob		}
460196008Smjacob		if (lp->dev_map_idx) {
461196008Smjacob			ISP_SNPRINTF(mb, sizeof (mb), "%3d", ((int) lp->dev_map_idx) - 1);
462164272Smjacob		} else {
463196008Smjacob			ISP_SNPRINTF(mb, sizeof (mb), "---");
464164272Smjacob		}
465196008Smjacob		isp_prt(isp, ISP_LOGALL, "Chan %d [%d]: hdl 0x%x %s al%d tgt %s %s 0x%06x =>%s 0x%06x; WWNN 0x%08x%08x WWPN 0x%08x%08x",
466196008Smjacob		    chan, i, lp->handle, dbs[lp->state], lp->autologin, mb, roles[lp->roles], lp->portid, roles[lp->new_roles], lp->new_portid,
467196008Smjacob		    (uint32_t) (lp->node_wwn >> 32), (uint32_t) (lp->node_wwn), (uint32_t) (lp->port_wwn >> 32), (uint32_t) (lp->port_wwn));
468164272Smjacob	}
469164272Smjacob}
470164272Smjacob
471196008Smjacobconst char *
472196008Smjacobisp_fc_fw_statename(int state)
473196008Smjacob{
474196008Smjacob	switch (state) {
475196008Smjacob	case FW_CONFIG_WAIT:	return "Config Wait";
476196008Smjacob	case FW_WAIT_AL_PA:	return "Waiting for AL_PA";
477196008Smjacob	case FW_WAIT_LOGIN:	return "Wait Login";
478196008Smjacob	case FW_READY:		return "Ready";
479196008Smjacob	case FW_LOSS_OF_SYNC:	return "Loss Of Sync";
480196008Smjacob	case FW_ERROR:		return "Error";
481196008Smjacob	case FW_REINIT:		return "Re-Init";
482196008Smjacob	case FW_NON_PART:	return "Nonparticipating";
483196008Smjacob	default:		return "?????";
484196008Smjacob	}
485196008Smjacob}
486196008Smjacob
487196008Smjacobconst char *
488196008Smjacobisp_fc_loop_statename(int state)
489196008Smjacob{
490196008Smjacob	switch (state) {
491196008Smjacob	case LOOP_NIL:                  return "NIL";
492196008Smjacob	case LOOP_LIP_RCVD:             return "LIP Received";
493196008Smjacob	case LOOP_PDB_RCVD:             return "PDB Received";
494196008Smjacob	case LOOP_SCANNING_LOOP:        return "Scanning";
495196008Smjacob	case LOOP_LSCAN_DONE:           return "Loop Scan Done";
496196008Smjacob	case LOOP_SCANNING_FABRIC:      return "Scanning Fabric";
497196008Smjacob	case LOOP_FSCAN_DONE:           return "Fabric Scan Done";
498196008Smjacob	case LOOP_SYNCING_PDB:          return "Syncing PDB";
499196008Smjacob	case LOOP_READY:                return "Ready";
500196008Smjacob	default:                        return "?????";
501196008Smjacob	}
502196008Smjacob}
503196008Smjacob
504196008Smjacobconst char *
505196008Smjacobisp_fc_toponame(fcparam *fcp)
506196008Smjacob{
507196008Smjacob
508196008Smjacob	if (fcp->isp_fwstate != FW_READY) {
509196008Smjacob		return "Unavailable";
510196008Smjacob	}
511196008Smjacob	switch (fcp->isp_topo) {
512196008Smjacob	case TOPO_NL_PORT:      return "Private Loop";
513196008Smjacob	case TOPO_FL_PORT:      return "FL Port";
514196008Smjacob	case TOPO_N_PORT:       return "N-Port to N-Port";
515196008Smjacob	case TOPO_F_PORT:       return "F Port";
516196008Smjacob	case TOPO_PTP_STUB:     return "F Port (no FLOGI_ACC response)";
517196008Smjacob	default:                return "?????";
518196008Smjacob	}
519196008Smjacob}
520196008Smjacob
521196008Smjacob/*
522196008Smjacob * Change Roles
523196008Smjacob */
524196008Smjacobint
525196008Smjacobisp_fc_change_role(ispsoftc_t *isp, int chan, int new_role)
526196008Smjacob{
527196008Smjacob	fcparam *fcp = FCPARAM(isp, chan);
528196008Smjacob
529196008Smjacob	if (chan >= isp->isp_nchan) {
530196008Smjacob		isp_prt(isp, ISP_LOGWARN, "%s: bad channel %d", __func__, chan);
531196008Smjacob		return (ENXIO);
532196008Smjacob	}
533196008Smjacob	if (chan == 0) {
534196008Smjacob#ifdef	ISP_TARGET_MODE
535196008Smjacob		isp_del_all_wwn_entries(isp, chan);
536196008Smjacob#endif
537196008Smjacob		isp_clear_commands(isp);
538196008Smjacob
539196008Smjacob		isp_reset(isp, 0);
540196008Smjacob		if (isp->isp_state != ISP_RESETSTATE) {
541196008Smjacob			isp_prt(isp, ISP_LOGERR, "%s: cannot reset card", __func__);
542196008Smjacob			return (EIO);
543196008Smjacob		}
544196008Smjacob		fcp->role = new_role;
545196008Smjacob		isp_init(isp);
546196008Smjacob		if (isp->isp_state != ISP_INITSTATE) {
547196008Smjacob			isp_prt(isp, ISP_LOGERR, "%s: cannot init card", __func__);
548196008Smjacob			return (EIO);
549196008Smjacob		}
550196008Smjacob		isp->isp_state = ISP_RUNSTATE;
551196008Smjacob		return (0);
552196008Smjacob	} else if (ISP_CAP_MULTI_ID(isp)) {
553196008Smjacob		mbreg_t mbs;
554196008Smjacob		vp_modify_t *vp;
555196008Smjacob		uint8_t qe[QENTRY_LEN], *scp;
556196008Smjacob
557196008Smjacob		ISP_MEMZERO(qe, QENTRY_LEN);
558196008Smjacob		/* Acquire Scratch */
559196008Smjacob
560196008Smjacob		if (FC_SCRATCH_ACQUIRE(isp, chan)) {
561196008Smjacob			return (EBUSY);
562196008Smjacob		}
563196008Smjacob		scp = fcp->isp_scratch;
564196008Smjacob
565196008Smjacob		/*
566196008Smjacob		 * Build a VP MODIFY command in memory
567196008Smjacob		 */
568196008Smjacob		vp = (vp_modify_t *) qe;
569196008Smjacob		vp->vp_mod_hdr.rqs_entry_type = RQSTYPE_VP_MODIFY;
570196008Smjacob		vp->vp_mod_hdr.rqs_entry_count = 1;
571196008Smjacob		vp->vp_mod_cnt = 1;
572196008Smjacob		vp->vp_mod_idx0 = chan;
573196008Smjacob		vp->vp_mod_cmd = VP_MODIFY_ENA;
574196008Smjacob		vp->vp_mod_ports[0].options = ICB2400_VPOPT_ENABLED;
575196008Smjacob		if (new_role & ISP_ROLE_INITIATOR) {
576196008Smjacob			vp->vp_mod_ports[0].options |= ICB2400_VPOPT_INI_ENABLE;
577196008Smjacob		}
578196008Smjacob		if ((new_role & ISP_ROLE_TARGET) == 0) {
579196008Smjacob			vp->vp_mod_ports[0].options |= ICB2400_VPOPT_TGT_DISABLE;
580196008Smjacob		}
581196008Smjacob		MAKE_NODE_NAME_FROM_WWN(vp->vp_mod_ports[0].wwpn, fcp->isp_wwpn);
582196008Smjacob		MAKE_NODE_NAME_FROM_WWN(vp->vp_mod_ports[0].wwnn, fcp->isp_wwnn);
583196008Smjacob		isp_put_vp_modify(isp, vp, (vp_modify_t *) scp);
584196008Smjacob
585196008Smjacob		/*
586196008Smjacob		 * Build a EXEC IOCB A64 command that points to the VP MODIFY command
587196008Smjacob		 */
588196008Smjacob		MBSINIT(&mbs, MBOX_EXEC_COMMAND_IOCB_A64, MBLOGALL, 0);
589196008Smjacob		mbs.param[1] = QENTRY_LEN;
590196008Smjacob		mbs.param[2] = DMA_WD1(fcp->isp_scdma);
591196008Smjacob		mbs.param[3] = DMA_WD0(fcp->isp_scdma);
592196008Smjacob		mbs.param[6] = DMA_WD3(fcp->isp_scdma);
593196008Smjacob		mbs.param[7] = DMA_WD2(fcp->isp_scdma);
594196008Smjacob		MEMORYBARRIER(isp, SYNC_SFORDEV, 0, 2 * QENTRY_LEN);
595196008Smjacob		isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs);
596196008Smjacob		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
597196008Smjacob			FC_SCRATCH_RELEASE(isp, chan);
598196008Smjacob			return (EIO);
599196008Smjacob		}
600196008Smjacob		MEMORYBARRIER(isp, SYNC_SFORCPU, QENTRY_LEN, QENTRY_LEN);
601196008Smjacob		isp_get_vp_modify(isp, (vp_modify_t *)&scp[QENTRY_LEN], vp);
602196008Smjacob
603196008Smjacob#ifdef	ISP_TARGET_MODE
604196008Smjacob		isp_del_all_wwn_entries(isp, chan);
605196008Smjacob#endif
606196008Smjacob		/*
607196008Smjacob		 * Release Scratch
608196008Smjacob		 */
609196008Smjacob		FC_SCRATCH_RELEASE(isp, chan);
610196008Smjacob
611196008Smjacob		if (vp->vp_mod_status != VP_STS_OK) {
612196008Smjacob			isp_prt(isp, ISP_LOGERR, "%s: VP_MODIFY of Chan %d failed with status %d", __func__, chan, vp->vp_mod_status);
613196008Smjacob			return (EIO);
614196008Smjacob		}
615196008Smjacob		fcp->role = new_role;
616196008Smjacob		return (0);
617196008Smjacob	} else {
618196008Smjacob		return (EINVAL);
619196008Smjacob	}
620196008Smjacob}
621196008Smjacob
622164272Smjacobvoid
623196008Smjacobisp_clear_commands(ispsoftc_t *isp)
624196008Smjacob{
625203444Smjacob	uint32_t tmp;
626203444Smjacob	isp_hdl_t *hdp;
627196008Smjacob#ifdef	ISP_TARGET_MODE
628196008Smjacob	isp_notify_t notify;
629196008Smjacob#endif
630196008Smjacob
631196008Smjacob	for (tmp = 0; isp->isp_xflist && tmp < isp->isp_maxcmds; tmp++) {
632203444Smjacob		XS_T *xs;
633203444Smjacob
634203444Smjacob		hdp = &isp->isp_xflist[tmp];
635203444Smjacob		if (hdp->handle == ISP_HANDLE_FREE) {
636196008Smjacob			continue;
637196008Smjacob		}
638203444Smjacob		xs = hdp->cmd;
639196008Smjacob		if (XS_XFRLEN(xs)) {
640203444Smjacob			ISP_DMAFREE(isp, xs, hdp->handle);
641196008Smjacob			XS_SET_RESID(xs, XS_XFRLEN(xs));
642196008Smjacob		} else {
643196008Smjacob			XS_SET_RESID(xs, 0);
644196008Smjacob		}
645203444Smjacob		hdp->handle = 0;
646203444Smjacob		hdp->cmd = NULL;
647196008Smjacob		XS_SETERR(xs, HBA_BUSRESET);
648196008Smjacob		isp_done(xs);
649196008Smjacob	}
650196008Smjacob#ifdef	ISP_TARGET_MODE
651196008Smjacob	for (tmp = 0; isp->isp_tgtlist && tmp < isp->isp_maxcmds; tmp++) {
652196008Smjacob		uint8_t local[QENTRY_LEN];
653203478Smjacob		hdp = &isp->isp_tgtlist[tmp];
654203444Smjacob		if (hdp->handle == ISP_HANDLE_FREE) {
655196008Smjacob			continue;
656196008Smjacob		}
657203444Smjacob		ISP_DMAFREE(isp, hdp->cmd, hdp->handle);
658196008Smjacob		ISP_MEMZERO(local, QENTRY_LEN);
659196008Smjacob		if (IS_24XX(isp)) {
660196008Smjacob			ct7_entry_t *ctio = (ct7_entry_t *) local;
661203444Smjacob			ctio->ct_syshandle = hdp->handle;
662196008Smjacob			ctio->ct_nphdl = CT_HBA_RESET;
663196008Smjacob			ctio->ct_header.rqs_entry_type = RQSTYPE_CTIO7;
664196008Smjacob		} else if (IS_FC(isp)) {
665196008Smjacob			ct2_entry_t *ctio = (ct2_entry_t *) local;
666203444Smjacob			ctio->ct_syshandle = hdp->handle;
667196008Smjacob			ctio->ct_status = CT_HBA_RESET;
668196008Smjacob			ctio->ct_header.rqs_entry_type = RQSTYPE_CTIO2;
669196008Smjacob		} else {
670196008Smjacob			ct_entry_t *ctio = (ct_entry_t *) local;
671204397Smjacob			ctio->ct_syshandle = hdp->handle;
672201758Smbr			ctio->ct_status = CT_HBA_RESET & 0xff;
673196008Smjacob			ctio->ct_header.rqs_entry_type = RQSTYPE_CTIO;
674196008Smjacob		}
675196008Smjacob		isp_async(isp, ISPASYNC_TARGET_ACTION, local);
676196008Smjacob	}
677196008Smjacob	for (tmp = 0; tmp < isp->isp_nchan; tmp++) {
678196008Smjacob		ISP_MEMZERO(&notify, sizeof (isp_notify_t));
679196008Smjacob		notify.nt_ncode = NT_HBA_RESET;
680196008Smjacob		notify.nt_hba = isp;
681196008Smjacob		notify.nt_wwn = INI_ANY;
682196008Smjacob		notify.nt_nphdl = NIL_HANDLE;
683196008Smjacob		notify.nt_sid = PORT_ANY;
684196008Smjacob		notify.nt_did = PORT_ANY;
685196008Smjacob		notify.nt_tgt = TGT_ANY;
686196008Smjacob		notify.nt_channel = tmp;
687196008Smjacob		notify.nt_lun = LUN_ANY;
688196008Smjacob		notify.nt_tagval = TAG_ANY;
689196008Smjacob		isp_async(isp, ISPASYNC_TARGET_NOTIFY, &notify);
690196008Smjacob	}
691196008Smjacob#endif
692196008Smjacob}
693196008Smjacob
694196008Smjacobvoid
695163899Smjacobisp_shutdown(ispsoftc_t *isp)
696163899Smjacob{
697163899Smjacob	if (IS_FC(isp)) {
698163899Smjacob		if (IS_24XX(isp)) {
699163899Smjacob			ISP_WRITE(isp, BIU2400_ICR, 0);
700163899Smjacob			ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_PAUSE);
701163899Smjacob		} else {
702163899Smjacob			ISP_WRITE(isp, BIU_ICR, 0);
703163899Smjacob			ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
704163899Smjacob			ISP_WRITE(isp, BIU2100_CSR, BIU2100_FPM0_REGS);
705163899Smjacob			ISP_WRITE(isp, FPM_DIAG_CONFIG, FPM_SOFT_RESET);
706163899Smjacob			ISP_WRITE(isp, BIU2100_CSR, BIU2100_FB_REGS);
707163899Smjacob			ISP_WRITE(isp, FBM_CMD, FBMCMD_FIFO_RESET_ALL);
708163899Smjacob			ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS);
709163899Smjacob		}
710163899Smjacob	} else {
711163899Smjacob		ISP_WRITE(isp, BIU_ICR, 0);
712163899Smjacob		ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
713163899Smjacob	}
714163899Smjacob}
715163899Smjacob
716155228Smjacob/*
717155228Smjacob * Functions to move stuff to a form that the QLogic RISC engine understands
718155228Smjacob * and functions to move stuff back to a form the processor understands.
719155228Smjacob *
720155228Smjacob * Each platform is required to provide the 8, 16 and 32 bit
721155228Smjacob * swizzle and unswizzle macros (ISP_IOX{PUT|GET}_{8,16,32})
722155228Smjacob *
723155228Smjacob * The assumption is that swizzling and unswizzling is mostly done 'in place'
724155228Smjacob * (with a few exceptions for efficiency).
725155228Smjacob */
726155228Smjacob
727196008Smjacob#define	ISP_IS_SBUS(isp)	(ISP_SBUS_SUPPORTED && (isp)->isp_bustype == ISP_BT_SBUS)
728155228Smjacob
729163899Smjacob#define	ASIZE(x)	(sizeof (x) / sizeof (x[0]))
730155228Smjacob/*
731155228Smjacob * Swizzle/Copy Functions
732155228Smjacob */
733155228Smjacobvoid
734163899Smjacobisp_put_hdr(ispsoftc_t *isp, isphdr_t *hpsrc, isphdr_t *hpdst)
735155228Smjacob{
736155228Smjacob	if (ISP_IS_SBUS(isp)) {
737196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_entry_type, &hpdst->rqs_entry_count);
738196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_entry_count, &hpdst->rqs_entry_type);
739196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_seqno, &hpdst->rqs_flags);
740196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_flags, &hpdst->rqs_seqno);
741155228Smjacob	} else {
742196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_entry_type, &hpdst->rqs_entry_type);
743196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_entry_count, &hpdst->rqs_entry_count);
744196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_seqno, &hpdst->rqs_seqno);
745196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_flags, &hpdst->rqs_flags);
746155228Smjacob	}
747155228Smjacob}
748155228Smjacob
749155228Smjacobvoid
750163899Smjacobisp_get_hdr(ispsoftc_t *isp, isphdr_t *hpsrc, isphdr_t *hpdst)
751155228Smjacob{
752155228Smjacob	if (ISP_IS_SBUS(isp)) {
753196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_entry_type, hpdst->rqs_entry_count);
754196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_entry_count, hpdst->rqs_entry_type);
755196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_seqno, hpdst->rqs_flags);
756196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_flags, hpdst->rqs_seqno);
757155228Smjacob	} else {
758196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_entry_type, hpdst->rqs_entry_type);
759196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_entry_count, hpdst->rqs_entry_count);
760196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_seqno, hpdst->rqs_seqno);
761196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_flags, hpdst->rqs_flags);
762155228Smjacob	}
763155228Smjacob}
764155228Smjacob
765155228Smjacobint
766155704Smjacobisp_get_response_type(ispsoftc_t *isp, isphdr_t *hp)
767155228Smjacob{
768155704Smjacob	uint8_t type;
769155228Smjacob	if (ISP_IS_SBUS(isp)) {
770155228Smjacob		ISP_IOXGET_8(isp, &hp->rqs_entry_count, type);
771155228Smjacob	} else {
772155228Smjacob		ISP_IOXGET_8(isp, &hp->rqs_entry_type, type);
773155228Smjacob	}
774155228Smjacob	return ((int)type);
775155228Smjacob}
776155228Smjacob
777155228Smjacobvoid
778155704Smjacobisp_put_request(ispsoftc_t *isp, ispreq_t *rqsrc, ispreq_t *rqdst)
779155228Smjacob{
780155228Smjacob	int i;
781163899Smjacob	isp_put_hdr(isp, &rqsrc->req_header, &rqdst->req_header);
782155228Smjacob	ISP_IOXPUT_32(isp, rqsrc->req_handle, &rqdst->req_handle);
783155228Smjacob	if (ISP_IS_SBUS(isp)) {
784155228Smjacob		ISP_IOXPUT_8(isp, rqsrc->req_lun_trn, &rqdst->req_target);
785155228Smjacob		ISP_IOXPUT_8(isp, rqsrc->req_target, &rqdst->req_lun_trn);
786155228Smjacob	} else {
787155228Smjacob		ISP_IOXPUT_8(isp, rqsrc->req_lun_trn, &rqdst->req_lun_trn);
788155228Smjacob		ISP_IOXPUT_8(isp, rqsrc->req_target, &rqdst->req_target);
789155228Smjacob	}
790155228Smjacob	ISP_IOXPUT_16(isp, rqsrc->req_cdblen, &rqdst->req_cdblen);
791155228Smjacob	ISP_IOXPUT_16(isp, rqsrc->req_flags, &rqdst->req_flags);
792155228Smjacob	ISP_IOXPUT_16(isp, rqsrc->req_time, &rqdst->req_time);
793155228Smjacob	ISP_IOXPUT_16(isp, rqsrc->req_seg_count, &rqdst->req_seg_count);
794163899Smjacob	for (i = 0; i < ASIZE(rqsrc->req_cdb); i++) {
795155228Smjacob		ISP_IOXPUT_8(isp, rqsrc->req_cdb[i], &rqdst->req_cdb[i]);
796155228Smjacob	}
797155228Smjacob	for (i = 0; i < ISP_RQDSEG; i++) {
798196008Smjacob		ISP_IOXPUT_32(isp, rqsrc->req_dataseg[i].ds_base, &rqdst->req_dataseg[i].ds_base);
799196008Smjacob		ISP_IOXPUT_32(isp, rqsrc->req_dataseg[i].ds_count, &rqdst->req_dataseg[i].ds_count);
800155228Smjacob	}
801155228Smjacob}
802155228Smjacob
803155228Smjacobvoid
804163899Smjacobisp_put_marker(ispsoftc_t *isp, isp_marker_t *src, isp_marker_t *dst)
805155228Smjacob{
806155228Smjacob	int i;
807163899Smjacob	isp_put_hdr(isp, &src->mrk_header, &dst->mrk_header);
808163899Smjacob	ISP_IOXPUT_32(isp, src->mrk_handle, &dst->mrk_handle);
809163899Smjacob	if (ISP_IS_SBUS(isp)) {
810163899Smjacob		ISP_IOXPUT_8(isp, src->mrk_reserved0, &dst->mrk_target);
811163899Smjacob		ISP_IOXPUT_8(isp, src->mrk_target, &dst->mrk_reserved0);
812163899Smjacob	} else {
813163899Smjacob		ISP_IOXPUT_8(isp, src->mrk_reserved0, &dst->mrk_reserved0);
814163899Smjacob		ISP_IOXPUT_8(isp, src->mrk_target, &dst->mrk_target);
815155228Smjacob	}
816163899Smjacob	ISP_IOXPUT_16(isp, src->mrk_modifier, &dst->mrk_modifier);
817163899Smjacob	ISP_IOXPUT_16(isp, src->mrk_flags, &dst->mrk_flags);
818163899Smjacob	ISP_IOXPUT_16(isp, src->mrk_lun, &dst->mrk_lun);
819163899Smjacob	for (i = 0; i < ASIZE(src->mrk_reserved1); i++) {
820196008Smjacob		ISP_IOXPUT_8(isp, src->mrk_reserved1[i], &dst->mrk_reserved1[i]);
821163899Smjacob	}
822163899Smjacob}
823163899Smjacob
824163899Smjacobvoid
825196008Smjacobisp_put_marker_24xx(ispsoftc_t *isp, isp_marker_24xx_t *src, isp_marker_24xx_t *dst)
826163899Smjacob{
827163899Smjacob	int i;
828163899Smjacob	isp_put_hdr(isp, &src->mrk_header, &dst->mrk_header);
829163899Smjacob	ISP_IOXPUT_32(isp, src->mrk_handle, &dst->mrk_handle);
830163899Smjacob	ISP_IOXPUT_16(isp, src->mrk_nphdl, &dst->mrk_nphdl);
831163899Smjacob	ISP_IOXPUT_8(isp, src->mrk_modifier, &dst->mrk_modifier);
832163899Smjacob	ISP_IOXPUT_8(isp, src->mrk_reserved0, &dst->mrk_reserved0);
833163899Smjacob	ISP_IOXPUT_8(isp, src->mrk_reserved1, &dst->mrk_reserved1);
834163899Smjacob	ISP_IOXPUT_8(isp, src->mrk_vphdl, &dst->mrk_vphdl);
835163899Smjacob	ISP_IOXPUT_8(isp, src->mrk_reserved2, &dst->mrk_reserved2);
836163899Smjacob	for (i = 0; i < ASIZE(src->mrk_lun); i++) {
837163899Smjacob		ISP_IOXPUT_8(isp, src->mrk_lun[i], &dst->mrk_lun[i]);
838163899Smjacob	}
839163899Smjacob	for (i = 0; i < ASIZE(src->mrk_reserved3); i++) {
840196008Smjacob		ISP_IOXPUT_8(isp, src->mrk_reserved3[i], &dst->mrk_reserved3[i]);
841163899Smjacob	}
842163899Smjacob}
843163899Smjacob
844163899Smjacobvoid
845163899Smjacobisp_put_request_t2(ispsoftc_t *isp, ispreqt2_t *src, ispreqt2_t *dst)
846163899Smjacob{
847163899Smjacob	int i;
848163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
849163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
850163899Smjacob	ISP_IOXPUT_8(isp, src->req_lun_trn, &dst->req_lun_trn);
851163899Smjacob	ISP_IOXPUT_8(isp, src->req_target, &dst->req_target);
852163899Smjacob	ISP_IOXPUT_16(isp, src->req_scclun, &dst->req_scclun);
853163899Smjacob	ISP_IOXPUT_16(isp, src->req_flags,  &dst->req_flags);
854163899Smjacob	ISP_IOXPUT_16(isp, src->req_reserved, &dst->req_reserved);
855163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
856163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
857163899Smjacob	for (i = 0; i < ASIZE(src->req_cdb); i++) {
858163899Smjacob		ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]);
859163899Smjacob	}
860163899Smjacob	ISP_IOXPUT_32(isp, src->req_totalcnt, &dst->req_totalcnt);
861155228Smjacob	for (i = 0; i < ISP_RQDSEG_T2; i++) {
862196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
863196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
864155228Smjacob	}
865155228Smjacob}
866155228Smjacob
867155228Smjacobvoid
868163899Smjacobisp_put_request_t2e(ispsoftc_t *isp, ispreqt2e_t *src, ispreqt2e_t *dst)
869155228Smjacob{
870155228Smjacob	int i;
871163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
872163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
873163899Smjacob	ISP_IOXPUT_16(isp, src->req_target, &dst->req_target);
874163899Smjacob	ISP_IOXPUT_16(isp, src->req_scclun, &dst->req_scclun);
875163899Smjacob	ISP_IOXPUT_16(isp, src->req_flags,  &dst->req_flags);
876163899Smjacob	ISP_IOXPUT_16(isp, src->req_reserved, &dst->req_reserved);
877163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
878163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
879163899Smjacob	for (i = 0; i < ASIZE(src->req_cdb); i++) {
880163899Smjacob		ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]);
881155228Smjacob	}
882163899Smjacob	ISP_IOXPUT_32(isp, src->req_totalcnt, &dst->req_totalcnt);
883155228Smjacob	for (i = 0; i < ISP_RQDSEG_T2; i++) {
884196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
885196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
886155228Smjacob	}
887155228Smjacob}
888155228Smjacob
889155228Smjacobvoid
890163899Smjacobisp_put_request_t3(ispsoftc_t *isp, ispreqt3_t *src, ispreqt3_t *dst)
891155228Smjacob{
892155228Smjacob	int i;
893163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
894163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
895163899Smjacob	ISP_IOXPUT_8(isp, src->req_lun_trn, &dst->req_lun_trn);
896163899Smjacob	ISP_IOXPUT_8(isp, src->req_target, &dst->req_target);
897163899Smjacob	ISP_IOXPUT_16(isp, src->req_scclun, &dst->req_scclun);
898163899Smjacob	ISP_IOXPUT_16(isp, src->req_flags,  &dst->req_flags);
899163899Smjacob	ISP_IOXPUT_16(isp, src->req_reserved, &dst->req_reserved);
900163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
901163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
902163899Smjacob	for (i = 0; i < ASIZE(src->req_cdb); i++) {
903163899Smjacob		ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]);
904155228Smjacob	}
905163899Smjacob	ISP_IOXPUT_32(isp, src->req_totalcnt, &dst->req_totalcnt);
906155228Smjacob	for (i = 0; i < ISP_RQDSEG_T3; i++) {
907196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
908196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_basehi, &dst->req_dataseg[i].ds_basehi);
909196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
910155228Smjacob	}
911155228Smjacob}
912155228Smjacob
913155228Smjacobvoid
914163899Smjacobisp_put_request_t3e(ispsoftc_t *isp, ispreqt3e_t *src, ispreqt3e_t *dst)
915155228Smjacob{
916155228Smjacob	int i;
917163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
918163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
919163899Smjacob	ISP_IOXPUT_16(isp, src->req_target, &dst->req_target);
920163899Smjacob	ISP_IOXPUT_16(isp, src->req_scclun, &dst->req_scclun);
921163899Smjacob	ISP_IOXPUT_16(isp, src->req_flags,  &dst->req_flags);
922163899Smjacob	ISP_IOXPUT_16(isp, src->req_reserved, &dst->req_reserved);
923163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
924163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
925163899Smjacob	for (i = 0; i < ASIZE(src->req_cdb); i++) {
926163899Smjacob		ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]);
927155228Smjacob	}
928163899Smjacob	ISP_IOXPUT_32(isp, src->req_totalcnt, &dst->req_totalcnt);
929155228Smjacob	for (i = 0; i < ISP_RQDSEG_T3; i++) {
930196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
931196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_basehi, &dst->req_dataseg[i].ds_basehi);
932196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
933155228Smjacob	}
934155228Smjacob}
935155228Smjacob
936155228Smjacobvoid
937163899Smjacobisp_put_extended_request(ispsoftc_t *isp, ispextreq_t *src, ispextreq_t *dst)
938155228Smjacob{
939155228Smjacob	int i;
940163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
941163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
942155228Smjacob	if (ISP_IS_SBUS(isp)) {
943163899Smjacob		ISP_IOXPUT_8(isp, src->req_lun_trn, &dst->req_target);
944163899Smjacob		ISP_IOXPUT_8(isp, src->req_target, &dst->req_lun_trn);
945155228Smjacob	} else {
946163899Smjacob		ISP_IOXPUT_8(isp, src->req_lun_trn, &dst->req_lun_trn);
947163899Smjacob		ISP_IOXPUT_8(isp, src->req_target, &dst->req_target);
948155228Smjacob	}
949163899Smjacob	ISP_IOXPUT_16(isp, src->req_cdblen, &dst->req_cdblen);
950163899Smjacob	ISP_IOXPUT_16(isp, src->req_flags, &dst->req_flags);
951163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
952163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
953163899Smjacob	for (i = 0; i < ASIZE(src->req_cdb); i++) {
954163899Smjacob		ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]);
955155228Smjacob	}
956155228Smjacob}
957155228Smjacob
958155228Smjacobvoid
959163899Smjacobisp_put_request_t7(ispsoftc_t *isp, ispreqt7_t *src, ispreqt7_t *dst)
960155228Smjacob{
961155228Smjacob	int i;
962163899Smjacob	uint32_t *a, *b;
963163899Smjacob
964163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
965163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
966163899Smjacob	ISP_IOXPUT_16(isp, src->req_nphdl, &dst->req_nphdl);
967163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
968163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
969163899Smjacob	ISP_IOXPUT_16(isp, src->req_reserved, &dst->req_reserved);
970163899Smjacob	a = (uint32_t *) src->req_lun;
971163899Smjacob	b = (uint32_t *) dst->req_lun;
972163899Smjacob	for (i = 0; i < (ASIZE(src->req_lun) >> 2); i++ ) {
973171159Smjacob		*b++ = ISP_SWAP32(isp, *a++);
974163899Smjacob	}
975163899Smjacob	ISP_IOXPUT_8(isp, src->req_alen_datadir, &dst->req_alen_datadir);
976163899Smjacob	ISP_IOXPUT_8(isp, src->req_task_management, &dst->req_task_management);
977163899Smjacob	ISP_IOXPUT_8(isp, src->req_task_attribute, &dst->req_task_attribute);
978163899Smjacob	ISP_IOXPUT_8(isp, src->req_crn, &dst->req_crn);
979163899Smjacob	a = (uint32_t *) src->req_cdb;
980163899Smjacob	b = (uint32_t *) dst->req_cdb;
981171159Smjacob	for (i = 0; i < (ASIZE(src->req_cdb) >> 2); i++) {
982171159Smjacob		*b++ = ISP_SWAP32(isp, *a++);
983163899Smjacob	}
984163899Smjacob	ISP_IOXPUT_32(isp, src->req_dl, &dst->req_dl);
985163899Smjacob	ISP_IOXPUT_16(isp, src->req_tidlo, &dst->req_tidlo);
986163899Smjacob	ISP_IOXPUT_8(isp, src->req_tidhi, &dst->req_tidhi);
987163899Smjacob	ISP_IOXPUT_8(isp, src->req_vpidx, &dst->req_vpidx);
988196008Smjacob	ISP_IOXPUT_32(isp, src->req_dataseg.ds_base, &dst->req_dataseg.ds_base);
989196008Smjacob	ISP_IOXPUT_32(isp, src->req_dataseg.ds_basehi, &dst->req_dataseg.ds_basehi);
990196008Smjacob	ISP_IOXPUT_32(isp, src->req_dataseg.ds_count, &dst->req_dataseg.ds_count);
991163899Smjacob}
992163899Smjacob
993163899Smjacobvoid
994196008Smjacobisp_put_24xx_tmf(ispsoftc_t *isp, isp24xx_tmf_t *src, isp24xx_tmf_t *dst)
995196008Smjacob{
996196008Smjacob	int i;
997196008Smjacob	uint32_t *a, *b;
998196008Smjacob
999196008Smjacob	isp_put_hdr(isp, &src->tmf_header, &dst->tmf_header);
1000196008Smjacob	ISP_IOXPUT_32(isp, src->tmf_handle, &dst->tmf_handle);
1001196008Smjacob	ISP_IOXPUT_16(isp, src->tmf_nphdl, &dst->tmf_nphdl);
1002196008Smjacob	ISP_IOXPUT_16(isp, src->tmf_delay, &dst->tmf_delay);
1003196008Smjacob	ISP_IOXPUT_16(isp, src->tmf_timeout, &dst->tmf_timeout);
1004196008Smjacob	for (i = 0; i < ASIZE(src->tmf_reserved0); i++) {
1005196008Smjacob		ISP_IOXPUT_8(isp, src->tmf_reserved0[i], &dst->tmf_reserved0[i]);
1006196008Smjacob	}
1007196008Smjacob	a = (uint32_t *) src->tmf_lun;
1008196008Smjacob	b = (uint32_t *) dst->tmf_lun;
1009196008Smjacob	for (i = 0; i < (ASIZE(src->tmf_lun) >> 2); i++ ) {
1010196008Smjacob		*b++ = ISP_SWAP32(isp, *a++);
1011196008Smjacob	}
1012196008Smjacob	ISP_IOXPUT_32(isp, src->tmf_flags, &dst->tmf_flags);
1013196008Smjacob	for (i = 0; i < ASIZE(src->tmf_reserved1); i++) {
1014196008Smjacob		ISP_IOXPUT_8(isp, src->tmf_reserved1[i], &dst->tmf_reserved1[i]);
1015196008Smjacob	}
1016196008Smjacob	ISP_IOXPUT_16(isp, src->tmf_tidlo, &dst->tmf_tidlo);
1017196008Smjacob	ISP_IOXPUT_8(isp, src->tmf_tidhi, &dst->tmf_tidhi);
1018196008Smjacob	ISP_IOXPUT_8(isp, src->tmf_vpidx, &dst->tmf_vpidx);
1019196008Smjacob	for (i = 0; i < ASIZE(src->tmf_reserved2); i++) {
1020196008Smjacob		ISP_IOXPUT_8(isp, src->tmf_reserved2[i], &dst->tmf_reserved2[i]);
1021196008Smjacob	}
1022196008Smjacob}
1023196008Smjacob
1024196008Smjacobvoid
1025163899Smjacobisp_put_24xx_abrt(ispsoftc_t *isp, isp24xx_abrt_t *src, isp24xx_abrt_t *dst)
1026163899Smjacob{
1027163899Smjacob	int i;
1028163899Smjacob	isp_put_hdr(isp, &src->abrt_header, &dst->abrt_header);
1029163899Smjacob	ISP_IOXPUT_32(isp, src->abrt_handle, &dst->abrt_handle);
1030163899Smjacob	ISP_IOXPUT_16(isp, src->abrt_nphdl, &dst->abrt_nphdl);
1031163899Smjacob	ISP_IOXPUT_16(isp, src->abrt_options, &dst->abrt_options);
1032163899Smjacob	ISP_IOXPUT_32(isp, src->abrt_cmd_handle, &dst->abrt_cmd_handle);
1033163899Smjacob	for (i = 0; i < ASIZE(src->abrt_reserved); i++) {
1034196008Smjacob		ISP_IOXPUT_8(isp, src->abrt_reserved[i], &dst->abrt_reserved[i]);
1035163899Smjacob	}
1036163899Smjacob	ISP_IOXPUT_16(isp, src->abrt_tidlo, &dst->abrt_tidlo);
1037163899Smjacob	ISP_IOXPUT_8(isp, src->abrt_tidhi, &dst->abrt_tidhi);
1038163899Smjacob	ISP_IOXPUT_8(isp, src->abrt_vpidx, &dst->abrt_vpidx);
1039163899Smjacob	for (i = 0; i < ASIZE(src->abrt_reserved1); i++) {
1040196008Smjacob		ISP_IOXPUT_8(isp, src->abrt_reserved1[i], &dst->abrt_reserved1[i]);
1041163899Smjacob	}
1042163899Smjacob}
1043163899Smjacob
1044163899Smjacobvoid
1045163899Smjacobisp_put_cont_req(ispsoftc_t *isp, ispcontreq_t *src, ispcontreq_t *dst)
1046163899Smjacob{
1047163899Smjacob	int i;
1048163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
1049155228Smjacob	for (i = 0; i < ISP_CDSEG; i++) {
1050196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
1051196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
1052155228Smjacob	}
1053155228Smjacob}
1054155228Smjacob
1055155228Smjacobvoid
1056163899Smjacobisp_put_cont64_req(ispsoftc_t *isp, ispcontreq64_t *src, ispcontreq64_t *dst)
1057155228Smjacob{
1058155228Smjacob	int i;
1059163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
1060155228Smjacob	for (i = 0; i < ISP_CDSEG64; i++) {
1061196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
1062196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_basehi, &dst->req_dataseg[i].ds_basehi);
1063196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
1064155228Smjacob	}
1065155228Smjacob}
1066155228Smjacob
1067155228Smjacobvoid
1068163899Smjacobisp_get_response(ispsoftc_t *isp, ispstatusreq_t *src, ispstatusreq_t *dst)
1069155228Smjacob{
1070155228Smjacob	int i;
1071163899Smjacob	isp_get_hdr(isp, &src->req_header, &dst->req_header);
1072163899Smjacob	ISP_IOXGET_32(isp, &src->req_handle, dst->req_handle);
1073163899Smjacob	ISP_IOXGET_16(isp, &src->req_scsi_status, dst->req_scsi_status);
1074196008Smjacob	ISP_IOXGET_16(isp, &src->req_completion_status, dst->req_completion_status);
1075163899Smjacob	ISP_IOXGET_16(isp, &src->req_state_flags, dst->req_state_flags);
1076163899Smjacob	ISP_IOXGET_16(isp, &src->req_status_flags, dst->req_status_flags);
1077163899Smjacob	ISP_IOXGET_16(isp, &src->req_time, dst->req_time);
1078163899Smjacob	ISP_IOXGET_16(isp, &src->req_sense_len, dst->req_sense_len);
1079163899Smjacob	ISP_IOXGET_32(isp, &src->req_resid, dst->req_resid);
1080155228Smjacob	for (i = 0; i < 8; i++) {
1081196008Smjacob		ISP_IOXGET_8(isp, &src->req_response[i], dst->req_response[i]);
1082155228Smjacob	}
1083155228Smjacob	for (i = 0; i < 32; i++) {
1084196008Smjacob		ISP_IOXGET_8(isp, &src->req_sense_data[i], dst->req_sense_data[i]);
1085155228Smjacob	}
1086155228Smjacob}
1087155228Smjacob
1088155228Smjacobvoid
1089196008Smjacobisp_get_24xx_response(ispsoftc_t *isp, isp24xx_statusreq_t *src, isp24xx_statusreq_t *dst)
1090155228Smjacob{
1091155228Smjacob	int i;
1092171159Smjacob	uint32_t *s, *d;
1093171159Smjacob
1094163899Smjacob	isp_get_hdr(isp, &src->req_header, &dst->req_header);
1095163899Smjacob	ISP_IOXGET_32(isp, &src->req_handle, dst->req_handle);
1096196008Smjacob	ISP_IOXGET_16(isp, &src->req_completion_status, dst->req_completion_status);
1097163899Smjacob	ISP_IOXGET_16(isp, &src->req_oxid, dst->req_oxid);
1098163899Smjacob	ISP_IOXGET_32(isp, &src->req_resid, dst->req_resid);
1099163899Smjacob	ISP_IOXGET_16(isp, &src->req_reserved0, dst->req_reserved0);
1100163899Smjacob	ISP_IOXGET_16(isp, &src->req_state_flags, dst->req_state_flags);
1101163899Smjacob	ISP_IOXGET_16(isp, &src->req_reserved1, dst->req_reserved1);
1102163899Smjacob	ISP_IOXGET_16(isp, &src->req_scsi_status, dst->req_scsi_status);
1103163899Smjacob	ISP_IOXGET_32(isp, &src->req_fcp_residual, dst->req_fcp_residual);
1104163899Smjacob	ISP_IOXGET_32(isp, &src->req_sense_len, dst->req_sense_len);
1105163899Smjacob	ISP_IOXGET_32(isp, &src->req_response_len, dst->req_response_len);
1106171159Smjacob	s = (uint32_t *)src->req_rsp_sense;
1107171159Smjacob	d = (uint32_t *)dst->req_rsp_sense;
1108171159Smjacob	for (i = 0; i < (ASIZE(src->req_rsp_sense) >> 2); i++) {
1109171159Smjacob		d[i] = ISP_SWAP32(isp, s[i]);
1110155228Smjacob	}
1111155228Smjacob}
1112155228Smjacob
1113155228Smjacobvoid
1114163899Smjacobisp_get_24xx_abrt(ispsoftc_t *isp, isp24xx_abrt_t *src, isp24xx_abrt_t *dst)
1115163899Smjacob{
1116163899Smjacob	int i;
1117163899Smjacob	isp_get_hdr(isp, &src->abrt_header, &dst->abrt_header);
1118163899Smjacob	ISP_IOXGET_32(isp, &src->abrt_handle, dst->abrt_handle);
1119163899Smjacob	ISP_IOXGET_16(isp, &src->abrt_nphdl, dst->abrt_nphdl);
1120163899Smjacob	ISP_IOXGET_16(isp, &src->abrt_options, dst->abrt_options);
1121163899Smjacob	ISP_IOXGET_32(isp, &src->abrt_cmd_handle, dst->abrt_cmd_handle);
1122171159Smjacob	for (i = 0; i < ASIZE(src->abrt_reserved); i++) {
1123196008Smjacob		ISP_IOXGET_8(isp, &src->abrt_reserved[i], dst->abrt_reserved[i]);
1124163899Smjacob	}
1125163899Smjacob	ISP_IOXGET_16(isp, &src->abrt_tidlo, dst->abrt_tidlo);
1126163899Smjacob	ISP_IOXGET_8(isp, &src->abrt_tidhi, dst->abrt_tidhi);
1127163899Smjacob	ISP_IOXGET_8(isp, &src->abrt_vpidx, dst->abrt_vpidx);
1128171159Smjacob	for (i = 0; i < ASIZE(src->abrt_reserved1); i++) {
1129196008Smjacob		ISP_IOXGET_8(isp, &src->abrt_reserved1[i], dst->abrt_reserved1[i]);
1130163899Smjacob	}
1131163899Smjacob}
1132163899Smjacob
1133163899Smjacob
1134163899Smjacobvoid
1135204397Smjacobisp_get_rio1(ispsoftc_t *isp, isp_rio1_t *r1src, isp_rio1_t *r1dst)
1136204397Smjacob{
1137204397Smjacob	const int lim = sizeof (r1dst->req_handles) / sizeof (r1dst->req_handles[0]);
1138204397Smjacob	int i;
1139204397Smjacob	isp_get_hdr(isp, &r1src->req_header, &r1dst->req_header);
1140204397Smjacob	if (r1dst->req_header.rqs_seqno > lim) {
1141204397Smjacob		r1dst->req_header.rqs_seqno = lim;
1142204397Smjacob	}
1143204397Smjacob	for (i = 0; i < r1dst->req_header.rqs_seqno; i++) {
1144204397Smjacob		ISP_IOXGET_32(isp, &r1src->req_handles[i], r1dst->req_handles[i]);
1145204397Smjacob	}
1146204397Smjacob	while (i < lim) {
1147204397Smjacob		r1dst->req_handles[i++] = 0;
1148204397Smjacob	}
1149204397Smjacob}
1150204397Smjacob
1151204397Smjacobvoid
1152155704Smjacobisp_get_rio2(ispsoftc_t *isp, isp_rio2_t *r2src, isp_rio2_t *r2dst)
1153155228Smjacob{
1154204397Smjacob	const int lim = sizeof (r2dst->req_handles) / sizeof (r2dst->req_handles[0]);
1155155228Smjacob	int i;
1156204397Smjacob
1157163899Smjacob	isp_get_hdr(isp, &r2src->req_header, &r2dst->req_header);
1158204397Smjacob	if (r2dst->req_header.rqs_seqno > lim) {
1159204397Smjacob		r2dst->req_header.rqs_seqno = lim;
1160163899Smjacob	}
1161155228Smjacob	for (i = 0; i < r2dst->req_header.rqs_seqno; i++) {
1162196008Smjacob		ISP_IOXGET_16(isp, &r2src->req_handles[i], r2dst->req_handles[i]);
1163155228Smjacob	}
1164204397Smjacob	while (i < lim) {
1165155228Smjacob		r2dst->req_handles[i++] = 0;
1166155228Smjacob	}
1167155228Smjacob}
1168155228Smjacob
1169155228Smjacobvoid
1170163899Smjacobisp_put_icb(ispsoftc_t *isp, isp_icb_t *src, isp_icb_t *dst)
1171155228Smjacob{
1172155228Smjacob	int i;
1173155228Smjacob	if (ISP_IS_SBUS(isp)) {
1174163899Smjacob		ISP_IOXPUT_8(isp, src->icb_version, &dst->icb_reserved0);
1175163899Smjacob		ISP_IOXPUT_8(isp, src->icb_reserved0, &dst->icb_version);
1176155228Smjacob	} else {
1177163899Smjacob		ISP_IOXPUT_8(isp, src->icb_version, &dst->icb_version);
1178163899Smjacob		ISP_IOXPUT_8(isp, src->icb_reserved0, &dst->icb_reserved0);
1179155228Smjacob	}
1180163899Smjacob	ISP_IOXPUT_16(isp, src->icb_fwoptions, &dst->icb_fwoptions);
1181163899Smjacob	ISP_IOXPUT_16(isp, src->icb_maxfrmlen, &dst->icb_maxfrmlen);
1182163899Smjacob	ISP_IOXPUT_16(isp, src->icb_maxalloc, &dst->icb_maxalloc);
1183163899Smjacob	ISP_IOXPUT_16(isp, src->icb_execthrottle, &dst->icb_execthrottle);
1184155228Smjacob	if (ISP_IS_SBUS(isp)) {
1185163899Smjacob		ISP_IOXPUT_8(isp, src->icb_retry_count, &dst->icb_retry_delay);
1186163899Smjacob		ISP_IOXPUT_8(isp, src->icb_retry_delay, &dst->icb_retry_count);
1187155228Smjacob	} else {
1188163899Smjacob		ISP_IOXPUT_8(isp, src->icb_retry_count, &dst->icb_retry_count);
1189163899Smjacob		ISP_IOXPUT_8(isp, src->icb_retry_delay, &dst->icb_retry_delay);
1190155228Smjacob	}
1191155228Smjacob	for (i = 0; i < 8; i++) {
1192163899Smjacob		ISP_IOXPUT_8(isp, src->icb_portname[i], &dst->icb_portname[i]);
1193155228Smjacob	}
1194163899Smjacob	ISP_IOXPUT_16(isp, src->icb_hardaddr, &dst->icb_hardaddr);
1195155228Smjacob	if (ISP_IS_SBUS(isp)) {
1196163899Smjacob		ISP_IOXPUT_8(isp, src->icb_iqdevtype, &dst->icb_logintime);
1197163899Smjacob		ISP_IOXPUT_8(isp, src->icb_logintime, &dst->icb_iqdevtype);
1198155228Smjacob	} else {
1199163899Smjacob		ISP_IOXPUT_8(isp, src->icb_iqdevtype, &dst->icb_iqdevtype);
1200163899Smjacob		ISP_IOXPUT_8(isp, src->icb_logintime, &dst->icb_logintime);
1201155228Smjacob	}
1202155228Smjacob	for (i = 0; i < 8; i++) {
1203163899Smjacob		ISP_IOXPUT_8(isp, src->icb_nodename[i], &dst->icb_nodename[i]);
1204155228Smjacob	}
1205163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rqstout, &dst->icb_rqstout);
1206163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rspnsin, &dst->icb_rspnsin);
1207163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rqstqlen, &dst->icb_rqstqlen);
1208163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rsltqlen, &dst->icb_rsltqlen);
1209155228Smjacob	for (i = 0; i < 4; i++) {
1210163899Smjacob		ISP_IOXPUT_16(isp, src->icb_rqstaddr[i], &dst->icb_rqstaddr[i]);
1211155228Smjacob	}
1212155228Smjacob	for (i = 0; i < 4; i++) {
1213163899Smjacob		ISP_IOXPUT_16(isp, src->icb_respaddr[i], &dst->icb_respaddr[i]);
1214155228Smjacob	}
1215163899Smjacob	ISP_IOXPUT_16(isp, src->icb_lunenables, &dst->icb_lunenables);
1216155228Smjacob	if (ISP_IS_SBUS(isp)) {
1217163899Smjacob		ISP_IOXPUT_8(isp, src->icb_ccnt, &dst->icb_icnt);
1218163899Smjacob		ISP_IOXPUT_8(isp, src->icb_icnt, &dst->icb_ccnt);
1219155228Smjacob	} else {
1220163899Smjacob		ISP_IOXPUT_8(isp, src->icb_ccnt, &dst->icb_ccnt);
1221163899Smjacob		ISP_IOXPUT_8(isp, src->icb_icnt, &dst->icb_icnt);
1222155228Smjacob	}
1223163899Smjacob	ISP_IOXPUT_16(isp, src->icb_lunetimeout, &dst->icb_lunetimeout);
1224163899Smjacob	ISP_IOXPUT_16(isp, src->icb_reserved1, &dst->icb_reserved1);
1225163899Smjacob	ISP_IOXPUT_16(isp, src->icb_xfwoptions, &dst->icb_xfwoptions);
1226155228Smjacob	if (ISP_IS_SBUS(isp)) {
1227163899Smjacob		ISP_IOXPUT_8(isp, src->icb_racctimer, &dst->icb_idelaytimer);
1228163899Smjacob		ISP_IOXPUT_8(isp, src->icb_idelaytimer, &dst->icb_racctimer);
1229155228Smjacob	} else {
1230163899Smjacob		ISP_IOXPUT_8(isp, src->icb_racctimer, &dst->icb_racctimer);
1231163899Smjacob		ISP_IOXPUT_8(isp, src->icb_idelaytimer, &dst->icb_idelaytimer);
1232155228Smjacob	}
1233163899Smjacob	ISP_IOXPUT_16(isp, src->icb_zfwoptions, &dst->icb_zfwoptions);
1234155228Smjacob}
1235155228Smjacob
1236155228Smjacobvoid
1237163899Smjacobisp_put_icb_2400(ispsoftc_t *isp, isp_icb_2400_t *src, isp_icb_2400_t *dst)
1238155228Smjacob{
1239155228Smjacob	int i;
1240163899Smjacob	ISP_IOXPUT_16(isp, src->icb_version, &dst->icb_version);
1241163899Smjacob	ISP_IOXPUT_16(isp, src->icb_reserved0, &dst->icb_reserved0);
1242163899Smjacob	ISP_IOXPUT_16(isp, src->icb_maxfrmlen, &dst->icb_maxfrmlen);
1243163899Smjacob	ISP_IOXPUT_16(isp, src->icb_execthrottle, &dst->icb_execthrottle);
1244163899Smjacob	ISP_IOXPUT_16(isp, src->icb_xchgcnt, &dst->icb_xchgcnt);
1245163899Smjacob	ISP_IOXPUT_16(isp, src->icb_hardaddr, &dst->icb_hardaddr);
1246163899Smjacob	for (i = 0; i < 8; i++) {
1247163899Smjacob		ISP_IOXPUT_8(isp, src->icb_portname[i], &dst->icb_portname[i]);
1248163899Smjacob	}
1249163899Smjacob	for (i = 0; i < 8; i++) {
1250163899Smjacob		ISP_IOXPUT_8(isp, src->icb_nodename[i], &dst->icb_nodename[i]);
1251163899Smjacob	}
1252163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rspnsin, &dst->icb_rspnsin);
1253163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rqstout, &dst->icb_rqstout);
1254163899Smjacob	ISP_IOXPUT_16(isp, src->icb_retry_count, &dst->icb_retry_count);
1255163899Smjacob	ISP_IOXPUT_16(isp, src->icb_priout, &dst->icb_priout);
1256163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rsltqlen, &dst->icb_rsltqlen);
1257163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rqstqlen, &dst->icb_rqstqlen);
1258163899Smjacob	ISP_IOXPUT_16(isp, src->icb_ldn_nols, &dst->icb_ldn_nols);
1259163899Smjacob	ISP_IOXPUT_16(isp, src->icb_prqstqlen, &dst->icb_prqstqlen);
1260163899Smjacob	for (i = 0; i < 4; i++) {
1261163899Smjacob		ISP_IOXPUT_16(isp, src->icb_rqstaddr[i], &dst->icb_rqstaddr[i]);
1262163899Smjacob	}
1263163899Smjacob	for (i = 0; i < 4; i++) {
1264163899Smjacob		ISP_IOXPUT_16(isp, src->icb_respaddr[i], &dst->icb_respaddr[i]);
1265163899Smjacob	}
1266163899Smjacob	for (i = 0; i < 4; i++) {
1267163899Smjacob		ISP_IOXPUT_16(isp, src->icb_priaddr[i], &dst->icb_priaddr[i]);
1268163899Smjacob	}
1269163899Smjacob	for (i = 0; i < 4; i++) {
1270196008Smjacob		ISP_IOXPUT_16(isp, src->icb_reserved1[i], &dst->icb_reserved1[i]);
1271163899Smjacob	}
1272163899Smjacob	ISP_IOXPUT_16(isp, src->icb_atio_in, &dst->icb_atio_in);
1273163899Smjacob	ISP_IOXPUT_16(isp, src->icb_atioqlen, &dst->icb_atioqlen);
1274163899Smjacob	for (i = 0; i < 4; i++) {
1275196008Smjacob		ISP_IOXPUT_16(isp, src->icb_atioqaddr[i], &dst->icb_atioqaddr[i]);
1276163899Smjacob	}
1277163899Smjacob	ISP_IOXPUT_16(isp, src->icb_idelaytimer, &dst->icb_idelaytimer);
1278163899Smjacob	ISP_IOXPUT_16(isp, src->icb_logintime, &dst->icb_logintime);
1279163899Smjacob	ISP_IOXPUT_32(isp, src->icb_fwoptions1, &dst->icb_fwoptions1);
1280163899Smjacob	ISP_IOXPUT_32(isp, src->icb_fwoptions2, &dst->icb_fwoptions2);
1281163899Smjacob	ISP_IOXPUT_32(isp, src->icb_fwoptions3, &dst->icb_fwoptions3);
1282163899Smjacob	for (i = 0; i < 12; i++) {
1283196008Smjacob		ISP_IOXPUT_16(isp, src->icb_reserved2[i], &dst->icb_reserved2[i]);
1284163899Smjacob	}
1285163899Smjacob}
1286163899Smjacob
1287163899Smjacobvoid
1288196008Smjacobisp_put_icb_2400_vpinfo(ispsoftc_t *isp, isp_icb_2400_vpinfo_t *src, isp_icb_2400_vpinfo_t *dst)
1289196008Smjacob{
1290196008Smjacob	ISP_IOXPUT_16(isp, src->vp_count, &dst->vp_count);
1291196008Smjacob	ISP_IOXPUT_16(isp, src->vp_global_options, &dst->vp_global_options);
1292196008Smjacob}
1293196008Smjacob
1294196008Smjacobvoid
1295196008Smjacobisp_put_vp_port_info(ispsoftc_t *isp, vp_port_info_t *src, vp_port_info_t *dst)
1296196008Smjacob{
1297196008Smjacob	int i;
1298196008Smjacob	ISP_IOXPUT_16(isp, src->vp_port_status, &dst->vp_port_status);
1299196008Smjacob	ISP_IOXPUT_8(isp, src->vp_port_options, &dst->vp_port_options);
1300196008Smjacob	ISP_IOXPUT_8(isp, src->vp_port_loopid, &dst->vp_port_loopid);
1301196008Smjacob	for (i = 0; i < 8; i++) {
1302196008Smjacob		ISP_IOXPUT_8(isp, src->vp_port_portname[i], &dst->vp_port_portname[i]);
1303196008Smjacob	}
1304196008Smjacob	for (i = 0; i < 8; i++) {
1305196008Smjacob		ISP_IOXPUT_8(isp, src->vp_port_nodename[i], &dst->vp_port_nodename[i]);
1306196008Smjacob	}
1307196008Smjacob	/* we never *put* portid_lo/portid_hi */
1308196008Smjacob}
1309196008Smjacob
1310196008Smjacobvoid
1311196008Smjacobisp_get_vp_port_info(ispsoftc_t *isp, vp_port_info_t *src, vp_port_info_t *dst)
1312196008Smjacob{
1313196008Smjacob	int i;
1314196008Smjacob	ISP_IOXGET_16(isp, &src->vp_port_status, dst->vp_port_status);
1315196008Smjacob	ISP_IOXGET_8(isp, &src->vp_port_options, dst->vp_port_options);
1316196008Smjacob	ISP_IOXGET_8(isp, &src->vp_port_loopid, dst->vp_port_loopid);
1317196008Smjacob	for (i = 0; i < ASIZE(src->vp_port_portname); i++) {
1318196008Smjacob		ISP_IOXGET_8(isp, &src->vp_port_portname[i], dst->vp_port_portname[i]);
1319196008Smjacob	}
1320196008Smjacob	for (i = 0; i < ASIZE(src->vp_port_nodename); i++) {
1321196008Smjacob		ISP_IOXGET_8(isp, &src->vp_port_nodename[i], dst->vp_port_nodename[i]);
1322196008Smjacob	}
1323196008Smjacob	ISP_IOXGET_16(isp, &src->vp_port_portid_lo, dst->vp_port_portid_lo);
1324196008Smjacob	ISP_IOXGET_16(isp, &src->vp_port_portid_hi, dst->vp_port_portid_hi);
1325196008Smjacob}
1326196008Smjacob
1327196008Smjacobvoid
1328196008Smjacobisp_put_vp_ctrl_info(ispsoftc_t *isp, vp_ctrl_info_t *src, vp_ctrl_info_t *dst)
1329196008Smjacob{
1330196008Smjacob	int i;
1331196008Smjacob	isp_put_hdr(isp, &src->vp_ctrl_hdr, &dst->vp_ctrl_hdr);
1332196008Smjacob	ISP_IOXPUT_32(isp, src->vp_ctrl_handle, &dst->vp_ctrl_handle);
1333196008Smjacob	ISP_IOXPUT_16(isp, src->vp_ctrl_index_fail, &dst->vp_ctrl_index_fail);
1334196008Smjacob	ISP_IOXPUT_16(isp, src->vp_ctrl_status, &dst->vp_ctrl_status);
1335196008Smjacob	ISP_IOXPUT_16(isp, src->vp_ctrl_command, &dst->vp_ctrl_command);
1336196008Smjacob	ISP_IOXPUT_16(isp, src->vp_ctrl_vp_count, &dst->vp_ctrl_vp_count);
1337196008Smjacob	for (i = 0; i < ASIZE(src->vp_ctrl_idmap); i++) {
1338196008Smjacob		ISP_IOXPUT_16(isp, src->vp_ctrl_idmap[i], &dst->vp_ctrl_idmap[i]);
1339196008Smjacob	}
1340196008Smjacob	for (i = 0; i < ASIZE(src->vp_ctrl_reserved); i++) {
1341208761Smjacob		ISP_IOXPUT_8(isp, src->vp_ctrl_reserved[i], &dst->vp_ctrl_reserved[i]);
1342196008Smjacob	}
1343196008Smjacob}
1344196008Smjacob
1345196008Smjacobvoid
1346196008Smjacobisp_get_vp_ctrl_info(ispsoftc_t *isp, vp_ctrl_info_t *src, vp_ctrl_info_t *dst)
1347196008Smjacob{
1348196008Smjacob	int i;
1349196008Smjacob	isp_get_hdr(isp, &src->vp_ctrl_hdr, &dst->vp_ctrl_hdr);
1350196008Smjacob	ISP_IOXGET_32(isp, &src->vp_ctrl_handle, dst->vp_ctrl_handle);
1351196008Smjacob	ISP_IOXGET_16(isp, &src->vp_ctrl_index_fail, dst->vp_ctrl_index_fail);
1352196008Smjacob	ISP_IOXGET_16(isp, &src->vp_ctrl_status, dst->vp_ctrl_status);
1353196008Smjacob	ISP_IOXGET_16(isp, &src->vp_ctrl_command, dst->vp_ctrl_command);
1354196008Smjacob	ISP_IOXGET_16(isp, &src->vp_ctrl_vp_count, dst->vp_ctrl_vp_count);
1355196008Smjacob	for (i = 0; i < ASIZE(src->vp_ctrl_idmap); i++) {
1356196008Smjacob		ISP_IOXGET_16(isp, &src->vp_ctrl_idmap[i], dst->vp_ctrl_idmap[i]);
1357196008Smjacob	}
1358196008Smjacob	for (i = 0; i < ASIZE(src->vp_ctrl_reserved); i++) {
1359196008Smjacob		ISP_IOXGET_8(isp, &src->vp_ctrl_reserved[i], dst->vp_ctrl_reserved[i]);
1360196008Smjacob	}
1361196008Smjacob}
1362196008Smjacob
1363196008Smjacobvoid
1364196008Smjacobisp_put_vp_modify(ispsoftc_t *isp, vp_modify_t *src, vp_modify_t *dst)
1365196008Smjacob{
1366196008Smjacob	int i, j;
1367196008Smjacob	isp_put_hdr(isp, &src->vp_mod_hdr, &dst->vp_mod_hdr);
1368196008Smjacob	ISP_IOXPUT_32(isp, src->vp_mod_hdl, &dst->vp_mod_hdl);
1369196008Smjacob	ISP_IOXPUT_16(isp, src->vp_mod_reserved0, &dst->vp_mod_reserved0);
1370196008Smjacob	ISP_IOXPUT_16(isp, src->vp_mod_status, &dst->vp_mod_status);
1371196008Smjacob	ISP_IOXPUT_8(isp, src->vp_mod_cmd, &dst->vp_mod_cmd);
1372196008Smjacob	ISP_IOXPUT_8(isp, src->vp_mod_cnt, &dst->vp_mod_cnt);
1373196008Smjacob	ISP_IOXPUT_8(isp, src->vp_mod_idx0, &dst->vp_mod_idx0);
1374196008Smjacob	ISP_IOXPUT_8(isp, src->vp_mod_idx1, &dst->vp_mod_idx1);
1375196008Smjacob	for (i = 0; i < ASIZE(src->vp_mod_ports); i++) {
1376196008Smjacob		ISP_IOXPUT_8(isp, src->vp_mod_ports[i].options, &dst->vp_mod_ports[i].options);
1377196008Smjacob		ISP_IOXPUT_8(isp, src->vp_mod_ports[i].loopid, &dst->vp_mod_ports[i].loopid);
1378196008Smjacob		ISP_IOXPUT_16(isp, src->vp_mod_ports[i].reserved1, &dst->vp_mod_ports[i].reserved1);
1379196008Smjacob		for (j = 0; j < ASIZE(src->vp_mod_ports[i].wwpn); j++) {
1380196008Smjacob			ISP_IOXPUT_8(isp, src->vp_mod_ports[i].wwpn[j], &dst->vp_mod_ports[i].wwpn[j]);
1381196008Smjacob		}
1382196008Smjacob		for (j = 0; j < ASIZE(src->vp_mod_ports[i].wwnn); j++) {
1383196008Smjacob			ISP_IOXPUT_8(isp, src->vp_mod_ports[i].wwnn[j], &dst->vp_mod_ports[i].wwnn[j]);
1384196008Smjacob		}
1385196008Smjacob	}
1386196008Smjacob	for (i = 0; i < ASIZE(src->vp_mod_reserved2); i++) {
1387196008Smjacob		ISP_IOXPUT_8(isp, src->vp_mod_reserved2[i], &dst->vp_mod_reserved2[i]);
1388196008Smjacob	}
1389196008Smjacob}
1390196008Smjacob
1391196008Smjacobvoid
1392196008Smjacobisp_get_vp_modify(ispsoftc_t *isp, vp_modify_t *src, vp_modify_t *dst)
1393196008Smjacob{
1394196008Smjacob	int i, j;
1395196008Smjacob	isp_get_hdr(isp, &src->vp_mod_hdr, &dst->vp_mod_hdr);
1396196008Smjacob	ISP_IOXGET_32(isp, &src->vp_mod_hdl, dst->vp_mod_hdl);
1397196008Smjacob	ISP_IOXGET_16(isp, &src->vp_mod_reserved0, dst->vp_mod_reserved0);
1398196008Smjacob	ISP_IOXGET_16(isp, &src->vp_mod_status, dst->vp_mod_status);
1399196008Smjacob	ISP_IOXGET_8(isp, &src->vp_mod_cmd, dst->vp_mod_cmd);
1400196008Smjacob	ISP_IOXGET_8(isp, &src->vp_mod_cnt, dst->vp_mod_cnt);
1401196008Smjacob	ISP_IOXGET_8(isp, &src->vp_mod_idx0, dst->vp_mod_idx0);
1402196008Smjacob	ISP_IOXGET_8(isp, &src->vp_mod_idx1, dst->vp_mod_idx1);
1403196008Smjacob	for (i = 0; i < ASIZE(src->vp_mod_ports); i++) {
1404196008Smjacob		ISP_IOXGET_8(isp, &src->vp_mod_ports[i].options, dst->vp_mod_ports[i].options);
1405196008Smjacob		ISP_IOXGET_8(isp, &src->vp_mod_ports[i].loopid, dst->vp_mod_ports[i].loopid);
1406196008Smjacob		ISP_IOXGET_16(isp, &src->vp_mod_ports[i].reserved1, dst->vp_mod_ports[i].reserved1);
1407196008Smjacob		for (j = 0; j < ASIZE(src->vp_mod_ports[i].wwpn); j++) {
1408196008Smjacob			ISP_IOXGET_8(isp, &src->vp_mod_ports[i].wwpn[j], dst->vp_mod_ports[i].wwpn[j]);
1409196008Smjacob		}
1410196008Smjacob		for (j = 0; j < ASIZE(src->vp_mod_ports[i].wwnn); j++) {
1411196008Smjacob			ISP_IOXGET_8(isp, &src->vp_mod_ports[i].wwnn[j], dst->vp_mod_ports[i].wwnn[j]);
1412196008Smjacob		}
1413196008Smjacob	}
1414196008Smjacob	for (i = 0; i < ASIZE(src->vp_mod_reserved2); i++) {
1415196008Smjacob		ISP_IOXGET_8(isp, &src->vp_mod_reserved2[i], dst->vp_mod_reserved2[i]);
1416196008Smjacob	}
1417196008Smjacob}
1418196008Smjacob
1419196008Smjacobvoid
1420163899Smjacobisp_get_pdb_21xx(ispsoftc_t *isp, isp_pdb_21xx_t *src, isp_pdb_21xx_t *dst)
1421163899Smjacob{
1422163899Smjacob	int i;
1423155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_options, dst->pdb_options);
1424155228Smjacob        ISP_IOXGET_8(isp, &src->pdb_mstate, dst->pdb_mstate);
1425155228Smjacob        ISP_IOXGET_8(isp, &src->pdb_sstate, dst->pdb_sstate);
1426155228Smjacob	for (i = 0; i < 4; i++) {
1427196008Smjacob		ISP_IOXGET_8(isp, &src->pdb_hardaddr_bits[i], dst->pdb_hardaddr_bits[i]);
1428155228Smjacob	}
1429155228Smjacob	for (i = 0; i < 4; i++) {
1430196008Smjacob		ISP_IOXGET_8(isp, &src->pdb_portid_bits[i], dst->pdb_portid_bits[i]);
1431155228Smjacob	}
1432155228Smjacob	for (i = 0; i < 8; i++) {
1433155228Smjacob		ISP_IOXGET_8(isp, &src->pdb_nodename[i], dst->pdb_nodename[i]);
1434155228Smjacob	}
1435155228Smjacob	for (i = 0; i < 8; i++) {
1436155228Smjacob		ISP_IOXGET_8(isp, &src->pdb_portname[i], dst->pdb_portname[i]);
1437155228Smjacob	}
1438155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_execthrottle, dst->pdb_execthrottle);
1439155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_exec_count, dst->pdb_exec_count);
1440155228Smjacob	ISP_IOXGET_8(isp, &src->pdb_retry_count, dst->pdb_retry_count);
1441155228Smjacob	ISP_IOXGET_8(isp, &src->pdb_retry_delay, dst->pdb_retry_delay);
1442155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_resalloc, dst->pdb_resalloc);
1443155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_curalloc, dst->pdb_curalloc);
1444155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_qhead, dst->pdb_qhead);
1445155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_qtail, dst->pdb_qtail);
1446155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_tl_next, dst->pdb_tl_next);
1447155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_tl_last, dst->pdb_tl_last);
1448155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_features, dst->pdb_features);
1449155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_pconcurrnt, dst->pdb_pconcurrnt);
1450155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_roi, dst->pdb_roi);
1451155228Smjacob	ISP_IOXGET_8(isp, &src->pdb_target, dst->pdb_target);
1452155228Smjacob	ISP_IOXGET_8(isp, &src->pdb_initiator, dst->pdb_initiator);
1453155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_rdsiz, dst->pdb_rdsiz);
1454155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_ncseq, dst->pdb_ncseq);
1455155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_noseq, dst->pdb_noseq);
1456155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_labrtflg, dst->pdb_labrtflg);
1457155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_lstopflg, dst->pdb_lstopflg);
1458155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_sqhead, dst->pdb_sqhead);
1459155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_sqtail, dst->pdb_sqtail);
1460155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_ptimer, dst->pdb_ptimer);
1461155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_nxt_seqid, dst->pdb_nxt_seqid);
1462155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_fcount, dst->pdb_fcount);
1463155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_prli_len, dst->pdb_prli_len);
1464155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_prli_svc0, dst->pdb_prli_svc0);
1465155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_prli_svc3, dst->pdb_prli_svc3);
1466155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_loopid, dst->pdb_loopid);
1467155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_il_ptr, dst->pdb_il_ptr);
1468155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_sl_ptr, dst->pdb_sl_ptr);
1469155228Smjacob}
1470155228Smjacob
1471163899Smjacobvoid
1472163899Smjacobisp_get_pdb_24xx(ispsoftc_t *isp, isp_pdb_24xx_t *src, isp_pdb_24xx_t *dst)
1473163899Smjacob{
1474163899Smjacob	int i;
1475163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_flags, dst->pdb_flags);
1476163899Smjacob        ISP_IOXGET_8(isp, &src->pdb_curstate, dst->pdb_curstate);
1477163899Smjacob        ISP_IOXGET_8(isp, &src->pdb_laststate, dst->pdb_laststate);
1478163899Smjacob	for (i = 0; i < 4; i++) {
1479196008Smjacob		ISP_IOXGET_8(isp, &src->pdb_hardaddr_bits[i], dst->pdb_hardaddr_bits[i]);
1480163899Smjacob	}
1481163899Smjacob	for (i = 0; i < 4; i++) {
1482196008Smjacob		ISP_IOXGET_8(isp, &src->pdb_portid_bits[i], dst->pdb_portid_bits[i]);
1483163899Smjacob	}
1484163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_retry_timer, dst->pdb_retry_timer);
1485163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_handle, dst->pdb_handle);
1486163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_rcv_dsize, dst->pdb_rcv_dsize);
1487163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_reserved0, dst->pdb_reserved0);
1488163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_prli_svc0, dst->pdb_prli_svc0);
1489163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_prli_svc3, dst->pdb_prli_svc3);
1490163899Smjacob	for (i = 0; i < 8; i++) {
1491163899Smjacob		ISP_IOXGET_8(isp, &src->pdb_nodename[i], dst->pdb_nodename[i]);
1492163899Smjacob	}
1493163899Smjacob	for (i = 0; i < 8; i++) {
1494163899Smjacob		ISP_IOXGET_8(isp, &src->pdb_portname[i], dst->pdb_portname[i]);
1495163899Smjacob	}
1496163899Smjacob	for (i = 0; i < 24; i++) {
1497196008Smjacob		ISP_IOXGET_8(isp, &src->pdb_reserved1[i], dst->pdb_reserved1[i]);
1498163899Smjacob	}
1499163899Smjacob}
1500155228Smjacob
1501155228Smjacob/*
1502163899Smjacob * PLOGI/LOGO IOCB canonicalization
1503155228Smjacob */
1504163899Smjacob
1505155228Smjacobvoid
1506163899Smjacobisp_get_plogx(ispsoftc_t *isp, isp_plogx_t *src, isp_plogx_t *dst)
1507155228Smjacob{
1508163899Smjacob	int i;
1509163899Smjacob	isp_get_hdr(isp, &src->plogx_header, &dst->plogx_header);
1510163899Smjacob	ISP_IOXGET_32(isp, &src->plogx_handle, dst->plogx_handle);
1511163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_status, dst->plogx_status);
1512163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_nphdl, dst->plogx_nphdl);
1513163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_flags, dst->plogx_flags);
1514163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_vphdl, dst->plogx_vphdl);
1515163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_portlo, dst->plogx_portlo);
1516163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_rspsz_porthi, dst->plogx_rspsz_porthi);
1517163899Smjacob	for (i = 0; i < 11; i++) {
1518196008Smjacob		ISP_IOXGET_16(isp, &src->plogx_ioparm[i].lo16, dst->plogx_ioparm[i].lo16);
1519196008Smjacob		ISP_IOXGET_16(isp, &src->plogx_ioparm[i].hi16, dst->plogx_ioparm[i].hi16);
1520163899Smjacob	}
1521155228Smjacob}
1522155228Smjacob
1523163899Smjacobvoid
1524163899Smjacobisp_put_plogx(ispsoftc_t *isp, isp_plogx_t *src, isp_plogx_t *dst)
1525163899Smjacob{
1526163899Smjacob	int i;
1527163899Smjacob	isp_put_hdr(isp, &src->plogx_header, &dst->plogx_header);
1528163899Smjacob	ISP_IOXPUT_32(isp, src->plogx_handle, &dst->plogx_handle);
1529163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_status, &dst->plogx_status);
1530163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_nphdl, &dst->plogx_nphdl);
1531163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_flags, &dst->plogx_flags);
1532163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_vphdl, &dst->plogx_vphdl);
1533163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_portlo, &dst->plogx_portlo);
1534163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_rspsz_porthi, &dst->plogx_rspsz_porthi);
1535163899Smjacob	for (i = 0; i < 11; i++) {
1536196008Smjacob		ISP_IOXPUT_16(isp, src->plogx_ioparm[i].lo16, &dst->plogx_ioparm[i].lo16);
1537196008Smjacob		ISP_IOXPUT_16(isp, src->plogx_ioparm[i].hi16, &dst->plogx_ioparm[i].hi16);
1538163899Smjacob	}
1539163899Smjacob}
1540163899Smjacob
1541155228Smjacob/*
1542196008Smjacob * Report ID canonicalization
1543196008Smjacob */
1544196008Smjacobvoid
1545196008Smjacobisp_get_ridacq(ispsoftc_t *isp, isp_ridacq_t *src, isp_ridacq_t *dst)
1546196008Smjacob{
1547196008Smjacob	int i;
1548196008Smjacob	isp_get_hdr(isp, &src->ridacq_hdr, &dst->ridacq_hdr);
1549196008Smjacob	ISP_IOXGET_32(isp, &src->ridacq_handle, dst->ridacq_handle);
1550196008Smjacob	ISP_IOXGET_16(isp, &src->ridacq_vp_port_lo, dst->ridacq_vp_port_lo);
1551196008Smjacob	ISP_IOXGET_8(isp, &src->ridacq_vp_port_hi, dst->ridacq_vp_port_hi);
1552196008Smjacob	ISP_IOXGET_8(isp, &src->ridacq_format, dst->ridacq_format);
1553196008Smjacob	for (i = 0; i < sizeof (src->ridacq_map) / sizeof (src->ridacq_map[0]); i++) {
1554196008Smjacob		ISP_IOXGET_16(isp, &src->ridacq_map[i], dst->ridacq_map[i]);
1555196008Smjacob	}
1556196008Smjacob	for (i = 0; i < sizeof (src->ridacq_reserved1) / sizeof (src->ridacq_reserved1[0]); i++) {
1557196008Smjacob		ISP_IOXGET_16(isp, &src->ridacq_reserved1[i], dst->ridacq_reserved1[i]);
1558196008Smjacob	}
1559196008Smjacob	if (dst->ridacq_format == 0) {
1560196008Smjacob		ISP_IOXGET_8(isp, &src->un.type0.ridacq_vp_acquired, dst->un.type0.ridacq_vp_acquired);
1561196008Smjacob		ISP_IOXGET_8(isp, &src->un.type0.ridacq_vp_setup, dst->un.type0.ridacq_vp_setup);
1562196008Smjacob		ISP_IOXGET_16(isp, &src->un.type0.ridacq_reserved0, dst->un.type0.ridacq_reserved0);
1563196008Smjacob	} else if (dst->ridacq_format == 1) {
1564196008Smjacob		ISP_IOXGET_16(isp, &src->un.type1.ridacq_vp_count, dst->un.type1.ridacq_vp_count);
1565196008Smjacob		ISP_IOXGET_8(isp, &src->un.type1.ridacq_vp_index, dst->un.type1.ridacq_vp_index);
1566196008Smjacob		ISP_IOXGET_8(isp, &src->un.type1.ridacq_vp_status, dst->un.type1.ridacq_vp_status);
1567196008Smjacob	} else {
1568196008Smjacob		ISP_MEMZERO(&dst->un, sizeof (dst->un));
1569196008Smjacob	}
1570196008Smjacob}
1571196008Smjacob
1572196008Smjacob
1573196008Smjacob/*
1574163899Smjacob * CT Passthru canonicalization
1575163899Smjacob */
1576163899Smjacobvoid
1577163899Smjacobisp_get_ct_pt(ispsoftc_t *isp, isp_ct_pt_t *src, isp_ct_pt_t *dst)
1578163899Smjacob{
1579163899Smjacob	int i;
1580163899Smjacob
1581163899Smjacob	isp_get_hdr(isp, &src->ctp_header, &dst->ctp_header);
1582163899Smjacob	ISP_IOXGET_32(isp, &src->ctp_handle, dst->ctp_handle);
1583163899Smjacob	ISP_IOXGET_16(isp, &src->ctp_status, dst->ctp_status);
1584163899Smjacob	ISP_IOXGET_16(isp, &src->ctp_nphdl, dst->ctp_nphdl);
1585163899Smjacob	ISP_IOXGET_16(isp, &src->ctp_cmd_cnt, dst->ctp_cmd_cnt);
1586196008Smjacob	ISP_IOXGET_8(isp, &src->ctp_vpidx, dst->ctp_vpidx);
1587196008Smjacob	ISP_IOXGET_8(isp, &src->ctp_reserved0, dst->ctp_reserved0);
1588163899Smjacob	ISP_IOXGET_16(isp, &src->ctp_time, dst->ctp_time);
1589196008Smjacob	ISP_IOXGET_16(isp, &src->ctp_reserved1, dst->ctp_reserved1);
1590163899Smjacob	ISP_IOXGET_16(isp, &src->ctp_rsp_cnt, dst->ctp_rsp_cnt);
1591163899Smjacob	for (i = 0; i < 5; i++) {
1592196008Smjacob		ISP_IOXGET_16(isp, &src->ctp_reserved2[i], dst->ctp_reserved2[i]);
1593163899Smjacob	}
1594163899Smjacob	ISP_IOXGET_32(isp, &src->ctp_rsp_bcnt, dst->ctp_rsp_bcnt);
1595163899Smjacob	ISP_IOXGET_32(isp, &src->ctp_cmd_bcnt, dst->ctp_cmd_bcnt);
1596163899Smjacob	for (i = 0; i < 2; i++) {
1597196008Smjacob		ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_base, dst->ctp_dataseg[i].ds_base);
1598196008Smjacob		ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_basehi, dst->ctp_dataseg[i].ds_basehi);
1599196008Smjacob		ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_count, dst->ctp_dataseg[i].ds_count);
1600163899Smjacob	}
1601163899Smjacob}
1602163899Smjacob
1603163899Smjacobvoid
1604164370Smjacobisp_get_ms(ispsoftc_t *isp, isp_ms_t *src, isp_ms_t *dst)
1605164370Smjacob{
1606164370Smjacob	int i;
1607164370Smjacob
1608164370Smjacob	isp_get_hdr(isp, &src->ms_header, &dst->ms_header);
1609164370Smjacob	ISP_IOXGET_32(isp, &src->ms_handle, dst->ms_handle);
1610164370Smjacob	ISP_IOXGET_16(isp, &src->ms_nphdl, dst->ms_nphdl);
1611164370Smjacob	ISP_IOXGET_16(isp, &src->ms_status, dst->ms_status);
1612164370Smjacob	ISP_IOXGET_16(isp, &src->ms_flags, dst->ms_flags);
1613164370Smjacob	ISP_IOXGET_16(isp, &src->ms_reserved1, dst->ms_reserved1);
1614164370Smjacob	ISP_IOXGET_16(isp, &src->ms_time, dst->ms_time);
1615164370Smjacob	ISP_IOXGET_16(isp, &src->ms_cmd_cnt, dst->ms_cmd_cnt);
1616164370Smjacob	ISP_IOXGET_16(isp, &src->ms_tot_cnt, dst->ms_tot_cnt);
1617164370Smjacob	ISP_IOXGET_8(isp, &src->ms_type, dst->ms_type);
1618164370Smjacob	ISP_IOXGET_8(isp, &src->ms_r_ctl, dst->ms_r_ctl);
1619164370Smjacob	ISP_IOXGET_16(isp, &src->ms_rxid, dst->ms_rxid);
1620164370Smjacob	ISP_IOXGET_16(isp, &src->ms_reserved2, dst->ms_reserved2);
1621164370Smjacob	ISP_IOXGET_32(isp, &src->ms_rsp_bcnt, dst->ms_rsp_bcnt);
1622164370Smjacob	ISP_IOXGET_32(isp, &src->ms_cmd_bcnt, dst->ms_cmd_bcnt);
1623164370Smjacob	for (i = 0; i < 2; i++) {
1624196008Smjacob		ISP_IOXGET_32(isp, &src->ms_dataseg[i].ds_base, dst->ms_dataseg[i].ds_base);
1625196008Smjacob		ISP_IOXGET_32(isp, &src->ms_dataseg[i].ds_basehi, dst->ms_dataseg[i].ds_basehi);
1626196008Smjacob		ISP_IOXGET_32(isp, &src->ms_dataseg[i].ds_count, dst->ms_dataseg[i].ds_count);
1627164370Smjacob	}
1628164370Smjacob}
1629164370Smjacob
1630164370Smjacobvoid
1631163899Smjacobisp_put_ct_pt(ispsoftc_t *isp, isp_ct_pt_t *src, isp_ct_pt_t *dst)
1632163899Smjacob{
1633163899Smjacob	int i;
1634163899Smjacob
1635163899Smjacob	isp_put_hdr(isp, &src->ctp_header, &dst->ctp_header);
1636163899Smjacob	ISP_IOXPUT_32(isp, src->ctp_handle, &dst->ctp_handle);
1637163899Smjacob	ISP_IOXPUT_16(isp, src->ctp_status, &dst->ctp_status);
1638163899Smjacob	ISP_IOXPUT_16(isp, src->ctp_nphdl, &dst->ctp_nphdl);
1639163899Smjacob	ISP_IOXPUT_16(isp, src->ctp_cmd_cnt, &dst->ctp_cmd_cnt);
1640196008Smjacob	ISP_IOXPUT_8(isp, src->ctp_vpidx, &dst->ctp_vpidx);
1641196008Smjacob	ISP_IOXPUT_8(isp, src->ctp_reserved0, &dst->ctp_reserved0);
1642163899Smjacob	ISP_IOXPUT_16(isp, src->ctp_time, &dst->ctp_time);
1643196008Smjacob	ISP_IOXPUT_16(isp, src->ctp_reserved1, &dst->ctp_reserved1);
1644163899Smjacob	ISP_IOXPUT_16(isp, src->ctp_rsp_cnt, &dst->ctp_rsp_cnt);
1645163899Smjacob	for (i = 0; i < 5; i++) {
1646196008Smjacob		ISP_IOXPUT_16(isp, src->ctp_reserved2[i], &dst->ctp_reserved2[i]);
1647163899Smjacob	}
1648163899Smjacob	ISP_IOXPUT_32(isp, src->ctp_rsp_bcnt, &dst->ctp_rsp_bcnt);
1649163899Smjacob	ISP_IOXPUT_32(isp, src->ctp_cmd_bcnt, &dst->ctp_cmd_bcnt);
1650163899Smjacob	for (i = 0; i < 2; i++) {
1651196008Smjacob		ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_base, &dst->ctp_dataseg[i].ds_base);
1652196008Smjacob		ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_basehi, &dst->ctp_dataseg[i].ds_basehi);
1653196008Smjacob		ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_count, &dst->ctp_dataseg[i].ds_count);
1654163899Smjacob	}
1655163899Smjacob}
1656163899Smjacob
1657164370Smjacobvoid
1658164370Smjacobisp_put_ms(ispsoftc_t *isp, isp_ms_t *src, isp_ms_t *dst)
1659164370Smjacob{
1660164370Smjacob	int i;
1661164370Smjacob
1662164370Smjacob	isp_put_hdr(isp, &src->ms_header, &dst->ms_header);
1663164370Smjacob	ISP_IOXPUT_32(isp, src->ms_handle, &dst->ms_handle);
1664164370Smjacob	ISP_IOXPUT_16(isp, src->ms_nphdl, &dst->ms_nphdl);
1665164370Smjacob	ISP_IOXPUT_16(isp, src->ms_status, &dst->ms_status);
1666164370Smjacob	ISP_IOXPUT_16(isp, src->ms_flags, &dst->ms_flags);
1667164370Smjacob	ISP_IOXPUT_16(isp, src->ms_reserved1, &dst->ms_reserved1);
1668164370Smjacob	ISP_IOXPUT_16(isp, src->ms_time, &dst->ms_time);
1669164370Smjacob	ISP_IOXPUT_16(isp, src->ms_cmd_cnt, &dst->ms_cmd_cnt);
1670164370Smjacob	ISP_IOXPUT_16(isp, src->ms_tot_cnt, &dst->ms_tot_cnt);
1671164370Smjacob	ISP_IOXPUT_8(isp, src->ms_type, &dst->ms_type);
1672164370Smjacob	ISP_IOXPUT_8(isp, src->ms_r_ctl, &dst->ms_r_ctl);
1673164370Smjacob	ISP_IOXPUT_16(isp, src->ms_rxid, &dst->ms_rxid);
1674164370Smjacob	ISP_IOXPUT_16(isp, src->ms_reserved2, &dst->ms_reserved2);
1675164370Smjacob	ISP_IOXPUT_32(isp, src->ms_rsp_bcnt, &dst->ms_rsp_bcnt);
1676164370Smjacob	ISP_IOXPUT_32(isp, src->ms_cmd_bcnt, &dst->ms_cmd_bcnt);
1677164370Smjacob	for (i = 0; i < 2; i++) {
1678196008Smjacob		ISP_IOXPUT_32(isp, src->ms_dataseg[i].ds_base, &dst->ms_dataseg[i].ds_base);
1679196008Smjacob		ISP_IOXPUT_32(isp, src->ms_dataseg[i].ds_basehi, &dst->ms_dataseg[i].ds_basehi);
1680196008Smjacob		ISP_IOXPUT_32(isp, src->ms_dataseg[i].ds_count, &dst->ms_dataseg[i].ds_count);
1681164370Smjacob	}
1682164370Smjacob}
1683164370Smjacob
1684163899Smjacob/*
1685155228Smjacob * Generic SNS request - not particularly useful since the per-command data
1686155228Smjacob * isn't always 16 bit words.
1687155228Smjacob */
1688155228Smjacobvoid
1689155704Smjacobisp_put_sns_request(ispsoftc_t *isp, sns_screq_t *src, sns_screq_t *dst)
1690155228Smjacob{
1691155228Smjacob	int i, nw = (int) src->snscb_sblen;
1692155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
1693155228Smjacob	for (i = 0; i < 4; i++) {
1694155228Smjacob		ISP_IOXPUT_16(isp, src->snscb_addr[i], &dst->snscb_addr[i]);
1695155228Smjacob	}
1696155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
1697155228Smjacob	for (i = 0; i < nw; i++) {
1698155228Smjacob		ISP_IOXPUT_16(isp, src->snscb_data[i], &dst->snscb_data[i]);
1699155228Smjacob	}
1700155228Smjacob}
1701155228Smjacob
1702155228Smjacobvoid
1703196008Smjacobisp_put_gid_ft_request(ispsoftc_t *isp, sns_gid_ft_req_t *src, sns_gid_ft_req_t *dst)
1704155228Smjacob{
1705155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
1706163899Smjacob	ISP_IOXPUT_16(isp, src->snscb_reserved0, &dst->snscb_reserved0);
1707155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[0], &dst->snscb_addr[0]);
1708155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[1], &dst->snscb_addr[1]);
1709155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[2], &dst->snscb_addr[2]);
1710155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[3], &dst->snscb_addr[3]);
1711155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
1712163899Smjacob	ISP_IOXPUT_16(isp, src->snscb_reserved1, &dst->snscb_reserved1);
1713155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_cmd, &dst->snscb_cmd);
1714155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_mword_div_2, &dst->snscb_mword_div_2);
1715163899Smjacob	ISP_IOXPUT_32(isp, src->snscb_reserved3, &dst->snscb_reserved3);
1716155228Smjacob	ISP_IOXPUT_32(isp, src->snscb_fc4_type, &dst->snscb_fc4_type);
1717155228Smjacob}
1718155228Smjacob
1719155228Smjacobvoid
1720196008Smjacobisp_put_gxn_id_request(ispsoftc_t *isp, sns_gxn_id_req_t *src, sns_gxn_id_req_t *dst)
1721155228Smjacob{
1722155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
1723163899Smjacob	ISP_IOXPUT_16(isp, src->snscb_reserved0, &dst->snscb_reserved0);
1724155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[0], &dst->snscb_addr[0]);
1725155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[1], &dst->snscb_addr[1]);
1726155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[2], &dst->snscb_addr[2]);
1727155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[3], &dst->snscb_addr[3]);
1728155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
1729163899Smjacob	ISP_IOXPUT_16(isp, src->snscb_reserved1, &dst->snscb_reserved1);
1730155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_cmd, &dst->snscb_cmd);
1731163899Smjacob	ISP_IOXPUT_16(isp, src->snscb_reserved2, &dst->snscb_reserved2);
1732163899Smjacob	ISP_IOXPUT_32(isp, src->snscb_reserved3, &dst->snscb_reserved3);
1733155228Smjacob	ISP_IOXPUT_32(isp, src->snscb_portid, &dst->snscb_portid);
1734155228Smjacob}
1735155228Smjacob
1736155228Smjacob/*
1737155228Smjacob * Generic SNS response - not particularly useful since the per-command data
1738155228Smjacob * isn't always 16 bit words.
1739155228Smjacob */
1740155228Smjacobvoid
1741196008Smjacobisp_get_sns_response(ispsoftc_t *isp, sns_scrsp_t *src, sns_scrsp_t *dst, int nwords)
1742155228Smjacob{
1743155228Smjacob	int i;
1744155228Smjacob	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1745155228Smjacob	ISP_IOXGET_8(isp, &src->snscb_port_type, dst->snscb_port_type);
1746155228Smjacob	for (i = 0; i < 3; i++) {
1747155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_port_id[i],
1748155228Smjacob		    dst->snscb_port_id[i]);
1749155228Smjacob	}
1750155228Smjacob	for (i = 0; i < 8; i++) {
1751155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_portname[i],
1752155228Smjacob		    dst->snscb_portname[i]);
1753155228Smjacob	}
1754155228Smjacob	for (i = 0; i < nwords; i++) {
1755155228Smjacob		ISP_IOXGET_16(isp, &src->snscb_data[i], dst->snscb_data[i]);
1756155228Smjacob	}
1757155228Smjacob}
1758155228Smjacob
1759155228Smjacobvoid
1760196008Smjacobisp_get_gid_ft_response(ispsoftc_t *isp, sns_gid_ft_rsp_t *src, sns_gid_ft_rsp_t *dst, int nwords)
1761155228Smjacob{
1762155228Smjacob	int i;
1763155228Smjacob	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1764155228Smjacob	for (i = 0; i < nwords; i++) {
1765155228Smjacob		int j;
1766196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_ports[i].control, dst->snscb_ports[i].control);
1767155228Smjacob		for (j = 0; j < 3; j++) {
1768196008Smjacob			ISP_IOXGET_8(isp, &src->snscb_ports[i].portid[j], dst->snscb_ports[i].portid[j]);
1769155228Smjacob		}
1770155228Smjacob		if (dst->snscb_ports[i].control & 0x80) {
1771155228Smjacob			break;
1772155228Smjacob		}
1773155228Smjacob	}
1774155228Smjacob}
1775155228Smjacob
1776155228Smjacobvoid
1777196008Smjacobisp_get_gxn_id_response(ispsoftc_t *isp, sns_gxn_id_rsp_t *src, sns_gxn_id_rsp_t *dst)
1778155228Smjacob{
1779155228Smjacob	int i;
1780155228Smjacob	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1781196008Smjacob	for (i = 0; i < 8; i++) {
1782155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_wwn[i], dst->snscb_wwn[i]);
1783196008Smjacob	}
1784155228Smjacob}
1785155228Smjacob
1786155228Smjacobvoid
1787196008Smjacobisp_get_gff_id_response(ispsoftc_t *isp, sns_gff_id_rsp_t *src, sns_gff_id_rsp_t *dst)
1788155228Smjacob{
1789155228Smjacob	int i;
1790155228Smjacob	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1791155228Smjacob	for (i = 0; i < 32; i++) {
1792196008Smjacob		ISP_IOXGET_32(isp, &src->snscb_fc4_features[i], dst->snscb_fc4_features[i]);
1793155228Smjacob	}
1794155228Smjacob}
1795155228Smjacob
1796155228Smjacobvoid
1797196008Smjacobisp_get_ga_nxt_response(ispsoftc_t *isp, sns_ga_nxt_rsp_t *src, sns_ga_nxt_rsp_t *dst)
1798155228Smjacob{
1799155228Smjacob	int i;
1800155228Smjacob	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1801155228Smjacob	ISP_IOXGET_8(isp, &src->snscb_port_type, dst->snscb_port_type);
1802155228Smjacob	for (i = 0; i < 3; i++) {
1803196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_port_id[i], dst->snscb_port_id[i]);
1804155228Smjacob	}
1805155228Smjacob	for (i = 0; i < 8; i++) {
1806196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_portname[i], dst->snscb_portname[i]);
1807155228Smjacob	}
1808155228Smjacob	ISP_IOXGET_8(isp, &src->snscb_pnlen, dst->snscb_pnlen);
1809155228Smjacob	for (i = 0; i < 255; i++) {
1810155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_pname[i], dst->snscb_pname[i]);
1811155228Smjacob	}
1812155228Smjacob	for (i = 0; i < 8; i++) {
1813196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_nodename[i], dst->snscb_nodename[i]);
1814155228Smjacob	}
1815155228Smjacob	ISP_IOXGET_8(isp, &src->snscb_nnlen, dst->snscb_nnlen);
1816155228Smjacob	for (i = 0; i < 255; i++) {
1817155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_nname[i], dst->snscb_nname[i]);
1818155228Smjacob	}
1819155228Smjacob	for (i = 0; i < 8; i++) {
1820196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_ipassoc[i], dst->snscb_ipassoc[i]);
1821155228Smjacob	}
1822155228Smjacob	for (i = 0; i < 16; i++) {
1823155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_ipaddr[i], dst->snscb_ipaddr[i]);
1824155228Smjacob	}
1825155228Smjacob	for (i = 0; i < 4; i++) {
1826196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_svc_class[i], dst->snscb_svc_class[i]);
1827155228Smjacob	}
1828155228Smjacob	for (i = 0; i < 32; i++) {
1829196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_fc4_types[i], dst->snscb_fc4_types[i]);
1830155228Smjacob	}
1831155228Smjacob	for (i = 0; i < 8; i++) {
1832155228Smjacob		ISP_IOXGET_8(isp, &src->snscb_fpname[i], dst->snscb_fpname[i]);
1833155228Smjacob	}
1834155228Smjacob	ISP_IOXGET_8(isp, &src->snscb_reserved, dst->snscb_reserved);
1835155228Smjacob	for (i = 0; i < 3; i++) {
1836196008Smjacob		ISP_IOXGET_8(isp, &src->snscb_hardaddr[i], dst->snscb_hardaddr[i]);
1837155228Smjacob	}
1838155228Smjacob}
1839155228Smjacob
1840163899Smjacobvoid
1841163899Smjacobisp_get_els(ispsoftc_t *isp, els_t *src, els_t *dst)
1842163899Smjacob{
1843163899Smjacob	int i;
1844163899Smjacob
1845163899Smjacob	isp_get_hdr(isp, &src->els_hdr, &dst->els_hdr);
1846163899Smjacob	ISP_IOXGET_32(isp, &src->els_handle, dst->els_handle);
1847163899Smjacob	ISP_IOXGET_16(isp, &src->els_status, dst->els_status);
1848163899Smjacob	ISP_IOXGET_16(isp, &src->els_nphdl, dst->els_nphdl);
1849163899Smjacob	ISP_IOXGET_16(isp, &src->els_xmit_dsd_count, dst->els_xmit_dsd_count);
1850163899Smjacob	ISP_IOXGET_8(isp, &src->els_vphdl, dst->els_vphdl);
1851163899Smjacob	ISP_IOXGET_8(isp, &src->els_sof, dst->els_sof);
1852163899Smjacob	ISP_IOXGET_32(isp, &src->els_rxid, dst->els_rxid);
1853163899Smjacob	ISP_IOXGET_16(isp, &src->els_recv_dsd_count, dst->els_recv_dsd_count);
1854163899Smjacob	ISP_IOXGET_8(isp, &src->els_opcode, dst->els_opcode);
1855163899Smjacob	ISP_IOXGET_8(isp, &src->els_reserved2, dst->els_reserved1);
1856163899Smjacob	ISP_IOXGET_8(isp, &src->els_did_lo, dst->els_did_lo);
1857163899Smjacob	ISP_IOXGET_8(isp, &src->els_did_mid, dst->els_did_mid);
1858163899Smjacob	ISP_IOXGET_8(isp, &src->els_did_hi, dst->els_did_hi);
1859163899Smjacob	ISP_IOXGET_8(isp, &src->els_reserved2, dst->els_reserved2);
1860163899Smjacob	ISP_IOXGET_16(isp, &src->els_reserved3, dst->els_reserved3);
1861163899Smjacob	ISP_IOXGET_16(isp, &src->els_ctl_flags, dst->els_ctl_flags);
1862163899Smjacob	ISP_IOXGET_32(isp, &src->els_bytecnt, dst->els_bytecnt);
1863163899Smjacob	ISP_IOXGET_32(isp, &src->els_subcode1, dst->els_subcode1);
1864163899Smjacob	ISP_IOXGET_32(isp, &src->els_subcode2, dst->els_subcode2);
1865163899Smjacob	for (i = 0; i < 20; i++) {
1866196008Smjacob		ISP_IOXGET_8(isp, &src->els_reserved4[i], dst->els_reserved4[i]);
1867163899Smjacob	}
1868163899Smjacob}
1869163899Smjacob
1870163899Smjacobvoid
1871163899Smjacobisp_put_els(ispsoftc_t *isp, els_t *src, els_t *dst)
1872163899Smjacob{
1873163899Smjacob	isp_put_hdr(isp, &src->els_hdr, &dst->els_hdr);
1874163899Smjacob	ISP_IOXPUT_32(isp, src->els_handle, &dst->els_handle);
1875163899Smjacob	ISP_IOXPUT_16(isp, src->els_status, &dst->els_status);
1876163899Smjacob	ISP_IOXPUT_16(isp, src->els_nphdl, &dst->els_nphdl);
1877163899Smjacob	ISP_IOXPUT_16(isp, src->els_xmit_dsd_count, &dst->els_xmit_dsd_count);
1878163899Smjacob	ISP_IOXPUT_8(isp, src->els_vphdl, &dst->els_vphdl);
1879163899Smjacob	ISP_IOXPUT_8(isp, src->els_sof, &dst->els_sof);
1880163899Smjacob	ISP_IOXPUT_32(isp, src->els_rxid, &dst->els_rxid);
1881163899Smjacob	ISP_IOXPUT_16(isp, src->els_recv_dsd_count, &dst->els_recv_dsd_count);
1882163899Smjacob	ISP_IOXPUT_8(isp, src->els_opcode, &dst->els_opcode);
1883163899Smjacob	ISP_IOXPUT_8(isp, src->els_reserved2, &dst->els_reserved1);
1884163899Smjacob	ISP_IOXPUT_8(isp, src->els_did_lo, &dst->els_did_lo);
1885163899Smjacob	ISP_IOXPUT_8(isp, src->els_did_mid, &dst->els_did_mid);
1886163899Smjacob	ISP_IOXPUT_8(isp, src->els_did_hi, &dst->els_did_hi);
1887163899Smjacob	ISP_IOXPUT_8(isp, src->els_reserved2, &dst->els_reserved2);
1888163899Smjacob	ISP_IOXPUT_16(isp, src->els_reserved3, &dst->els_reserved3);
1889163899Smjacob	ISP_IOXPUT_16(isp, src->els_ctl_flags, &dst->els_ctl_flags);
1890163899Smjacob	ISP_IOXPUT_32(isp, src->els_recv_bytecnt, &dst->els_recv_bytecnt);
1891163899Smjacob	ISP_IOXPUT_32(isp, src->els_xmit_bytecnt, &dst->els_xmit_bytecnt);
1892163899Smjacob	ISP_IOXPUT_32(isp, src->els_xmit_dsd_length, &dst->els_xmit_dsd_length);
1893163899Smjacob	ISP_IOXPUT_16(isp, src->els_xmit_dsd_a1500, &dst->els_xmit_dsd_a1500);
1894163899Smjacob	ISP_IOXPUT_16(isp, src->els_xmit_dsd_a3116, &dst->els_xmit_dsd_a3116);
1895163899Smjacob	ISP_IOXPUT_16(isp, src->els_xmit_dsd_a4732, &dst->els_xmit_dsd_a4732);
1896163899Smjacob	ISP_IOXPUT_16(isp, src->els_xmit_dsd_a6348, &dst->els_xmit_dsd_a6348);
1897163899Smjacob	ISP_IOXPUT_32(isp, src->els_recv_dsd_length, &dst->els_recv_dsd_length);
1898163899Smjacob	ISP_IOXPUT_16(isp, src->els_recv_dsd_a1500, &dst->els_recv_dsd_a1500);
1899163899Smjacob	ISP_IOXPUT_16(isp, src->els_recv_dsd_a3116, &dst->els_recv_dsd_a3116);
1900163899Smjacob	ISP_IOXPUT_16(isp, src->els_recv_dsd_a4732, &dst->els_recv_dsd_a4732);
1901163899Smjacob	ISP_IOXPUT_16(isp, src->els_recv_dsd_a6348, &dst->els_recv_dsd_a6348);
1902163899Smjacob}
1903163899Smjacob
1904163899Smjacob/*
1905163899Smjacob * FC Structure Canonicalization
1906163899Smjacob */
1907163899Smjacob
1908163899Smjacobvoid
1909163899Smjacobisp_get_fc_hdr(ispsoftc_t *isp, fc_hdr_t *src, fc_hdr_t *dst)
1910163899Smjacob{
1911163899Smjacob        ISP_IOZGET_8(isp, &src->r_ctl, dst->r_ctl);
1912163899Smjacob        ISP_IOZGET_8(isp, &src->d_id[0], dst->d_id[0]);
1913163899Smjacob        ISP_IOZGET_8(isp, &src->d_id[1], dst->d_id[1]);
1914163899Smjacob        ISP_IOZGET_8(isp, &src->d_id[2], dst->d_id[2]);
1915163899Smjacob        ISP_IOZGET_8(isp, &src->cs_ctl, dst->cs_ctl);
1916163899Smjacob        ISP_IOZGET_8(isp, &src->s_id[0], dst->s_id[0]);
1917163899Smjacob        ISP_IOZGET_8(isp, &src->s_id[1], dst->s_id[1]);
1918163899Smjacob        ISP_IOZGET_8(isp, &src->s_id[2], dst->s_id[2]);
1919163899Smjacob        ISP_IOZGET_8(isp, &src->type, dst->type);
1920196008Smjacob        ISP_IOZGET_8(isp, &src->f_ctl[0], dst->f_ctl[0]);
1921196008Smjacob        ISP_IOZGET_8(isp, &src->f_ctl[1], dst->f_ctl[1]);
1922196008Smjacob        ISP_IOZGET_8(isp, &src->f_ctl[2], dst->f_ctl[2]);
1923163899Smjacob        ISP_IOZGET_8(isp, &src->seq_id, dst->seq_id);
1924163899Smjacob        ISP_IOZGET_8(isp, &src->df_ctl, dst->df_ctl);
1925163899Smjacob        ISP_IOZGET_16(isp, &src->seq_cnt, dst->seq_cnt);
1926163899Smjacob        ISP_IOZGET_16(isp, &src->ox_id, dst->ox_id);
1927163899Smjacob        ISP_IOZGET_16(isp, &src->rx_id, dst->rx_id);
1928163899Smjacob        ISP_IOZGET_32(isp, &src->parameter, dst->parameter);
1929163899Smjacob}
1930163899Smjacob
1931163899Smjacobvoid
1932163899Smjacobisp_get_fcp_cmnd_iu(ispsoftc_t *isp, fcp_cmnd_iu_t *src, fcp_cmnd_iu_t *dst)
1933163899Smjacob{
1934163899Smjacob	int i;
1935163899Smjacob
1936163899Smjacob	for (i = 0; i < 8; i++) {
1937163899Smjacob		ISP_IOZGET_8(isp, &src->fcp_cmnd_lun[i], dst->fcp_cmnd_lun[i]);
1938163899Smjacob	}
1939163899Smjacob        ISP_IOZGET_8(isp, &src->fcp_cmnd_crn, dst->fcp_cmnd_crn);
1940196008Smjacob        ISP_IOZGET_8(isp, &src->fcp_cmnd_task_attribute, dst->fcp_cmnd_task_attribute);
1941196008Smjacob        ISP_IOZGET_8(isp, &src->fcp_cmnd_task_management, dst->fcp_cmnd_task_management);
1942196008Smjacob        ISP_IOZGET_8(isp, &src->fcp_cmnd_alen_datadir, dst->fcp_cmnd_alen_datadir);
1943163899Smjacob	for (i = 0; i < 16; i++) {
1944196008Smjacob		ISP_IOZGET_8(isp, &src->cdb_dl.sf.fcp_cmnd_cdb[i], dst->cdb_dl.sf.fcp_cmnd_cdb[i]);
1945163899Smjacob	}
1946196008Smjacob	ISP_IOZGET_32(isp, &src->cdb_dl.sf.fcp_cmnd_dl, dst->cdb_dl.sf.fcp_cmnd_dl);
1947163899Smjacob}
1948163899Smjacob
1949163899Smjacobvoid
1950163899Smjacobisp_put_rft_id(ispsoftc_t *isp, rft_id_t *src, rft_id_t *dst)
1951163899Smjacob{
1952163899Smjacob	int i;
1953163899Smjacob	isp_put_ct_hdr(isp, &src->rftid_hdr, &dst->rftid_hdr);
1954163899Smjacob	ISP_IOZPUT_8(isp, src->rftid_reserved, &dst->rftid_reserved);
1955163899Smjacob	for (i = 0; i < 3; i++) {
1956163899Smjacob		ISP_IOZPUT_8(isp, src->rftid_portid[i], &dst->rftid_portid[i]);
1957163899Smjacob	}
1958163899Smjacob	for (i = 0; i < 8; i++) {
1959196008Smjacob		ISP_IOZPUT_32(isp, src->rftid_fc4types[i], &dst->rftid_fc4types[i]);
1960163899Smjacob	}
1961163899Smjacob}
1962163899Smjacob
1963163899Smjacobvoid
1964163899Smjacobisp_get_ct_hdr(ispsoftc_t *isp, ct_hdr_t *src, ct_hdr_t *dst)
1965163899Smjacob{
1966163899Smjacob	ISP_IOZGET_8(isp, &src->ct_revision, dst->ct_revision);
1967163899Smjacob	ISP_IOZGET_8(isp, &src->ct_in_id[0], dst->ct_in_id[0]);
1968163899Smjacob	ISP_IOZGET_8(isp, &src->ct_in_id[1], dst->ct_in_id[1]);
1969163899Smjacob	ISP_IOZGET_8(isp, &src->ct_in_id[2], dst->ct_in_id[2]);
1970163899Smjacob	ISP_IOZGET_8(isp, &src->ct_fcs_type, dst->ct_fcs_type);
1971163899Smjacob	ISP_IOZGET_8(isp, &src->ct_fcs_subtype, dst->ct_fcs_subtype);
1972163899Smjacob	ISP_IOZGET_8(isp, &src->ct_options, dst->ct_options);
1973163899Smjacob	ISP_IOZGET_8(isp, &src->ct_reserved0, dst->ct_reserved0);
1974163899Smjacob	ISP_IOZGET_16(isp, &src->ct_cmd_resp, dst->ct_cmd_resp);
1975163899Smjacob	ISP_IOZGET_16(isp, &src->ct_bcnt_resid, dst->ct_bcnt_resid);
1976163899Smjacob	ISP_IOZGET_8(isp, &src->ct_reserved1, dst->ct_reserved1);
1977163899Smjacob	ISP_IOZGET_8(isp, &src->ct_reason, dst->ct_reason);
1978163899Smjacob	ISP_IOZGET_8(isp, &src->ct_explanation, dst->ct_explanation);
1979163899Smjacob	ISP_IOZGET_8(isp, &src->ct_vunique, dst->ct_vunique);
1980163899Smjacob}
1981163899Smjacob
1982163899Smjacobvoid
1983163899Smjacobisp_put_ct_hdr(ispsoftc_t *isp, ct_hdr_t *src, ct_hdr_t *dst)
1984163899Smjacob{
1985163899Smjacob	ISP_IOZPUT_8(isp, src->ct_revision, &dst->ct_revision);
1986163899Smjacob	ISP_IOZPUT_8(isp, src->ct_in_id[0], &dst->ct_in_id[0]);
1987163899Smjacob	ISP_IOZPUT_8(isp, src->ct_in_id[1], &dst->ct_in_id[1]);
1988163899Smjacob	ISP_IOZPUT_8(isp, src->ct_in_id[2], &dst->ct_in_id[2]);
1989163899Smjacob	ISP_IOZPUT_8(isp, src->ct_fcs_type, &dst->ct_fcs_type);
1990163899Smjacob	ISP_IOZPUT_8(isp, src->ct_fcs_subtype, &dst->ct_fcs_subtype);
1991163899Smjacob	ISP_IOZPUT_8(isp, src->ct_options, &dst->ct_options);
1992163899Smjacob	ISP_IOZPUT_8(isp, src->ct_reserved0, &dst->ct_reserved0);
1993163899Smjacob	ISP_IOZPUT_16(isp, src->ct_cmd_resp, &dst->ct_cmd_resp);
1994163899Smjacob	ISP_IOZPUT_16(isp, src->ct_bcnt_resid, &dst->ct_bcnt_resid);
1995163899Smjacob	ISP_IOZPUT_8(isp, src->ct_reserved1, &dst->ct_reserved1);
1996163899Smjacob	ISP_IOZPUT_8(isp, src->ct_reason, &dst->ct_reason);
1997163899Smjacob	ISP_IOZPUT_8(isp, src->ct_explanation, &dst->ct_explanation);
1998163899Smjacob	ISP_IOZPUT_8(isp, src->ct_vunique, &dst->ct_vunique);
1999163899Smjacob}
2000163899Smjacob
2001155228Smjacob#ifdef	ISP_TARGET_MODE
2002196008Smjacob
2003196008Smjacob/*
2004196008Smjacob * Command shipping- finish off first queue entry and do dma mapping and
2005196008Smjacob * additional segments as needed.
2006196008Smjacob *
2007196008Smjacob * Called with the first queue entry at least partially filled out.
2008196008Smjacob */
2009155228Smjacobint
2010196008Smjacobisp_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)
2011196008Smjacob{
2012196008Smjacob	uint8_t storage[QENTRY_LEN], storage2[QENTRY_LEN];
2013196008Smjacob	uint8_t type, nqe;
2014196008Smjacob	uint32_t seg, curseg, seglim, nxt, nxtnxt;
2015196008Smjacob	ispds_t *dsp = NULL;
2016196008Smjacob	ispds64_t *dsp64 = NULL;
2017196008Smjacob	void *qe0, *qe1, *sqe = NULL;
2018196008Smjacob
2019196008Smjacob	qe0 = isp_getrqentry(isp);
2020196008Smjacob	if (qe0 == NULL) {
2021196008Smjacob		return (CMD_EAGAIN);
2022196008Smjacob	}
2023196008Smjacob	nxt = ISP_NXT_QENTRY(isp->isp_reqidx, RQUEST_QUEUE_LEN(isp));
2024196008Smjacob
2025196008Smjacob	type = ((isphdr_t *)fqe)->rqs_entry_type;
2026196008Smjacob	nqe = 1;
2027196008Smjacob	seglim = 0;
2028196008Smjacob
2029196008Smjacob	/*
2030196008Smjacob	 * If we have no data to transmit, just copy the first IOCB and start it up.
2031196008Smjacob	 */
2032196008Smjacob	if (ddir != ISP_NOXFR) {
2033196008Smjacob		/*
2034196008Smjacob		 * First, figure out how many pieces of data to transfer and what kind and how many we can put into the first queue entry.
2035196008Smjacob		 */
2036196008Smjacob		switch (type) {
2037196008Smjacob		case RQSTYPE_CTIO:
2038196008Smjacob			dsp = ((ct_entry_t *)fqe)->ct_dataseg;
2039196008Smjacob			seglim = ISP_RQDSEG;
2040196008Smjacob			break;
2041196008Smjacob		case RQSTYPE_CTIO2:
2042196008Smjacob		case RQSTYPE_CTIO3:
2043196008Smjacob		{
2044196008Smjacob			ct2_entry_t *ct = fqe, *ct2 = (ct2_entry_t *) storage2;
2045196008Smjacob			uint16_t swd = ct->rsp.m0.ct_scsi_status & 0xff;
2046196008Smjacob
2047196008Smjacob			if ((ct->ct_flags & CT2_SENDSTATUS) && (swd || ct->ct_resid)) {
2048196008Smjacob				memcpy(ct2, ct, QENTRY_LEN);
2049196008Smjacob				/*
2050196008Smjacob				 * Clear fields from first CTIO2 that now need to be cleared
2051196008Smjacob				 */
2052196008Smjacob				ct->ct_header.rqs_seqno = 0;
2053196008Smjacob				ct->ct_flags &= ~(CT2_SENDSTATUS|CT2_CCINCR|CT2_FASTPOST);
2054196008Smjacob				ct->ct_resid = 0;
2055196008Smjacob				ct->ct_syshandle = 0;
2056196008Smjacob				ct->rsp.m0.ct_scsi_status = 0;
2057196008Smjacob
2058196008Smjacob				/*
2059196008Smjacob				 * Reset fields in the second CTIO2 as appropriate.
2060196008Smjacob				 */
2061196008Smjacob				ct2->ct_flags &= ~(CT2_FLAG_MMASK|CT2_DATAMASK|CT2_FASTPOST);
2062196008Smjacob				ct2->ct_flags |= CT2_NO_DATA|CT2_FLAG_MODE1;
2063196008Smjacob				ct2->ct_seg_count = 0;
2064196008Smjacob				ct2->ct_reloff = 0;
2065196008Smjacob				memset(&ct2->rsp, 0, sizeof (ct2->rsp));
2066196008Smjacob				if (swd == SCSI_CHECK && snsptr && snslen) {
2067196008Smjacob					ct2->rsp.m1.ct_senselen = min(snslen, MAXRESPLEN);
2068196008Smjacob					memcpy(ct2->rsp.m1.ct_resp, snsptr, ct2->rsp.m1.ct_senselen);
2069196008Smjacob					swd |= CT2_SNSLEN_VALID;
2070196008Smjacob				}
2071196008Smjacob				if (ct2->ct_resid > 0) {
2072196008Smjacob					swd |= CT2_DATA_UNDER;
2073196008Smjacob				} else if (ct2->ct_resid < 0) {
2074196008Smjacob					swd |= CT2_DATA_OVER;
2075196008Smjacob				}
2076196008Smjacob				ct2->rsp.m1.ct_scsi_status = swd;
2077196008Smjacob				sqe = storage2;
2078196008Smjacob			}
2079196008Smjacob			if (type == RQSTYPE_CTIO2) {
2080196008Smjacob				dsp = ct->rsp.m0.u.ct_dataseg;
2081196008Smjacob				seglim = ISP_RQDSEG_T2;
2082196008Smjacob			} else {
2083196008Smjacob				dsp64 = ct->rsp.m0.u.ct_dataseg64;
2084196008Smjacob				seglim = ISP_RQDSEG_T3;
2085196008Smjacob			}
2086196008Smjacob			break;
2087196008Smjacob		}
2088196008Smjacob		case RQSTYPE_CTIO7:
2089196008Smjacob		{
2090196008Smjacob			ct7_entry_t *ct = fqe, *ct2 = (ct7_entry_t *)storage2;
2091196008Smjacob			uint16_t swd = ct->ct_scsi_status & 0xff;
2092196008Smjacob
2093196008Smjacob			dsp64 = &ct->rsp.m0.ds;
2094196008Smjacob			seglim = 1;
2095196008Smjacob			if ((ct->ct_flags & CT7_SENDSTATUS) && (swd || ct->ct_resid)) {
2096196008Smjacob				memcpy(ct2, ct, sizeof (ct7_entry_t));
2097196008Smjacob
2098196008Smjacob				/*
2099196008Smjacob				 * Clear fields from first CTIO7 that now need to be cleared
2100196008Smjacob				 */
2101196008Smjacob				ct->ct_header.rqs_seqno = 0;
2102196008Smjacob				ct->ct_flags &= ~CT7_SENDSTATUS;
2103196008Smjacob				ct->ct_resid = 0;
2104196008Smjacob				ct->ct_syshandle = 0;
2105196008Smjacob				ct->ct_scsi_status = 0;
2106196008Smjacob
2107196008Smjacob				/*
2108196008Smjacob				 * Reset fields in the second CTIO7 as appropriate.
2109196008Smjacob				 */
2110196008Smjacob				ct2->ct_flags &= ~(CT7_FLAG_MMASK|CT7_DATAMASK);
2111196008Smjacob				ct2->ct_flags |= CT7_NO_DATA|CT7_NO_DATA|CT7_FLAG_MODE1;
2112196008Smjacob				ct2->ct_seg_count = 0;
2113196008Smjacob				memset(&ct2->rsp, 0, sizeof (ct2->rsp));
2114196008Smjacob				if (swd == SCSI_CHECK && snsptr && snslen) {
2115196008Smjacob					ct2->rsp.m1.ct_resplen = min(snslen, MAXRESPLEN_24XX);
2116196008Smjacob					memcpy(ct2->rsp.m1.ct_resp, snsptr, ct2->rsp.m1.ct_resplen);
2117196008Smjacob					swd |= (FCP_SNSLEN_VALID << 8);
2118196008Smjacob				}
2119196008Smjacob				if (ct2->ct_resid < 0) {
2120196008Smjacob					swd |= (FCP_RESID_OVERFLOW << 8);
2121196008Smjacob				} else if (ct2->ct_resid > 0) {
2122196008Smjacob					swd |= (FCP_RESID_UNDERFLOW << 8);
2123196008Smjacob				}
2124196008Smjacob				ct2->ct_scsi_status = swd;
2125196008Smjacob				sqe = storage2;
2126196008Smjacob			}
2127196008Smjacob			break;
2128196008Smjacob		}
2129196008Smjacob		default:
2130196008Smjacob			return (CMD_COMPLETE);
2131196008Smjacob		}
2132196008Smjacob	}
2133196008Smjacob
2134196008Smjacob	/*
2135196008Smjacob	 * Fill out the data transfer stuff in the first queue entry
2136196008Smjacob	 */
2137196008Smjacob	if (seglim > nsegs) {
2138196008Smjacob		seglim = nsegs;
2139196008Smjacob	}
2140196008Smjacob
2141196008Smjacob	for (seg = curseg = 0; curseg < seglim; curseg++) {
2142196008Smjacob		if (dsp64) {
2143196008Smjacob			XS_GET_DMA64_SEG(dsp64++, segp, seg++);
2144196008Smjacob		} else {
2145196008Smjacob			XS_GET_DMA_SEG(dsp++, segp, seg++);
2146196008Smjacob		}
2147196008Smjacob	}
2148196008Smjacob
2149196008Smjacob	/*
2150196008Smjacob	 * First, if we are sending status with data and we have a non-zero
2151196008Smjacob	 * status or non-zero residual, we have to make a synthetic extra CTIO
2152196008Smjacob	 * that contains the status that we'll ship separately (FC cards only).
2153196008Smjacob	 */
2154196008Smjacob
2155196008Smjacob	/*
2156196008Smjacob	 * Second, start building additional continuation segments as needed.
2157196008Smjacob	 */
2158196008Smjacob	while (seg < nsegs) {
2159196008Smjacob		nxtnxt = ISP_NXT_QENTRY(nxt, RQUEST_QUEUE_LEN(isp));
2160196008Smjacob		if (nxtnxt == isp->isp_reqodx) {
2161196008Smjacob			return (CMD_EAGAIN);
2162196008Smjacob		}
2163196008Smjacob		ISP_MEMZERO(storage, QENTRY_LEN);
2164196008Smjacob		qe1 = ISP_QUEUE_ENTRY(isp->isp_rquest, nxt);
2165196008Smjacob		nxt = nxtnxt;
2166196008Smjacob		if (dsp64) {
2167196008Smjacob			ispcontreq64_t *crq = (ispcontreq64_t *) storage;
2168196008Smjacob			seglim = ISP_CDSEG64;
2169196008Smjacob			crq->req_header.rqs_entry_type = RQSTYPE_A64_CONT;
2170196008Smjacob			crq->req_header.rqs_entry_count = 1;
2171196008Smjacob			dsp64 = crq->req_dataseg;
2172196008Smjacob		} else {
2173196008Smjacob			ispcontreq_t *crq = (ispcontreq_t *) storage;
2174196008Smjacob			seglim = ISP_CDSEG;
2175196008Smjacob			crq->req_header.rqs_entry_type = RQSTYPE_DATASEG;
2176196008Smjacob			crq->req_header.rqs_entry_count = 1;
2177196008Smjacob			dsp = crq->req_dataseg;
2178196008Smjacob		}
2179196008Smjacob		if (seg + seglim > nsegs) {
2180196008Smjacob			seglim = nsegs - seg;
2181196008Smjacob		}
2182196008Smjacob		for (curseg = 0; curseg < seglim; curseg++) {
2183196008Smjacob			if (dsp64) {
2184196008Smjacob				XS_GET_DMA64_SEG(dsp64++, segp, seg++);
2185196008Smjacob			} else {
2186196008Smjacob				XS_GET_DMA_SEG(dsp++, segp, seg++);
2187196008Smjacob			}
2188196008Smjacob		}
2189196008Smjacob		if (dsp64) {
2190196008Smjacob			isp_put_cont64_req(isp, (ispcontreq64_t *)storage, qe1);
2191196008Smjacob		} else {
2192196008Smjacob			isp_put_cont_req(isp, (ispcontreq_t *)storage, qe1);
2193196008Smjacob		}
2194196008Smjacob		if (isp->isp_dblev & ISP_LOGTDEBUG1) {
2195196008Smjacob			isp_print_bytes(isp, "additional queue entry", QENTRY_LEN, storage);
2196196008Smjacob		}
2197196008Smjacob		nqe++;
2198196008Smjacob        }
2199196008Smjacob
2200196008Smjacob	/*
2201196008Smjacob	 * If we have a synthetic queue entry to complete things, do it here.
2202196008Smjacob	 */
2203196008Smjacob	if (sqe) {
2204196008Smjacob		nxtnxt = ISP_NXT_QENTRY(nxt, RQUEST_QUEUE_LEN(isp));
2205196008Smjacob		if (nxtnxt == isp->isp_reqodx) {
2206196008Smjacob			return (CMD_EAGAIN);
2207196008Smjacob		}
2208196008Smjacob		qe1 = ISP_QUEUE_ENTRY(isp->isp_rquest, nxt);
2209196008Smjacob		nxt = nxtnxt;
2210196008Smjacob		if (type == RQSTYPE_CTIO7) {
2211196008Smjacob			isp_put_ctio7(isp, sqe, qe1);
2212196008Smjacob		} else {
2213196008Smjacob			isp_put_ctio2(isp, sqe, qe1);
2214196008Smjacob		}
2215196008Smjacob		if (isp->isp_dblev & ISP_LOGTDEBUG1) {
2216196008Smjacob			isp_print_bytes(isp, "synthetic final queue entry", QENTRY_LEN, storage2);
2217196008Smjacob		}
2218196008Smjacob	}
2219196008Smjacob
2220196008Smjacob	((isphdr_t *)fqe)->rqs_entry_count = nqe;
2221196008Smjacob	switch (type) {
2222196008Smjacob	case RQSTYPE_CTIO:
2223196008Smjacob		((ct_entry_t *)fqe)->ct_seg_count = nsegs;
2224196008Smjacob		isp_put_ctio(isp, fqe, qe0);
2225196008Smjacob		break;
2226196008Smjacob	case RQSTYPE_CTIO2:
2227196008Smjacob	case RQSTYPE_CTIO3:
2228196008Smjacob		((ct2_entry_t *)fqe)->ct_seg_count = nsegs;
2229196008Smjacob		if (ISP_CAP_2KLOGIN(isp)) {
2230196008Smjacob			isp_put_ctio2e(isp, fqe, qe0);
2231196008Smjacob		} else {
2232196008Smjacob			isp_put_ctio2(isp, fqe, qe0);
2233196008Smjacob		}
2234196008Smjacob		break;
2235196008Smjacob	case RQSTYPE_CTIO7:
2236196008Smjacob		((ct7_entry_t *)fqe)->ct_seg_count = nsegs;
2237196008Smjacob		isp_put_ctio7(isp, fqe, qe0);
2238196008Smjacob		break;
2239196008Smjacob	default:
2240196008Smjacob		return (CMD_COMPLETE);
2241196008Smjacob	}
2242196008Smjacob	if (isp->isp_dblev & ISP_LOGTDEBUG1) {
2243196008Smjacob		isp_print_bytes(isp, "first queue entry", QENTRY_LEN, fqe);
2244196008Smjacob	}
2245196008Smjacob	ISP_ADD_REQUEST(isp, nxt);
2246196008Smjacob	return (CMD_QUEUED);
2247196008Smjacob}
2248196008Smjacob
2249196008Smjacobint
2250203444Smjacobisp_allocate_xs_tgt(ispsoftc_t *isp, void *xs, uint32_t *handlep)
2251155228Smjacob{
2252203444Smjacob	isp_hdl_t *hdp;
2253155228Smjacob
2254203444Smjacob	hdp = isp->isp_tgtfree;
2255203444Smjacob	if (hdp == NULL) {
2256155228Smjacob		return (-1);
2257155228Smjacob	}
2258203444Smjacob	isp->isp_tgtfree = hdp->cmd;
2259203444Smjacob	hdp->cmd = xs;
2260203444Smjacob	hdp->handle = (hdp - isp->isp_tgtlist);
2261203444Smjacob	hdp->handle |= (ISP_HANDLE_TARGET << ISP_HANDLE_USAGE_SHIFT);
2262204397Smjacob	/*
2263204397Smjacob	 * Target handles for SCSI cards are only 16 bits, so
2264204397Smjacob	 * sequence number protection will be ommitted.
2265204397Smjacob	 */
2266204397Smjacob	if (IS_FC(isp)) {
2267204397Smjacob		hdp->handle |= (isp->isp_seqno++ << ISP_HANDLE_SEQ_SHIFT);
2268204397Smjacob	}
2269203444Smjacob	*handlep = hdp->handle;
2270155228Smjacob	return (0);
2271155228Smjacob}
2272155228Smjacob
2273155228Smjacobvoid *
2274163899Smjacobisp_find_xs_tgt(ispsoftc_t *isp, uint32_t handle)
2275155228Smjacob{
2276203444Smjacob	if (!ISP_VALID_TGT_HANDLE(isp, handle)) {
2277203444Smjacob		isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle);
2278155228Smjacob		return (NULL);
2279155228Smjacob	}
2280203444Smjacob	return (isp->isp_tgtlist[(handle & ISP_HANDLE_CMD_MASK)].cmd);
2281155228Smjacob}
2282155228Smjacob
2283163899Smjacobuint32_t
2284155704Smjacobisp_find_tgt_handle(ispsoftc_t *isp, void *xs)
2285155228Smjacob{
2286203444Smjacob	uint32_t i, foundhdl = ISP_HANDLE_FREE;
2287203444Smjacob
2288155228Smjacob	if (xs != NULL) {
2289155228Smjacob		for (i = 0; i < isp->isp_maxcmds; i++) {
2290203444Smjacob			if (isp->isp_tgtlist[i].cmd != xs) {
2291203444Smjacob				continue;
2292155228Smjacob			}
2293203444Smjacob			foundhdl = isp->isp_tgtlist[i].handle;
2294203444Smjacob			break;
2295155228Smjacob		}
2296155228Smjacob	}
2297203444Smjacob	return (foundhdl);
2298155228Smjacob}
2299155228Smjacob
2300155228Smjacobvoid
2301163899Smjacobisp_destroy_tgt_handle(ispsoftc_t *isp, uint32_t handle)
2302155228Smjacob{
2303203463Smjacob	if (!ISP_VALID_TGT_HANDLE(isp, handle)) {
2304203444Smjacob		isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle);
2305163899Smjacob	} else {
2306203444Smjacob		isp->isp_tgtlist[(handle & ISP_HANDLE_CMD_MASK)].handle = ISP_HANDLE_FREE;
2307203444Smjacob		isp->isp_tgtlist[(handle & ISP_HANDLE_CMD_MASK)].cmd = isp->isp_tgtfree;
2308203444Smjacob		isp->isp_tgtfree = &isp->isp_tgtlist[(handle & ISP_HANDLE_CMD_MASK)];
2309155228Smjacob	}
2310155228Smjacob}
2311163899Smjacob
2312196008Smjacob/*
2313196008Smjacob * Find target mode entries
2314196008Smjacob */
2315196008Smjacobint
2316196008Smjacobisp_find_pdb_by_wwn(ispsoftc_t *isp, int chan, uint64_t wwn, fcportdb_t **lptr)
2317196008Smjacob{
2318196008Smjacob	fcparam *fcp;
2319196008Smjacob	int i;
2320196008Smjacob
2321196008Smjacob	if (chan < isp->isp_nchan) {
2322196008Smjacob		fcp = FCPARAM(isp, chan);
2323196008Smjacob		for (i = 0; i < MAX_FC_TARG; i++) {
2324196008Smjacob			fcportdb_t *lp = &fcp->portdb[i];
2325196008Smjacob
2326196008Smjacob			if (lp->target_mode == 0) {
2327196008Smjacob				continue;
2328196008Smjacob			}
2329196008Smjacob			if (lp->port_wwn == wwn) {
2330196008Smjacob				*lptr = lp;
2331196008Smjacob				return (1);
2332196008Smjacob			}
2333196008Smjacob		}
2334196008Smjacob	}
2335196008Smjacob	return (0);
2336196008Smjacob}
2337196008Smjacob
2338196008Smjacobint
2339196008Smjacobisp_find_pdb_by_loopid(ispsoftc_t *isp, int chan, uint32_t loopid, fcportdb_t **lptr)
2340196008Smjacob{
2341196008Smjacob	fcparam *fcp;
2342196008Smjacob	int i;
2343196008Smjacob
2344196008Smjacob	if (chan < isp->isp_nchan) {
2345196008Smjacob		fcp = FCPARAM(isp, chan);
2346196008Smjacob		for (i = 0; i < MAX_FC_TARG; i++) {
2347196008Smjacob			fcportdb_t *lp = &fcp->portdb[i];
2348196008Smjacob
2349196008Smjacob			if (lp->target_mode == 0) {
2350196008Smjacob				continue;
2351196008Smjacob			}
2352196008Smjacob			if (lp->handle == loopid) {
2353196008Smjacob				*lptr = lp;
2354196008Smjacob				return (1);
2355196008Smjacob			}
2356196008Smjacob		}
2357196008Smjacob	}
2358196008Smjacob	return (0);
2359196008Smjacob}
2360196008Smjacob
2361196008Smjacobint
2362196008Smjacobisp_find_pdb_by_sid(ispsoftc_t *isp, int chan, uint32_t sid, fcportdb_t **lptr)
2363196008Smjacob{
2364196008Smjacob	fcparam *fcp;
2365196008Smjacob	int i;
2366196008Smjacob
2367196008Smjacob	if (chan >= isp->isp_nchan) {
2368196008Smjacob		return (0);
2369196008Smjacob	}
2370196008Smjacob
2371196008Smjacob	fcp = FCPARAM(isp, chan);
2372196008Smjacob	for (i = 0; i < MAX_FC_TARG; i++) {
2373196008Smjacob		fcportdb_t *lp = &fcp->portdb[i];
2374196008Smjacob
2375196008Smjacob		if (lp->target_mode == 0) {
2376196008Smjacob			continue;
2377196008Smjacob		}
2378196008Smjacob		if (lp->portid == sid) {
2379196008Smjacob			*lptr = lp;
2380196008Smjacob			return (1);
2381196008Smjacob		}
2382196008Smjacob	}
2383196008Smjacob	return (0);
2384196008Smjacob}
2385196008Smjacob
2386155228Smjacobvoid
2387196008Smjacobisp_find_chan_by_did(ispsoftc_t *isp, uint32_t did, uint16_t *cp)
2388196008Smjacob{
2389196008Smjacob	uint16_t chan;
2390196008Smjacob
2391196008Smjacob	*cp = ISP_NOCHAN;
2392196008Smjacob	for (chan = 0; chan < isp->isp_nchan; chan++) {
2393196008Smjacob		fcparam *fcp = FCPARAM(isp, chan);
2394196008Smjacob		if ((fcp->role & ISP_ROLE_TARGET) == 0 || fcp->isp_fwstate != FW_READY || fcp->isp_loopstate < LOOP_PDB_RCVD) {
2395196008Smjacob			continue;
2396196008Smjacob		}
2397196008Smjacob		if (fcp->isp_portid == did) {
2398196008Smjacob			*cp = chan;
2399196008Smjacob			break;
2400196008Smjacob		}
2401196008Smjacob	}
2402196008Smjacob}
2403196008Smjacob
2404196008Smjacob/*
2405196008Smjacob * Add an initiator device to the port database
2406196008Smjacob */
2407196008Smjacobvoid
2408196008Smjacobisp_add_wwn_entry(ispsoftc_t *isp, int chan, uint64_t ini, uint16_t nphdl, uint32_t s_id)
2409196008Smjacob{
2410196008Smjacob	fcparam *fcp;
2411196008Smjacob	fcportdb_t *lp;
2412196008Smjacob	isp_notify_t nt;
2413196008Smjacob	int i;
2414196008Smjacob
2415196008Smjacob	fcp = FCPARAM(isp, chan);
2416196008Smjacob
2417196008Smjacob	if (nphdl >= MAX_NPORT_HANDLE) {
2418196008Smjacob		isp_prt(isp, ISP_LOGWARN, "%s: Chan %d IID 0x%016llx bad N-Port handle 0x%04x Port ID 0x%06x",
2419196008Smjacob		    __func__, chan, (unsigned long long) ini, nphdl, s_id);
2420196008Smjacob		return;
2421196008Smjacob	}
2422196008Smjacob
2423196008Smjacob	lp = NULL;
2424196008Smjacob	if (fcp->isp_tgt_map[nphdl]) {
2425196008Smjacob		lp = &fcp->portdb[fcp->isp_tgt_map[nphdl] - 1];
2426196008Smjacob	} else {
2427196008Smjacob		/*
2428196008Smjacob		 * Make sure the addition of a new target mode entry doesn't duplicate entries
2429196008Smjacob		 * with the same N-Port handles, the same portids or the same Port WWN.
2430196008Smjacob		 */
2431196008Smjacob		for (i = 0; i < MAX_FC_TARG; i++) {
2432196008Smjacob			lp = &fcp->portdb[i];
2433196008Smjacob			if (lp->target_mode == 0) {
2434196008Smjacob				lp = NULL;
2435196008Smjacob				continue;
2436196008Smjacob			}
2437196008Smjacob			if (lp->handle == nphdl) {
2438196008Smjacob				break;
2439196008Smjacob			}
2440196008Smjacob			if (s_id != PORT_ANY && lp->portid == s_id) {
2441196008Smjacob				break;
2442196008Smjacob			}
2443196008Smjacob			if (VALID_INI(ini) && lp->port_wwn == ini) {
2444196008Smjacob				break;
2445196008Smjacob			}
2446196008Smjacob			lp = NULL;
2447196008Smjacob		}
2448196008Smjacob
2449196008Smjacob	}
2450196008Smjacob
2451196008Smjacob	if (lp) {
2452196008Smjacob		int something = 0;
2453196008Smjacob		if (lp->handle != nphdl) {
2454196008Smjacob			isp_prt(isp, ISP_LOGWARN, "%s: Chan %d attempt to re-enter N-port handle 0x%04x IID 0x%016llx Port ID 0x%06x finds IID 0x%016llx N-Port Handle 0x%04x Port ID 0x%06x",
2455196008Smjacob			    __func__, chan, nphdl, (unsigned long long)ini, s_id, (unsigned long long) lp->port_wwn, lp->handle, lp->portid);
2456196008Smjacob			isp_dump_portdb(isp, chan);
2457196008Smjacob			return;
2458196008Smjacob		}
2459196008Smjacob		if (s_id != PORT_NONE) {
2460196008Smjacob			if (lp->portid == PORT_NONE) {
2461196008Smjacob				lp->portid = s_id;
2462196008Smjacob				isp_prt(isp, ISP_LOGTINFO, "%s: Chan %d N-port handle 0x%04x gets Port ID 0x%06x", __func__, chan, nphdl, s_id);
2463196008Smjacob				something++;
2464196008Smjacob			} else if (lp->portid != s_id) {
2465196008Smjacob				isp_prt(isp, ISP_LOGTINFO, "%s: Chan %d N-port handle 0x%04x tries to change Port ID 0x%06x to 0x%06x", __func__, chan, nphdl,
2466196008Smjacob				    lp->portid, s_id);
2467196008Smjacob				isp_dump_portdb(isp, chan);
2468196008Smjacob				return;
2469196008Smjacob			}
2470196008Smjacob		}
2471196008Smjacob		if (VALID_INI(ini)) {
2472196008Smjacob			if (!VALID_INI(lp->port_wwn)) {
2473196008Smjacob				lp->port_wwn = ini;
2474196008Smjacob				isp_prt(isp, ISP_LOGTINFO, "%s: Chan %d N-port handle 0x%04x gets WWN 0x%016llxx", __func__, chan, nphdl, (unsigned long long) ini);
2475196008Smjacob				something++;
2476196008Smjacob			} else if (lp->port_wwn != ini) {
2477196008Smjacob				isp_prt(isp, ISP_LOGWARN, "%s: Chan %d N-port handle 0x%04x tries to change WWN 0x%016llx to 0x%016llx", __func__, chan, nphdl,
2478196008Smjacob				    (unsigned long long) lp->port_wwn, (unsigned long long) ini);
2479196008Smjacob				isp_dump_portdb(isp, chan);
2480196008Smjacob				return;
2481196008Smjacob			}
2482196008Smjacob		}
2483196008Smjacob
2484196008Smjacob		if (!something) {
2485196008Smjacob			isp_prt(isp, ISP_LOGWARN, "%s: Chan %d IID 0x%016llx N-Port Handle 0x%04x Port ID 0x%06x reentered", __func__, chan,
2486196008Smjacob			    (unsigned long long) lp->port_wwn, lp->handle, lp->portid);
2487196008Smjacob		}
2488196008Smjacob		return;
2489196008Smjacob	}
2490196008Smjacob
2491196008Smjacob	/*
2492196008Smjacob	 * Find a new spot
2493196008Smjacob	 */
2494196008Smjacob	for (i = MAX_FC_TARG - 1; i >= 0; i--) {
2495196008Smjacob		if (fcp->portdb[i].target_mode == 1) {
2496196008Smjacob			continue;
2497196008Smjacob		}
2498196008Smjacob		if (fcp->portdb[i].state == FC_PORTDB_STATE_NIL) {
2499196008Smjacob			break;
2500196008Smjacob		}
2501196008Smjacob	}
2502196008Smjacob	if (i < 0) {
2503196008Smjacob		isp_prt(isp, ISP_LOGWARN, "%s: Chan %d IID 0x%016llx N-Port Handle 0x%04x Port ID 0x%06x- no room in port database",
2504196008Smjacob		    __func__, chan, (unsigned long long) ini, nphdl, s_id);
2505196008Smjacob		return;
2506196008Smjacob	}
2507196008Smjacob
2508196008Smjacob	lp = &fcp->portdb[i];
2509196008Smjacob	ISP_MEMZERO(lp, sizeof (fcportdb_t));
2510196008Smjacob	lp->target_mode = 1;
2511196008Smjacob	lp->handle = nphdl;
2512196008Smjacob	lp->portid = s_id;
2513196008Smjacob	lp->port_wwn = ini;
2514196008Smjacob	fcp->isp_tgt_map[nphdl] = i + 1;
2515196008Smjacob
2516196008Smjacob	isp_prt(isp, ISP_LOGTINFO, "%s: Chan %d IID 0x%016llx N-Port Handle 0x%04x Port ID 0x%06x vtgt %d added", __func__, chan, (unsigned long long) ini, nphdl, s_id, fcp->isp_tgt_map[nphdl] - 1);
2517196008Smjacob
2518196008Smjacob	ISP_MEMZERO(&nt, sizeof (nt));
2519196008Smjacob	nt.nt_hba = isp;
2520196008Smjacob	nt.nt_wwn = ini;
2521196008Smjacob	nt.nt_tgt = FCPARAM(isp, chan)->isp_wwpn;
2522196008Smjacob	nt.nt_sid = s_id;
2523196008Smjacob	nt.nt_did = FCPARAM(isp, chan)->isp_portid;
2524196008Smjacob	nt.nt_nphdl = nphdl;
2525196008Smjacob	nt.nt_channel = chan;
2526196008Smjacob	nt.nt_ncode = NT_ARRIVED;
2527196008Smjacob	isp_async(isp, ISPASYNC_TARGET_NOTIFY, &nt);
2528196008Smjacob}
2529196008Smjacob
2530196008Smjacob/*
2531196008Smjacob * Remove a target device to the port database
2532196008Smjacob */
2533196008Smjacobvoid
2534196008Smjacobisp_del_wwn_entry(ispsoftc_t *isp, int chan, uint64_t ini, uint16_t nphdl, uint32_t s_id)
2535196008Smjacob{
2536196008Smjacob	fcparam *fcp;
2537196008Smjacob	isp_notify_t nt;
2538196008Smjacob	fcportdb_t *lp;
2539196008Smjacob
2540196008Smjacob	if (nphdl >= MAX_NPORT_HANDLE) {
2541196008Smjacob		isp_prt(isp, ISP_LOGWARN, "%s: Chan %d IID 0x%016llx bad N-Port handle 0x%04x Port ID 0x%06x",
2542196008Smjacob		    __func__, chan, (unsigned long long) ini, nphdl, s_id);
2543196008Smjacob		return;
2544196008Smjacob	}
2545196008Smjacob
2546196008Smjacob	fcp = FCPARAM(isp, chan);
2547196008Smjacob	if (fcp->isp_tgt_map[nphdl] == 0) {
2548196008Smjacob		lp = NULL;
2549196008Smjacob	} else {
2550196008Smjacob		lp = &fcp->portdb[fcp->isp_tgt_map[nphdl] - 1];
2551196008Smjacob		if (lp->target_mode == 0) {
2552196008Smjacob			lp = NULL;
2553196008Smjacob		}
2554196008Smjacob	}
2555196008Smjacob	if (lp == NULL) {
2556196008Smjacob		isp_prt(isp, ISP_LOGWARN, "%s: Chan %d IID 0x%016llx N-Port Handle 0x%04x Port ID 0x%06x cannot be found to be cleared",
2557196008Smjacob		    __func__, chan, (unsigned long long) ini, nphdl, s_id);
2558196008Smjacob		isp_dump_portdb(isp, chan);
2559196008Smjacob		return;
2560196008Smjacob	}
2561196008Smjacob	isp_prt(isp, ISP_LOGTINFO, "%s: Chan %d IID 0x%016llx N-Port Handle 0x%04x Port ID 0x%06x vtgt %d cleared",
2562196008Smjacob	    __func__, chan, (unsigned long long) lp->port_wwn, nphdl, lp->portid, fcp->isp_tgt_map[nphdl] - 1);
2563196008Smjacob	fcp->isp_tgt_map[nphdl] = 0;
2564196008Smjacob
2565196008Smjacob	ISP_MEMZERO(&nt, sizeof (nt));
2566196008Smjacob	nt.nt_hba = isp;
2567196008Smjacob	nt.nt_wwn = lp->port_wwn;
2568196008Smjacob	nt.nt_tgt = FCPARAM(isp, chan)->isp_wwpn;
2569196008Smjacob	nt.nt_sid = lp->portid;
2570196008Smjacob	nt.nt_did = FCPARAM(isp, chan)->isp_portid;
2571196008Smjacob	nt.nt_nphdl = nphdl;
2572196008Smjacob	nt.nt_channel = chan;
2573196008Smjacob	nt.nt_ncode = NT_DEPARTED;
2574196008Smjacob	isp_async(isp, ISPASYNC_TARGET_NOTIFY, &nt);
2575196008Smjacob}
2576196008Smjacob
2577196008Smjacobvoid
2578196008Smjacobisp_del_all_wwn_entries(ispsoftc_t *isp, int chan)
2579196008Smjacob{
2580196008Smjacob	fcparam *fcp;
2581196008Smjacob	int i;
2582196008Smjacob
2583196008Smjacob	if (!IS_FC(isp)) {
2584196008Smjacob		return;
2585196008Smjacob	}
2586196008Smjacob
2587196008Smjacob	/*
2588196008Smjacob	 * Handle iterations over all channels via recursion
2589196008Smjacob	 */
2590196008Smjacob	if (chan == ISP_NOCHAN) {
2591196008Smjacob		for (chan = 0; chan < isp->isp_nchan; chan++) {
2592196008Smjacob			isp_del_all_wwn_entries(isp, chan);
2593196008Smjacob		}
2594196008Smjacob		return;
2595196008Smjacob	}
2596196008Smjacob
2597196008Smjacob	if (chan > isp->isp_nchan) {
2598196008Smjacob		return;
2599196008Smjacob	}
2600196008Smjacob
2601196008Smjacob	fcp = FCPARAM(isp, chan);
2602196008Smjacob	if (fcp == NULL) {
2603196008Smjacob		return;
2604196008Smjacob	}
2605196008Smjacob	for (i = 0; i < MAX_NPORT_HANDLE; i++) {
2606196008Smjacob		if (fcp->isp_tgt_map[i]) {
2607196008Smjacob			fcportdb_t *lp = &fcp->portdb[fcp->isp_tgt_map[i] - 1];
2608196008Smjacob			isp_del_wwn_entry(isp, chan, lp->port_wwn, lp->handle, lp->portid);
2609196008Smjacob		}
2610196008Smjacob	}
2611196008Smjacob}
2612196008Smjacob
2613196008Smjacobvoid
2614196008Smjacobisp_del_wwn_entries(ispsoftc_t *isp, isp_notify_t *mp)
2615196008Smjacob{
2616196008Smjacob	fcportdb_t *lp;
2617196008Smjacob
2618196008Smjacob	/*
2619196008Smjacob	 * Handle iterations over all channels via recursion
2620196008Smjacob	 */
2621196008Smjacob	if (mp->nt_channel == ISP_NOCHAN) {
2622196008Smjacob		for (mp->nt_channel = 0; mp->nt_channel < isp->isp_nchan; mp->nt_channel++) {
2623196008Smjacob			isp_del_wwn_entries(isp, mp);
2624196008Smjacob		}
2625196008Smjacob		mp->nt_channel = ISP_NOCHAN;
2626196008Smjacob		return;
2627196008Smjacob	}
2628196008Smjacob
2629196008Smjacob	/*
2630196008Smjacob	 * We have an entry which is only partially identified.
2631196008Smjacob	 *
2632196008Smjacob	 * It's only known by WWN, N-Port handle, or Port ID.
2633196008Smjacob	 * We need to find the actual entry so we can delete it.
2634196008Smjacob	 */
2635196008Smjacob	if (mp->nt_nphdl != NIL_HANDLE) {
2636196008Smjacob		if (isp_find_pdb_by_loopid(isp, mp->nt_channel, mp->nt_nphdl, &lp)) {
2637196008Smjacob			isp_del_wwn_entry(isp, mp->nt_channel, lp->port_wwn, lp->handle, lp->portid);
2638196008Smjacob			return;
2639196008Smjacob		}
2640196008Smjacob	}
2641196008Smjacob	if (mp->nt_wwn != INI_ANY) {
2642196008Smjacob		if (isp_find_pdb_by_wwn(isp, mp->nt_channel, mp->nt_wwn, &lp)) {
2643196008Smjacob			isp_del_wwn_entry(isp, mp->nt_channel, lp->port_wwn, lp->handle, lp->portid);
2644196008Smjacob			return;
2645196008Smjacob		}
2646196008Smjacob	}
2647196008Smjacob	if (mp->nt_sid != PORT_ANY && mp->nt_sid != PORT_NONE) {
2648196008Smjacob		if (isp_find_pdb_by_sid(isp, mp->nt_channel, mp->nt_sid, &lp)) {
2649196008Smjacob			isp_del_wwn_entry(isp, mp->nt_channel, lp->port_wwn, lp->handle, lp->portid);
2650196008Smjacob			return;
2651196008Smjacob		}
2652196008Smjacob	}
2653196008Smjacob	isp_prt(isp, ISP_LOGWARN, "%s: Chan %d unable to find entry to delete N-port handle 0x%04x initiator WWN 0x%016llx Port ID 0x%06x", __func__,
2654196008Smjacob	    mp->nt_channel, mp->nt_nphdl, (unsigned long long) mp->nt_wwn, mp->nt_sid);
2655196008Smjacob}
2656196008Smjacob
2657196008Smjacobvoid
2658163899Smjacobisp_put_atio(ispsoftc_t *isp, at_entry_t *src, at_entry_t *dst)
2659155228Smjacob{
2660155228Smjacob	int i;
2661163899Smjacob	isp_put_hdr(isp, &src->at_header, &dst->at_header);
2662163899Smjacob	ISP_IOXPUT_16(isp, src->at_reserved, &dst->at_reserved);
2663163899Smjacob	ISP_IOXPUT_16(isp, src->at_handle, &dst->at_handle);
2664155228Smjacob	if (ISP_IS_SBUS(isp)) {
2665163899Smjacob		ISP_IOXPUT_8(isp, src->at_lun, &dst->at_iid);
2666163899Smjacob		ISP_IOXPUT_8(isp, src->at_iid, &dst->at_lun);
2667163899Smjacob		ISP_IOXPUT_8(isp, src->at_cdblen, &dst->at_tgt);
2668163899Smjacob		ISP_IOXPUT_8(isp, src->at_tgt, &dst->at_cdblen);
2669163899Smjacob		ISP_IOXPUT_8(isp, src->at_status, &dst->at_scsi_status);
2670163899Smjacob		ISP_IOXPUT_8(isp, src->at_scsi_status, &dst->at_status);
2671163899Smjacob		ISP_IOXPUT_8(isp, src->at_tag_val, &dst->at_tag_type);
2672163899Smjacob		ISP_IOXPUT_8(isp, src->at_tag_type, &dst->at_tag_val);
2673155228Smjacob	} else {
2674163899Smjacob		ISP_IOXPUT_8(isp, src->at_lun, &dst->at_lun);
2675163899Smjacob		ISP_IOXPUT_8(isp, src->at_iid, &dst->at_iid);
2676163899Smjacob		ISP_IOXPUT_8(isp, src->at_cdblen, &dst->at_cdblen);
2677163899Smjacob		ISP_IOXPUT_8(isp, src->at_tgt, &dst->at_tgt);
2678163899Smjacob		ISP_IOXPUT_8(isp, src->at_status, &dst->at_status);
2679196008Smjacob		ISP_IOXPUT_8(isp, src->at_scsi_status, &dst->at_scsi_status);
2680163899Smjacob		ISP_IOXPUT_8(isp, src->at_tag_val, &dst->at_tag_val);
2681163899Smjacob		ISP_IOXPUT_8(isp, src->at_tag_type, &dst->at_tag_type);
2682155228Smjacob	}
2683163899Smjacob	ISP_IOXPUT_32(isp, src->at_flags, &dst->at_flags);
2684155228Smjacob	for (i = 0; i < ATIO_CDBLEN; i++) {
2685163899Smjacob		ISP_IOXPUT_8(isp, src->at_cdb[i], &dst->at_cdb[i]);
2686155228Smjacob	}
2687155228Smjacob	for (i = 0; i < QLTM_SENSELEN; i++) {
2688163899Smjacob		ISP_IOXPUT_8(isp, src->at_sense[i], &dst->at_sense[i]);
2689155228Smjacob	}
2690155228Smjacob}
2691155228Smjacob
2692155228Smjacobvoid
2693163899Smjacobisp_get_atio(ispsoftc_t *isp, at_entry_t *src, at_entry_t *dst)
2694155228Smjacob{
2695155228Smjacob	int i;
2696163899Smjacob	isp_get_hdr(isp, &src->at_header, &dst->at_header);
2697163899Smjacob	ISP_IOXGET_16(isp, &src->at_reserved, dst->at_reserved);
2698163899Smjacob	ISP_IOXGET_16(isp, &src->at_handle, dst->at_handle);
2699155228Smjacob	if (ISP_IS_SBUS(isp)) {
2700163899Smjacob		ISP_IOXGET_8(isp, &src->at_lun, dst->at_iid);
2701163899Smjacob		ISP_IOXGET_8(isp, &src->at_iid, dst->at_lun);
2702163899Smjacob		ISP_IOXGET_8(isp, &src->at_cdblen, dst->at_tgt);
2703163899Smjacob		ISP_IOXGET_8(isp, &src->at_tgt, dst->at_cdblen);
2704163899Smjacob		ISP_IOXGET_8(isp, &src->at_status, dst->at_scsi_status);
2705163899Smjacob		ISP_IOXGET_8(isp, &src->at_scsi_status, dst->at_status);
2706163899Smjacob		ISP_IOXGET_8(isp, &src->at_tag_val, dst->at_tag_type);
2707163899Smjacob		ISP_IOXGET_8(isp, &src->at_tag_type, dst->at_tag_val);
2708155228Smjacob	} else {
2709163899Smjacob		ISP_IOXGET_8(isp, &src->at_lun, dst->at_lun);
2710163899Smjacob		ISP_IOXGET_8(isp, &src->at_iid, dst->at_iid);
2711163899Smjacob		ISP_IOXGET_8(isp, &src->at_cdblen, dst->at_cdblen);
2712163899Smjacob		ISP_IOXGET_8(isp, &src->at_tgt, dst->at_tgt);
2713163899Smjacob		ISP_IOXGET_8(isp, &src->at_status, dst->at_status);
2714196008Smjacob		ISP_IOXGET_8(isp, &src->at_scsi_status, dst->at_scsi_status);
2715163899Smjacob		ISP_IOXGET_8(isp, &src->at_tag_val, dst->at_tag_val);
2716163899Smjacob		ISP_IOXGET_8(isp, &src->at_tag_type, dst->at_tag_type);
2717155228Smjacob	}
2718163899Smjacob	ISP_IOXGET_32(isp, &src->at_flags, dst->at_flags);
2719155228Smjacob	for (i = 0; i < ATIO_CDBLEN; i++) {
2720163899Smjacob		ISP_IOXGET_8(isp, &src->at_cdb[i], dst->at_cdb[i]);
2721155228Smjacob	}
2722155228Smjacob	for (i = 0; i < QLTM_SENSELEN; i++) {
2723163899Smjacob		ISP_IOXGET_8(isp, &src->at_sense[i], dst->at_sense[i]);
2724155228Smjacob	}
2725155228Smjacob}
2726155228Smjacob
2727155228Smjacobvoid
2728163899Smjacobisp_put_atio2(ispsoftc_t *isp, at2_entry_t *src, at2_entry_t *dst)
2729155228Smjacob{
2730155228Smjacob	int i;
2731163899Smjacob	isp_put_hdr(isp, &src->at_header, &dst->at_header);
2732163899Smjacob	ISP_IOXPUT_32(isp, src->at_reserved, &dst->at_reserved);
2733163899Smjacob	ISP_IOXPUT_8(isp, src->at_lun, &dst->at_lun);
2734163899Smjacob	ISP_IOXPUT_8(isp, src->at_iid, &dst->at_iid);
2735163899Smjacob	ISP_IOXPUT_16(isp, src->at_rxid, &dst->at_rxid);
2736163899Smjacob	ISP_IOXPUT_16(isp, src->at_flags, &dst->at_flags);
2737163899Smjacob	ISP_IOXPUT_16(isp, src->at_status, &dst->at_status);
2738163899Smjacob	ISP_IOXPUT_8(isp, src->at_crn, &dst->at_crn);
2739163899Smjacob	ISP_IOXPUT_8(isp, src->at_taskcodes, &dst->at_taskcodes);
2740163899Smjacob	ISP_IOXPUT_8(isp, src->at_taskflags, &dst->at_taskflags);
2741163899Smjacob	ISP_IOXPUT_8(isp, src->at_execodes, &dst->at_execodes);
2742155228Smjacob	for (i = 0; i < ATIO2_CDBLEN; i++) {
2743163899Smjacob		ISP_IOXPUT_8(isp, src->at_cdb[i], &dst->at_cdb[i]);
2744155228Smjacob	}
2745163899Smjacob	ISP_IOXPUT_32(isp, src->at_datalen, &dst->at_datalen);
2746163899Smjacob	ISP_IOXPUT_16(isp, src->at_scclun, &dst->at_scclun);
2747155228Smjacob	for (i = 0; i < 4; i++) {
2748163899Smjacob		ISP_IOXPUT_16(isp, src->at_wwpn[i], &dst->at_wwpn[i]);
2749155228Smjacob	}
2750155228Smjacob	for (i = 0; i < 6; i++) {
2751196008Smjacob		ISP_IOXPUT_16(isp, src->at_reserved2[i], &dst->at_reserved2[i]);
2752155228Smjacob	}
2753163899Smjacob	ISP_IOXPUT_16(isp, src->at_oxid, &dst->at_oxid);
2754155228Smjacob}
2755155228Smjacob
2756155228Smjacobvoid
2757163899Smjacobisp_put_atio2e(ispsoftc_t *isp, at2e_entry_t *src, at2e_entry_t *dst)
2758155228Smjacob{
2759155228Smjacob	int i;
2760163899Smjacob	isp_put_hdr(isp, &src->at_header, &dst->at_header);
2761163899Smjacob	ISP_IOXPUT_32(isp, src->at_reserved, &dst->at_reserved);
2762163899Smjacob	ISP_IOXPUT_16(isp, src->at_iid, &dst->at_iid);
2763163899Smjacob	ISP_IOXPUT_16(isp, src->at_rxid, &dst->at_rxid);
2764163899Smjacob	ISP_IOXPUT_16(isp, src->at_flags, &dst->at_flags);
2765163899Smjacob	ISP_IOXPUT_16(isp, src->at_status, &dst->at_status);
2766163899Smjacob	ISP_IOXPUT_8(isp, src->at_crn, &dst->at_crn);
2767163899Smjacob	ISP_IOXPUT_8(isp, src->at_taskcodes, &dst->at_taskcodes);
2768163899Smjacob	ISP_IOXPUT_8(isp, src->at_taskflags, &dst->at_taskflags);
2769163899Smjacob	ISP_IOXPUT_8(isp, src->at_execodes, &dst->at_execodes);
2770155228Smjacob	for (i = 0; i < ATIO2_CDBLEN; i++) {
2771163899Smjacob		ISP_IOXPUT_8(isp, src->at_cdb[i], &dst->at_cdb[i]);
2772155228Smjacob	}
2773163899Smjacob	ISP_IOXPUT_32(isp, src->at_datalen, &dst->at_datalen);
2774163899Smjacob	ISP_IOXPUT_16(isp, src->at_scclun, &dst->at_scclun);
2775155228Smjacob	for (i = 0; i < 4; i++) {
2776163899Smjacob		ISP_IOXPUT_16(isp, src->at_wwpn[i], &dst->at_wwpn[i]);
2777155228Smjacob	}
2778155228Smjacob	for (i = 0; i < 6; i++) {
2779196008Smjacob		ISP_IOXPUT_16(isp, src->at_reserved2[i], &dst->at_reserved2[i]);
2780155228Smjacob	}
2781163899Smjacob	ISP_IOXPUT_16(isp, src->at_oxid, &dst->at_oxid);
2782155228Smjacob}
2783155228Smjacob
2784155228Smjacobvoid
2785163899Smjacobisp_get_atio2(ispsoftc_t *isp, at2_entry_t *src, at2_entry_t *dst)
2786155228Smjacob{
2787155228Smjacob	int i;
2788163899Smjacob	isp_get_hdr(isp, &src->at_header, &dst->at_header);
2789163899Smjacob	ISP_IOXGET_32(isp, &src->at_reserved, dst->at_reserved);
2790163899Smjacob	ISP_IOXGET_8(isp, &src->at_lun, dst->at_lun);
2791163899Smjacob	ISP_IOXGET_8(isp, &src->at_iid, dst->at_iid);
2792163899Smjacob	ISP_IOXGET_16(isp, &src->at_rxid, dst->at_rxid);
2793163899Smjacob	ISP_IOXGET_16(isp, &src->at_flags, dst->at_flags);
2794163899Smjacob	ISP_IOXGET_16(isp, &src->at_status, dst->at_status);
2795163899Smjacob	ISP_IOXGET_8(isp, &src->at_crn, dst->at_crn);
2796163899Smjacob	ISP_IOXGET_8(isp, &src->at_taskcodes, dst->at_taskcodes);
2797163899Smjacob	ISP_IOXGET_8(isp, &src->at_taskflags, dst->at_taskflags);
2798163899Smjacob	ISP_IOXGET_8(isp, &src->at_execodes, dst->at_execodes);
2799155228Smjacob	for (i = 0; i < ATIO2_CDBLEN; i++) {
2800163899Smjacob		ISP_IOXGET_8(isp, &src->at_cdb[i], dst->at_cdb[i]);
2801155228Smjacob	}
2802163899Smjacob	ISP_IOXGET_32(isp, &src->at_datalen, dst->at_datalen);
2803163899Smjacob	ISP_IOXGET_16(isp, &src->at_scclun, dst->at_scclun);
2804155228Smjacob	for (i = 0; i < 4; i++) {
2805163899Smjacob		ISP_IOXGET_16(isp, &src->at_wwpn[i], dst->at_wwpn[i]);
2806155228Smjacob	}
2807155228Smjacob	for (i = 0; i < 6; i++) {
2808196008Smjacob		ISP_IOXGET_16(isp, &src->at_reserved2[i], dst->at_reserved2[i]);
2809155228Smjacob	}
2810163899Smjacob	ISP_IOXGET_16(isp, &src->at_oxid, dst->at_oxid);
2811155228Smjacob}
2812155228Smjacob
2813155228Smjacobvoid
2814163899Smjacobisp_get_atio2e(ispsoftc_t *isp, at2e_entry_t *src, at2e_entry_t *dst)
2815155228Smjacob{
2816155228Smjacob	int i;
2817163899Smjacob	isp_get_hdr(isp, &src->at_header, &dst->at_header);
2818163899Smjacob	ISP_IOXGET_32(isp, &src->at_reserved, dst->at_reserved);
2819163899Smjacob	ISP_IOXGET_16(isp, &src->at_iid, dst->at_iid);
2820163899Smjacob	ISP_IOXGET_16(isp, &src->at_rxid, dst->at_rxid);
2821163899Smjacob	ISP_IOXGET_16(isp, &src->at_flags, dst->at_flags);
2822163899Smjacob	ISP_IOXGET_16(isp, &src->at_status, dst->at_status);
2823163899Smjacob	ISP_IOXGET_8(isp, &src->at_crn, dst->at_crn);
2824163899Smjacob	ISP_IOXGET_8(isp, &src->at_taskcodes, dst->at_taskcodes);
2825163899Smjacob	ISP_IOXGET_8(isp, &src->at_taskflags, dst->at_taskflags);
2826163899Smjacob	ISP_IOXGET_8(isp, &src->at_execodes, dst->at_execodes);
2827155228Smjacob	for (i = 0; i < ATIO2_CDBLEN; i++) {
2828163899Smjacob		ISP_IOXGET_8(isp, &src->at_cdb[i], dst->at_cdb[i]);
2829155228Smjacob	}
2830163899Smjacob	ISP_IOXGET_32(isp, &src->at_datalen, dst->at_datalen);
2831163899Smjacob	ISP_IOXGET_16(isp, &src->at_scclun, dst->at_scclun);
2832155228Smjacob	for (i = 0; i < 4; i++) {
2833163899Smjacob		ISP_IOXGET_16(isp, &src->at_wwpn[i], dst->at_wwpn[i]);
2834155228Smjacob	}
2835155228Smjacob	for (i = 0; i < 6; i++) {
2836196008Smjacob		ISP_IOXGET_16(isp, &src->at_reserved2[i], dst->at_reserved2[i]);
2837155228Smjacob	}
2838163899Smjacob	ISP_IOXGET_16(isp, &src->at_oxid, dst->at_oxid);
2839155228Smjacob}
2840155228Smjacob
2841155228Smjacobvoid
2842163899Smjacobisp_get_atio7(ispsoftc_t *isp, at7_entry_t *src, at7_entry_t *dst)
2843155228Smjacob{
2844163899Smjacob	ISP_IOXGET_8(isp, &src->at_type, dst->at_type);
2845163899Smjacob	ISP_IOXGET_8(isp, &src->at_count, dst->at_count);
2846163899Smjacob	ISP_IOXGET_16(isp, &src->at_ta_len, dst->at_ta_len);
2847163899Smjacob	ISP_IOXGET_32(isp, &src->at_rxid, dst->at_rxid);
2848163899Smjacob	isp_get_fc_hdr(isp, &src->at_hdr, &dst->at_hdr);
2849163899Smjacob	isp_get_fcp_cmnd_iu(isp, &src->at_cmnd, &dst->at_cmnd);
2850163899Smjacob}
2851163899Smjacob
2852163899Smjacobvoid
2853163899Smjacobisp_put_ctio(ispsoftc_t *isp, ct_entry_t *src, ct_entry_t *dst)
2854163899Smjacob{
2855155228Smjacob	int i;
2856163899Smjacob	isp_put_hdr(isp, &src->ct_header, &dst->ct_header);
2857163899Smjacob	ISP_IOXPUT_16(isp, src->ct_syshandle, &dst->ct_syshandle);
2858163899Smjacob	ISP_IOXPUT_16(isp, src->ct_fwhandle, &dst->ct_fwhandle);
2859155228Smjacob	if (ISP_IS_SBUS(isp)) {
2860163899Smjacob		ISP_IOXPUT_8(isp, src->ct_iid, &dst->ct_lun);
2861163899Smjacob		ISP_IOXPUT_8(isp, src->ct_lun, &dst->ct_iid);
2862163899Smjacob		ISP_IOXPUT_8(isp, src->ct_tgt, &dst->ct_reserved2);
2863163899Smjacob		ISP_IOXPUT_8(isp, src->ct_reserved2, &dst->ct_tgt);
2864163899Smjacob		ISP_IOXPUT_8(isp, src->ct_status, &dst->ct_scsi_status);
2865163899Smjacob		ISP_IOXPUT_8(isp, src->ct_scsi_status, &dst->ct_status);
2866163899Smjacob		ISP_IOXPUT_8(isp, src->ct_tag_type, &dst->ct_tag_val);
2867163899Smjacob		ISP_IOXPUT_8(isp, src->ct_tag_val, &dst->ct_tag_type);
2868155228Smjacob	} else {
2869163899Smjacob		ISP_IOXPUT_8(isp, src->ct_iid, &dst->ct_iid);
2870163899Smjacob		ISP_IOXPUT_8(isp, src->ct_lun, &dst->ct_lun);
2871163899Smjacob		ISP_IOXPUT_8(isp, src->ct_tgt, &dst->ct_tgt);
2872163899Smjacob		ISP_IOXPUT_8(isp, src->ct_reserved2, &dst->ct_reserved2);
2873163899Smjacob		ISP_IOXPUT_8(isp, src->ct_scsi_status,
2874163899Smjacob		    &dst->ct_scsi_status);
2875163899Smjacob		ISP_IOXPUT_8(isp, src->ct_status, &dst->ct_status);
2876163899Smjacob		ISP_IOXPUT_8(isp, src->ct_tag_type, &dst->ct_tag_type);
2877163899Smjacob		ISP_IOXPUT_8(isp, src->ct_tag_val, &dst->ct_tag_val);
2878155228Smjacob	}
2879163899Smjacob	ISP_IOXPUT_32(isp, src->ct_flags, &dst->ct_flags);
2880163899Smjacob	ISP_IOXPUT_32(isp, src->ct_xfrlen, &dst->ct_xfrlen);
2881163899Smjacob	ISP_IOXPUT_32(isp, src->ct_resid, &dst->ct_resid);
2882163899Smjacob	ISP_IOXPUT_16(isp, src->ct_timeout, &dst->ct_timeout);
2883163899Smjacob	ISP_IOXPUT_16(isp, src->ct_seg_count, &dst->ct_seg_count);
2884155228Smjacob	for (i = 0; i < ISP_RQDSEG; i++) {
2885196008Smjacob		ISP_IOXPUT_32(isp, src->ct_dataseg[i].ds_base, &dst->ct_dataseg[i].ds_base);
2886196008Smjacob		ISP_IOXPUT_32(isp, src->ct_dataseg[i].ds_count, &dst->ct_dataseg[i].ds_count);
2887155228Smjacob	}
2888155228Smjacob}
2889155228Smjacob
2890155228Smjacobvoid
2891163899Smjacobisp_get_ctio(ispsoftc_t *isp, ct_entry_t *src, ct_entry_t *dst)
2892155228Smjacob{
2893155228Smjacob	int i;
2894163899Smjacob	isp_get_hdr(isp, &src->ct_header, &dst->ct_header);
2895163899Smjacob	ISP_IOXGET_16(isp, &src->ct_syshandle, dst->ct_syshandle);
2896163899Smjacob	ISP_IOXGET_16(isp, &src->ct_fwhandle, dst->ct_fwhandle);
2897155228Smjacob	if (ISP_IS_SBUS(isp)) {
2898163899Smjacob		ISP_IOXGET_8(isp, &src->ct_lun, dst->ct_iid);
2899163899Smjacob		ISP_IOXGET_8(isp, &src->ct_iid, dst->ct_lun);
2900163899Smjacob		ISP_IOXGET_8(isp, &src->ct_reserved2, dst->ct_tgt);
2901163899Smjacob		ISP_IOXGET_8(isp, &src->ct_tgt, dst->ct_reserved2);
2902163899Smjacob		ISP_IOXGET_8(isp, &src->ct_status, dst->ct_scsi_status);
2903163899Smjacob		ISP_IOXGET_8(isp, &src->ct_scsi_status, dst->ct_status);
2904163899Smjacob		ISP_IOXGET_8(isp, &src->ct_tag_val, dst->ct_tag_type);
2905163899Smjacob		ISP_IOXGET_8(isp, &src->ct_tag_type, dst->ct_tag_val);
2906155228Smjacob	} else {
2907163899Smjacob		ISP_IOXGET_8(isp, &src->ct_lun, dst->ct_lun);
2908163899Smjacob		ISP_IOXGET_8(isp, &src->ct_iid, dst->ct_iid);
2909163899Smjacob		ISP_IOXGET_8(isp, &src->ct_reserved2, dst->ct_reserved2);
2910163899Smjacob		ISP_IOXGET_8(isp, &src->ct_tgt, dst->ct_tgt);
2911163899Smjacob		ISP_IOXGET_8(isp, &src->ct_status, dst->ct_status);
2912196008Smjacob		ISP_IOXGET_8(isp, &src->ct_scsi_status, dst->ct_scsi_status);
2913163899Smjacob		ISP_IOXGET_8(isp, &src->ct_tag_val, dst->ct_tag_val);
2914163899Smjacob		ISP_IOXGET_8(isp, &src->ct_tag_type, dst->ct_tag_type);
2915155228Smjacob	}
2916163899Smjacob	ISP_IOXGET_32(isp, &src->ct_flags, dst->ct_flags);
2917163899Smjacob	ISP_IOXGET_32(isp, &src->ct_xfrlen, dst->ct_xfrlen);
2918163899Smjacob	ISP_IOXGET_32(isp, &src->ct_resid, dst->ct_resid);
2919163899Smjacob	ISP_IOXGET_16(isp, &src->ct_timeout, dst->ct_timeout);
2920163899Smjacob	ISP_IOXGET_16(isp, &src->ct_seg_count, dst->ct_seg_count);
2921155228Smjacob	for (i = 0; i < ISP_RQDSEG; i++) {
2922196008Smjacob		ISP_IOXGET_32(isp, &src->ct_dataseg[i].ds_base, dst->ct_dataseg[i].ds_base);
2923196008Smjacob		ISP_IOXGET_32(isp, &src->ct_dataseg[i].ds_count, dst->ct_dataseg[i].ds_count);
2924155228Smjacob	}
2925155228Smjacob}
2926155228Smjacob
2927155228Smjacobvoid
2928163899Smjacobisp_put_ctio2(ispsoftc_t *isp, ct2_entry_t *src, ct2_entry_t *dst)
2929155228Smjacob{
2930155228Smjacob	int i;
2931163899Smjacob	isp_put_hdr(isp, &src->ct_header, &dst->ct_header);
2932163899Smjacob	ISP_IOXPUT_32(isp, src->ct_syshandle, &dst->ct_syshandle);
2933163899Smjacob	ISP_IOXPUT_8(isp, src->ct_lun, &dst->ct_lun);
2934163899Smjacob	ISP_IOXPUT_8(isp, src->ct_iid, &dst->ct_iid);
2935163899Smjacob	ISP_IOXPUT_16(isp, src->ct_rxid, &dst->ct_rxid);
2936163899Smjacob	ISP_IOXPUT_16(isp, src->ct_flags, &dst->ct_flags);
2937163899Smjacob	ISP_IOXPUT_16(isp, src->ct_timeout, &dst->ct_timeout);
2938163899Smjacob	ISP_IOXPUT_16(isp, src->ct_seg_count, &dst->ct_seg_count);
2939163899Smjacob	ISP_IOXPUT_32(isp, src->ct_resid, &dst->ct_resid);
2940163899Smjacob	ISP_IOXPUT_32(isp, src->ct_reloff, &dst->ct_reloff);
2941163899Smjacob	if ((src->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) {
2942196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0._reserved, &dst->rsp.m0._reserved);
2943196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m0._reserved2, &dst->rsp.m0._reserved2);
2944196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m0.ct_scsi_status, &dst->rsp.m0.ct_scsi_status);
2945196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ct_xfrlen, &dst->rsp.m0.ct_xfrlen);
2946163899Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
2947155228Smjacob			for (i = 0; i < ISP_RQDSEG_T2; i++) {
2948196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg[i].ds_base, &dst->rsp.m0.u.ct_dataseg[i].ds_base);
2949196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg[i].ds_count, &dst->rsp.m0.u.ct_dataseg[i].ds_count);
2950155228Smjacob			}
2951163899Smjacob		} else if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO3) {
2952155228Smjacob			for (i = 0; i < ISP_RQDSEG_T3; i++) {
2953196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_base, &dst->rsp.m0.u.ct_dataseg64[i].ds_base);
2954196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_basehi, &dst->rsp.m0.u.ct_dataseg64[i].ds_basehi);
2955196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_count, &dst->rsp.m0.u.ct_dataseg64[i].ds_count);
2956155228Smjacob			}
2957163899Smjacob		} else if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO4) {
2958196008Smjacob			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,
2959163899Smjacob			    &dst->rsp.m0.u.ct_dslist.ds_segment);
2960196008Smjacob			ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dslist.ds_base, &dst->rsp.m0.u.ct_dslist.ds_base);
2961155228Smjacob		}
2962163899Smjacob	} else if ((src->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) {
2963196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1._reserved, &dst->rsp.m1._reserved);
2964196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1._reserved2, &dst->rsp.m1._reserved2);
2965196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_senselen, &dst->rsp.m1.ct_senselen);
2966196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_scsi_status, &dst->rsp.m1.ct_scsi_status);
2967196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_resplen, &dst->rsp.m1.ct_resplen);
2968155228Smjacob		for (i = 0; i < MAXRESPLEN; i++) {
2969196008Smjacob			ISP_IOXPUT_8(isp, src->rsp.m1.ct_resp[i], &dst->rsp.m1.ct_resp[i]);
2970155228Smjacob		}
2971155228Smjacob	} else {
2972196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2._reserved, &dst->rsp.m2._reserved);
2973196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m2._reserved2, &dst->rsp.m2._reserved2);
2974196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m2._reserved3, &dst->rsp.m2._reserved3);
2975196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_datalen, &dst->rsp.m2.ct_datalen);
2976196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_base, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_base);
2977196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_count, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_count);
2978155228Smjacob	}
2979155228Smjacob}
2980155228Smjacob
2981155228Smjacobvoid
2982163899Smjacobisp_put_ctio2e(ispsoftc_t *isp, ct2e_entry_t *src, ct2e_entry_t *dst)
2983155228Smjacob{
2984155228Smjacob	int i;
2985163899Smjacob	isp_put_hdr(isp, &src->ct_header, &dst->ct_header);
2986163899Smjacob	ISP_IOXPUT_32(isp, src->ct_syshandle, &dst->ct_syshandle);
2987163899Smjacob	ISP_IOXPUT_16(isp, src->ct_iid, &dst->ct_iid);
2988163899Smjacob	ISP_IOXPUT_16(isp, src->ct_rxid, &dst->ct_rxid);
2989163899Smjacob	ISP_IOXPUT_16(isp, src->ct_flags, &dst->ct_flags);
2990163899Smjacob	ISP_IOXPUT_16(isp, src->ct_timeout, &dst->ct_timeout);
2991163899Smjacob	ISP_IOXPUT_16(isp, src->ct_seg_count, &dst->ct_seg_count);
2992163899Smjacob	ISP_IOXPUT_32(isp, src->ct_resid, &dst->ct_resid);
2993163899Smjacob	ISP_IOXPUT_32(isp, src->ct_reloff, &dst->ct_reloff);
2994163899Smjacob	if ((src->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) {
2995196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0._reserved, &dst->rsp.m0._reserved);
2996196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m0._reserved2, &dst->rsp.m0._reserved2);
2997196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m0.ct_scsi_status, &dst->rsp.m0.ct_scsi_status);
2998196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ct_xfrlen, &dst->rsp.m0.ct_xfrlen);
2999163899Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
3000155228Smjacob			for (i = 0; i < ISP_RQDSEG_T2; i++) {
3001196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg[i].ds_base, &dst->rsp.m0.u.ct_dataseg[i].ds_base);
3002196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg[i].ds_count, &dst->rsp.m0.u.ct_dataseg[i].ds_count);
3003155228Smjacob			}
3004163899Smjacob		} else if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO3) {
3005155228Smjacob			for (i = 0; i < ISP_RQDSEG_T3; i++) {
3006196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_base, &dst->rsp.m0.u.ct_dataseg64[i].ds_base);
3007196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_basehi, &dst->rsp.m0.u.ct_dataseg64[i].ds_basehi);
3008196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_count, &dst->rsp.m0.u.ct_dataseg64[i].ds_count);
3009155228Smjacob			}
3010163899Smjacob		} else if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO4) {
3011196008Smjacob			ISP_IOXPUT_16(isp, src->rsp.m0.u.ct_dslist.ds_type, &dst->rsp.m0.u.ct_dslist.ds_type);
3012196008Smjacob			ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dslist.ds_segment, &dst->rsp.m0.u.ct_dslist.ds_segment);
3013196008Smjacob			ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dslist.ds_base, &dst->rsp.m0.u.ct_dslist.ds_base);
3014155228Smjacob		}
3015163899Smjacob	} else if ((src->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) {
3016196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1._reserved, &dst->rsp.m1._reserved);
3017196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1._reserved2, &dst->rsp.m1._reserved2);
3018196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_senselen, &dst->rsp.m1.ct_senselen);
3019196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_scsi_status, &dst->rsp.m1.ct_scsi_status);
3020196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_resplen, &dst->rsp.m1.ct_resplen);
3021155228Smjacob		for (i = 0; i < MAXRESPLEN; i++) {
3022196008Smjacob			ISP_IOXPUT_8(isp, src->rsp.m1.ct_resp[i], &dst->rsp.m1.ct_resp[i]);
3023155228Smjacob		}
3024155228Smjacob	} else {
3025196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2._reserved, &dst->rsp.m2._reserved);
3026196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m2._reserved2, &dst->rsp.m2._reserved2);
3027196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m2._reserved3, &dst->rsp.m2._reserved3);
3028196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_datalen, &dst->rsp.m2.ct_datalen);
3029196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_base, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_base);
3030196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_count, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_count);
3031155228Smjacob	}
3032155228Smjacob}
3033155228Smjacob
3034155228Smjacobvoid
3035163899Smjacobisp_put_ctio7(ispsoftc_t *isp, ct7_entry_t *src, ct7_entry_t *dst)
3036155228Smjacob{
3037163899Smjacob	int i;
3038163899Smjacob
3039163899Smjacob	isp_put_hdr(isp, &src->ct_header, &dst->ct_header);
3040163899Smjacob	ISP_IOXPUT_32(isp, src->ct_syshandle, &dst->ct_syshandle);
3041163899Smjacob	ISP_IOXPUT_16(isp, src->ct_nphdl, &dst->ct_nphdl);
3042163899Smjacob	ISP_IOXPUT_16(isp, src->ct_timeout, &dst->ct_timeout);
3043163899Smjacob	ISP_IOXPUT_16(isp, src->ct_seg_count, &dst->ct_seg_count);
3044196008Smjacob	ISP_IOXPUT_8(isp, src->ct_vpidx, &dst->ct_vpidx);
3045163899Smjacob	ISP_IOXPUT_8(isp, src->ct_xflags, &dst->ct_xflags);
3046163899Smjacob	ISP_IOXPUT_16(isp, src->ct_iid_lo, &dst->ct_iid_lo);
3047163899Smjacob	ISP_IOXPUT_8(isp, src->ct_iid_hi, &dst->ct_iid_hi);
3048163899Smjacob	ISP_IOXPUT_8(isp, src->ct_reserved, &dst->ct_reserved);
3049163899Smjacob	ISP_IOXPUT_32(isp, src->ct_rxid, &dst->ct_rxid);
3050163899Smjacob	ISP_IOXPUT_16(isp, src->ct_senselen, &dst->ct_senselen);
3051163899Smjacob	ISP_IOXPUT_16(isp, src->ct_flags, &dst->ct_flags);
3052163899Smjacob	ISP_IOXPUT_32(isp, src->ct_resid, &dst->ct_resid);
3053163899Smjacob	ISP_IOXPUT_16(isp, src->ct_oxid, &dst->ct_oxid);
3054163899Smjacob	ISP_IOXPUT_16(isp, src->ct_scsi_status, &dst->ct_scsi_status);
3055163899Smjacob	if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE0) {
3056163899Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.reloff, &dst->rsp.m0.reloff);
3057196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.reserved0, &dst->rsp.m0.reserved0);
3058196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ct_xfrlen, &dst->rsp.m0.ct_xfrlen);
3059196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.reserved1, &dst->rsp.m0.reserved1);
3060196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_base, &dst->rsp.m0.ds.ds_base);
3061196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_basehi, &dst->rsp.m0.ds.ds_basehi);
3062196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_count, &dst->rsp.m0.ds.ds_count);
3063163899Smjacob	} else if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE1) {
3064196008Smjacob		uint32_t *a, *b;
3065196008Smjacob
3066196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_resplen, &dst->rsp.m1.ct_resplen);
3067163899Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.reserved, &dst->rsp.m1.reserved);
3068196008Smjacob		a = (uint32_t *) src->rsp.m1.ct_resp;
3069196008Smjacob		b = (uint32_t *) dst->rsp.m1.ct_resp;
3070196008Smjacob		for (i = 0; i < (ASIZE(src->rsp.m1.ct_resp) >> 2); i++) {
3071196008Smjacob			*b++ = ISP_SWAP32(isp, *a++);
3072163899Smjacob		}
3073163899Smjacob	} else {
3074196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.reserved0, &dst->rsp.m2.reserved0);
3075196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_datalen, &dst->rsp.m2.ct_datalen);
3076196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.reserved1, &dst->rsp.m2.reserved1);
3077196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_base, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_base);
3078196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_basehi, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_basehi);
3079196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_count, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_count);
3080163899Smjacob	}
3081155228Smjacob}
3082155228Smjacob
3083163899Smjacob
3084155228Smjacobvoid
3085163899Smjacobisp_get_ctio2(ispsoftc_t *isp, ct2_entry_t *src, ct2_entry_t *dst)
3086155228Smjacob{
3087163899Smjacob	int i;
3088163899Smjacob
3089163899Smjacob	isp_get_hdr(isp, &src->ct_header, &dst->ct_header);
3090163899Smjacob	ISP_IOXGET_32(isp, &src->ct_syshandle, dst->ct_syshandle);
3091163899Smjacob	ISP_IOXGET_8(isp, &src->ct_lun, dst->ct_lun);
3092163899Smjacob	ISP_IOXGET_8(isp, &src->ct_iid, dst->ct_iid);
3093163899Smjacob	ISP_IOXGET_16(isp, &src->ct_rxid, dst->ct_rxid);
3094163899Smjacob	ISP_IOXGET_16(isp, &src->ct_flags, dst->ct_flags);
3095163899Smjacob	ISP_IOXGET_16(isp, &src->ct_status, dst->ct_status);
3096163899Smjacob	ISP_IOXGET_16(isp, &src->ct_timeout, dst->ct_timeout);
3097163899Smjacob	ISP_IOXGET_16(isp, &src->ct_seg_count, dst->ct_seg_count);
3098163899Smjacob	ISP_IOXGET_32(isp, &src->ct_reloff, dst->ct_reloff);
3099163899Smjacob	ISP_IOXGET_32(isp, &src->ct_resid, dst->ct_resid);
3100163899Smjacob	if ((dst->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) {
3101196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0._reserved, dst->rsp.m0._reserved);
3102196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m0._reserved2, dst->rsp.m0._reserved2);
3103196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m0.ct_scsi_status, dst->rsp.m0.ct_scsi_status);
3104196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ct_xfrlen, dst->rsp.m0.ct_xfrlen);
3105163899Smjacob		if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
3106163899Smjacob			for (i = 0; i < ISP_RQDSEG_T2; i++) {
3107196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg[i].ds_base, dst->rsp.m0.u.ct_dataseg[i].ds_base);
3108196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg[i].ds_count, dst->rsp.m0.u.ct_dataseg[i].ds_count);
3109163899Smjacob			}
3110163899Smjacob		} else if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO3) {
3111163899Smjacob			for (i = 0; i < ISP_RQDSEG_T3; i++) {
3112196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_base, dst->rsp.m0.u.ct_dataseg64[i].ds_base);
3113196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_basehi, dst->rsp.m0.u.ct_dataseg64[i].ds_basehi);
3114196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_count, dst->rsp.m0.u.ct_dataseg64[i].ds_count);
3115163899Smjacob			}
3116163899Smjacob		} else if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO4) {
3117196008Smjacob			ISP_IOXGET_16(isp, &src->rsp.m0.u.ct_dslist.ds_type, dst->rsp.m0.u.ct_dslist.ds_type);
3118196008Smjacob			ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dslist.ds_segment, dst->rsp.m0.u.ct_dslist.ds_segment);
3119196008Smjacob			ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dslist.ds_base, dst->rsp.m0.u.ct_dslist.ds_base);
3120163899Smjacob		}
3121163899Smjacob	} else if ((dst->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) {
3122196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1._reserved, dst->rsp.m1._reserved);
3123196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1._reserved2, dst->rsp.m1._reserved2);
3124196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_senselen, dst->rsp.m1.ct_senselen);
3125196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_scsi_status, dst->rsp.m1.ct_scsi_status);
3126196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_resplen, dst->rsp.m1.ct_resplen);
3127163899Smjacob		for (i = 0; i < MAXRESPLEN; i++) {
3128196008Smjacob			ISP_IOXGET_8(isp, &src->rsp.m1.ct_resp[i], dst->rsp.m1.ct_resp[i]);
3129163899Smjacob		}
3130163899Smjacob	} else {
3131196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2._reserved, dst->rsp.m2._reserved);
3132196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m2._reserved2, dst->rsp.m2._reserved2);
3133196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m2._reserved3, dst->rsp.m2._reserved3);
3134196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_datalen, dst->rsp.m2.ct_datalen);
3135196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_base, dst->rsp.m2.ct_fcp_rsp_iudata.ds_base);
3136196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_count, dst->rsp.m2.ct_fcp_rsp_iudata.ds_count);
3137163899Smjacob	}
3138155228Smjacob}
3139155228Smjacob
3140155228Smjacobvoid
3141163899Smjacobisp_get_ctio2e(ispsoftc_t *isp, ct2e_entry_t *src, ct2e_entry_t *dst)
3142163899Smjacob{
3143163899Smjacob	int i;
3144163899Smjacob
3145163899Smjacob	isp_get_hdr(isp, &src->ct_header, &dst->ct_header);
3146163899Smjacob	ISP_IOXGET_32(isp, &src->ct_syshandle, dst->ct_syshandle);
3147163899Smjacob	ISP_IOXGET_16(isp, &src->ct_iid, dst->ct_iid);
3148163899Smjacob	ISP_IOXGET_16(isp, &src->ct_rxid, dst->ct_rxid);
3149163899Smjacob	ISP_IOXGET_16(isp, &src->ct_flags, dst->ct_flags);
3150163899Smjacob	ISP_IOXGET_16(isp, &src->ct_status, dst->ct_status);
3151163899Smjacob	ISP_IOXGET_16(isp, &src->ct_timeout, dst->ct_timeout);
3152163899Smjacob	ISP_IOXGET_16(isp, &src->ct_seg_count, dst->ct_seg_count);
3153163899Smjacob	ISP_IOXGET_32(isp, &src->ct_reloff, dst->ct_reloff);
3154163899Smjacob	ISP_IOXGET_32(isp, &src->ct_resid, dst->ct_resid);
3155163899Smjacob	if ((dst->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) {
3156196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0._reserved, dst->rsp.m0._reserved);
3157196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m0._reserved2, dst->rsp.m0._reserved2);
3158196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m0.ct_scsi_status, dst->rsp.m0.ct_scsi_status);
3159196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ct_xfrlen, dst->rsp.m0.ct_xfrlen);
3160163899Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
3161163899Smjacob			for (i = 0; i < ISP_RQDSEG_T2; i++) {
3162196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg[i].ds_base, dst->rsp.m0.u.ct_dataseg[i].ds_base);
3163196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg[i].ds_count, dst->rsp.m0.u.ct_dataseg[i].ds_count);
3164163899Smjacob			}
3165163899Smjacob		} else if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO3) {
3166163899Smjacob			for (i = 0; i < ISP_RQDSEG_T3; i++) {
3167196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_base, dst->rsp.m0.u.ct_dataseg64[i].ds_base);
3168196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_basehi, dst->rsp.m0.u.ct_dataseg64[i].ds_basehi);
3169196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_count, dst->rsp.m0.u.ct_dataseg64[i].ds_count);
3170163899Smjacob			}
3171163899Smjacob		} else if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO4) {
3172196008Smjacob			ISP_IOXGET_16(isp, &src->rsp.m0.u.ct_dslist.ds_type, dst->rsp.m0.u.ct_dslist.ds_type);
3173196008Smjacob			ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dslist.ds_segment, dst->rsp.m0.u.ct_dslist.ds_segment);
3174196008Smjacob			ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dslist.ds_base, dst->rsp.m0.u.ct_dslist.ds_base);
3175163899Smjacob		}
3176163899Smjacob	} else if ((dst->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) {
3177196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1._reserved, dst->rsp.m1._reserved);
3178196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1._reserved2, dst->rsp.m1._reserved2);
3179196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_senselen, dst->rsp.m1.ct_senselen);
3180196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_scsi_status, dst->rsp.m1.ct_scsi_status);
3181196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_resplen, dst->rsp.m1.ct_resplen);
3182163899Smjacob		for (i = 0; i < MAXRESPLEN; i++) {
3183196008Smjacob			ISP_IOXGET_8(isp, &src->rsp.m1.ct_resp[i], dst->rsp.m1.ct_resp[i]);
3184163899Smjacob		}
3185163899Smjacob	} else {
3186196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2._reserved, dst->rsp.m2._reserved);
3187196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m2._reserved2, dst->rsp.m2._reserved2);
3188196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m2._reserved3, dst->rsp.m2._reserved3);
3189196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_datalen, dst->rsp.m2.ct_datalen);
3190196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_base, dst->rsp.m2.ct_fcp_rsp_iudata.ds_base);
3191196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_count, dst->rsp.m2.ct_fcp_rsp_iudata.ds_count);
3192163899Smjacob	}
3193163899Smjacob}
3194163899Smjacob
3195163899Smjacobvoid
3196163899Smjacobisp_get_ctio7(ispsoftc_t *isp, ct7_entry_t *src, ct7_entry_t *dst)
3197163899Smjacob{
3198163899Smjacob	int i;
3199163899Smjacob
3200163899Smjacob	isp_get_hdr(isp, &src->ct_header, &dst->ct_header);
3201163899Smjacob	ISP_IOXGET_32(isp, &src->ct_syshandle, dst->ct_syshandle);
3202163899Smjacob	ISP_IOXGET_16(isp, &src->ct_nphdl, dst->ct_nphdl);
3203163899Smjacob	ISP_IOXGET_16(isp, &src->ct_timeout, dst->ct_timeout);
3204163899Smjacob	ISP_IOXGET_16(isp, &src->ct_seg_count, dst->ct_seg_count);
3205196008Smjacob	ISP_IOXGET_8(isp, &src->ct_vpidx, dst->ct_vpidx);
3206163899Smjacob	ISP_IOXGET_8(isp, &src->ct_xflags, dst->ct_xflags);
3207163899Smjacob	ISP_IOXGET_16(isp, &src->ct_iid_lo, dst->ct_iid_lo);
3208163899Smjacob	ISP_IOXGET_8(isp, &src->ct_iid_hi, dst->ct_iid_hi);
3209163899Smjacob	ISP_IOXGET_8(isp, &src->ct_reserved, dst->ct_reserved);
3210163899Smjacob	ISP_IOXGET_32(isp, &src->ct_rxid, dst->ct_rxid);
3211163899Smjacob	ISP_IOXGET_16(isp, &src->ct_senselen, dst->ct_senselen);
3212163899Smjacob	ISP_IOXGET_16(isp, &src->ct_flags, dst->ct_flags);
3213163899Smjacob	ISP_IOXGET_32(isp, &src->ct_resid, dst->ct_resid);
3214163899Smjacob	ISP_IOXGET_16(isp, &src->ct_oxid, dst->ct_oxid);
3215163899Smjacob	ISP_IOXGET_16(isp, &src->ct_scsi_status, dst->ct_scsi_status);
3216163899Smjacob	if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE0) {
3217163899Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.reloff, dst->rsp.m0.reloff);
3218196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.reserved0, dst->rsp.m0.reserved0);
3219196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ct_xfrlen, dst->rsp.m0.ct_xfrlen);
3220196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.reserved1, dst->rsp.m0.reserved1);
3221196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_base, dst->rsp.m0.ds.ds_base);
3222196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_basehi, dst->rsp.m0.ds.ds_basehi);
3223196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_count, dst->rsp.m0.ds.ds_count);
3224163899Smjacob	} else if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE1) {
3225196008Smjacob		uint32_t *a, *b;
3226196008Smjacob
3227196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_resplen, dst->rsp.m1.ct_resplen);
3228163899Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.reserved, dst->rsp.m1.reserved);
3229196008Smjacob		a = (uint32_t *) src->rsp.m1.ct_resp;
3230196008Smjacob		b = (uint32_t *) dst->rsp.m1.ct_resp;
3231163899Smjacob		for (i = 0; i < MAXRESPLEN_24XX; i++) {
3232196008Smjacob			ISP_IOXGET_8(isp, &src->rsp.m1.ct_resp[i], dst->rsp.m1.ct_resp[i]);
3233163899Smjacob		}
3234196008Smjacob		for (i = 0; i < (ASIZE(src->rsp.m1.ct_resp) >> 2); i++) {
3235196008Smjacob			*b++ = ISP_SWAP32(isp, *a++);
3236196008Smjacob		}
3237163899Smjacob	} else {
3238196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.reserved0, dst->rsp.m2.reserved0);
3239196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_datalen, dst->rsp.m2.ct_datalen);
3240196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.reserved1, dst->rsp.m2.reserved1);
3241196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_base, dst->rsp.m2.ct_fcp_rsp_iudata.ds_base);
3242196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_basehi, dst->rsp.m2.ct_fcp_rsp_iudata.ds_basehi);
3243196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_count, dst->rsp.m2.ct_fcp_rsp_iudata.ds_count);
3244163899Smjacob	}
3245163899Smjacob}
3246163899Smjacob
3247163899Smjacobvoid
3248155704Smjacobisp_put_enable_lun(ispsoftc_t *isp, lun_entry_t *lesrc, lun_entry_t *ledst)
3249155228Smjacob{
3250155228Smjacob	int i;
3251163899Smjacob	isp_put_hdr(isp, &lesrc->le_header, &ledst->le_header);
3252155228Smjacob	ISP_IOXPUT_32(isp, lesrc->le_reserved, &ledst->le_reserved);
3253155228Smjacob	if (ISP_IS_SBUS(isp)) {
3254155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_lun, &ledst->le_rsvd);
3255155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_rsvd, &ledst->le_lun);
3256155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_ops, &ledst->le_tgt);
3257155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_tgt, &ledst->le_ops);
3258155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_status, &ledst->le_reserved2);
3259155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_reserved2, &ledst->le_status);
3260155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_cmd_count, &ledst->le_in_count);
3261155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_in_count, &ledst->le_cmd_count);
3262155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_cdb6len, &ledst->le_cdb7len);
3263155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_cdb7len, &ledst->le_cdb6len);
3264155228Smjacob	} else {
3265155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_lun, &ledst->le_lun);
3266155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_rsvd, &ledst->le_rsvd);
3267155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_ops, &ledst->le_ops);
3268155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_tgt, &ledst->le_tgt);
3269155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_status, &ledst->le_status);
3270155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_reserved2, &ledst->le_reserved2);
3271155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_cmd_count, &ledst->le_cmd_count);
3272155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_in_count, &ledst->le_in_count);
3273155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_cdb6len, &ledst->le_cdb6len);
3274155228Smjacob		ISP_IOXPUT_8(isp, lesrc->le_cdb7len, &ledst->le_cdb7len);
3275155228Smjacob	}
3276155228Smjacob	ISP_IOXPUT_32(isp, lesrc->le_flags, &ledst->le_flags);
3277155228Smjacob	ISP_IOXPUT_16(isp, lesrc->le_timeout, &ledst->le_timeout);
3278155228Smjacob	for (i = 0; i < 20; i++) {
3279196008Smjacob		ISP_IOXPUT_8(isp, lesrc->le_reserved3[i], &ledst->le_reserved3[i]);
3280155228Smjacob	}
3281155228Smjacob}
3282155228Smjacob
3283155228Smjacobvoid
3284155704Smjacobisp_get_enable_lun(ispsoftc_t *isp, lun_entry_t *lesrc, lun_entry_t *ledst)
3285155228Smjacob{
3286155228Smjacob	int i;
3287163899Smjacob	isp_get_hdr(isp, &lesrc->le_header, &ledst->le_header);
3288155228Smjacob	ISP_IOXGET_32(isp, &lesrc->le_reserved, ledst->le_reserved);
3289155228Smjacob	if (ISP_IS_SBUS(isp)) {
3290155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_lun, ledst->le_rsvd);
3291155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_rsvd, ledst->le_lun);
3292155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_ops, ledst->le_tgt);
3293155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_tgt, ledst->le_ops);
3294155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_status, ledst->le_reserved2);
3295155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_reserved2, ledst->le_status);
3296155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_cmd_count, ledst->le_in_count);
3297155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_in_count, ledst->le_cmd_count);
3298155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_cdb6len, ledst->le_cdb7len);
3299155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_cdb7len, ledst->le_cdb6len);
3300155228Smjacob	} else {
3301155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_lun, ledst->le_lun);
3302155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_rsvd, ledst->le_rsvd);
3303155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_ops, ledst->le_ops);
3304155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_tgt, ledst->le_tgt);
3305155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_status, ledst->le_status);
3306155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_reserved2, ledst->le_reserved2);
3307155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_cmd_count, ledst->le_cmd_count);
3308155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_in_count, ledst->le_in_count);
3309155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_cdb6len, ledst->le_cdb6len);
3310155228Smjacob		ISP_IOXGET_8(isp, &lesrc->le_cdb7len, ledst->le_cdb7len);
3311155228Smjacob	}
3312155228Smjacob	ISP_IOXGET_32(isp, &lesrc->le_flags, ledst->le_flags);
3313155228Smjacob	ISP_IOXGET_16(isp, &lesrc->le_timeout, ledst->le_timeout);
3314155228Smjacob	for (i = 0; i < 20; i++) {
3315196008Smjacob		ISP_IOXGET_8(isp, &lesrc->le_reserved3[i], ledst->le_reserved3[i]);
3316155228Smjacob	}
3317155228Smjacob}
3318155228Smjacob
3319155228Smjacobvoid
3320163899Smjacobisp_put_notify(ispsoftc_t *isp, in_entry_t *src, in_entry_t *dst)
3321155228Smjacob{
3322155228Smjacob	int i;
3323163899Smjacob	isp_put_hdr(isp, &src->in_header, &dst->in_header);
3324163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved, &dst->in_reserved);
3325155228Smjacob	if (ISP_IS_SBUS(isp)) {
3326163899Smjacob		ISP_IOXPUT_8(isp, src->in_lun, &dst->in_iid);
3327163899Smjacob		ISP_IOXPUT_8(isp, src->in_iid, &dst->in_lun);
3328163899Smjacob		ISP_IOXPUT_8(isp, src->in_reserved2, &dst->in_tgt);
3329163899Smjacob		ISP_IOXPUT_8(isp, src->in_tgt, &dst->in_reserved2);
3330163899Smjacob		ISP_IOXPUT_8(isp, src->in_status, &dst->in_rsvd2);
3331163899Smjacob		ISP_IOXPUT_8(isp, src->in_rsvd2, &dst->in_status);
3332163899Smjacob		ISP_IOXPUT_8(isp, src->in_tag_val, &dst->in_tag_type);
3333163899Smjacob		ISP_IOXPUT_8(isp, src->in_tag_type, &dst->in_tag_val);
3334155228Smjacob	} else {
3335163899Smjacob		ISP_IOXPUT_8(isp, src->in_lun, &dst->in_lun);
3336163899Smjacob		ISP_IOXPUT_8(isp, src->in_iid, &dst->in_iid);
3337163899Smjacob		ISP_IOXPUT_8(isp, src->in_reserved2, &dst->in_reserved2);
3338163899Smjacob		ISP_IOXPUT_8(isp, src->in_tgt, &dst->in_tgt);
3339163899Smjacob		ISP_IOXPUT_8(isp, src->in_status, &dst->in_status);
3340163899Smjacob		ISP_IOXPUT_8(isp, src->in_rsvd2, &dst->in_rsvd2);
3341163899Smjacob		ISP_IOXPUT_8(isp, src->in_tag_val, &dst->in_tag_val);
3342163899Smjacob		ISP_IOXPUT_8(isp, src->in_tag_type, &dst->in_tag_type);
3343155228Smjacob	}
3344163899Smjacob	ISP_IOXPUT_32(isp, src->in_flags, &dst->in_flags);
3345163899Smjacob	ISP_IOXPUT_16(isp, src->in_seqid, &dst->in_seqid);
3346155228Smjacob	for (i = 0; i < IN_MSGLEN; i++) {
3347163899Smjacob		ISP_IOXPUT_8(isp, src->in_msg[i], &dst->in_msg[i]);
3348155228Smjacob	}
3349155228Smjacob	for (i = 0; i < IN_RSVDLEN; i++) {
3350196008Smjacob		ISP_IOXPUT_8(isp, src->in_reserved3[i], &dst->in_reserved3[i]);
3351155228Smjacob	}
3352155228Smjacob	for (i = 0; i < QLTM_SENSELEN; i++) {
3353196008Smjacob		ISP_IOXPUT_8(isp, src->in_sense[i], &dst->in_sense[i]);
3354155228Smjacob	}
3355155228Smjacob}
3356155228Smjacob
3357155228Smjacobvoid
3358163899Smjacobisp_get_notify(ispsoftc_t *isp, in_entry_t *src, in_entry_t *dst)
3359155228Smjacob{
3360155228Smjacob	int i;
3361163899Smjacob	isp_get_hdr(isp, &src->in_header, &dst->in_header);
3362163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved, dst->in_reserved);
3363155228Smjacob	if (ISP_IS_SBUS(isp)) {
3364163899Smjacob		ISP_IOXGET_8(isp, &src->in_lun, dst->in_iid);
3365163899Smjacob		ISP_IOXGET_8(isp, &src->in_iid, dst->in_lun);
3366163899Smjacob		ISP_IOXGET_8(isp, &src->in_reserved2, dst->in_tgt);
3367163899Smjacob		ISP_IOXGET_8(isp, &src->in_tgt, dst->in_reserved2);
3368163899Smjacob		ISP_IOXGET_8(isp, &src->in_status, dst->in_rsvd2);
3369163899Smjacob		ISP_IOXGET_8(isp, &src->in_rsvd2, dst->in_status);
3370163899Smjacob		ISP_IOXGET_8(isp, &src->in_tag_val, dst->in_tag_type);
3371163899Smjacob		ISP_IOXGET_8(isp, &src->in_tag_type, dst->in_tag_val);
3372155228Smjacob	} else {
3373163899Smjacob		ISP_IOXGET_8(isp, &src->in_lun, dst->in_lun);
3374163899Smjacob		ISP_IOXGET_8(isp, &src->in_iid, dst->in_iid);
3375163899Smjacob		ISP_IOXGET_8(isp, &src->in_reserved2, dst->in_reserved2);
3376163899Smjacob		ISP_IOXGET_8(isp, &src->in_tgt, dst->in_tgt);
3377163899Smjacob		ISP_IOXGET_8(isp, &src->in_status, dst->in_status);
3378163899Smjacob		ISP_IOXGET_8(isp, &src->in_rsvd2, dst->in_rsvd2);
3379163899Smjacob		ISP_IOXGET_8(isp, &src->in_tag_val, dst->in_tag_val);
3380163899Smjacob		ISP_IOXGET_8(isp, &src->in_tag_type, dst->in_tag_type);
3381155228Smjacob	}
3382163899Smjacob	ISP_IOXGET_32(isp, &src->in_flags, dst->in_flags);
3383163899Smjacob	ISP_IOXGET_16(isp, &src->in_seqid, dst->in_seqid);
3384155228Smjacob	for (i = 0; i < IN_MSGLEN; i++) {
3385163899Smjacob		ISP_IOXGET_8(isp, &src->in_msg[i], dst->in_msg[i]);
3386155228Smjacob	}
3387155228Smjacob	for (i = 0; i < IN_RSVDLEN; i++) {
3388196008Smjacob		ISP_IOXGET_8(isp, &src->in_reserved3[i], dst->in_reserved3[i]);
3389155228Smjacob	}
3390155228Smjacob	for (i = 0; i < QLTM_SENSELEN; i++) {
3391196008Smjacob		ISP_IOXGET_8(isp, &src->in_sense[i], dst->in_sense[i]);
3392155228Smjacob	}
3393155228Smjacob}
3394155228Smjacob
3395155228Smjacobvoid
3396196008Smjacobisp_put_notify_fc(ispsoftc_t *isp, in_fcentry_t *src, in_fcentry_t *dst)
3397155228Smjacob{
3398163899Smjacob	isp_put_hdr(isp, &src->in_header, &dst->in_header);
3399163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved, &dst->in_reserved);
3400163899Smjacob	ISP_IOXPUT_8(isp, src->in_lun, &dst->in_lun);
3401163899Smjacob	ISP_IOXPUT_8(isp, src->in_iid, &dst->in_iid);
3402163899Smjacob	ISP_IOXPUT_16(isp, src->in_scclun, &dst->in_scclun);
3403163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved2, &dst->in_reserved2);
3404163899Smjacob	ISP_IOXPUT_16(isp, src->in_status, &dst->in_status);
3405163899Smjacob	ISP_IOXPUT_16(isp, src->in_task_flags, &dst->in_task_flags);
3406163899Smjacob	ISP_IOXPUT_16(isp, src->in_seqid, &dst->in_seqid);
3407155228Smjacob}
3408155228Smjacob
3409155228Smjacobvoid
3410196008Smjacobisp_put_notify_fc_e(ispsoftc_t *isp, in_fcentry_e_t *src, in_fcentry_e_t *dst)
3411155228Smjacob{
3412163899Smjacob	isp_put_hdr(isp, &src->in_header, &dst->in_header);
3413163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved, &dst->in_reserved);
3414163899Smjacob	ISP_IOXPUT_16(isp, src->in_iid, &dst->in_iid);
3415163899Smjacob	ISP_IOXPUT_16(isp, src->in_scclun, &dst->in_scclun);
3416163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved2, &dst->in_reserved2);
3417163899Smjacob	ISP_IOXPUT_16(isp, src->in_status, &dst->in_status);
3418163899Smjacob	ISP_IOXPUT_16(isp, src->in_task_flags, &dst->in_task_flags);
3419163899Smjacob	ISP_IOXPUT_16(isp, src->in_seqid, &dst->in_seqid);
3420155228Smjacob}
3421155228Smjacob
3422155228Smjacobvoid
3423196008Smjacobisp_put_notify_24xx(ispsoftc_t *isp, in_fcentry_24xx_t *src, in_fcentry_24xx_t *dst)
3424155228Smjacob{
3425163899Smjacob	int i;
3426163899Smjacob
3427163899Smjacob	isp_put_hdr(isp, &src->in_header, &dst->in_header);
3428163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved, &dst->in_reserved);
3429163899Smjacob	ISP_IOXPUT_16(isp, src->in_nphdl, &dst->in_nphdl);
3430163899Smjacob	ISP_IOXPUT_16(isp, src->in_reserved1, &dst->in_reserved1);
3431163899Smjacob	ISP_IOXPUT_16(isp, src->in_flags, &dst->in_flags);
3432163899Smjacob	ISP_IOXPUT_16(isp, src->in_srr_rxid, &dst->in_srr_rxid);
3433163899Smjacob	ISP_IOXPUT_16(isp, src->in_status, &dst->in_status);
3434163899Smjacob	ISP_IOXPUT_8(isp, src->in_status_subcode, &dst->in_status_subcode);
3435163899Smjacob	ISP_IOXPUT_16(isp, src->in_reserved2, &dst->in_reserved2);
3436163899Smjacob	ISP_IOXPUT_32(isp, src->in_rxid, &dst->in_rxid);
3437163899Smjacob	ISP_IOXPUT_16(isp, src->in_srr_reloff_hi, &dst->in_srr_reloff_hi);
3438163899Smjacob	ISP_IOXPUT_16(isp, src->in_srr_reloff_lo, &dst->in_srr_reloff_lo);
3439163899Smjacob	ISP_IOXPUT_16(isp, src->in_srr_iu, &dst->in_srr_iu);
3440163899Smjacob	ISP_IOXPUT_16(isp, src->in_srr_oxid, &dst->in_srr_oxid);
3441196008Smjacob	ISP_IOXPUT_16(isp, src->in_nport_id_hi, &dst->in_nport_id_hi);
3442196008Smjacob	ISP_IOXPUT_8(isp, src->in_nport_id_lo, &dst->in_nport_id_lo);
3443196008Smjacob	ISP_IOXPUT_8(isp, src->in_reserved3, &dst->in_reserved3);
3444196008Smjacob	ISP_IOXPUT_16(isp, src->in_np_handle, &dst->in_np_handle);
3445196008Smjacob	for (i = 0; i < ASIZE(src->in_reserved4); i++) {
3446196008Smjacob		ISP_IOXPUT_8(isp, src->in_reserved4[i], &dst->in_reserved4[i]);
3447163899Smjacob	}
3448196008Smjacob	ISP_IOXPUT_8(isp, src->in_reserved5, &dst->in_reserved5);
3449196008Smjacob	ISP_IOXPUT_8(isp, src->in_vpidx, &dst->in_vpidx);
3450196008Smjacob	ISP_IOXPUT_32(isp, src->in_reserved6, &dst->in_reserved6);
3451163899Smjacob	ISP_IOXPUT_16(isp, src->in_portid_lo, &dst->in_portid_lo);
3452163899Smjacob	ISP_IOXPUT_8(isp, src->in_portid_hi, &dst->in_portid_hi);
3453196008Smjacob	ISP_IOXPUT_8(isp, src->in_reserved7, &dst->in_reserved7);
3454196008Smjacob	ISP_IOXPUT_16(isp, src->in_reserved8, &dst->in_reserved8);
3455163899Smjacob	ISP_IOXPUT_16(isp, src->in_oxid, &dst->in_oxid);
3456155228Smjacob}
3457155228Smjacob
3458155228Smjacobvoid
3459196008Smjacobisp_get_notify_fc(ispsoftc_t *isp, in_fcentry_t *src, in_fcentry_t *dst)
3460155228Smjacob{
3461163899Smjacob	isp_get_hdr(isp, &src->in_header, &dst->in_header);
3462163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved, dst->in_reserved);
3463163899Smjacob	ISP_IOXGET_8(isp, &src->in_lun, dst->in_lun);
3464163899Smjacob	ISP_IOXGET_8(isp, &src->in_iid, dst->in_iid);
3465163899Smjacob	ISP_IOXGET_16(isp, &src->in_scclun, dst->in_scclun);
3466163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved2, dst->in_reserved2);
3467163899Smjacob	ISP_IOXGET_16(isp, &src->in_status, dst->in_status);
3468163899Smjacob	ISP_IOXGET_16(isp, &src->in_task_flags, dst->in_task_flags);
3469163899Smjacob	ISP_IOXGET_16(isp, &src->in_seqid, dst->in_seqid);
3470155228Smjacob}
3471155228Smjacob
3472155228Smjacobvoid
3473196008Smjacobisp_get_notify_fc_e(ispsoftc_t *isp, in_fcentry_e_t *src, in_fcentry_e_t *dst)
3474155228Smjacob{
3475163899Smjacob	isp_get_hdr(isp, &src->in_header, &dst->in_header);
3476163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved, dst->in_reserved);
3477163899Smjacob	ISP_IOXGET_16(isp, &src->in_iid, dst->in_iid);
3478163899Smjacob	ISP_IOXGET_16(isp, &src->in_scclun, dst->in_scclun);
3479163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved2, dst->in_reserved2);
3480163899Smjacob	ISP_IOXGET_16(isp, &src->in_status, dst->in_status);
3481163899Smjacob	ISP_IOXGET_16(isp, &src->in_task_flags, dst->in_task_flags);
3482163899Smjacob	ISP_IOXGET_16(isp, &src->in_seqid, dst->in_seqid);
3483163899Smjacob}
3484163899Smjacob
3485163899Smjacobvoid
3486196008Smjacobisp_get_notify_24xx(ispsoftc_t *isp, in_fcentry_24xx_t *src, in_fcentry_24xx_t *dst)
3487163899Smjacob{
3488155228Smjacob	int i;
3489163899Smjacob
3490163899Smjacob	isp_get_hdr(isp, &src->in_header, &dst->in_header);
3491163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved, dst->in_reserved);
3492163899Smjacob	ISP_IOXGET_16(isp, &src->in_nphdl, dst->in_nphdl);
3493163899Smjacob	ISP_IOXGET_16(isp, &src->in_reserved1, dst->in_reserved1);
3494163899Smjacob	ISP_IOXGET_16(isp, &src->in_flags, dst->in_flags);
3495163899Smjacob	ISP_IOXGET_16(isp, &src->in_srr_rxid, dst->in_srr_rxid);
3496163899Smjacob	ISP_IOXGET_16(isp, &src->in_status, dst->in_status);
3497163899Smjacob	ISP_IOXGET_8(isp, &src->in_status_subcode, dst->in_status_subcode);
3498163899Smjacob	ISP_IOXGET_16(isp, &src->in_reserved2, dst->in_reserved2);
3499163899Smjacob	ISP_IOXGET_32(isp, &src->in_rxid, dst->in_rxid);
3500163899Smjacob	ISP_IOXGET_16(isp, &src->in_srr_reloff_hi, dst->in_srr_reloff_hi);
3501163899Smjacob	ISP_IOXGET_16(isp, &src->in_srr_reloff_lo, dst->in_srr_reloff_lo);
3502163899Smjacob	ISP_IOXGET_16(isp, &src->in_srr_iu, dst->in_srr_iu);
3503163899Smjacob	ISP_IOXGET_16(isp, &src->in_srr_oxid, dst->in_srr_oxid);
3504196008Smjacob	ISP_IOXGET_16(isp, &src->in_nport_id_hi, dst->in_nport_id_hi);
3505196008Smjacob	ISP_IOXGET_8(isp, &src->in_nport_id_lo, dst->in_nport_id_lo);
3506196008Smjacob	ISP_IOXGET_8(isp, &src->in_reserved3, dst->in_reserved3);
3507196008Smjacob	ISP_IOXGET_16(isp, &src->in_np_handle, dst->in_np_handle);
3508196008Smjacob	for (i = 0; i < ASIZE(src->in_reserved4); i++) {
3509196008Smjacob		ISP_IOXGET_8(isp, &src->in_reserved4[i], dst->in_reserved4[i]);
3510163899Smjacob	}
3511196008Smjacob	ISP_IOXGET_8(isp, &src->in_reserved5, dst->in_reserved5);
3512196008Smjacob	ISP_IOXGET_8(isp, &src->in_vpidx, dst->in_vpidx);
3513196008Smjacob	ISP_IOXGET_32(isp, &src->in_reserved6, dst->in_reserved6);
3514163899Smjacob	ISP_IOXGET_16(isp, &src->in_portid_lo, dst->in_portid_lo);
3515163899Smjacob	ISP_IOXGET_8(isp, &src->in_portid_hi, dst->in_portid_hi);
3516196008Smjacob	ISP_IOXGET_8(isp, &src->in_reserved7, dst->in_reserved7);
3517196008Smjacob	ISP_IOXGET_16(isp, &src->in_reserved8, dst->in_reserved8);
3518163899Smjacob	ISP_IOXGET_16(isp, &src->in_oxid, dst->in_oxid);
3519163899Smjacob}
3520163899Smjacob
3521163899Smjacobvoid
3522163899Smjacobisp_put_notify_ack(ispsoftc_t *isp, na_entry_t *src,  na_entry_t *dst)
3523163899Smjacob{
3524163899Smjacob	int i;
3525163899Smjacob	isp_put_hdr(isp, &src->na_header, &dst->na_header);
3526163899Smjacob	ISP_IOXPUT_32(isp, src->na_reserved, &dst->na_reserved);
3527155228Smjacob	if (ISP_IS_SBUS(isp)) {
3528163899Smjacob		ISP_IOXPUT_8(isp, src->na_lun, &dst->na_iid);
3529163899Smjacob		ISP_IOXPUT_8(isp, src->na_iid, &dst->na_lun);
3530163899Smjacob		ISP_IOXPUT_8(isp, src->na_status, &dst->na_event);
3531163899Smjacob		ISP_IOXPUT_8(isp, src->na_event, &dst->na_status);
3532155228Smjacob	} else {
3533163899Smjacob		ISP_IOXPUT_8(isp, src->na_lun, &dst->na_lun);
3534163899Smjacob		ISP_IOXPUT_8(isp, src->na_iid, &dst->na_iid);
3535163899Smjacob		ISP_IOXPUT_8(isp, src->na_status, &dst->na_status);
3536163899Smjacob		ISP_IOXPUT_8(isp, src->na_event, &dst->na_event);
3537155228Smjacob	}
3538163899Smjacob	ISP_IOXPUT_32(isp, src->na_flags, &dst->na_flags);
3539155228Smjacob	for (i = 0; i < NA_RSVDLEN; i++) {
3540196008Smjacob		ISP_IOXPUT_16(isp, src->na_reserved3[i], &dst->na_reserved3[i]);
3541155228Smjacob	}
3542155228Smjacob}
3543155228Smjacob
3544155228Smjacobvoid
3545163899Smjacobisp_get_notify_ack(ispsoftc_t *isp, na_entry_t *src, na_entry_t *dst)
3546155228Smjacob{
3547155228Smjacob	int i;
3548163899Smjacob	isp_get_hdr(isp, &src->na_header, &dst->na_header);
3549163899Smjacob	ISP_IOXGET_32(isp, &src->na_reserved, dst->na_reserved);
3550155228Smjacob	if (ISP_IS_SBUS(isp)) {
3551163899Smjacob		ISP_IOXGET_8(isp, &src->na_lun, dst->na_iid);
3552163899Smjacob		ISP_IOXGET_8(isp, &src->na_iid, dst->na_lun);
3553163899Smjacob		ISP_IOXGET_8(isp, &src->na_status, dst->na_event);
3554163899Smjacob		ISP_IOXGET_8(isp, &src->na_event, dst->na_status);
3555155228Smjacob	} else {
3556163899Smjacob		ISP_IOXGET_8(isp, &src->na_lun, dst->na_lun);
3557163899Smjacob		ISP_IOXGET_8(isp, &src->na_iid, dst->na_iid);
3558163899Smjacob		ISP_IOXGET_8(isp, &src->na_status, dst->na_status);
3559163899Smjacob		ISP_IOXGET_8(isp, &src->na_event, dst->na_event);
3560155228Smjacob	}
3561163899Smjacob	ISP_IOXGET_32(isp, &src->na_flags, dst->na_flags);
3562155228Smjacob	for (i = 0; i < NA_RSVDLEN; i++) {
3563196008Smjacob		ISP_IOXGET_16(isp, &src->na_reserved3[i], dst->na_reserved3[i]);
3564155228Smjacob	}
3565155228Smjacob}
3566155228Smjacob
3567155228Smjacobvoid
3568196008Smjacobisp_put_notify_ack_fc(ispsoftc_t *isp, na_fcentry_t *src, na_fcentry_t *dst)
3569155228Smjacob{
3570155228Smjacob	int i;
3571163899Smjacob	isp_put_hdr(isp, &src->na_header, &dst->na_header);
3572163899Smjacob	ISP_IOXPUT_32(isp, src->na_reserved, &dst->na_reserved);
3573163899Smjacob	ISP_IOXPUT_8(isp, src->na_reserved1, &dst->na_reserved1);
3574163899Smjacob	ISP_IOXPUT_8(isp, src->na_iid, &dst->na_iid);
3575163899Smjacob	ISP_IOXPUT_16(isp, src->na_response, &dst->na_response);
3576163899Smjacob	ISP_IOXPUT_16(isp, src->na_flags, &dst->na_flags);
3577163899Smjacob	ISP_IOXPUT_16(isp, src->na_reserved2, &dst->na_reserved2);
3578163899Smjacob	ISP_IOXPUT_16(isp, src->na_status, &dst->na_status);
3579163899Smjacob	ISP_IOXPUT_16(isp, src->na_task_flags, &dst->na_task_flags);
3580163899Smjacob	ISP_IOXPUT_16(isp, src->na_seqid, &dst->na_seqid);
3581155228Smjacob	for (i = 0; i < NA2_RSVDLEN; i++) {
3582196008Smjacob		ISP_IOXPUT_16(isp, src->na_reserved3[i], &dst->na_reserved3[i]);
3583155228Smjacob	}
3584155228Smjacob}
3585155228Smjacob
3586155228Smjacobvoid
3587196008Smjacobisp_put_notify_ack_fc_e(ispsoftc_t *isp, na_fcentry_e_t *src, na_fcentry_e_t *dst)
3588155228Smjacob{
3589155228Smjacob	int i;
3590163899Smjacob	isp_put_hdr(isp, &src->na_header, &dst->na_header);
3591163899Smjacob	ISP_IOXPUT_32(isp, src->na_reserved, &dst->na_reserved);
3592163899Smjacob	ISP_IOXPUT_16(isp, src->na_iid, &dst->na_iid);
3593163899Smjacob	ISP_IOXPUT_16(isp, src->na_response, &dst->na_response);
3594163899Smjacob	ISP_IOXPUT_16(isp, src->na_flags, &dst->na_flags);
3595163899Smjacob	ISP_IOXPUT_16(isp, src->na_reserved2, &dst->na_reserved2);
3596163899Smjacob	ISP_IOXPUT_16(isp, src->na_status, &dst->na_status);
3597163899Smjacob	ISP_IOXPUT_16(isp, src->na_task_flags, &dst->na_task_flags);
3598163899Smjacob	ISP_IOXPUT_16(isp, src->na_seqid, &dst->na_seqid);
3599155228Smjacob	for (i = 0; i < NA2_RSVDLEN; i++) {
3600196008Smjacob		ISP_IOXPUT_16(isp, src->na_reserved3[i], &dst->na_reserved3[i]);
3601155228Smjacob	}
3602155228Smjacob}
3603155228Smjacob
3604155228Smjacobvoid
3605196008Smjacobisp_put_notify_24xx_ack(ispsoftc_t *isp, na_fcentry_24xx_t *src, na_fcentry_24xx_t *dst)
3606155228Smjacob{
3607155228Smjacob	int i;
3608163899Smjacob
3609163899Smjacob	isp_put_hdr(isp, &src->na_header, &dst->na_header);
3610163899Smjacob	ISP_IOXPUT_32(isp, src->na_handle, &dst->na_handle);
3611163899Smjacob	ISP_IOXPUT_16(isp, src->na_nphdl, &dst->na_nphdl);
3612163899Smjacob	ISP_IOXPUT_16(isp, src->na_reserved1, &dst->na_reserved1);
3613163899Smjacob	ISP_IOXPUT_16(isp, src->na_flags, &dst->na_flags);
3614163899Smjacob	ISP_IOXPUT_16(isp, src->na_srr_rxid, &dst->na_srr_rxid);
3615163899Smjacob	ISP_IOXPUT_16(isp, src->na_status, &dst->na_status);
3616163899Smjacob	ISP_IOXPUT_8(isp, src->na_status_subcode, &dst->na_status_subcode);
3617163899Smjacob	ISP_IOXPUT_16(isp, src->na_reserved2, &dst->na_reserved2);
3618163899Smjacob	ISP_IOXPUT_32(isp, src->na_rxid, &dst->na_rxid);
3619163899Smjacob	ISP_IOXPUT_16(isp, src->na_srr_reloff_hi, &dst->na_srr_reloff_hi);
3620163899Smjacob	ISP_IOXPUT_16(isp, src->na_srr_reloff_lo, &dst->na_srr_reloff_lo);
3621163899Smjacob	ISP_IOXPUT_16(isp, src->na_srr_iu, &dst->na_srr_iu);
3622163899Smjacob	ISP_IOXPUT_16(isp, src->na_srr_flags, &dst->na_srr_flags);
3623163899Smjacob	for (i = 0; i < 18; i++) {
3624163899Smjacob		ISP_IOXPUT_8(isp, src->na_reserved3[i], &dst->na_reserved3[i]);
3625163899Smjacob	}
3626163899Smjacob	ISP_IOXPUT_8(isp, src->na_reserved4, &dst->na_reserved4);
3627196008Smjacob	ISP_IOXPUT_8(isp, src->na_vpidx, &dst->na_vpidx);
3628196008Smjacob	ISP_IOXPUT_8(isp, src->na_srr_reject_vunique, &dst->na_srr_reject_vunique);
3629196008Smjacob	ISP_IOXPUT_8(isp, src->na_srr_reject_explanation, &dst->na_srr_reject_explanation);
3630163899Smjacob	ISP_IOXPUT_8(isp, src->na_srr_reject_code, &dst->na_srr_reject_code);
3631163899Smjacob	ISP_IOXPUT_8(isp, src->na_reserved5, &dst->na_reserved5);
3632163899Smjacob	for (i = 0; i < 6; i++) {
3633163899Smjacob		ISP_IOXPUT_8(isp, src->na_reserved6[i], &dst->na_reserved6[i]);
3634163899Smjacob	}
3635163899Smjacob	ISP_IOXPUT_16(isp, src->na_oxid, &dst->na_oxid);
3636163899Smjacob}
3637163899Smjacob
3638163899Smjacobvoid
3639196008Smjacobisp_get_notify_ack_fc(ispsoftc_t *isp, na_fcentry_t *src, na_fcentry_t *dst)
3640163899Smjacob{
3641163899Smjacob	int i;
3642163899Smjacob	isp_get_hdr(isp, &src->na_header, &dst->na_header);
3643163899Smjacob	ISP_IOXGET_32(isp, &src->na_reserved, dst->na_reserved);
3644163899Smjacob	ISP_IOXGET_8(isp, &src->na_reserved1, dst->na_reserved1);
3645163899Smjacob	ISP_IOXGET_8(isp, &src->na_iid, dst->na_iid);
3646163899Smjacob	ISP_IOXGET_16(isp, &src->na_response, dst->na_response);
3647163899Smjacob	ISP_IOXGET_16(isp, &src->na_flags, dst->na_flags);
3648163899Smjacob	ISP_IOXGET_16(isp, &src->na_reserved2, dst->na_reserved2);
3649163899Smjacob	ISP_IOXGET_16(isp, &src->na_status, dst->na_status);
3650163899Smjacob	ISP_IOXGET_16(isp, &src->na_task_flags, dst->na_task_flags);
3651163899Smjacob	ISP_IOXGET_16(isp, &src->na_seqid, dst->na_seqid);
3652155228Smjacob	for (i = 0; i < NA2_RSVDLEN; i++) {
3653196008Smjacob		ISP_IOXGET_16(isp, &src->na_reserved3[i], dst->na_reserved3[i]);
3654155228Smjacob	}
3655155228Smjacob}
3656155228Smjacob
3657155228Smjacobvoid
3658196008Smjacobisp_get_notify_ack_fc_e(ispsoftc_t *isp, na_fcentry_e_t *src, na_fcentry_e_t *dst)
3659155228Smjacob{
3660155228Smjacob	int i;
3661163899Smjacob	isp_get_hdr(isp, &src->na_header, &dst->na_header);
3662163899Smjacob	ISP_IOXGET_32(isp, &src->na_reserved, dst->na_reserved);
3663163899Smjacob	ISP_IOXGET_16(isp, &src->na_iid, dst->na_iid);
3664163899Smjacob	ISP_IOXGET_16(isp, &src->na_response, dst->na_response);
3665163899Smjacob	ISP_IOXGET_16(isp, &src->na_flags, dst->na_flags);
3666163899Smjacob	ISP_IOXGET_16(isp, &src->na_reserved2, dst->na_reserved2);
3667163899Smjacob	ISP_IOXGET_16(isp, &src->na_status, dst->na_status);
3668163899Smjacob	ISP_IOXGET_16(isp, &src->na_task_flags, dst->na_task_flags);
3669163899Smjacob	ISP_IOXGET_16(isp, &src->na_seqid, dst->na_seqid);
3670155228Smjacob	for (i = 0; i < NA2_RSVDLEN; i++) {
3671196008Smjacob		ISP_IOXGET_16(isp, &src->na_reserved3[i], dst->na_reserved3[i]);
3672155228Smjacob	}
3673155228Smjacob}
3674163899Smjacob
3675163899Smjacobvoid
3676196008Smjacobisp_get_notify_ack_24xx(ispsoftc_t *isp, na_fcentry_24xx_t *src, na_fcentry_24xx_t *dst)
3677163899Smjacob{
3678163899Smjacob	int i;
3679163899Smjacob
3680163899Smjacob	isp_get_hdr(isp, &src->na_header, &dst->na_header);
3681163899Smjacob	ISP_IOXGET_32(isp, &src->na_handle, dst->na_handle);
3682163899Smjacob	ISP_IOXGET_16(isp, &src->na_nphdl, dst->na_nphdl);
3683163899Smjacob	ISP_IOXGET_16(isp, &src->na_reserved1, dst->na_reserved1);
3684163899Smjacob	ISP_IOXGET_16(isp, &src->na_flags, dst->na_flags);
3685163899Smjacob	ISP_IOXGET_16(isp, &src->na_srr_rxid, dst->na_srr_rxid);
3686163899Smjacob	ISP_IOXGET_16(isp, &src->na_status, dst->na_status);
3687163899Smjacob	ISP_IOXGET_8(isp, &src->na_status_subcode, dst->na_status_subcode);
3688163899Smjacob	ISP_IOXGET_16(isp, &src->na_reserved2, dst->na_reserved2);
3689163899Smjacob	ISP_IOXGET_32(isp, &src->na_rxid, dst->na_rxid);
3690163899Smjacob	ISP_IOXGET_16(isp, &src->na_srr_reloff_hi, dst->na_srr_reloff_hi);
3691163899Smjacob	ISP_IOXGET_16(isp, &src->na_srr_reloff_lo, dst->na_srr_reloff_lo);
3692163899Smjacob	ISP_IOXGET_16(isp, &src->na_srr_iu, dst->na_srr_iu);
3693163899Smjacob	ISP_IOXGET_16(isp, &src->na_srr_flags, dst->na_srr_flags);
3694163899Smjacob	for (i = 0; i < 18; i++) {
3695163899Smjacob		ISP_IOXGET_8(isp, &src->na_reserved3[i], dst->na_reserved3[i]);
3696163899Smjacob	}
3697163899Smjacob	ISP_IOXGET_8(isp, &src->na_reserved4, dst->na_reserved4);
3698196008Smjacob	ISP_IOXGET_8(isp, &src->na_vpidx, dst->na_vpidx);
3699196008Smjacob	ISP_IOXGET_8(isp, &src->na_srr_reject_vunique, dst->na_srr_reject_vunique);
3700196008Smjacob	ISP_IOXGET_8(isp, &src->na_srr_reject_explanation, dst->na_srr_reject_explanation);
3701163899Smjacob	ISP_IOXGET_8(isp, &src->na_srr_reject_code, dst->na_srr_reject_code);
3702163899Smjacob	ISP_IOXGET_8(isp, &src->na_reserved5, dst->na_reserved5);
3703163899Smjacob	for (i = 0; i < 6; i++) {
3704163899Smjacob		ISP_IOXGET_8(isp, &src->na_reserved6[i], dst->na_reserved6[i]);
3705163899Smjacob	}
3706163899Smjacob	ISP_IOXGET_16(isp, &src->na_oxid, dst->na_oxid);
3707163899Smjacob}
3708163899Smjacob
3709163899Smjacobvoid
3710163899Smjacobisp_get_abts(ispsoftc_t *isp, abts_t *src, abts_t *dst)
3711163899Smjacob{
3712163899Smjacob	int i;
3713163899Smjacob
3714163899Smjacob	isp_get_hdr(isp, &src->abts_header, &dst->abts_header);
3715163899Smjacob	for (i = 0; i < 6; i++) {
3716196008Smjacob		ISP_IOXGET_8(isp, &src->abts_reserved0[i], dst->abts_reserved0[i]);
3717163899Smjacob	}
3718163899Smjacob	ISP_IOXGET_16(isp, &src->abts_nphdl, dst->abts_nphdl);
3719163899Smjacob	ISP_IOXGET_16(isp, &src->abts_reserved1, dst->abts_reserved1);
3720163899Smjacob	ISP_IOXGET_16(isp, &src->abts_sof, dst->abts_sof);
3721163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rxid_abts, dst->abts_rxid_abts);
3722163899Smjacob	ISP_IOXGET_16(isp, &src->abts_did_lo, dst->abts_did_lo);
3723163899Smjacob	ISP_IOXGET_8(isp, &src->abts_did_hi, dst->abts_did_hi);
3724163899Smjacob	ISP_IOXGET_8(isp, &src->abts_r_ctl, dst->abts_r_ctl);
3725163899Smjacob	ISP_IOXGET_16(isp, &src->abts_sid_lo, dst->abts_sid_lo);
3726163899Smjacob	ISP_IOXGET_8(isp, &src->abts_sid_hi, dst->abts_sid_hi);
3727163899Smjacob	ISP_IOXGET_8(isp, &src->abts_cs_ctl, dst->abts_cs_ctl);
3728163899Smjacob	ISP_IOXGET_16(isp, &src->abts_fs_ctl, dst->abts_fs_ctl);
3729163899Smjacob	ISP_IOXGET_8(isp, &src->abts_f_ctl, dst->abts_f_ctl);
3730163899Smjacob	ISP_IOXGET_8(isp, &src->abts_type, dst->abts_type);
3731163899Smjacob	ISP_IOXGET_16(isp, &src->abts_seq_cnt, dst->abts_seq_cnt);
3732163899Smjacob	ISP_IOXGET_8(isp, &src->abts_df_ctl, dst->abts_df_ctl);
3733163899Smjacob	ISP_IOXGET_8(isp, &src->abts_seq_id, dst->abts_seq_id);
3734163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rx_id, dst->abts_rx_id);
3735163899Smjacob	ISP_IOXGET_16(isp, &src->abts_ox_id, dst->abts_ox_id);
3736163899Smjacob	ISP_IOXGET_32(isp, &src->abts_param, dst->abts_param);
3737163899Smjacob	for (i = 0; i < 16; i++) {
3738196008Smjacob		ISP_IOXGET_8(isp, &src->abts_reserved2[i], dst->abts_reserved2[i]);
3739163899Smjacob	}
3740163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rxid_task, dst->abts_rxid_task);
3741163899Smjacob}
3742163899Smjacob
3743163899Smjacobvoid
3744163899Smjacobisp_put_abts_rsp(ispsoftc_t *isp, abts_rsp_t *src, abts_rsp_t *dst)
3745163899Smjacob{
3746163899Smjacob	int i;
3747163899Smjacob
3748163899Smjacob	isp_put_hdr(isp, &src->abts_rsp_header, &dst->abts_rsp_header);
3749163899Smjacob	ISP_IOXPUT_32(isp, src->abts_rsp_handle, &dst->abts_rsp_handle);
3750163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_status, &dst->abts_rsp_status);
3751163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_nphdl, &dst->abts_rsp_nphdl);
3752163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_ctl_flags, &dst->abts_rsp_ctl_flags);
3753163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_sof, &dst->abts_rsp_sof);
3754163899Smjacob	ISP_IOXPUT_32(isp, src->abts_rsp_rxid_abts, &dst->abts_rsp_rxid_abts);
3755163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_did_lo, &dst->abts_rsp_did_lo);
3756163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_did_hi, &dst->abts_rsp_did_hi);
3757163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_r_ctl, &dst->abts_rsp_r_ctl);
3758163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_sid_lo, &dst->abts_rsp_sid_lo);
3759163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_sid_hi, &dst->abts_rsp_sid_hi);
3760163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_cs_ctl, &dst->abts_rsp_cs_ctl);
3761163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_f_ctl_lo, &dst->abts_rsp_f_ctl_lo);
3762163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_f_ctl_hi, &dst->abts_rsp_f_ctl_hi);
3763163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_type, &dst->abts_rsp_type);
3764163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_seq_cnt, &dst->abts_rsp_seq_cnt);
3765163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_df_ctl, &dst->abts_rsp_df_ctl);
3766163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_seq_id, &dst->abts_rsp_seq_id);
3767163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_rx_id, &dst->abts_rsp_rx_id);
3768163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_ox_id, &dst->abts_rsp_ox_id);
3769163899Smjacob	ISP_IOXPUT_32(isp, src->abts_rsp_param, &dst->abts_rsp_param);
3770163899Smjacob	if (src->abts_rsp_r_ctl == BA_ACC) {
3771196008Smjacob		ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.reserved, &dst->abts_rsp_payload.ba_acc.reserved);
3772196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_acc.last_seq_id, &dst->abts_rsp_payload.ba_acc.last_seq_id);
3773196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_acc.seq_id_valid, &dst->abts_rsp_payload.ba_acc.seq_id_valid);
3774196008Smjacob		ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.aborted_rx_id, &dst->abts_rsp_payload.ba_acc.aborted_rx_id);
3775196008Smjacob		ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.aborted_ox_id, &dst->abts_rsp_payload.ba_acc.aborted_ox_id);
3776196008Smjacob		ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.high_seq_cnt, &dst->abts_rsp_payload.ba_acc.high_seq_cnt);
3777196008Smjacob		ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.low_seq_cnt, &dst->abts_rsp_payload.ba_acc.low_seq_cnt);
3778163899Smjacob		for (i = 0; i < 4; i++) {
3779196008Smjacob			ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.reserved2[i], &dst->abts_rsp_payload.ba_acc.reserved2[i]);
3780163899Smjacob		}
3781163899Smjacob	} else if (src->abts_rsp_r_ctl == BA_RJT) {
3782196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.vendor_unique, &dst->abts_rsp_payload.ba_rjt.vendor_unique);
3783196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.explanation, &dst->abts_rsp_payload.ba_rjt.explanation);
3784196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.reason, &dst->abts_rsp_payload.ba_rjt.reason);
3785196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.reserved, &dst->abts_rsp_payload.ba_rjt.reserved);
3786163899Smjacob		for (i = 0; i < 12; i++) {
3787196008Smjacob			ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_rjt.reserved2[i], &dst->abts_rsp_payload.ba_rjt.reserved2[i]);
3788163899Smjacob		}
3789163899Smjacob	} else {
3790163899Smjacob		for (i = 0; i < 16; i++) {
3791196008Smjacob			ISP_IOXPUT_8(isp, src->abts_rsp_payload.reserved[i], &dst->abts_rsp_payload.reserved[i]);
3792163899Smjacob		}
3793163899Smjacob	}
3794163899Smjacob	ISP_IOXPUT_32(isp, src->abts_rsp_rxid_task, &dst->abts_rsp_rxid_task);
3795163899Smjacob}
3796163899Smjacob
3797163899Smjacobvoid
3798163899Smjacobisp_get_abts_rsp(ispsoftc_t *isp, abts_rsp_t *src, abts_rsp_t *dst)
3799163899Smjacob{
3800163899Smjacob	int i;
3801163899Smjacob
3802163899Smjacob	isp_get_hdr(isp, &src->abts_rsp_header, &dst->abts_rsp_header);
3803163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_handle, dst->abts_rsp_handle);
3804163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_status, dst->abts_rsp_status);
3805163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_nphdl, dst->abts_rsp_nphdl);
3806163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_ctl_flags, dst->abts_rsp_ctl_flags);
3807163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_sof, dst->abts_rsp_sof);
3808163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_rxid_abts, dst->abts_rsp_rxid_abts);
3809163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_did_lo, dst->abts_rsp_did_lo);
3810163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_did_hi, dst->abts_rsp_did_hi);
3811163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_r_ctl, dst->abts_rsp_r_ctl);
3812163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_sid_lo, dst->abts_rsp_sid_lo);
3813163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_sid_hi, dst->abts_rsp_sid_hi);
3814163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_cs_ctl, dst->abts_rsp_cs_ctl);
3815163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_f_ctl_lo, dst->abts_rsp_f_ctl_lo);
3816163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_f_ctl_hi, dst->abts_rsp_f_ctl_hi);
3817163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_type, dst->abts_rsp_type);
3818163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_seq_cnt, dst->abts_rsp_seq_cnt);
3819163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_df_ctl, dst->abts_rsp_df_ctl);
3820163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_seq_id, dst->abts_rsp_seq_id);
3821163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_rx_id, dst->abts_rsp_rx_id);
3822163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_ox_id, dst->abts_rsp_ox_id);
3823163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_param, dst->abts_rsp_param);
3824163899Smjacob	for (i = 0; i < 8; i++) {
3825196008Smjacob		ISP_IOXGET_8(isp, &src->abts_rsp_payload.rsp.reserved[i], dst->abts_rsp_payload.rsp.reserved[i]);
3826163899Smjacob	}
3827196008Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_payload.rsp.subcode1, dst->abts_rsp_payload.rsp.subcode1);
3828196008Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_payload.rsp.subcode2, dst->abts_rsp_payload.rsp.subcode2);
3829163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_rxid_task, dst->abts_rsp_rxid_task);
3830163899Smjacob}
3831155228Smjacob#endif	/* ISP_TARGET_MODE */
3832163899Smjacob/*
3833163899Smjacob * vim:ts=8:sw=8
3834163899Smjacob */
3835