1155228Smjacob/*-
2321870Smav *  Copyright (c) 2009-2017 Alexander Motin <mav@FreeBSD.org>
3196008Smjacob *  Copyright (c) 1997-2009 by Matthew Jacob
4167403Smjacob *  All rights reserved.
5196008Smjacob *
6167403Smjacob *  Redistribution and use in source and binary forms, with or without
7167403Smjacob *  modification, are permitted provided that the following conditions
8167403Smjacob *  are met:
9196008Smjacob *
10167403Smjacob *  1. Redistributions of source code must retain the above copyright
11167403Smjacob *     notice, this list of conditions and the following disclaimer.
12167403Smjacob *  2. Redistributions in binary form must reproduce the above copyright
13167403Smjacob *     notice, this list of conditions and the following disclaimer in the
14167403Smjacob *     documentation and/or other materials provided with the distribution.
15196008Smjacob *
16167403Smjacob *  THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17167403Smjacob *  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18167403Smjacob *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19167403Smjacob *  ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
20167403Smjacob *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21167403Smjacob *  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22167403Smjacob *  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23167403Smjacob *  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24167403Smjacob *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25167403Smjacob *  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26167403Smjacob *  SUCH DAMAGE.
27196008Smjacob *
28155228Smjacob */
29160410Smjacob/*
30160410Smjacob * Qlogic Host Adapter Internal Library Functions
31160410Smjacob */
32155704Smjacob#ifdef	__NetBSD__
33167403Smjacob#include <sys/cdefs.h>
34167403Smjacob__KERNEL_RCSID(0, "$NetBSD$");
35155704Smjacob#include <dev/ic/isp_netbsd.h>
36155704Smjacob#endif
37155704Smjacob#ifdef	__FreeBSD__
38160410Smjacob#include <sys/cdefs.h>
39160410Smjacob__FBSDID("$FreeBSD: stable/11/sys/dev/isp/isp_library.c 321870 2017-08-01 13:03:06Z mav $");
40155228Smjacob#include <dev/isp/isp_freebsd.h>
41155704Smjacob#endif
42155704Smjacob#ifdef	__OpenBSD__
43155704Smjacob#include <dev/ic/isp_openbsd.h>
44155704Smjacob#endif
45155704Smjacob#ifdef	__linux__
46155704Smjacob#include "isp_linux.h"
47155704Smjacob#endif
48155704Smjacob#ifdef	__svr4__
49155704Smjacob#include "isp_solaris.h"
50155704Smjacob#endif
51155228Smjacob
52196008Smjacobconst char *isp_class3_roles[4] = {
53196008Smjacob    "None", "Target", "Initiator", "Target/Initiator"
54196008Smjacob};
55196008Smjacob
56196008Smjacob/*
57196008Smjacob * Command shipping- finish off first queue entry and do dma mapping and additional segments as needed.
58196008Smjacob *
59196008Smjacob * Called with the first queue entry at least partially filled out.
60196008Smjacob */
61155228Smjacobint
62238869Smjacobisp_send_cmd(ispsoftc_t *isp, void *fqe, void *segp, uint32_t nsegs, uint32_t totalcnt, isp_ddir_t ddir, ispds64_t *ecmd)
63196008Smjacob{
64196008Smjacob	uint8_t storage[QENTRY_LEN];
65317360Smav	uint8_t type, nqe, need64;
66317360Smav	uint32_t seg, seglim, nxt, nxtnxt, ddf;
67196008Smjacob	ispds_t *dsp = NULL;
68196008Smjacob	ispds64_t *dsp64 = NULL;
69196008Smjacob	void *qe0, *qe1;
70196008Smjacob
71196008Smjacob	qe0 = isp_getrqentry(isp);
72196008Smjacob	if (qe0 == NULL) {
73196008Smjacob		return (CMD_EAGAIN);
74196008Smjacob	}
75196008Smjacob	nxt = ISP_NXT_QENTRY(isp->isp_reqidx, RQUEST_QUEUE_LEN(isp));
76196008Smjacob
77196008Smjacob	type = ((isphdr_t *)fqe)->rqs_entry_type;
78196008Smjacob	nqe = 1;
79196008Smjacob
80196008Smjacob	/*
81196008Smjacob	 * If we have no data to transmit, just copy the first IOCB and start it up.
82196008Smjacob	 */
83196008Smjacob	if (ddir == ISP_NOXFR) {
84196008Smjacob		if (type == RQSTYPE_T2RQS || type == RQSTYPE_T3RQS) {
85196008Smjacob			ddf = CT2_NO_DATA;
86196008Smjacob		} else {
87196008Smjacob			ddf = 0;
88196008Smjacob		}
89196008Smjacob		goto copy_and_sync;
90196008Smjacob	}
91196008Smjacob
92317360Smav	need64 = 0;
93317360Smav	for (seg = 0; seg < nsegs; seg++)
94317360Smav		need64 |= XS_NEED_DMA64_SEG(segp, seg);
95317360Smav	if (need64) {
96317360Smav		if (type == RQSTYPE_T2RQS)
97317360Smav			((isphdr_t *)fqe)->rqs_entry_type = type = RQSTYPE_T3RQS;
98317360Smav		else if (type == RQSTYPE_REQUEST)
99317360Smav			((isphdr_t *)fqe)->rqs_entry_type = type = RQSTYPE_A64;
100317360Smav		else if (type == RQSTYPE_CTIO2)
101317360Smav			((isphdr_t *)fqe)->rqs_entry_type = type = RQSTYPE_CTIO3;
102317360Smav	}
103317360Smav
104196008Smjacob	/*
105317360Smav	 * First figure out how many pieces of data to transfer, what
106317360Smav	 * kind and how many we can put into the first queue entry.
107196008Smjacob	 */
108196008Smjacob	switch (type) {
109196008Smjacob	case RQSTYPE_REQUEST:
110196008Smjacob		ddf = (ddir == ISP_TO_DEVICE)? REQFLAG_DATA_OUT : REQFLAG_DATA_IN;
111196008Smjacob		dsp = ((ispreq_t *)fqe)->req_dataseg;
112196008Smjacob		seglim = ISP_RQDSEG;
113196008Smjacob		break;
114196008Smjacob	case RQSTYPE_CMDONLY:
115196008Smjacob		ddf = (ddir == ISP_TO_DEVICE)? REQFLAG_DATA_OUT : REQFLAG_DATA_IN;
116196008Smjacob		seglim = 0;
117196008Smjacob		break;
118196008Smjacob	case RQSTYPE_T2RQS:
119196008Smjacob		ddf = (ddir == ISP_TO_DEVICE)? REQFLAG_DATA_OUT : REQFLAG_DATA_IN;
120196008Smjacob		dsp = ((ispreqt2_t *)fqe)->req_dataseg;
121196008Smjacob		seglim = ISP_RQDSEG_T2;
122196008Smjacob		break;
123196008Smjacob	case RQSTYPE_A64:
124196008Smjacob		ddf = (ddir == ISP_TO_DEVICE)? REQFLAG_DATA_OUT : REQFLAG_DATA_IN;
125196008Smjacob		dsp64 = ((ispreqt3_t *)fqe)->req_dataseg;
126196008Smjacob		seglim = ISP_RQDSEG_T3;
127196008Smjacob		break;
128196008Smjacob	case RQSTYPE_T3RQS:
129196008Smjacob		ddf = (ddir == ISP_TO_DEVICE)? REQFLAG_DATA_OUT : REQFLAG_DATA_IN;
130196008Smjacob		dsp64 = ((ispreqt3_t *)fqe)->req_dataseg;
131196008Smjacob		seglim = ISP_RQDSEG_T3;
132196008Smjacob		break;
133196008Smjacob	case RQSTYPE_T7RQS:
134196008Smjacob		ddf = (ddir == ISP_TO_DEVICE)? FCP_CMND_DATA_WRITE : FCP_CMND_DATA_READ;
135196008Smjacob		dsp64 = &((ispreqt7_t *)fqe)->req_dataseg;
136196008Smjacob		seglim = 1;
137196008Smjacob		break;
138317360Smav#ifdef	ISP_TARGET_MODE
139317360Smav	case RQSTYPE_CTIO2:
140317360Smav		dsp = ((ct2_entry_t *)fqe)->rsp.m0.u.ct_dataseg;
141317360Smav		seglim = ISP_RQDSEG_T2;
142317360Smav		break;
143317360Smav	case RQSTYPE_CTIO3:
144317360Smav		dsp64 = ((ct2_entry_t *)fqe)->rsp.m0.u.ct_dataseg64;
145317360Smav		seglim = ISP_RQDSEG_T3;
146317360Smav		break;
147317360Smav	case RQSTYPE_CTIO7:
148317360Smav		dsp64 = &((ct7_entry_t *)fqe)->rsp.m0.ds;
149317360Smav		seglim = 1;
150317360Smav		break;
151317360Smav#endif
152196008Smjacob	default:
153196008Smjacob		return (CMD_COMPLETE);
154196008Smjacob	}
155317360Smav	if (seglim > nsegs)
156196008Smjacob		seglim = nsegs;
157317360Smav	seg = 0;
158317360Smav	while (seg < seglim) {
159196008Smjacob		if (dsp64) {
160196008Smjacob			XS_GET_DMA64_SEG(dsp64++, segp, seg++);
161196008Smjacob		} else {
162196008Smjacob			XS_GET_DMA_SEG(dsp++, segp, seg++);
163196008Smjacob		}
164196008Smjacob	}
165196008Smjacob
166196008Smjacob	/*
167196008Smjacob	 * Second, start building additional continuation segments as needed.
168196008Smjacob	 */
169196008Smjacob	while (seg < nsegs) {
170196008Smjacob		nxtnxt = ISP_NXT_QENTRY(nxt, RQUEST_QUEUE_LEN(isp));
171196008Smjacob		if (nxtnxt == isp->isp_reqodx) {
172261515Smav			isp->isp_reqodx = ISP_READ(isp, isp->isp_rqstoutrp);
173261515Smav			if (nxtnxt == isp->isp_reqodx)
174261515Smav				return (CMD_EAGAIN);
175196008Smjacob		}
176196008Smjacob		ISP_MEMZERO(storage, QENTRY_LEN);
177196008Smjacob		qe1 = ISP_QUEUE_ENTRY(isp->isp_rquest, nxt);
178196008Smjacob		nxt = nxtnxt;
179196008Smjacob		if (dsp64) {
180196008Smjacob			ispcontreq64_t *crq = (ispcontreq64_t *) storage;
181196008Smjacob			seglim = ISP_CDSEG64;
182196008Smjacob			crq->req_header.rqs_entry_type = RQSTYPE_A64_CONT;
183196008Smjacob			crq->req_header.rqs_entry_count = 1;
184196008Smjacob			dsp64 = crq->req_dataseg;
185196008Smjacob		} else {
186196008Smjacob			ispcontreq_t *crq = (ispcontreq_t *) storage;
187196008Smjacob			seglim = ISP_CDSEG;
188196008Smjacob			crq->req_header.rqs_entry_type = RQSTYPE_DATASEG;
189196008Smjacob			crq->req_header.rqs_entry_count = 1;
190196008Smjacob			dsp = crq->req_dataseg;
191196008Smjacob		}
192317360Smav		seglim += seg;
193317360Smav		if (seglim > nsegs)
194317360Smav			seglim = nsegs;
195317360Smav		while (seg < seglim) {
196196008Smjacob			if (dsp64) {
197196008Smjacob				XS_GET_DMA64_SEG(dsp64++, segp, seg++);
198196008Smjacob			} else {
199196008Smjacob				XS_GET_DMA_SEG(dsp++, segp, seg++);
200196008Smjacob			}
201196008Smjacob		}
202196008Smjacob		if (dsp64) {
203196008Smjacob			isp_put_cont64_req(isp, (ispcontreq64_t *)storage, qe1);
204196008Smjacob		} else {
205196008Smjacob			isp_put_cont_req(isp, (ispcontreq_t *)storage, qe1);
206196008Smjacob		}
207196008Smjacob		if (isp->isp_dblev & ISP_LOGDEBUG1) {
208297817Smav			isp_print_bytes(isp, "additional queue entry",
209297817Smav			    QENTRY_LEN, qe1);
210196008Smjacob		}
211196008Smjacob		nqe++;
212196008Smjacob        }
213196008Smjacob
214196008Smjacobcopy_and_sync:
215196008Smjacob	((isphdr_t *)fqe)->rqs_entry_count = nqe;
216196008Smjacob	switch (type) {
217196008Smjacob	case RQSTYPE_REQUEST:
218196008Smjacob		((ispreq_t *)fqe)->req_flags |= ddf;
219317360Smav		/* This is historical and not clear whether really needed. */
220317360Smav		if (nsegs == 0)
221196008Smjacob			nsegs = 1;
222196008Smjacob		((ispreq_t *)fqe)->req_seg_count = nsegs;
223196008Smjacob		isp_put_request(isp, fqe, qe0);
224196008Smjacob		break;
225196008Smjacob	case RQSTYPE_CMDONLY:
226196008Smjacob		((ispreq_t *)fqe)->req_flags |= ddf;
227317360Smav		/* This is historical and not clear whether really needed. */
228317360Smav		if (nsegs == 0)
229196008Smjacob			nsegs = 1;
230196008Smjacob		((ispextreq_t *)fqe)->req_seg_count = nsegs;
231196008Smjacob		isp_put_extended_request(isp, fqe, qe0);
232196008Smjacob		break;
233196008Smjacob	case RQSTYPE_T2RQS:
234196008Smjacob		((ispreqt2_t *)fqe)->req_flags |= ddf;
235196008Smjacob		((ispreqt2_t *)fqe)->req_seg_count = nsegs;
236196008Smjacob		((ispreqt2_t *)fqe)->req_totalcnt = totalcnt;
237196008Smjacob		if (ISP_CAP_2KLOGIN(isp)) {
238196008Smjacob			isp_put_request_t2e(isp, fqe, qe0);
239196008Smjacob		} else {
240196008Smjacob			isp_put_request_t2(isp, fqe, qe0);
241196008Smjacob		}
242196008Smjacob		break;
243196008Smjacob	case RQSTYPE_A64:
244196008Smjacob	case RQSTYPE_T3RQS:
245196008Smjacob		((ispreqt3_t *)fqe)->req_flags |= ddf;
246196008Smjacob		((ispreqt3_t *)fqe)->req_seg_count = nsegs;
247196008Smjacob		((ispreqt3_t *)fqe)->req_totalcnt = totalcnt;
248196008Smjacob		if (ISP_CAP_2KLOGIN(isp)) {
249196008Smjacob			isp_put_request_t3e(isp, fqe, qe0);
250196008Smjacob		} else {
251196008Smjacob			isp_put_request_t3(isp, fqe, qe0);
252196008Smjacob		}
253196008Smjacob		break;
254196008Smjacob	case RQSTYPE_T7RQS:
255317360Smav		((ispreqt7_t *)fqe)->req_alen_datadir = ddf;
256196008Smjacob		((ispreqt7_t *)fqe)->req_seg_count = nsegs;
257196008Smjacob		((ispreqt7_t *)fqe)->req_dl = totalcnt;
258196008Smjacob		isp_put_request_t7(isp, fqe, qe0);
259196008Smjacob		break;
260317360Smav#ifdef	ISP_TARGET_MODE
261317360Smav	case RQSTYPE_CTIO2:
262317360Smav	case RQSTYPE_CTIO3:
263317360Smav		if (((ct2_entry_t *)fqe)->ct_flags & CT2_FLAG_MODE2) {
264317360Smav			((ct2_entry_t *)fqe)->ct_seg_count = 1;
265317360Smav		} else {
266317360Smav			((ct2_entry_t *)fqe)->ct_seg_count = nsegs;
267317360Smav		}
268317360Smav		if (ISP_CAP_2KLOGIN(isp)) {
269317360Smav			isp_put_ctio2e(isp, fqe, qe0);
270317360Smav		} else {
271317360Smav			isp_put_ctio2(isp, fqe, qe0);
272317360Smav		}
273317360Smav		break;
274317360Smav	case RQSTYPE_CTIO7:
275317360Smav		if (((ct7_entry_t *)fqe)->ct_flags & CT7_FLAG_MODE2) {
276317360Smav			((ct7_entry_t *)fqe)->ct_seg_count = 1;
277317360Smav		} else {
278317360Smav			((ct7_entry_t *)fqe)->ct_seg_count = nsegs;
279317360Smav		}
280317360Smav		isp_put_ctio7(isp, fqe, qe0);
281317360Smav		break;
282317360Smav#endif
283196008Smjacob	default:
284196008Smjacob		return (CMD_COMPLETE);
285196008Smjacob	}
286196008Smjacob	if (isp->isp_dblev & ISP_LOGDEBUG1) {
287297817Smav		isp_print_bytes(isp, "first queue entry", QENTRY_LEN, qe0);
288196008Smjacob	}
289196008Smjacob	ISP_ADD_REQUEST(isp, nxt);
290196008Smjacob	return (CMD_QUEUED);
291196008Smjacob}
292196008Smjacob
293292725Smavuint32_t
294292725Smavisp_allocate_handle(ispsoftc_t *isp, void *xs, int type)
295155228Smjacob{
296203444Smjacob	isp_hdl_t *hdp;
297155228Smjacob
298203444Smjacob	hdp = isp->isp_xffree;
299292725Smav	if (hdp == NULL)
300292725Smav		return (ISP_HANDLE_FREE);
301203444Smjacob	isp->isp_xffree = hdp->cmd;
302203444Smjacob	hdp->cmd = xs;
303203444Smjacob	hdp->handle = (hdp - isp->isp_xflist);
304292725Smav	hdp->handle |= (type << ISP_HANDLE_USAGE_SHIFT);
305203444Smjacob	hdp->handle |= (isp->isp_seqno++ << ISP_HANDLE_SEQ_SHIFT);
306292725Smav	return (hdp->handle);
307155228Smjacob}
308155228Smjacob
309292725Smavvoid *
310163899Smjacobisp_find_xs(ispsoftc_t *isp, uint32_t handle)
311155228Smjacob{
312292725Smav	if (!ISP_VALID_HANDLE(isp, handle)) {
313203444Smjacob		isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle);
314155228Smjacob		return (NULL);
315155228Smjacob	}
316203444Smjacob	return (isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].cmd);
317155228Smjacob}
318155228Smjacob
319163899Smjacobuint32_t
320292725Smavisp_find_handle(ispsoftc_t *isp, void *xs)
321155228Smjacob{
322203444Smjacob	uint32_t i, foundhdl = ISP_HANDLE_FREE;
323203444Smjacob
324155228Smjacob	if (xs != NULL) {
325155228Smjacob		for (i = 0; i < isp->isp_maxcmds; i++) {
326203444Smjacob			if (isp->isp_xflist[i].cmd != xs) {
327203444Smjacob				continue;
328155228Smjacob			}
329203444Smjacob			foundhdl = isp->isp_xflist[i].handle;
330203444Smjacob			break;
331155228Smjacob		}
332155228Smjacob	}
333203444Smjacob	return (foundhdl);
334155228Smjacob}
335155228Smjacob
336155228Smjacobvoid
337163899Smjacobisp_destroy_handle(ispsoftc_t *isp, uint32_t handle)
338155228Smjacob{
339292725Smav	if (!ISP_VALID_HANDLE(isp, handle)) {
340203444Smjacob		isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle);
341203444Smjacob	} else {
342203444Smjacob		isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].handle = ISP_HANDLE_FREE;
343203444Smjacob		isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].cmd = isp->isp_xffree;
344203444Smjacob		isp->isp_xffree = &isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)];
345155228Smjacob	}
346155228Smjacob}
347155228Smjacob
348196008Smjacob/*
349196008Smjacob * Make sure we have space to put something on the request queue.
350196008Smjacob * Return a pointer to that entry if we do. A side effect of this
351196008Smjacob * function is to update the output index. The input index
352196008Smjacob * stays the same.
353196008Smjacob */
354196008Smjacobvoid *
355196008Smjacobisp_getrqentry(ispsoftc_t *isp)
356155228Smjacob{
357257916Smav	uint32_t next;
358257916Smav
359257916Smav	next = ISP_NXT_QENTRY(isp->isp_reqidx, RQUEST_QUEUE_LEN(isp));
360257916Smav	if (next == isp->isp_reqodx) {
361257916Smav		isp->isp_reqodx = ISP_READ(isp, isp->isp_rqstoutrp);
362257916Smav		if (next == isp->isp_reqodx)
363257916Smav			return (NULL);
364155228Smjacob	}
365196008Smjacob	return (ISP_QUEUE_ENTRY(isp->isp_rquest, isp->isp_reqidx));
366155228Smjacob}
367155228Smjacob
368155228Smjacob#define	TBA	(4 * (((QENTRY_LEN >> 2) * 3) + 1) + 1)
369155228Smjacobvoid
370196008Smjacobisp_print_qentry(ispsoftc_t *isp, const char *msg, int idx, void *arg)
371155228Smjacob{
372155228Smjacob	char buf[TBA];
373155228Smjacob	int amt, i, j;
374155704Smjacob	uint8_t *ptr = arg;
375155228Smjacob
376155228Smjacob	isp_prt(isp, ISP_LOGALL, "%s index %d=>", msg, idx);
377155228Smjacob	for (buf[0] = 0, amt = i = 0; i < 4; i++) {
378155228Smjacob		buf[0] = 0;
379196008Smjacob		ISP_SNPRINTF(buf, TBA, "  ");
380155228Smjacob		for (j = 0; j < (QENTRY_LEN >> 2); j++) {
381196008Smjacob			ISP_SNPRINTF(buf, TBA, "%s %02x", buf, ptr[amt++] & 0xff);
382155228Smjacob		}
383208997Smjacob		isp_prt(isp, ISP_LOGALL, "%s", buf);
384155228Smjacob	}
385155228Smjacob}
386155228Smjacob
387155228Smjacobvoid
388167821Smjacobisp_print_bytes(ispsoftc_t *isp, const char *msg, int amt, void *arg)
389155228Smjacob{
390155228Smjacob	char buf[128];
391155704Smjacob	uint8_t *ptr = arg;
392155228Smjacob	int off;
393155228Smjacob
394155228Smjacob	if (msg)
395155228Smjacob		isp_prt(isp, ISP_LOGALL, "%s:", msg);
396155228Smjacob	off = 0;
397155228Smjacob	buf[0] = 0;
398155228Smjacob	while (off < amt) {
399155228Smjacob		int j, to;
400155228Smjacob		to = off;
401155228Smjacob		for (j = 0; j < 16; j++) {
402196008Smjacob			ISP_SNPRINTF(buf, 128, "%s %02x", buf, ptr[off++] & 0xff);
403196008Smjacob			if (off == amt) {
404155228Smjacob				break;
405196008Smjacob			}
406155228Smjacob		}
407155228Smjacob		isp_prt(isp, ISP_LOGALL, "0x%08x:%s", to, buf);
408155228Smjacob		buf[0] = 0;
409155228Smjacob	}
410155228Smjacob}
411155228Smjacob
412155228Smjacob/*
413155228Smjacob * Do the common path to try and ensure that link is up, we've scanned
414155228Smjacob * the fabric (if we're on a fabric), and that we've synchronized this
415155228Smjacob * all with our own database and done the appropriate logins.
416155228Smjacob *
417155228Smjacob * We repeatedly check for firmware state and loop state after each
418155228Smjacob * action because things may have changed while we were doing this.
419155228Smjacob * Any failure or change of state causes us to return a nonzero value.
420155228Smjacob *
421155228Smjacob * We assume we enter here with any locks held.
422155228Smjacob */
423155228Smjacob
424155228Smjacobint
425196008Smjacobisp_fc_runstate(ispsoftc_t *isp, int chan, int tval)
426155228Smjacob{
427291365Smav	fcparam *fcp = FCPARAM(isp, chan);
428291365Smav	int res;
429155228Smjacob
430291365Smavagain:
431291365Smav	if (fcp->role == ISP_ROLE_NONE)
432290993Smav		return (-1);
433291365Smav	res = isp_control(isp, ISPCTL_FCLINK_TEST, chan, tval);
434291365Smav	if (res > 0)
435291365Smav		goto again;
436291365Smav	if (res < 0)
437291365Smav		return (fcp->isp_loopstate);
438291365Smav	res = isp_control(isp, ISPCTL_SCAN_LOOP, chan);
439291365Smav	if (res > 0)
440291365Smav		goto again;
441291365Smav	if (res < 0)
442291365Smav		return (fcp->isp_loopstate);
443291365Smav	res = isp_control(isp, ISPCTL_SCAN_FABRIC, chan);
444291365Smav	if (res > 0)
445291365Smav		goto again;
446291365Smav	if (res < 0)
447291365Smav		return (fcp->isp_loopstate);
448291365Smav	res = isp_control(isp, ISPCTL_PDB_SYNC, chan);
449291365Smav	if (res > 0)
450291365Smav		goto again;
451291365Smav	return (fcp->isp_loopstate);
452155228Smjacob}
453155228Smjacob
454164272Smjacob/*
455196008Smjacob * Fibre Channel Support routines
456164272Smjacob */
457163899Smjacobvoid
458196008Smjacobisp_dump_portdb(ispsoftc_t *isp, int chan)
459164272Smjacob{
460196008Smjacob	fcparam *fcp = FCPARAM(isp, chan);
461164272Smjacob	int i;
462164272Smjacob
463164272Smjacob	for (i = 0; i < MAX_FC_TARG; i++) {
464285459Smav		char buf1[64], buf2[64];
465164272Smjacob		const char *dbs[8] = {
466164272Smjacob			"NIL ",
467164272Smjacob			"PROB",
468164272Smjacob			"DEAD",
469164272Smjacob			"CHGD",
470164272Smjacob			"NEW ",
471164272Smjacob			"PVLD",
472164272Smjacob			"ZOMB",
473164272Smjacob			"VLD "
474164272Smjacob		};
475164272Smjacob		fcportdb_t *lp = &fcp->portdb[i];
476164272Smjacob
477285459Smav		if (lp->state == FC_PORTDB_STATE_NIL) {
478164272Smjacob			continue;
479164272Smjacob		}
480238869Smjacob		isp_gen_role_str(buf1, sizeof (buf1), lp->prli_word3);
481238869Smjacob		isp_gen_role_str(buf2, sizeof (buf2), lp->new_prli_word3);
482300052Smav		isp_prt(isp, ISP_LOGALL, "Chan %d [%d]: hdl 0x%x %s %s 0x%06x =>%s 0x%06x; WWNN 0x%08x%08x WWPN 0x%08x%08x",
483300052Smav		    chan, i, lp->handle, dbs[lp->state], buf1, lp->portid, buf2, lp->new_portid,
484196008Smjacob		    (uint32_t) (lp->node_wwn >> 32), (uint32_t) (lp->node_wwn), (uint32_t) (lp->port_wwn >> 32), (uint32_t) (lp->port_wwn));
485164272Smjacob	}
486164272Smjacob}
487164272Smjacob
488238869Smjacobvoid
489238869Smjacobisp_gen_role_str(char *buf, size_t len, uint16_t p3)
490238869Smjacob{
491238869Smjacob	int nd = 0;
492238869Smjacob	buf[0] = '(';
493238869Smjacob	buf[1] = 0;
494238869Smjacob	if (p3 & PRLI_WD3_ENHANCED_DISCOVERY) {
495238869Smjacob		nd++;
496238869Smjacob		strlcat(buf, "EDisc", len);
497238869Smjacob	}
498238869Smjacob	if (p3 & PRLI_WD3_REC_SUPPORT) {
499238869Smjacob		if (nd++) {
500238869Smjacob			strlcat(buf, ",", len);
501238869Smjacob		}
502238869Smjacob		strlcat(buf, "REC", len);
503238869Smjacob	}
504238869Smjacob	if (p3 & PRLI_WD3_TASK_RETRY_IDENTIFICATION_REQUESTED) {
505238869Smjacob		if (nd++) {
506238869Smjacob			strlcat(buf, ",", len);
507238869Smjacob		}
508238869Smjacob		strlcat(buf, "RetryID", len);
509238869Smjacob	}
510238869Smjacob	if (p3 & PRLI_WD3_RETRY) {
511238869Smjacob		if (nd++) {
512238869Smjacob			strlcat(buf, ",", len);
513238869Smjacob		}
514238869Smjacob		strlcat(buf, "Retry", len);
515238869Smjacob	}
516238869Smjacob	if (p3 & PRLI_WD3_CONFIRMED_COMPLETION_ALLOWED) {
517238869Smjacob		if (nd++) {
518238869Smjacob			strlcat(buf, ",", len);
519238869Smjacob		}
520238869Smjacob		strlcat(buf, "CNFRM", len);
521238869Smjacob	}
522238869Smjacob	if (p3 & PRLI_WD3_DATA_OVERLAY_ALLOWED) {
523238869Smjacob		if (nd++) {
524238869Smjacob			strlcat(buf, ",", len);
525238869Smjacob		}
526238869Smjacob		strlcat(buf, "DOver", len);
527238869Smjacob	}
528238869Smjacob	if (p3 & PRLI_WD3_INITIATOR_FUNCTION) {
529238869Smjacob		if (nd++) {
530238869Smjacob			strlcat(buf, ",", len);
531238869Smjacob		}
532238869Smjacob		strlcat(buf, "INI", len);
533238869Smjacob	}
534238869Smjacob	if (p3 & PRLI_WD3_TARGET_FUNCTION) {
535238869Smjacob		if (nd++) {
536238869Smjacob			strlcat(buf, ",", len);
537238869Smjacob		}
538238869Smjacob		strlcat(buf, "TGT", len);
539238869Smjacob	}
540238869Smjacob	if (p3 & PRLI_WD3_READ_FCP_XFER_RDY_DISABLED) {
541238869Smjacob		if (nd++) {
542238869Smjacob			strlcat(buf, ",", len);
543238869Smjacob		}
544238869Smjacob		strlcat(buf, "RdXfrDis", len);
545238869Smjacob	}
546238869Smjacob	if (p3 & PRLI_WD3_WRITE_FCP_XFER_RDY_DISABLED) {
547238869Smjacob		if (nd++) {
548238869Smjacob			strlcat(buf, ",", len);
549238869Smjacob		}
550238869Smjacob		strlcat(buf, "XfrDis", len);
551238869Smjacob	}
552238869Smjacob	strlcat(buf, ")", len);
553238869Smjacob}
554238869Smjacob
555196008Smjacobconst char *
556196008Smjacobisp_fc_fw_statename(int state)
557196008Smjacob{
558196008Smjacob	switch (state) {
559196008Smjacob	case FW_CONFIG_WAIT:	return "Config Wait";
560290993Smav	case FW_WAIT_LINK:	return "Wait Link";
561196008Smjacob	case FW_WAIT_LOGIN:	return "Wait Login";
562196008Smjacob	case FW_READY:		return "Ready";
563196008Smjacob	case FW_LOSS_OF_SYNC:	return "Loss Of Sync";
564196008Smjacob	case FW_ERROR:		return "Error";
565196008Smjacob	case FW_REINIT:		return "Re-Init";
566196008Smjacob	case FW_NON_PART:	return "Nonparticipating";
567196008Smjacob	default:		return "?????";
568196008Smjacob	}
569196008Smjacob}
570196008Smjacob
571196008Smjacobconst char *
572196008Smjacobisp_fc_loop_statename(int state)
573196008Smjacob{
574196008Smjacob	switch (state) {
575196008Smjacob	case LOOP_NIL:                  return "NIL";
576291365Smav	case LOOP_HAVE_LINK:            return "Have Link";
577297991Smav	case LOOP_HAVE_ADDR:            return "Have Address";
578290993Smav	case LOOP_TESTING_LINK:         return "Testing Link";
579290993Smav	case LOOP_LTEST_DONE:           return "Link Test Done";
580290993Smav	case LOOP_SCANNING_LOOP:        return "Scanning Loop";
581196008Smjacob	case LOOP_LSCAN_DONE:           return "Loop Scan Done";
582196008Smjacob	case LOOP_SCANNING_FABRIC:      return "Scanning Fabric";
583196008Smjacob	case LOOP_FSCAN_DONE:           return "Fabric Scan Done";
584196008Smjacob	case LOOP_SYNCING_PDB:          return "Syncing PDB";
585196008Smjacob	case LOOP_READY:                return "Ready";
586196008Smjacob	default:                        return "?????";
587196008Smjacob	}
588196008Smjacob}
589196008Smjacob
590196008Smjacobconst char *
591196008Smjacobisp_fc_toponame(fcparam *fcp)
592196008Smjacob{
593196008Smjacob
594297991Smav	if (fcp->isp_loopstate < LOOP_HAVE_ADDR) {
595196008Smjacob		return "Unavailable";
596196008Smjacob	}
597196008Smjacob	switch (fcp->isp_topo) {
598291080Smav	case TOPO_NL_PORT:      return "Private Loop (NL_Port)";
599291080Smav	case TOPO_FL_PORT:      return "Public Loop (FL_Port)";
600291080Smav	case TOPO_N_PORT:       return "Point-to-Point (N_Port)";
601291080Smav	case TOPO_F_PORT:       return "Fabric (F_Port)";
602291080Smav	case TOPO_PTP_STUB:     return "Point-to-Point (no response)";
603196008Smjacob	default:                return "?????";
604196008Smjacob	}
605196008Smjacob}
606196008Smjacob
607164272Smjacobvoid
608196008Smjacobisp_clear_commands(ispsoftc_t *isp)
609196008Smjacob{
610203444Smjacob	uint32_t tmp;
611203444Smjacob	isp_hdl_t *hdp;
612196008Smjacob#ifdef	ISP_TARGET_MODE
613196008Smjacob	isp_notify_t notify;
614196008Smjacob#endif
615196008Smjacob
616196008Smjacob	for (tmp = 0; isp->isp_xflist && tmp < isp->isp_maxcmds; tmp++) {
617203444Smjacob
618203444Smjacob		hdp = &isp->isp_xflist[tmp];
619292739Smav		switch (ISP_H2HT(hdp->handle)) {
620292739Smav		case ISP_HANDLE_INITIATOR: {
621292725Smav			XS_T *xs = hdp->cmd;
622292725Smav			if (XS_XFRLEN(xs)) {
623292725Smav				ISP_DMAFREE(isp, xs, hdp->handle);
624292725Smav				XS_SET_RESID(xs, XS_XFRLEN(xs));
625292725Smav			} else {
626292725Smav				XS_SET_RESID(xs, 0);
627292725Smav			}
628292739Smav			isp_destroy_handle(isp, hdp->handle);
629292725Smav			XS_SETERR(xs, HBA_BUSRESET);
630292725Smav			isp_done(xs);
631292739Smav			break;
632292739Smav		}
633292725Smav#ifdef	ISP_TARGET_MODE
634292739Smav		case ISP_HANDLE_TARGET: {
635292725Smav			uint8_t local[QENTRY_LEN];
636292725Smav			ISP_DMAFREE(isp, hdp->cmd, hdp->handle);
637292725Smav			ISP_MEMZERO(local, QENTRY_LEN);
638292725Smav			if (IS_24XX(isp)) {
639292725Smav				ct7_entry_t *ctio = (ct7_entry_t *) local;
640292725Smav				ctio->ct_syshandle = hdp->handle;
641292725Smav				ctio->ct_nphdl = CT_HBA_RESET;
642292725Smav				ctio->ct_header.rqs_entry_type = RQSTYPE_CTIO7;
643292725Smav			} else {
644292725Smav				ct2_entry_t *ctio = (ct2_entry_t *) local;
645292725Smav				ctio->ct_syshandle = hdp->handle;
646292725Smav				ctio->ct_status = CT_HBA_RESET;
647292725Smav				ctio->ct_header.rqs_entry_type = RQSTYPE_CTIO2;
648292725Smav			}
649292725Smav			isp_async(isp, ISPASYNC_TARGET_ACTION, local);
650292739Smav			break;
651292739Smav		}
652292725Smav#endif
653292739Smav		case ISP_HANDLE_CTRL:
654292739Smav			wakeup(hdp->cmd);
655292739Smav			isp_destroy_handle(isp, hdp->handle);
656292739Smav			break;
657196008Smjacob		}
658196008Smjacob	}
659196008Smjacob#ifdef	ISP_TARGET_MODE
660196008Smjacob	for (tmp = 0; tmp < isp->isp_nchan; tmp++) {
661196008Smjacob		ISP_MEMZERO(&notify, sizeof (isp_notify_t));
662196008Smjacob		notify.nt_ncode = NT_HBA_RESET;
663196008Smjacob		notify.nt_hba = isp;
664196008Smjacob		notify.nt_wwn = INI_ANY;
665196008Smjacob		notify.nt_nphdl = NIL_HANDLE;
666196008Smjacob		notify.nt_sid = PORT_ANY;
667196008Smjacob		notify.nt_did = PORT_ANY;
668196008Smjacob		notify.nt_tgt = TGT_ANY;
669196008Smjacob		notify.nt_channel = tmp;
670196008Smjacob		notify.nt_lun = LUN_ANY;
671196008Smjacob		notify.nt_tagval = TAG_ANY;
672196008Smjacob		isp_async(isp, ISPASYNC_TARGET_NOTIFY, &notify);
673196008Smjacob	}
674196008Smjacob#endif
675196008Smjacob}
676196008Smjacob
677155228Smjacob/*
678155228Smjacob * Functions to move stuff to a form that the QLogic RISC engine understands
679155228Smjacob * and functions to move stuff back to a form the processor understands.
680155228Smjacob *
681155228Smjacob * Each platform is required to provide the 8, 16 and 32 bit
682155228Smjacob * swizzle and unswizzle macros (ISP_IOX{PUT|GET}_{8,16,32})
683155228Smjacob *
684155228Smjacob * The assumption is that swizzling and unswizzling is mostly done 'in place'
685155228Smjacob * (with a few exceptions for efficiency).
686155228Smjacob */
687155228Smjacob
688196008Smjacob#define	ISP_IS_SBUS(isp)	(ISP_SBUS_SUPPORTED && (isp)->isp_bustype == ISP_BT_SBUS)
689155228Smjacob
690163899Smjacob#define	ASIZE(x)	(sizeof (x) / sizeof (x[0]))
691155228Smjacob/*
692155228Smjacob * Swizzle/Copy Functions
693155228Smjacob */
694155228Smjacobvoid
695163899Smjacobisp_put_hdr(ispsoftc_t *isp, isphdr_t *hpsrc, isphdr_t *hpdst)
696155228Smjacob{
697155228Smjacob	if (ISP_IS_SBUS(isp)) {
698196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_entry_type, &hpdst->rqs_entry_count);
699196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_entry_count, &hpdst->rqs_entry_type);
700196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_seqno, &hpdst->rqs_flags);
701196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_flags, &hpdst->rqs_seqno);
702155228Smjacob	} else {
703196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_entry_type, &hpdst->rqs_entry_type);
704196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_entry_count, &hpdst->rqs_entry_count);
705196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_seqno, &hpdst->rqs_seqno);
706196008Smjacob		ISP_IOXPUT_8(isp, hpsrc->rqs_flags, &hpdst->rqs_flags);
707155228Smjacob	}
708155228Smjacob}
709155228Smjacob
710155228Smjacobvoid
711163899Smjacobisp_get_hdr(ispsoftc_t *isp, isphdr_t *hpsrc, isphdr_t *hpdst)
712155228Smjacob{
713155228Smjacob	if (ISP_IS_SBUS(isp)) {
714196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_entry_type, hpdst->rqs_entry_count);
715196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_entry_count, hpdst->rqs_entry_type);
716196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_seqno, hpdst->rqs_flags);
717196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_flags, hpdst->rqs_seqno);
718155228Smjacob	} else {
719196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_entry_type, hpdst->rqs_entry_type);
720196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_entry_count, hpdst->rqs_entry_count);
721196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_seqno, hpdst->rqs_seqno);
722196008Smjacob		ISP_IOXGET_8(isp, &hpsrc->rqs_flags, hpdst->rqs_flags);
723155228Smjacob	}
724155228Smjacob}
725155228Smjacob
726155228Smjacobint
727155704Smjacobisp_get_response_type(ispsoftc_t *isp, isphdr_t *hp)
728155228Smjacob{
729155704Smjacob	uint8_t type;
730155228Smjacob	if (ISP_IS_SBUS(isp)) {
731155228Smjacob		ISP_IOXGET_8(isp, &hp->rqs_entry_count, type);
732155228Smjacob	} else {
733155228Smjacob		ISP_IOXGET_8(isp, &hp->rqs_entry_type, type);
734155228Smjacob	}
735155228Smjacob	return ((int)type);
736155228Smjacob}
737155228Smjacob
738155228Smjacobvoid
739155704Smjacobisp_put_request(ispsoftc_t *isp, ispreq_t *rqsrc, ispreq_t *rqdst)
740155228Smjacob{
741155228Smjacob	int i;
742163899Smjacob	isp_put_hdr(isp, &rqsrc->req_header, &rqdst->req_header);
743155228Smjacob	ISP_IOXPUT_32(isp, rqsrc->req_handle, &rqdst->req_handle);
744155228Smjacob	if (ISP_IS_SBUS(isp)) {
745155228Smjacob		ISP_IOXPUT_8(isp, rqsrc->req_lun_trn, &rqdst->req_target);
746155228Smjacob		ISP_IOXPUT_8(isp, rqsrc->req_target, &rqdst->req_lun_trn);
747155228Smjacob	} else {
748155228Smjacob		ISP_IOXPUT_8(isp, rqsrc->req_lun_trn, &rqdst->req_lun_trn);
749155228Smjacob		ISP_IOXPUT_8(isp, rqsrc->req_target, &rqdst->req_target);
750155228Smjacob	}
751155228Smjacob	ISP_IOXPUT_16(isp, rqsrc->req_cdblen, &rqdst->req_cdblen);
752155228Smjacob	ISP_IOXPUT_16(isp, rqsrc->req_flags, &rqdst->req_flags);
753155228Smjacob	ISP_IOXPUT_16(isp, rqsrc->req_time, &rqdst->req_time);
754155228Smjacob	ISP_IOXPUT_16(isp, rqsrc->req_seg_count, &rqdst->req_seg_count);
755163899Smjacob	for (i = 0; i < ASIZE(rqsrc->req_cdb); i++) {
756155228Smjacob		ISP_IOXPUT_8(isp, rqsrc->req_cdb[i], &rqdst->req_cdb[i]);
757155228Smjacob	}
758155228Smjacob	for (i = 0; i < ISP_RQDSEG; i++) {
759196008Smjacob		ISP_IOXPUT_32(isp, rqsrc->req_dataseg[i].ds_base, &rqdst->req_dataseg[i].ds_base);
760196008Smjacob		ISP_IOXPUT_32(isp, rqsrc->req_dataseg[i].ds_count, &rqdst->req_dataseg[i].ds_count);
761155228Smjacob	}
762155228Smjacob}
763155228Smjacob
764155228Smjacobvoid
765163899Smjacobisp_put_marker(ispsoftc_t *isp, isp_marker_t *src, isp_marker_t *dst)
766155228Smjacob{
767155228Smjacob	int i;
768163899Smjacob	isp_put_hdr(isp, &src->mrk_header, &dst->mrk_header);
769163899Smjacob	ISP_IOXPUT_32(isp, src->mrk_handle, &dst->mrk_handle);
770163899Smjacob	if (ISP_IS_SBUS(isp)) {
771163899Smjacob		ISP_IOXPUT_8(isp, src->mrk_reserved0, &dst->mrk_target);
772163899Smjacob		ISP_IOXPUT_8(isp, src->mrk_target, &dst->mrk_reserved0);
773163899Smjacob	} else {
774163899Smjacob		ISP_IOXPUT_8(isp, src->mrk_reserved0, &dst->mrk_reserved0);
775163899Smjacob		ISP_IOXPUT_8(isp, src->mrk_target, &dst->mrk_target);
776155228Smjacob	}
777163899Smjacob	ISP_IOXPUT_16(isp, src->mrk_modifier, &dst->mrk_modifier);
778163899Smjacob	ISP_IOXPUT_16(isp, src->mrk_flags, &dst->mrk_flags);
779163899Smjacob	ISP_IOXPUT_16(isp, src->mrk_lun, &dst->mrk_lun);
780163899Smjacob	for (i = 0; i < ASIZE(src->mrk_reserved1); i++) {
781196008Smjacob		ISP_IOXPUT_8(isp, src->mrk_reserved1[i], &dst->mrk_reserved1[i]);
782163899Smjacob	}
783163899Smjacob}
784163899Smjacob
785163899Smjacobvoid
786196008Smjacobisp_put_marker_24xx(ispsoftc_t *isp, isp_marker_24xx_t *src, isp_marker_24xx_t *dst)
787163899Smjacob{
788163899Smjacob	int i;
789163899Smjacob	isp_put_hdr(isp, &src->mrk_header, &dst->mrk_header);
790163899Smjacob	ISP_IOXPUT_32(isp, src->mrk_handle, &dst->mrk_handle);
791163899Smjacob	ISP_IOXPUT_16(isp, src->mrk_nphdl, &dst->mrk_nphdl);
792163899Smjacob	ISP_IOXPUT_8(isp, src->mrk_modifier, &dst->mrk_modifier);
793163899Smjacob	ISP_IOXPUT_8(isp, src->mrk_reserved0, &dst->mrk_reserved0);
794163899Smjacob	ISP_IOXPUT_8(isp, src->mrk_reserved1, &dst->mrk_reserved1);
795163899Smjacob	ISP_IOXPUT_8(isp, src->mrk_vphdl, &dst->mrk_vphdl);
796163899Smjacob	ISP_IOXPUT_8(isp, src->mrk_reserved2, &dst->mrk_reserved2);
797163899Smjacob	for (i = 0; i < ASIZE(src->mrk_lun); i++) {
798163899Smjacob		ISP_IOXPUT_8(isp, src->mrk_lun[i], &dst->mrk_lun[i]);
799163899Smjacob	}
800163899Smjacob	for (i = 0; i < ASIZE(src->mrk_reserved3); i++) {
801196008Smjacob		ISP_IOXPUT_8(isp, src->mrk_reserved3[i], &dst->mrk_reserved3[i]);
802163899Smjacob	}
803163899Smjacob}
804163899Smjacob
805163899Smjacobvoid
806163899Smjacobisp_put_request_t2(ispsoftc_t *isp, ispreqt2_t *src, ispreqt2_t *dst)
807163899Smjacob{
808163899Smjacob	int i;
809163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
810163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
811163899Smjacob	ISP_IOXPUT_8(isp, src->req_lun_trn, &dst->req_lun_trn);
812163899Smjacob	ISP_IOXPUT_8(isp, src->req_target, &dst->req_target);
813163899Smjacob	ISP_IOXPUT_16(isp, src->req_scclun, &dst->req_scclun);
814163899Smjacob	ISP_IOXPUT_16(isp, src->req_flags,  &dst->req_flags);
815291209Smav	ISP_IOXPUT_8(isp, src->req_crn, &dst->req_crn);
816291209Smav	ISP_IOXPUT_8(isp, src->req_reserved, &dst->req_reserved);
817163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
818163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
819163899Smjacob	for (i = 0; i < ASIZE(src->req_cdb); i++) {
820163899Smjacob		ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]);
821163899Smjacob	}
822163899Smjacob	ISP_IOXPUT_32(isp, src->req_totalcnt, &dst->req_totalcnt);
823155228Smjacob	for (i = 0; i < ISP_RQDSEG_T2; i++) {
824196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
825196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
826155228Smjacob	}
827155228Smjacob}
828155228Smjacob
829155228Smjacobvoid
830163899Smjacobisp_put_request_t2e(ispsoftc_t *isp, ispreqt2e_t *src, ispreqt2e_t *dst)
831155228Smjacob{
832155228Smjacob	int i;
833163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
834163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
835163899Smjacob	ISP_IOXPUT_16(isp, src->req_target, &dst->req_target);
836163899Smjacob	ISP_IOXPUT_16(isp, src->req_scclun, &dst->req_scclun);
837163899Smjacob	ISP_IOXPUT_16(isp, src->req_flags,  &dst->req_flags);
838291209Smav	ISP_IOXPUT_8(isp, src->req_crn, &dst->req_crn);
839291209Smav	ISP_IOXPUT_8(isp, src->req_reserved, &dst->req_reserved);
840163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
841163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
842163899Smjacob	for (i = 0; i < ASIZE(src->req_cdb); i++) {
843163899Smjacob		ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]);
844155228Smjacob	}
845163899Smjacob	ISP_IOXPUT_32(isp, src->req_totalcnt, &dst->req_totalcnt);
846155228Smjacob	for (i = 0; i < ISP_RQDSEG_T2; i++) {
847196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
848196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
849155228Smjacob	}
850155228Smjacob}
851155228Smjacob
852155228Smjacobvoid
853163899Smjacobisp_put_request_t3(ispsoftc_t *isp, ispreqt3_t *src, ispreqt3_t *dst)
854155228Smjacob{
855155228Smjacob	int i;
856163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
857163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
858163899Smjacob	ISP_IOXPUT_8(isp, src->req_lun_trn, &dst->req_lun_trn);
859163899Smjacob	ISP_IOXPUT_8(isp, src->req_target, &dst->req_target);
860163899Smjacob	ISP_IOXPUT_16(isp, src->req_scclun, &dst->req_scclun);
861163899Smjacob	ISP_IOXPUT_16(isp, src->req_flags,  &dst->req_flags);
862238869Smjacob	ISP_IOXPUT_8(isp, src->req_crn, &dst->req_crn);
863238869Smjacob	ISP_IOXPUT_8(isp, src->req_reserved, &dst->req_reserved);
864163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
865163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
866163899Smjacob	for (i = 0; i < ASIZE(src->req_cdb); i++) {
867163899Smjacob		ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]);
868155228Smjacob	}
869163899Smjacob	ISP_IOXPUT_32(isp, src->req_totalcnt, &dst->req_totalcnt);
870155228Smjacob	for (i = 0; i < ISP_RQDSEG_T3; i++) {
871196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
872196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_basehi, &dst->req_dataseg[i].ds_basehi);
873196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
874155228Smjacob	}
875155228Smjacob}
876155228Smjacob
877155228Smjacobvoid
878163899Smjacobisp_put_request_t3e(ispsoftc_t *isp, ispreqt3e_t *src, ispreqt3e_t *dst)
879155228Smjacob{
880155228Smjacob	int i;
881163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
882163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
883163899Smjacob	ISP_IOXPUT_16(isp, src->req_target, &dst->req_target);
884163899Smjacob	ISP_IOXPUT_16(isp, src->req_scclun, &dst->req_scclun);
885163899Smjacob	ISP_IOXPUT_16(isp, src->req_flags,  &dst->req_flags);
886238869Smjacob	ISP_IOXPUT_8(isp, src->req_crn, &dst->req_crn);
887238869Smjacob	ISP_IOXPUT_8(isp, src->req_reserved, &dst->req_reserved);
888163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
889163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
890163899Smjacob	for (i = 0; i < ASIZE(src->req_cdb); i++) {
891163899Smjacob		ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]);
892155228Smjacob	}
893163899Smjacob	ISP_IOXPUT_32(isp, src->req_totalcnt, &dst->req_totalcnt);
894155228Smjacob	for (i = 0; i < ISP_RQDSEG_T3; i++) {
895196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
896196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_basehi, &dst->req_dataseg[i].ds_basehi);
897196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
898155228Smjacob	}
899155228Smjacob}
900155228Smjacob
901155228Smjacobvoid
902163899Smjacobisp_put_extended_request(ispsoftc_t *isp, ispextreq_t *src, ispextreq_t *dst)
903155228Smjacob{
904155228Smjacob	int i;
905163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
906163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
907155228Smjacob	if (ISP_IS_SBUS(isp)) {
908163899Smjacob		ISP_IOXPUT_8(isp, src->req_lun_trn, &dst->req_target);
909163899Smjacob		ISP_IOXPUT_8(isp, src->req_target, &dst->req_lun_trn);
910155228Smjacob	} else {
911163899Smjacob		ISP_IOXPUT_8(isp, src->req_lun_trn, &dst->req_lun_trn);
912163899Smjacob		ISP_IOXPUT_8(isp, src->req_target, &dst->req_target);
913155228Smjacob	}
914163899Smjacob	ISP_IOXPUT_16(isp, src->req_cdblen, &dst->req_cdblen);
915163899Smjacob	ISP_IOXPUT_16(isp, src->req_flags, &dst->req_flags);
916163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
917163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
918163899Smjacob	for (i = 0; i < ASIZE(src->req_cdb); i++) {
919163899Smjacob		ISP_IOXPUT_8(isp, src->req_cdb[i], &dst->req_cdb[i]);
920155228Smjacob	}
921155228Smjacob}
922155228Smjacob
923155228Smjacobvoid
924163899Smjacobisp_put_request_t7(ispsoftc_t *isp, ispreqt7_t *src, ispreqt7_t *dst)
925155228Smjacob{
926155228Smjacob	int i;
927163899Smjacob	uint32_t *a, *b;
928163899Smjacob
929163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
930163899Smjacob	ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
931163899Smjacob	ISP_IOXPUT_16(isp, src->req_nphdl, &dst->req_nphdl);
932163899Smjacob	ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
933163899Smjacob	ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
934163899Smjacob	ISP_IOXPUT_16(isp, src->req_reserved, &dst->req_reserved);
935163899Smjacob	a = (uint32_t *) src->req_lun;
936163899Smjacob	b = (uint32_t *) dst->req_lun;
937163899Smjacob	for (i = 0; i < (ASIZE(src->req_lun) >> 2); i++ ) {
938171159Smjacob		*b++ = ISP_SWAP32(isp, *a++);
939163899Smjacob	}
940163899Smjacob	ISP_IOXPUT_8(isp, src->req_alen_datadir, &dst->req_alen_datadir);
941163899Smjacob	ISP_IOXPUT_8(isp, src->req_task_management, &dst->req_task_management);
942163899Smjacob	ISP_IOXPUT_8(isp, src->req_task_attribute, &dst->req_task_attribute);
943163899Smjacob	ISP_IOXPUT_8(isp, src->req_crn, &dst->req_crn);
944163899Smjacob	a = (uint32_t *) src->req_cdb;
945163899Smjacob	b = (uint32_t *) dst->req_cdb;
946171159Smjacob	for (i = 0; i < (ASIZE(src->req_cdb) >> 2); i++) {
947171159Smjacob		*b++ = ISP_SWAP32(isp, *a++);
948163899Smjacob	}
949163899Smjacob	ISP_IOXPUT_32(isp, src->req_dl, &dst->req_dl);
950163899Smjacob	ISP_IOXPUT_16(isp, src->req_tidlo, &dst->req_tidlo);
951163899Smjacob	ISP_IOXPUT_8(isp, src->req_tidhi, &dst->req_tidhi);
952163899Smjacob	ISP_IOXPUT_8(isp, src->req_vpidx, &dst->req_vpidx);
953196008Smjacob	ISP_IOXPUT_32(isp, src->req_dataseg.ds_base, &dst->req_dataseg.ds_base);
954196008Smjacob	ISP_IOXPUT_32(isp, src->req_dataseg.ds_basehi, &dst->req_dataseg.ds_basehi);
955196008Smjacob	ISP_IOXPUT_32(isp, src->req_dataseg.ds_count, &dst->req_dataseg.ds_count);
956163899Smjacob}
957163899Smjacob
958163899Smjacobvoid
959196008Smjacobisp_put_24xx_tmf(ispsoftc_t *isp, isp24xx_tmf_t *src, isp24xx_tmf_t *dst)
960196008Smjacob{
961196008Smjacob	int i;
962196008Smjacob	uint32_t *a, *b;
963196008Smjacob
964196008Smjacob	isp_put_hdr(isp, &src->tmf_header, &dst->tmf_header);
965196008Smjacob	ISP_IOXPUT_32(isp, src->tmf_handle, &dst->tmf_handle);
966196008Smjacob	ISP_IOXPUT_16(isp, src->tmf_nphdl, &dst->tmf_nphdl);
967196008Smjacob	ISP_IOXPUT_16(isp, src->tmf_delay, &dst->tmf_delay);
968196008Smjacob	ISP_IOXPUT_16(isp, src->tmf_timeout, &dst->tmf_timeout);
969196008Smjacob	for (i = 0; i < ASIZE(src->tmf_reserved0); i++) {
970196008Smjacob		ISP_IOXPUT_8(isp, src->tmf_reserved0[i], &dst->tmf_reserved0[i]);
971196008Smjacob	}
972196008Smjacob	a = (uint32_t *) src->tmf_lun;
973196008Smjacob	b = (uint32_t *) dst->tmf_lun;
974196008Smjacob	for (i = 0; i < (ASIZE(src->tmf_lun) >> 2); i++ ) {
975196008Smjacob		*b++ = ISP_SWAP32(isp, *a++);
976196008Smjacob	}
977196008Smjacob	ISP_IOXPUT_32(isp, src->tmf_flags, &dst->tmf_flags);
978196008Smjacob	for (i = 0; i < ASIZE(src->tmf_reserved1); i++) {
979196008Smjacob		ISP_IOXPUT_8(isp, src->tmf_reserved1[i], &dst->tmf_reserved1[i]);
980196008Smjacob	}
981196008Smjacob	ISP_IOXPUT_16(isp, src->tmf_tidlo, &dst->tmf_tidlo);
982196008Smjacob	ISP_IOXPUT_8(isp, src->tmf_tidhi, &dst->tmf_tidhi);
983196008Smjacob	ISP_IOXPUT_8(isp, src->tmf_vpidx, &dst->tmf_vpidx);
984196008Smjacob	for (i = 0; i < ASIZE(src->tmf_reserved2); i++) {
985196008Smjacob		ISP_IOXPUT_8(isp, src->tmf_reserved2[i], &dst->tmf_reserved2[i]);
986196008Smjacob	}
987196008Smjacob}
988196008Smjacob
989196008Smjacobvoid
990163899Smjacobisp_put_24xx_abrt(ispsoftc_t *isp, isp24xx_abrt_t *src, isp24xx_abrt_t *dst)
991163899Smjacob{
992163899Smjacob	int i;
993163899Smjacob	isp_put_hdr(isp, &src->abrt_header, &dst->abrt_header);
994163899Smjacob	ISP_IOXPUT_32(isp, src->abrt_handle, &dst->abrt_handle);
995163899Smjacob	ISP_IOXPUT_16(isp, src->abrt_nphdl, &dst->abrt_nphdl);
996163899Smjacob	ISP_IOXPUT_16(isp, src->abrt_options, &dst->abrt_options);
997163899Smjacob	ISP_IOXPUT_32(isp, src->abrt_cmd_handle, &dst->abrt_cmd_handle);
998289886Smav	ISP_IOXPUT_16(isp, src->abrt_queue_number, &dst->abrt_queue_number);
999163899Smjacob	for (i = 0; i < ASIZE(src->abrt_reserved); i++) {
1000196008Smjacob		ISP_IOXPUT_8(isp, src->abrt_reserved[i], &dst->abrt_reserved[i]);
1001163899Smjacob	}
1002163899Smjacob	ISP_IOXPUT_16(isp, src->abrt_tidlo, &dst->abrt_tidlo);
1003163899Smjacob	ISP_IOXPUT_8(isp, src->abrt_tidhi, &dst->abrt_tidhi);
1004163899Smjacob	ISP_IOXPUT_8(isp, src->abrt_vpidx, &dst->abrt_vpidx);
1005163899Smjacob	for (i = 0; i < ASIZE(src->abrt_reserved1); i++) {
1006196008Smjacob		ISP_IOXPUT_8(isp, src->abrt_reserved1[i], &dst->abrt_reserved1[i]);
1007163899Smjacob	}
1008163899Smjacob}
1009163899Smjacob
1010163899Smjacobvoid
1011163899Smjacobisp_put_cont_req(ispsoftc_t *isp, ispcontreq_t *src, ispcontreq_t *dst)
1012163899Smjacob{
1013163899Smjacob	int i;
1014163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
1015155228Smjacob	for (i = 0; i < ISP_CDSEG; i++) {
1016196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
1017196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
1018155228Smjacob	}
1019155228Smjacob}
1020155228Smjacob
1021155228Smjacobvoid
1022163899Smjacobisp_put_cont64_req(ispsoftc_t *isp, ispcontreq64_t *src, ispcontreq64_t *dst)
1023155228Smjacob{
1024155228Smjacob	int i;
1025163899Smjacob	isp_put_hdr(isp, &src->req_header, &dst->req_header);
1026155228Smjacob	for (i = 0; i < ISP_CDSEG64; i++) {
1027196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
1028196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_basehi, &dst->req_dataseg[i].ds_basehi);
1029196008Smjacob		ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
1030155228Smjacob	}
1031155228Smjacob}
1032155228Smjacob
1033155228Smjacobvoid
1034163899Smjacobisp_get_response(ispsoftc_t *isp, ispstatusreq_t *src, ispstatusreq_t *dst)
1035155228Smjacob{
1036155228Smjacob	int i;
1037163899Smjacob	isp_get_hdr(isp, &src->req_header, &dst->req_header);
1038163899Smjacob	ISP_IOXGET_32(isp, &src->req_handle, dst->req_handle);
1039163899Smjacob	ISP_IOXGET_16(isp, &src->req_scsi_status, dst->req_scsi_status);
1040196008Smjacob	ISP_IOXGET_16(isp, &src->req_completion_status, dst->req_completion_status);
1041163899Smjacob	ISP_IOXGET_16(isp, &src->req_state_flags, dst->req_state_flags);
1042163899Smjacob	ISP_IOXGET_16(isp, &src->req_status_flags, dst->req_status_flags);
1043163899Smjacob	ISP_IOXGET_16(isp, &src->req_time, dst->req_time);
1044163899Smjacob	ISP_IOXGET_16(isp, &src->req_sense_len, dst->req_sense_len);
1045163899Smjacob	ISP_IOXGET_32(isp, &src->req_resid, dst->req_resid);
1046238869Smjacob	for (i = 0; i < sizeof (src->req_response); i++) {
1047196008Smjacob		ISP_IOXGET_8(isp, &src->req_response[i], dst->req_response[i]);
1048155228Smjacob	}
1049238869Smjacob	for (i = 0; i < sizeof (src->req_sense_data); i++) {
1050196008Smjacob		ISP_IOXGET_8(isp, &src->req_sense_data[i], dst->req_sense_data[i]);
1051155228Smjacob	}
1052155228Smjacob}
1053155228Smjacob
1054155228Smjacobvoid
1055238869Smjacobisp_get_cont_response(ispsoftc_t *isp, ispstatus_cont_t *src, ispstatus_cont_t *dst)
1056238869Smjacob{
1057238869Smjacob	int i;
1058238869Smjacob	isp_get_hdr(isp, &src->req_header, &dst->req_header);
1059238869Smjacob	if (IS_24XX(isp)) {
1060238869Smjacob		uint32_t *a, *b;
1061238869Smjacob		a = (uint32_t *) src->req_sense_data;
1062238869Smjacob		b = (uint32_t *) dst->req_sense_data;
1063238869Smjacob		for (i = 0; i < (sizeof (src->req_sense_data) / sizeof (uint32_t)); i++) {
1064238869Smjacob			ISP_IOZGET_32(isp, a++, *b++);
1065238869Smjacob		}
1066238869Smjacob	} else {
1067238869Smjacob		for (i = 0; i < sizeof (src->req_sense_data); i++) {
1068238869Smjacob			ISP_IOXGET_8(isp, &src->req_sense_data[i], dst->req_sense_data[i]);
1069238869Smjacob		}
1070238869Smjacob	}
1071238869Smjacob}
1072238869Smjacob
1073238869Smjacobvoid
1074196008Smjacobisp_get_24xx_response(ispsoftc_t *isp, isp24xx_statusreq_t *src, isp24xx_statusreq_t *dst)
1075155228Smjacob{
1076155228Smjacob	int i;
1077171159Smjacob	uint32_t *s, *d;
1078171159Smjacob
1079163899Smjacob	isp_get_hdr(isp, &src->req_header, &dst->req_header);
1080163899Smjacob	ISP_IOXGET_32(isp, &src->req_handle, dst->req_handle);
1081196008Smjacob	ISP_IOXGET_16(isp, &src->req_completion_status, dst->req_completion_status);
1082163899Smjacob	ISP_IOXGET_16(isp, &src->req_oxid, dst->req_oxid);
1083163899Smjacob	ISP_IOXGET_32(isp, &src->req_resid, dst->req_resid);
1084163899Smjacob	ISP_IOXGET_16(isp, &src->req_reserved0, dst->req_reserved0);
1085163899Smjacob	ISP_IOXGET_16(isp, &src->req_state_flags, dst->req_state_flags);
1086289855Smav	ISP_IOXGET_16(isp, &src->req_retry_delay, dst->req_retry_delay);
1087163899Smjacob	ISP_IOXGET_16(isp, &src->req_scsi_status, dst->req_scsi_status);
1088163899Smjacob	ISP_IOXGET_32(isp, &src->req_fcp_residual, dst->req_fcp_residual);
1089163899Smjacob	ISP_IOXGET_32(isp, &src->req_sense_len, dst->req_sense_len);
1090163899Smjacob	ISP_IOXGET_32(isp, &src->req_response_len, dst->req_response_len);
1091171159Smjacob	s = (uint32_t *)src->req_rsp_sense;
1092171159Smjacob	d = (uint32_t *)dst->req_rsp_sense;
1093171159Smjacob	for (i = 0; i < (ASIZE(src->req_rsp_sense) >> 2); i++) {
1094171159Smjacob		d[i] = ISP_SWAP32(isp, s[i]);
1095155228Smjacob	}
1096155228Smjacob}
1097155228Smjacob
1098155228Smjacobvoid
1099163899Smjacobisp_get_24xx_abrt(ispsoftc_t *isp, isp24xx_abrt_t *src, isp24xx_abrt_t *dst)
1100163899Smjacob{
1101163899Smjacob	int i;
1102163899Smjacob	isp_get_hdr(isp, &src->abrt_header, &dst->abrt_header);
1103163899Smjacob	ISP_IOXGET_32(isp, &src->abrt_handle, dst->abrt_handle);
1104163899Smjacob	ISP_IOXGET_16(isp, &src->abrt_nphdl, dst->abrt_nphdl);
1105163899Smjacob	ISP_IOXGET_16(isp, &src->abrt_options, dst->abrt_options);
1106163899Smjacob	ISP_IOXGET_32(isp, &src->abrt_cmd_handle, dst->abrt_cmd_handle);
1107289886Smav	ISP_IOXGET_16(isp, &src->abrt_queue_number, dst->abrt_queue_number);
1108171159Smjacob	for (i = 0; i < ASIZE(src->abrt_reserved); i++) {
1109196008Smjacob		ISP_IOXGET_8(isp, &src->abrt_reserved[i], dst->abrt_reserved[i]);
1110163899Smjacob	}
1111163899Smjacob	ISP_IOXGET_16(isp, &src->abrt_tidlo, dst->abrt_tidlo);
1112163899Smjacob	ISP_IOXGET_8(isp, &src->abrt_tidhi, dst->abrt_tidhi);
1113163899Smjacob	ISP_IOXGET_8(isp, &src->abrt_vpidx, dst->abrt_vpidx);
1114171159Smjacob	for (i = 0; i < ASIZE(src->abrt_reserved1); i++) {
1115196008Smjacob		ISP_IOXGET_8(isp, &src->abrt_reserved1[i], dst->abrt_reserved1[i]);
1116163899Smjacob	}
1117163899Smjacob}
1118163899Smjacob
1119163899Smjacob
1120163899Smjacobvoid
1121204397Smjacobisp_get_rio1(ispsoftc_t *isp, isp_rio1_t *r1src, isp_rio1_t *r1dst)
1122204397Smjacob{
1123204397Smjacob	const int lim = sizeof (r1dst->req_handles) / sizeof (r1dst->req_handles[0]);
1124204397Smjacob	int i;
1125204397Smjacob	isp_get_hdr(isp, &r1src->req_header, &r1dst->req_header);
1126204397Smjacob	if (r1dst->req_header.rqs_seqno > lim) {
1127204397Smjacob		r1dst->req_header.rqs_seqno = lim;
1128204397Smjacob	}
1129204397Smjacob	for (i = 0; i < r1dst->req_header.rqs_seqno; i++) {
1130204397Smjacob		ISP_IOXGET_32(isp, &r1src->req_handles[i], r1dst->req_handles[i]);
1131204397Smjacob	}
1132204397Smjacob	while (i < lim) {
1133204397Smjacob		r1dst->req_handles[i++] = 0;
1134204397Smjacob	}
1135204397Smjacob}
1136204397Smjacob
1137204397Smjacobvoid
1138155704Smjacobisp_get_rio2(ispsoftc_t *isp, isp_rio2_t *r2src, isp_rio2_t *r2dst)
1139155228Smjacob{
1140204397Smjacob	const int lim = sizeof (r2dst->req_handles) / sizeof (r2dst->req_handles[0]);
1141155228Smjacob	int i;
1142204397Smjacob
1143163899Smjacob	isp_get_hdr(isp, &r2src->req_header, &r2dst->req_header);
1144204397Smjacob	if (r2dst->req_header.rqs_seqno > lim) {
1145204397Smjacob		r2dst->req_header.rqs_seqno = lim;
1146163899Smjacob	}
1147155228Smjacob	for (i = 0; i < r2dst->req_header.rqs_seqno; i++) {
1148196008Smjacob		ISP_IOXGET_16(isp, &r2src->req_handles[i], r2dst->req_handles[i]);
1149155228Smjacob	}
1150204397Smjacob	while (i < lim) {
1151155228Smjacob		r2dst->req_handles[i++] = 0;
1152155228Smjacob	}
1153155228Smjacob}
1154155228Smjacob
1155155228Smjacobvoid
1156163899Smjacobisp_put_icb(ispsoftc_t *isp, isp_icb_t *src, isp_icb_t *dst)
1157155228Smjacob{
1158155228Smjacob	int i;
1159155228Smjacob	if (ISP_IS_SBUS(isp)) {
1160163899Smjacob		ISP_IOXPUT_8(isp, src->icb_version, &dst->icb_reserved0);
1161163899Smjacob		ISP_IOXPUT_8(isp, src->icb_reserved0, &dst->icb_version);
1162155228Smjacob	} else {
1163163899Smjacob		ISP_IOXPUT_8(isp, src->icb_version, &dst->icb_version);
1164163899Smjacob		ISP_IOXPUT_8(isp, src->icb_reserved0, &dst->icb_reserved0);
1165155228Smjacob	}
1166163899Smjacob	ISP_IOXPUT_16(isp, src->icb_fwoptions, &dst->icb_fwoptions);
1167163899Smjacob	ISP_IOXPUT_16(isp, src->icb_maxfrmlen, &dst->icb_maxfrmlen);
1168163899Smjacob	ISP_IOXPUT_16(isp, src->icb_maxalloc, &dst->icb_maxalloc);
1169163899Smjacob	ISP_IOXPUT_16(isp, src->icb_execthrottle, &dst->icb_execthrottle);
1170155228Smjacob	if (ISP_IS_SBUS(isp)) {
1171163899Smjacob		ISP_IOXPUT_8(isp, src->icb_retry_count, &dst->icb_retry_delay);
1172163899Smjacob		ISP_IOXPUT_8(isp, src->icb_retry_delay, &dst->icb_retry_count);
1173155228Smjacob	} else {
1174163899Smjacob		ISP_IOXPUT_8(isp, src->icb_retry_count, &dst->icb_retry_count);
1175163899Smjacob		ISP_IOXPUT_8(isp, src->icb_retry_delay, &dst->icb_retry_delay);
1176155228Smjacob	}
1177155228Smjacob	for (i = 0; i < 8; i++) {
1178163899Smjacob		ISP_IOXPUT_8(isp, src->icb_portname[i], &dst->icb_portname[i]);
1179155228Smjacob	}
1180163899Smjacob	ISP_IOXPUT_16(isp, src->icb_hardaddr, &dst->icb_hardaddr);
1181155228Smjacob	if (ISP_IS_SBUS(isp)) {
1182163899Smjacob		ISP_IOXPUT_8(isp, src->icb_iqdevtype, &dst->icb_logintime);
1183163899Smjacob		ISP_IOXPUT_8(isp, src->icb_logintime, &dst->icb_iqdevtype);
1184155228Smjacob	} else {
1185163899Smjacob		ISP_IOXPUT_8(isp, src->icb_iqdevtype, &dst->icb_iqdevtype);
1186163899Smjacob		ISP_IOXPUT_8(isp, src->icb_logintime, &dst->icb_logintime);
1187155228Smjacob	}
1188155228Smjacob	for (i = 0; i < 8; i++) {
1189163899Smjacob		ISP_IOXPUT_8(isp, src->icb_nodename[i], &dst->icb_nodename[i]);
1190155228Smjacob	}
1191163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rqstout, &dst->icb_rqstout);
1192163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rspnsin, &dst->icb_rspnsin);
1193163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rqstqlen, &dst->icb_rqstqlen);
1194163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rsltqlen, &dst->icb_rsltqlen);
1195155228Smjacob	for (i = 0; i < 4; i++) {
1196163899Smjacob		ISP_IOXPUT_16(isp, src->icb_rqstaddr[i], &dst->icb_rqstaddr[i]);
1197155228Smjacob	}
1198155228Smjacob	for (i = 0; i < 4; i++) {
1199163899Smjacob		ISP_IOXPUT_16(isp, src->icb_respaddr[i], &dst->icb_respaddr[i]);
1200155228Smjacob	}
1201163899Smjacob	ISP_IOXPUT_16(isp, src->icb_lunenables, &dst->icb_lunenables);
1202155228Smjacob	if (ISP_IS_SBUS(isp)) {
1203163899Smjacob		ISP_IOXPUT_8(isp, src->icb_ccnt, &dst->icb_icnt);
1204163899Smjacob		ISP_IOXPUT_8(isp, src->icb_icnt, &dst->icb_ccnt);
1205155228Smjacob	} else {
1206163899Smjacob		ISP_IOXPUT_8(isp, src->icb_ccnt, &dst->icb_ccnt);
1207163899Smjacob		ISP_IOXPUT_8(isp, src->icb_icnt, &dst->icb_icnt);
1208155228Smjacob	}
1209163899Smjacob	ISP_IOXPUT_16(isp, src->icb_lunetimeout, &dst->icb_lunetimeout);
1210163899Smjacob	ISP_IOXPUT_16(isp, src->icb_reserved1, &dst->icb_reserved1);
1211163899Smjacob	ISP_IOXPUT_16(isp, src->icb_xfwoptions, &dst->icb_xfwoptions);
1212155228Smjacob	if (ISP_IS_SBUS(isp)) {
1213163899Smjacob		ISP_IOXPUT_8(isp, src->icb_racctimer, &dst->icb_idelaytimer);
1214163899Smjacob		ISP_IOXPUT_8(isp, src->icb_idelaytimer, &dst->icb_racctimer);
1215155228Smjacob	} else {
1216163899Smjacob		ISP_IOXPUT_8(isp, src->icb_racctimer, &dst->icb_racctimer);
1217163899Smjacob		ISP_IOXPUT_8(isp, src->icb_idelaytimer, &dst->icb_idelaytimer);
1218155228Smjacob	}
1219163899Smjacob	ISP_IOXPUT_16(isp, src->icb_zfwoptions, &dst->icb_zfwoptions);
1220155228Smjacob}
1221155228Smjacob
1222155228Smjacobvoid
1223163899Smjacobisp_put_icb_2400(ispsoftc_t *isp, isp_icb_2400_t *src, isp_icb_2400_t *dst)
1224155228Smjacob{
1225155228Smjacob	int i;
1226163899Smjacob	ISP_IOXPUT_16(isp, src->icb_version, &dst->icb_version);
1227163899Smjacob	ISP_IOXPUT_16(isp, src->icb_reserved0, &dst->icb_reserved0);
1228163899Smjacob	ISP_IOXPUT_16(isp, src->icb_maxfrmlen, &dst->icb_maxfrmlen);
1229163899Smjacob	ISP_IOXPUT_16(isp, src->icb_execthrottle, &dst->icb_execthrottle);
1230163899Smjacob	ISP_IOXPUT_16(isp, src->icb_xchgcnt, &dst->icb_xchgcnt);
1231163899Smjacob	ISP_IOXPUT_16(isp, src->icb_hardaddr, &dst->icb_hardaddr);
1232163899Smjacob	for (i = 0; i < 8; i++) {
1233163899Smjacob		ISP_IOXPUT_8(isp, src->icb_portname[i], &dst->icb_portname[i]);
1234163899Smjacob	}
1235163899Smjacob	for (i = 0; i < 8; i++) {
1236163899Smjacob		ISP_IOXPUT_8(isp, src->icb_nodename[i], &dst->icb_nodename[i]);
1237163899Smjacob	}
1238163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rspnsin, &dst->icb_rspnsin);
1239163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rqstout, &dst->icb_rqstout);
1240163899Smjacob	ISP_IOXPUT_16(isp, src->icb_retry_count, &dst->icb_retry_count);
1241163899Smjacob	ISP_IOXPUT_16(isp, src->icb_priout, &dst->icb_priout);
1242163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rsltqlen, &dst->icb_rsltqlen);
1243163899Smjacob	ISP_IOXPUT_16(isp, src->icb_rqstqlen, &dst->icb_rqstqlen);
1244163899Smjacob	ISP_IOXPUT_16(isp, src->icb_ldn_nols, &dst->icb_ldn_nols);
1245163899Smjacob	ISP_IOXPUT_16(isp, src->icb_prqstqlen, &dst->icb_prqstqlen);
1246163899Smjacob	for (i = 0; i < 4; i++) {
1247163899Smjacob		ISP_IOXPUT_16(isp, src->icb_rqstaddr[i], &dst->icb_rqstaddr[i]);
1248163899Smjacob	}
1249163899Smjacob	for (i = 0; i < 4; i++) {
1250163899Smjacob		ISP_IOXPUT_16(isp, src->icb_respaddr[i], &dst->icb_respaddr[i]);
1251163899Smjacob	}
1252163899Smjacob	for (i = 0; i < 4; i++) {
1253163899Smjacob		ISP_IOXPUT_16(isp, src->icb_priaddr[i], &dst->icb_priaddr[i]);
1254163899Smjacob	}
1255291730Smav	ISP_IOXPUT_16(isp, src->icb_msixresp, &dst->icb_msixresp);
1256291730Smav	ISP_IOXPUT_16(isp, src->icb_msixatio, &dst->icb_msixatio);
1257291730Smav	for (i = 0; i < 2; i++) {
1258196008Smjacob		ISP_IOXPUT_16(isp, src->icb_reserved1[i], &dst->icb_reserved1[i]);
1259163899Smjacob	}
1260163899Smjacob	ISP_IOXPUT_16(isp, src->icb_atio_in, &dst->icb_atio_in);
1261163899Smjacob	ISP_IOXPUT_16(isp, src->icb_atioqlen, &dst->icb_atioqlen);
1262163899Smjacob	for (i = 0; i < 4; i++) {
1263196008Smjacob		ISP_IOXPUT_16(isp, src->icb_atioqaddr[i], &dst->icb_atioqaddr[i]);
1264163899Smjacob	}
1265163899Smjacob	ISP_IOXPUT_16(isp, src->icb_idelaytimer, &dst->icb_idelaytimer);
1266163899Smjacob	ISP_IOXPUT_16(isp, src->icb_logintime, &dst->icb_logintime);
1267163899Smjacob	ISP_IOXPUT_32(isp, src->icb_fwoptions1, &dst->icb_fwoptions1);
1268163899Smjacob	ISP_IOXPUT_32(isp, src->icb_fwoptions2, &dst->icb_fwoptions2);
1269163899Smjacob	ISP_IOXPUT_32(isp, src->icb_fwoptions3, &dst->icb_fwoptions3);
1270291730Smav	ISP_IOXPUT_16(isp, src->icb_qos, &dst->icb_qos);
1271291730Smav	for (i = 0; i < 3; i++)
1272196008Smjacob		ISP_IOXPUT_16(isp, src->icb_reserved2[i], &dst->icb_reserved2[i]);
1273291730Smav	for (i = 0; i < 3; i++)
1274291730Smav		ISP_IOXPUT_16(isp, src->icb_enodemac[i], &dst->icb_enodemac[i]);
1275291730Smav	ISP_IOXPUT_16(isp, src->icb_disctime, &dst->icb_disctime);
1276291730Smav	for (i = 0; i < 4; i++)
1277291730Smav		ISP_IOXPUT_16(isp, src->icb_reserved3[i], &dst->icb_reserved3[i]);
1278163899Smjacob}
1279163899Smjacob
1280163899Smjacobvoid
1281196008Smjacobisp_put_icb_2400_vpinfo(ispsoftc_t *isp, isp_icb_2400_vpinfo_t *src, isp_icb_2400_vpinfo_t *dst)
1282196008Smjacob{
1283196008Smjacob	ISP_IOXPUT_16(isp, src->vp_count, &dst->vp_count);
1284196008Smjacob	ISP_IOXPUT_16(isp, src->vp_global_options, &dst->vp_global_options);
1285196008Smjacob}
1286196008Smjacob
1287196008Smjacobvoid
1288196008Smjacobisp_put_vp_port_info(ispsoftc_t *isp, vp_port_info_t *src, vp_port_info_t *dst)
1289196008Smjacob{
1290196008Smjacob	int i;
1291196008Smjacob	ISP_IOXPUT_16(isp, src->vp_port_status, &dst->vp_port_status);
1292196008Smjacob	ISP_IOXPUT_8(isp, src->vp_port_options, &dst->vp_port_options);
1293196008Smjacob	ISP_IOXPUT_8(isp, src->vp_port_loopid, &dst->vp_port_loopid);
1294196008Smjacob	for (i = 0; i < 8; i++) {
1295196008Smjacob		ISP_IOXPUT_8(isp, src->vp_port_portname[i], &dst->vp_port_portname[i]);
1296196008Smjacob	}
1297196008Smjacob	for (i = 0; i < 8; i++) {
1298196008Smjacob		ISP_IOXPUT_8(isp, src->vp_port_nodename[i], &dst->vp_port_nodename[i]);
1299196008Smjacob	}
1300196008Smjacob	/* we never *put* portid_lo/portid_hi */
1301196008Smjacob}
1302196008Smjacob
1303196008Smjacobvoid
1304196008Smjacobisp_get_vp_port_info(ispsoftc_t *isp, vp_port_info_t *src, vp_port_info_t *dst)
1305196008Smjacob{
1306196008Smjacob	int i;
1307196008Smjacob	ISP_IOXGET_16(isp, &src->vp_port_status, dst->vp_port_status);
1308196008Smjacob	ISP_IOXGET_8(isp, &src->vp_port_options, dst->vp_port_options);
1309196008Smjacob	ISP_IOXGET_8(isp, &src->vp_port_loopid, dst->vp_port_loopid);
1310196008Smjacob	for (i = 0; i < ASIZE(src->vp_port_portname); i++) {
1311196008Smjacob		ISP_IOXGET_8(isp, &src->vp_port_portname[i], dst->vp_port_portname[i]);
1312196008Smjacob	}
1313196008Smjacob	for (i = 0; i < ASIZE(src->vp_port_nodename); i++) {
1314196008Smjacob		ISP_IOXGET_8(isp, &src->vp_port_nodename[i], dst->vp_port_nodename[i]);
1315196008Smjacob	}
1316196008Smjacob	ISP_IOXGET_16(isp, &src->vp_port_portid_lo, dst->vp_port_portid_lo);
1317196008Smjacob	ISP_IOXGET_16(isp, &src->vp_port_portid_hi, dst->vp_port_portid_hi);
1318196008Smjacob}
1319196008Smjacob
1320196008Smjacobvoid
1321196008Smjacobisp_put_vp_ctrl_info(ispsoftc_t *isp, vp_ctrl_info_t *src, vp_ctrl_info_t *dst)
1322196008Smjacob{
1323196008Smjacob	int i;
1324196008Smjacob	isp_put_hdr(isp, &src->vp_ctrl_hdr, &dst->vp_ctrl_hdr);
1325196008Smjacob	ISP_IOXPUT_32(isp, src->vp_ctrl_handle, &dst->vp_ctrl_handle);
1326196008Smjacob	ISP_IOXPUT_16(isp, src->vp_ctrl_index_fail, &dst->vp_ctrl_index_fail);
1327196008Smjacob	ISP_IOXPUT_16(isp, src->vp_ctrl_status, &dst->vp_ctrl_status);
1328196008Smjacob	ISP_IOXPUT_16(isp, src->vp_ctrl_command, &dst->vp_ctrl_command);
1329196008Smjacob	ISP_IOXPUT_16(isp, src->vp_ctrl_vp_count, &dst->vp_ctrl_vp_count);
1330196008Smjacob	for (i = 0; i < ASIZE(src->vp_ctrl_idmap); i++) {
1331196008Smjacob		ISP_IOXPUT_16(isp, src->vp_ctrl_idmap[i], &dst->vp_ctrl_idmap[i]);
1332196008Smjacob	}
1333196008Smjacob	for (i = 0; i < ASIZE(src->vp_ctrl_reserved); i++) {
1334290018Smav		ISP_IOXPUT_16(isp, src->vp_ctrl_reserved[i], &dst->vp_ctrl_reserved[i]);
1335196008Smjacob	}
1336290018Smav	ISP_IOXPUT_16(isp, src->vp_ctrl_fcf_index, &dst->vp_ctrl_fcf_index);
1337196008Smjacob}
1338196008Smjacob
1339196008Smjacobvoid
1340196008Smjacobisp_get_vp_ctrl_info(ispsoftc_t *isp, vp_ctrl_info_t *src, vp_ctrl_info_t *dst)
1341196008Smjacob{
1342196008Smjacob	int i;
1343196008Smjacob	isp_get_hdr(isp, &src->vp_ctrl_hdr, &dst->vp_ctrl_hdr);
1344196008Smjacob	ISP_IOXGET_32(isp, &src->vp_ctrl_handle, dst->vp_ctrl_handle);
1345196008Smjacob	ISP_IOXGET_16(isp, &src->vp_ctrl_index_fail, dst->vp_ctrl_index_fail);
1346196008Smjacob	ISP_IOXGET_16(isp, &src->vp_ctrl_status, dst->vp_ctrl_status);
1347196008Smjacob	ISP_IOXGET_16(isp, &src->vp_ctrl_command, dst->vp_ctrl_command);
1348196008Smjacob	ISP_IOXGET_16(isp, &src->vp_ctrl_vp_count, dst->vp_ctrl_vp_count);
1349196008Smjacob	for (i = 0; i < ASIZE(src->vp_ctrl_idmap); i++) {
1350196008Smjacob		ISP_IOXGET_16(isp, &src->vp_ctrl_idmap[i], dst->vp_ctrl_idmap[i]);
1351196008Smjacob	}
1352196008Smjacob	for (i = 0; i < ASIZE(src->vp_ctrl_reserved); i++) {
1353290018Smav		ISP_IOXGET_16(isp, &src->vp_ctrl_reserved[i], dst->vp_ctrl_reserved[i]);
1354196008Smjacob	}
1355290018Smav	ISP_IOXGET_16(isp, &src->vp_ctrl_fcf_index, dst->vp_ctrl_fcf_index);
1356196008Smjacob}
1357196008Smjacob
1358196008Smjacobvoid
1359196008Smjacobisp_put_vp_modify(ispsoftc_t *isp, vp_modify_t *src, vp_modify_t *dst)
1360196008Smjacob{
1361196008Smjacob	int i, j;
1362196008Smjacob	isp_put_hdr(isp, &src->vp_mod_hdr, &dst->vp_mod_hdr);
1363196008Smjacob	ISP_IOXPUT_32(isp, src->vp_mod_hdl, &dst->vp_mod_hdl);
1364196008Smjacob	ISP_IOXPUT_16(isp, src->vp_mod_reserved0, &dst->vp_mod_reserved0);
1365196008Smjacob	ISP_IOXPUT_16(isp, src->vp_mod_status, &dst->vp_mod_status);
1366196008Smjacob	ISP_IOXPUT_8(isp, src->vp_mod_cmd, &dst->vp_mod_cmd);
1367196008Smjacob	ISP_IOXPUT_8(isp, src->vp_mod_cnt, &dst->vp_mod_cnt);
1368196008Smjacob	ISP_IOXPUT_8(isp, src->vp_mod_idx0, &dst->vp_mod_idx0);
1369196008Smjacob	ISP_IOXPUT_8(isp, src->vp_mod_idx1, &dst->vp_mod_idx1);
1370196008Smjacob	for (i = 0; i < ASIZE(src->vp_mod_ports); i++) {
1371196008Smjacob		ISP_IOXPUT_8(isp, src->vp_mod_ports[i].options, &dst->vp_mod_ports[i].options);
1372196008Smjacob		ISP_IOXPUT_8(isp, src->vp_mod_ports[i].loopid, &dst->vp_mod_ports[i].loopid);
1373196008Smjacob		ISP_IOXPUT_16(isp, src->vp_mod_ports[i].reserved1, &dst->vp_mod_ports[i].reserved1);
1374196008Smjacob		for (j = 0; j < ASIZE(src->vp_mod_ports[i].wwpn); j++) {
1375196008Smjacob			ISP_IOXPUT_8(isp, src->vp_mod_ports[i].wwpn[j], &dst->vp_mod_ports[i].wwpn[j]);
1376196008Smjacob		}
1377196008Smjacob		for (j = 0; j < ASIZE(src->vp_mod_ports[i].wwnn); j++) {
1378196008Smjacob			ISP_IOXPUT_8(isp, src->vp_mod_ports[i].wwnn[j], &dst->vp_mod_ports[i].wwnn[j]);
1379196008Smjacob		}
1380196008Smjacob	}
1381196008Smjacob	for (i = 0; i < ASIZE(src->vp_mod_reserved2); i++) {
1382196008Smjacob		ISP_IOXPUT_8(isp, src->vp_mod_reserved2[i], &dst->vp_mod_reserved2[i]);
1383196008Smjacob	}
1384196008Smjacob}
1385196008Smjacob
1386196008Smjacobvoid
1387196008Smjacobisp_get_vp_modify(ispsoftc_t *isp, vp_modify_t *src, vp_modify_t *dst)
1388196008Smjacob{
1389196008Smjacob	int i, j;
1390196008Smjacob	isp_get_hdr(isp, &src->vp_mod_hdr, &dst->vp_mod_hdr);
1391196008Smjacob	ISP_IOXGET_32(isp, &src->vp_mod_hdl, dst->vp_mod_hdl);
1392196008Smjacob	ISP_IOXGET_16(isp, &src->vp_mod_reserved0, dst->vp_mod_reserved0);
1393196008Smjacob	ISP_IOXGET_16(isp, &src->vp_mod_status, dst->vp_mod_status);
1394196008Smjacob	ISP_IOXGET_8(isp, &src->vp_mod_cmd, dst->vp_mod_cmd);
1395196008Smjacob	ISP_IOXGET_8(isp, &src->vp_mod_cnt, dst->vp_mod_cnt);
1396196008Smjacob	ISP_IOXGET_8(isp, &src->vp_mod_idx0, dst->vp_mod_idx0);
1397196008Smjacob	ISP_IOXGET_8(isp, &src->vp_mod_idx1, dst->vp_mod_idx1);
1398196008Smjacob	for (i = 0; i < ASIZE(src->vp_mod_ports); i++) {
1399196008Smjacob		ISP_IOXGET_8(isp, &src->vp_mod_ports[i].options, dst->vp_mod_ports[i].options);
1400196008Smjacob		ISP_IOXGET_8(isp, &src->vp_mod_ports[i].loopid, dst->vp_mod_ports[i].loopid);
1401196008Smjacob		ISP_IOXGET_16(isp, &src->vp_mod_ports[i].reserved1, dst->vp_mod_ports[i].reserved1);
1402196008Smjacob		for (j = 0; j < ASIZE(src->vp_mod_ports[i].wwpn); j++) {
1403196008Smjacob			ISP_IOXGET_8(isp, &src->vp_mod_ports[i].wwpn[j], dst->vp_mod_ports[i].wwpn[j]);
1404196008Smjacob		}
1405196008Smjacob		for (j = 0; j < ASIZE(src->vp_mod_ports[i].wwnn); j++) {
1406196008Smjacob			ISP_IOXGET_8(isp, &src->vp_mod_ports[i].wwnn[j], dst->vp_mod_ports[i].wwnn[j]);
1407196008Smjacob		}
1408196008Smjacob	}
1409196008Smjacob	for (i = 0; i < ASIZE(src->vp_mod_reserved2); i++) {
1410196008Smjacob		ISP_IOXGET_8(isp, &src->vp_mod_reserved2[i], dst->vp_mod_reserved2[i]);
1411196008Smjacob	}
1412196008Smjacob}
1413196008Smjacob
1414196008Smjacobvoid
1415163899Smjacobisp_get_pdb_21xx(ispsoftc_t *isp, isp_pdb_21xx_t *src, isp_pdb_21xx_t *dst)
1416163899Smjacob{
1417163899Smjacob	int i;
1418155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_options, dst->pdb_options);
1419155228Smjacob        ISP_IOXGET_8(isp, &src->pdb_mstate, dst->pdb_mstate);
1420155228Smjacob        ISP_IOXGET_8(isp, &src->pdb_sstate, dst->pdb_sstate);
1421155228Smjacob	for (i = 0; i < 4; i++) {
1422196008Smjacob		ISP_IOXGET_8(isp, &src->pdb_hardaddr_bits[i], dst->pdb_hardaddr_bits[i]);
1423155228Smjacob	}
1424155228Smjacob	for (i = 0; i < 4; i++) {
1425196008Smjacob		ISP_IOXGET_8(isp, &src->pdb_portid_bits[i], dst->pdb_portid_bits[i]);
1426155228Smjacob	}
1427155228Smjacob	for (i = 0; i < 8; i++) {
1428155228Smjacob		ISP_IOXGET_8(isp, &src->pdb_nodename[i], dst->pdb_nodename[i]);
1429155228Smjacob	}
1430155228Smjacob	for (i = 0; i < 8; i++) {
1431155228Smjacob		ISP_IOXGET_8(isp, &src->pdb_portname[i], dst->pdb_portname[i]);
1432155228Smjacob	}
1433155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_execthrottle, dst->pdb_execthrottle);
1434155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_exec_count, dst->pdb_exec_count);
1435155228Smjacob	ISP_IOXGET_8(isp, &src->pdb_retry_count, dst->pdb_retry_count);
1436155228Smjacob	ISP_IOXGET_8(isp, &src->pdb_retry_delay, dst->pdb_retry_delay);
1437155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_resalloc, dst->pdb_resalloc);
1438155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_curalloc, dst->pdb_curalloc);
1439155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_qhead, dst->pdb_qhead);
1440155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_qtail, dst->pdb_qtail);
1441155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_tl_next, dst->pdb_tl_next);
1442155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_tl_last, dst->pdb_tl_last);
1443155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_features, dst->pdb_features);
1444155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_pconcurrnt, dst->pdb_pconcurrnt);
1445155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_roi, dst->pdb_roi);
1446155228Smjacob	ISP_IOXGET_8(isp, &src->pdb_target, dst->pdb_target);
1447155228Smjacob	ISP_IOXGET_8(isp, &src->pdb_initiator, dst->pdb_initiator);
1448155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_rdsiz, dst->pdb_rdsiz);
1449155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_ncseq, dst->pdb_ncseq);
1450155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_noseq, dst->pdb_noseq);
1451155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_labrtflg, dst->pdb_labrtflg);
1452155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_lstopflg, dst->pdb_lstopflg);
1453155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_sqhead, dst->pdb_sqhead);
1454155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_sqtail, dst->pdb_sqtail);
1455155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_ptimer, dst->pdb_ptimer);
1456155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_nxt_seqid, dst->pdb_nxt_seqid);
1457155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_fcount, dst->pdb_fcount);
1458155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_prli_len, dst->pdb_prli_len);
1459155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_prli_svc0, dst->pdb_prli_svc0);
1460155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_prli_svc3, dst->pdb_prli_svc3);
1461155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_loopid, dst->pdb_loopid);
1462155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_il_ptr, dst->pdb_il_ptr);
1463155228Smjacob	ISP_IOXGET_16(isp, &src->pdb_sl_ptr, dst->pdb_sl_ptr);
1464155228Smjacob}
1465155228Smjacob
1466163899Smjacobvoid
1467163899Smjacobisp_get_pdb_24xx(ispsoftc_t *isp, isp_pdb_24xx_t *src, isp_pdb_24xx_t *dst)
1468163899Smjacob{
1469163899Smjacob	int i;
1470163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_flags, dst->pdb_flags);
1471163899Smjacob        ISP_IOXGET_8(isp, &src->pdb_curstate, dst->pdb_curstate);
1472163899Smjacob        ISP_IOXGET_8(isp, &src->pdb_laststate, dst->pdb_laststate);
1473163899Smjacob	for (i = 0; i < 4; i++) {
1474196008Smjacob		ISP_IOXGET_8(isp, &src->pdb_hardaddr_bits[i], dst->pdb_hardaddr_bits[i]);
1475163899Smjacob	}
1476163899Smjacob	for (i = 0; i < 4; i++) {
1477196008Smjacob		ISP_IOXGET_8(isp, &src->pdb_portid_bits[i], dst->pdb_portid_bits[i]);
1478163899Smjacob	}
1479163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_retry_timer, dst->pdb_retry_timer);
1480163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_handle, dst->pdb_handle);
1481163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_rcv_dsize, dst->pdb_rcv_dsize);
1482163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_reserved0, dst->pdb_reserved0);
1483163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_prli_svc0, dst->pdb_prli_svc0);
1484163899Smjacob	ISP_IOXGET_16(isp, &src->pdb_prli_svc3, dst->pdb_prli_svc3);
1485163899Smjacob	for (i = 0; i < 8; i++) {
1486163899Smjacob		ISP_IOXGET_8(isp, &src->pdb_nodename[i], dst->pdb_nodename[i]);
1487163899Smjacob	}
1488163899Smjacob	for (i = 0; i < 8; i++) {
1489163899Smjacob		ISP_IOXGET_8(isp, &src->pdb_portname[i], dst->pdb_portname[i]);
1490163899Smjacob	}
1491163899Smjacob	for (i = 0; i < 24; i++) {
1492196008Smjacob		ISP_IOXGET_8(isp, &src->pdb_reserved1[i], dst->pdb_reserved1[i]);
1493163899Smjacob	}
1494163899Smjacob}
1495155228Smjacob
1496290104Smavvoid
1497290104Smavisp_get_pnhle_21xx(ispsoftc_t *isp, isp_pnhle_21xx_t *src, isp_pnhle_21xx_t *dst)
1498290104Smav{
1499290104Smav
1500290104Smav	ISP_IOXGET_16(isp, &src->pnhle_port_id_lo, dst->pnhle_port_id_lo);
1501290104Smav	ISP_IOXGET_16(isp, &src->pnhle_port_id_hi_handle, dst->pnhle_port_id_hi_handle);
1502290104Smav}
1503290104Smav
1504290104Smavvoid
1505290104Smavisp_get_pnhle_23xx(ispsoftc_t *isp, isp_pnhle_23xx_t *src, isp_pnhle_23xx_t *dst)
1506290104Smav{
1507290104Smav
1508290104Smav	ISP_IOXGET_16(isp, &src->pnhle_port_id_lo, dst->pnhle_port_id_lo);
1509290104Smav	ISP_IOXGET_16(isp, &src->pnhle_port_id_hi, dst->pnhle_port_id_hi);
1510290104Smav	ISP_IOXGET_16(isp, &src->pnhle_handle, dst->pnhle_handle);
1511290104Smav}
1512290104Smav
1513290104Smavvoid
1514290104Smavisp_get_pnhle_24xx(ispsoftc_t *isp, isp_pnhle_24xx_t *src, isp_pnhle_24xx_t *dst)
1515290104Smav{
1516290104Smav
1517290104Smav	ISP_IOXGET_16(isp, &src->pnhle_port_id_lo, dst->pnhle_port_id_lo);
1518290104Smav	ISP_IOXGET_16(isp, &src->pnhle_port_id_hi, dst->pnhle_port_id_hi);
1519290104Smav	ISP_IOXGET_16(isp, &src->pnhle_handle, dst->pnhle_handle);
1520290104Smav	ISP_IOXGET_16(isp, &src->pnhle_reserved, dst->pnhle_reserved);
1521290104Smav}
1522290104Smav
1523290104Smavvoid
1524290104Smavisp_get_pnnle(ispsoftc_t *isp, isp_pnnle_t *src, isp_pnnle_t *dst)
1525290104Smav{
1526290104Smav	int i;
1527290104Smav
1528290104Smav	for (i = 0; i < 8; i++)
1529290104Smav		ISP_IOXGET_8(isp, &src->pnnle_name[i], dst->pnnle_name[i]);
1530290104Smav	ISP_IOXGET_16(isp, &src->pnnle_handle, dst->pnnle_handle);
1531290104Smav	ISP_IOXGET_16(isp, &src->pnnle_reserved, dst->pnnle_reserved);
1532290104Smav}
1533290104Smav
1534155228Smjacob/*
1535163899Smjacob * PLOGI/LOGO IOCB canonicalization
1536155228Smjacob */
1537163899Smjacob
1538155228Smjacobvoid
1539163899Smjacobisp_get_plogx(ispsoftc_t *isp, isp_plogx_t *src, isp_plogx_t *dst)
1540155228Smjacob{
1541163899Smjacob	int i;
1542163899Smjacob	isp_get_hdr(isp, &src->plogx_header, &dst->plogx_header);
1543163899Smjacob	ISP_IOXGET_32(isp, &src->plogx_handle, dst->plogx_handle);
1544163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_status, dst->plogx_status);
1545163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_nphdl, dst->plogx_nphdl);
1546163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_flags, dst->plogx_flags);
1547163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_vphdl, dst->plogx_vphdl);
1548163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_portlo, dst->plogx_portlo);
1549163899Smjacob	ISP_IOXGET_16(isp, &src->plogx_rspsz_porthi, dst->plogx_rspsz_porthi);
1550163899Smjacob	for (i = 0; i < 11; i++) {
1551196008Smjacob		ISP_IOXGET_16(isp, &src->plogx_ioparm[i].lo16, dst->plogx_ioparm[i].lo16);
1552196008Smjacob		ISP_IOXGET_16(isp, &src->plogx_ioparm[i].hi16, dst->plogx_ioparm[i].hi16);
1553163899Smjacob	}
1554155228Smjacob}
1555155228Smjacob
1556163899Smjacobvoid
1557163899Smjacobisp_put_plogx(ispsoftc_t *isp, isp_plogx_t *src, isp_plogx_t *dst)
1558163899Smjacob{
1559163899Smjacob	int i;
1560163899Smjacob	isp_put_hdr(isp, &src->plogx_header, &dst->plogx_header);
1561163899Smjacob	ISP_IOXPUT_32(isp, src->plogx_handle, &dst->plogx_handle);
1562163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_status, &dst->plogx_status);
1563163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_nphdl, &dst->plogx_nphdl);
1564163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_flags, &dst->plogx_flags);
1565163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_vphdl, &dst->plogx_vphdl);
1566163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_portlo, &dst->plogx_portlo);
1567163899Smjacob	ISP_IOXPUT_16(isp, src->plogx_rspsz_porthi, &dst->plogx_rspsz_porthi);
1568163899Smjacob	for (i = 0; i < 11; i++) {
1569196008Smjacob		ISP_IOXPUT_16(isp, src->plogx_ioparm[i].lo16, &dst->plogx_ioparm[i].lo16);
1570196008Smjacob		ISP_IOXPUT_16(isp, src->plogx_ioparm[i].hi16, &dst->plogx_ioparm[i].hi16);
1571163899Smjacob	}
1572163899Smjacob}
1573163899Smjacob
1574155228Smjacob/*
1575196008Smjacob * Report ID canonicalization
1576196008Smjacob */
1577196008Smjacobvoid
1578196008Smjacobisp_get_ridacq(ispsoftc_t *isp, isp_ridacq_t *src, isp_ridacq_t *dst)
1579196008Smjacob{
1580196008Smjacob	int i;
1581196008Smjacob	isp_get_hdr(isp, &src->ridacq_hdr, &dst->ridacq_hdr);
1582196008Smjacob	ISP_IOXGET_32(isp, &src->ridacq_handle, dst->ridacq_handle);
1583290978Smav	ISP_IOXGET_8(isp, &src->ridacq_vp_acquired, dst->ridacq_vp_acquired);
1584290978Smav	ISP_IOXGET_8(isp, &src->ridacq_vp_setup, dst->ridacq_vp_setup);
1585290978Smav	ISP_IOXGET_8(isp, &src->ridacq_vp_index, dst->ridacq_vp_index);
1586290978Smav	ISP_IOXGET_8(isp, &src->ridacq_vp_status, dst->ridacq_vp_status);
1587196008Smjacob	ISP_IOXGET_16(isp, &src->ridacq_vp_port_lo, dst->ridacq_vp_port_lo);
1588196008Smjacob	ISP_IOXGET_8(isp, &src->ridacq_vp_port_hi, dst->ridacq_vp_port_hi);
1589196008Smjacob	ISP_IOXGET_8(isp, &src->ridacq_format, dst->ridacq_format);
1590196008Smjacob	for (i = 0; i < sizeof (src->ridacq_map) / sizeof (src->ridacq_map[0]); i++) {
1591196008Smjacob		ISP_IOXGET_16(isp, &src->ridacq_map[i], dst->ridacq_map[i]);
1592196008Smjacob	}
1593196008Smjacob	for (i = 0; i < sizeof (src->ridacq_reserved1) / sizeof (src->ridacq_reserved1[0]); i++) {
1594196008Smjacob		ISP_IOXGET_16(isp, &src->ridacq_reserved1[i], dst->ridacq_reserved1[i]);
1595196008Smjacob	}
1596196008Smjacob}
1597196008Smjacob
1598196008Smjacob
1599196008Smjacob/*
1600163899Smjacob * CT Passthru canonicalization
1601163899Smjacob */
1602163899Smjacobvoid
1603163899Smjacobisp_get_ct_pt(ispsoftc_t *isp, isp_ct_pt_t *src, isp_ct_pt_t *dst)
1604163899Smjacob{
1605163899Smjacob	int i;
1606163899Smjacob
1607163899Smjacob	isp_get_hdr(isp, &src->ctp_header, &dst->ctp_header);
1608163899Smjacob	ISP_IOXGET_32(isp, &src->ctp_handle, dst->ctp_handle);
1609163899Smjacob	ISP_IOXGET_16(isp, &src->ctp_status, dst->ctp_status);
1610163899Smjacob	ISP_IOXGET_16(isp, &src->ctp_nphdl, dst->ctp_nphdl);
1611163899Smjacob	ISP_IOXGET_16(isp, &src->ctp_cmd_cnt, dst->ctp_cmd_cnt);
1612196008Smjacob	ISP_IOXGET_8(isp, &src->ctp_vpidx, dst->ctp_vpidx);
1613196008Smjacob	ISP_IOXGET_8(isp, &src->ctp_reserved0, dst->ctp_reserved0);
1614163899Smjacob	ISP_IOXGET_16(isp, &src->ctp_time, dst->ctp_time);
1615196008Smjacob	ISP_IOXGET_16(isp, &src->ctp_reserved1, dst->ctp_reserved1);
1616163899Smjacob	ISP_IOXGET_16(isp, &src->ctp_rsp_cnt, dst->ctp_rsp_cnt);
1617163899Smjacob	for (i = 0; i < 5; i++) {
1618196008Smjacob		ISP_IOXGET_16(isp, &src->ctp_reserved2[i], dst->ctp_reserved2[i]);
1619163899Smjacob	}
1620163899Smjacob	ISP_IOXGET_32(isp, &src->ctp_rsp_bcnt, dst->ctp_rsp_bcnt);
1621163899Smjacob	ISP_IOXGET_32(isp, &src->ctp_cmd_bcnt, dst->ctp_cmd_bcnt);
1622163899Smjacob	for (i = 0; i < 2; i++) {
1623196008Smjacob		ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_base, dst->ctp_dataseg[i].ds_base);
1624196008Smjacob		ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_basehi, dst->ctp_dataseg[i].ds_basehi);
1625196008Smjacob		ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_count, dst->ctp_dataseg[i].ds_count);
1626163899Smjacob	}
1627163899Smjacob}
1628163899Smjacob
1629163899Smjacobvoid
1630164370Smjacobisp_get_ms(ispsoftc_t *isp, isp_ms_t *src, isp_ms_t *dst)
1631164370Smjacob{
1632164370Smjacob	int i;
1633164370Smjacob
1634164370Smjacob	isp_get_hdr(isp, &src->ms_header, &dst->ms_header);
1635164370Smjacob	ISP_IOXGET_32(isp, &src->ms_handle, dst->ms_handle);
1636164370Smjacob	ISP_IOXGET_16(isp, &src->ms_nphdl, dst->ms_nphdl);
1637164370Smjacob	ISP_IOXGET_16(isp, &src->ms_status, dst->ms_status);
1638164370Smjacob	ISP_IOXGET_16(isp, &src->ms_flags, dst->ms_flags);
1639164370Smjacob	ISP_IOXGET_16(isp, &src->ms_reserved1, dst->ms_reserved1);
1640164370Smjacob	ISP_IOXGET_16(isp, &src->ms_time, dst->ms_time);
1641164370Smjacob	ISP_IOXGET_16(isp, &src->ms_cmd_cnt, dst->ms_cmd_cnt);
1642164370Smjacob	ISP_IOXGET_16(isp, &src->ms_tot_cnt, dst->ms_tot_cnt);
1643164370Smjacob	ISP_IOXGET_8(isp, &src->ms_type, dst->ms_type);
1644164370Smjacob	ISP_IOXGET_8(isp, &src->ms_r_ctl, dst->ms_r_ctl);
1645164370Smjacob	ISP_IOXGET_16(isp, &src->ms_rxid, dst->ms_rxid);
1646164370Smjacob	ISP_IOXGET_16(isp, &src->ms_reserved2, dst->ms_reserved2);
1647164370Smjacob	ISP_IOXGET_32(isp, &src->ms_rsp_bcnt, dst->ms_rsp_bcnt);
1648164370Smjacob	ISP_IOXGET_32(isp, &src->ms_cmd_bcnt, dst->ms_cmd_bcnt);
1649164370Smjacob	for (i = 0; i < 2; i++) {
1650196008Smjacob		ISP_IOXGET_32(isp, &src->ms_dataseg[i].ds_base, dst->ms_dataseg[i].ds_base);
1651196008Smjacob		ISP_IOXGET_32(isp, &src->ms_dataseg[i].ds_basehi, dst->ms_dataseg[i].ds_basehi);
1652196008Smjacob		ISP_IOXGET_32(isp, &src->ms_dataseg[i].ds_count, dst->ms_dataseg[i].ds_count);
1653164370Smjacob	}
1654164370Smjacob}
1655164370Smjacob
1656164370Smjacobvoid
1657163899Smjacobisp_put_ct_pt(ispsoftc_t *isp, isp_ct_pt_t *src, isp_ct_pt_t *dst)
1658163899Smjacob{
1659163899Smjacob	int i;
1660163899Smjacob
1661163899Smjacob	isp_put_hdr(isp, &src->ctp_header, &dst->ctp_header);
1662163899Smjacob	ISP_IOXPUT_32(isp, src->ctp_handle, &dst->ctp_handle);
1663163899Smjacob	ISP_IOXPUT_16(isp, src->ctp_status, &dst->ctp_status);
1664163899Smjacob	ISP_IOXPUT_16(isp, src->ctp_nphdl, &dst->ctp_nphdl);
1665163899Smjacob	ISP_IOXPUT_16(isp, src->ctp_cmd_cnt, &dst->ctp_cmd_cnt);
1666196008Smjacob	ISP_IOXPUT_8(isp, src->ctp_vpidx, &dst->ctp_vpidx);
1667196008Smjacob	ISP_IOXPUT_8(isp, src->ctp_reserved0, &dst->ctp_reserved0);
1668163899Smjacob	ISP_IOXPUT_16(isp, src->ctp_time, &dst->ctp_time);
1669196008Smjacob	ISP_IOXPUT_16(isp, src->ctp_reserved1, &dst->ctp_reserved1);
1670163899Smjacob	ISP_IOXPUT_16(isp, src->ctp_rsp_cnt, &dst->ctp_rsp_cnt);
1671163899Smjacob	for (i = 0; i < 5; i++) {
1672196008Smjacob		ISP_IOXPUT_16(isp, src->ctp_reserved2[i], &dst->ctp_reserved2[i]);
1673163899Smjacob	}
1674163899Smjacob	ISP_IOXPUT_32(isp, src->ctp_rsp_bcnt, &dst->ctp_rsp_bcnt);
1675163899Smjacob	ISP_IOXPUT_32(isp, src->ctp_cmd_bcnt, &dst->ctp_cmd_bcnt);
1676163899Smjacob	for (i = 0; i < 2; i++) {
1677196008Smjacob		ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_base, &dst->ctp_dataseg[i].ds_base);
1678196008Smjacob		ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_basehi, &dst->ctp_dataseg[i].ds_basehi);
1679196008Smjacob		ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_count, &dst->ctp_dataseg[i].ds_count);
1680163899Smjacob	}
1681163899Smjacob}
1682163899Smjacob
1683164370Smjacobvoid
1684164370Smjacobisp_put_ms(ispsoftc_t *isp, isp_ms_t *src, isp_ms_t *dst)
1685164370Smjacob{
1686164370Smjacob	int i;
1687164370Smjacob
1688164370Smjacob	isp_put_hdr(isp, &src->ms_header, &dst->ms_header);
1689164370Smjacob	ISP_IOXPUT_32(isp, src->ms_handle, &dst->ms_handle);
1690164370Smjacob	ISP_IOXPUT_16(isp, src->ms_nphdl, &dst->ms_nphdl);
1691164370Smjacob	ISP_IOXPUT_16(isp, src->ms_status, &dst->ms_status);
1692164370Smjacob	ISP_IOXPUT_16(isp, src->ms_flags, &dst->ms_flags);
1693164370Smjacob	ISP_IOXPUT_16(isp, src->ms_reserved1, &dst->ms_reserved1);
1694164370Smjacob	ISP_IOXPUT_16(isp, src->ms_time, &dst->ms_time);
1695164370Smjacob	ISP_IOXPUT_16(isp, src->ms_cmd_cnt, &dst->ms_cmd_cnt);
1696164370Smjacob	ISP_IOXPUT_16(isp, src->ms_tot_cnt, &dst->ms_tot_cnt);
1697164370Smjacob	ISP_IOXPUT_8(isp, src->ms_type, &dst->ms_type);
1698164370Smjacob	ISP_IOXPUT_8(isp, src->ms_r_ctl, &dst->ms_r_ctl);
1699164370Smjacob	ISP_IOXPUT_16(isp, src->ms_rxid, &dst->ms_rxid);
1700164370Smjacob	ISP_IOXPUT_16(isp, src->ms_reserved2, &dst->ms_reserved2);
1701164370Smjacob	ISP_IOXPUT_32(isp, src->ms_rsp_bcnt, &dst->ms_rsp_bcnt);
1702164370Smjacob	ISP_IOXPUT_32(isp, src->ms_cmd_bcnt, &dst->ms_cmd_bcnt);
1703164370Smjacob	for (i = 0; i < 2; i++) {
1704196008Smjacob		ISP_IOXPUT_32(isp, src->ms_dataseg[i].ds_base, &dst->ms_dataseg[i].ds_base);
1705196008Smjacob		ISP_IOXPUT_32(isp, src->ms_dataseg[i].ds_basehi, &dst->ms_dataseg[i].ds_basehi);
1706196008Smjacob		ISP_IOXPUT_32(isp, src->ms_dataseg[i].ds_count, &dst->ms_dataseg[i].ds_count);
1707164370Smjacob	}
1708164370Smjacob}
1709164370Smjacob
1710163899Smjacob/*
1711155228Smjacob * Generic SNS request - not particularly useful since the per-command data
1712155228Smjacob * isn't always 16 bit words.
1713155228Smjacob */
1714155228Smjacobvoid
1715155704Smjacobisp_put_sns_request(ispsoftc_t *isp, sns_screq_t *src, sns_screq_t *dst)
1716155228Smjacob{
1717155228Smjacob	int i, nw = (int) src->snscb_sblen;
1718155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
1719155228Smjacob	for (i = 0; i < 4; i++) {
1720155228Smjacob		ISP_IOXPUT_16(isp, src->snscb_addr[i], &dst->snscb_addr[i]);
1721155228Smjacob	}
1722155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
1723155228Smjacob	for (i = 0; i < nw; i++) {
1724155228Smjacob		ISP_IOXPUT_16(isp, src->snscb_data[i], &dst->snscb_data[i]);
1725155228Smjacob	}
1726155228Smjacob}
1727155228Smjacob
1728155228Smjacobvoid
1729196008Smjacobisp_put_gid_ft_request(ispsoftc_t *isp, sns_gid_ft_req_t *src, sns_gid_ft_req_t *dst)
1730155228Smjacob{
1731155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
1732163899Smjacob	ISP_IOXPUT_16(isp, src->snscb_reserved0, &dst->snscb_reserved0);
1733155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[0], &dst->snscb_addr[0]);
1734155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[1], &dst->snscb_addr[1]);
1735155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[2], &dst->snscb_addr[2]);
1736155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[3], &dst->snscb_addr[3]);
1737155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
1738163899Smjacob	ISP_IOXPUT_16(isp, src->snscb_reserved1, &dst->snscb_reserved1);
1739155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_cmd, &dst->snscb_cmd);
1740155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_mword_div_2, &dst->snscb_mword_div_2);
1741163899Smjacob	ISP_IOXPUT_32(isp, src->snscb_reserved3, &dst->snscb_reserved3);
1742155228Smjacob	ISP_IOXPUT_32(isp, src->snscb_fc4_type, &dst->snscb_fc4_type);
1743155228Smjacob}
1744155228Smjacob
1745155228Smjacobvoid
1746321870Smavisp_put_gid_pt_request(ispsoftc_t *isp, sns_gid_pt_req_t *src, sns_gid_pt_req_t *dst)
1747155228Smjacob{
1748155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
1749163899Smjacob	ISP_IOXPUT_16(isp, src->snscb_reserved0, &dst->snscb_reserved0);
1750155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[0], &dst->snscb_addr[0]);
1751155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[1], &dst->snscb_addr[1]);
1752155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[2], &dst->snscb_addr[2]);
1753155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_addr[3], &dst->snscb_addr[3]);
1754155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
1755163899Smjacob	ISP_IOXPUT_16(isp, src->snscb_reserved1, &dst->snscb_reserved1);
1756155228Smjacob	ISP_IOXPUT_16(isp, src->snscb_cmd, &dst->snscb_cmd);
1757321870Smav	ISP_IOXPUT_16(isp, src->snscb_mword_div_2, &dst->snscb_mword_div_2);
1758163899Smjacob	ISP_IOXPUT_32(isp, src->snscb_reserved3, &dst->snscb_reserved3);
1759321870Smav	ISP_IOXPUT_8(isp, src->snscb_port_type, &dst->snscb_port_type);
1760321870Smav	ISP_IOXPUT_8(isp, src->snscb_domain, &dst->snscb_domain);
1761321870Smav	ISP_IOXPUT_8(isp, src->snscb_area, &dst->snscb_area);
1762321870Smav	ISP_IOXPUT_8(isp, src->snscb_flags, &dst->snscb_flags);
1763155228Smjacob}
1764155228Smjacob
1765155228Smjacobvoid
1766321870Smavisp_put_gxx_id_request(ispsoftc_t *isp, sns_gxx_id_req_t *src, sns_gxx_id_req_t *dst)
1767155228Smjacob{
1768321870Smav	ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
1769321870Smav	ISP_IOXPUT_16(isp, src->snscb_reserved0, &dst->snscb_reserved0);
1770321870Smav	ISP_IOXPUT_16(isp, src->snscb_addr[0], &dst->snscb_addr[0]);
1771321870Smav	ISP_IOXPUT_16(isp, src->snscb_addr[1], &dst->snscb_addr[1]);
1772321870Smav	ISP_IOXPUT_16(isp, src->snscb_addr[2], &dst->snscb_addr[2]);
1773321870Smav	ISP_IOXPUT_16(isp, src->snscb_addr[3], &dst->snscb_addr[3]);
1774321870Smav	ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
1775321870Smav	ISP_IOXPUT_16(isp, src->snscb_reserved1, &dst->snscb_reserved1);
1776321870Smav	ISP_IOXPUT_16(isp, src->snscb_cmd, &dst->snscb_cmd);
1777321870Smav	ISP_IOXPUT_16(isp, src->snscb_mword_div_2, &dst->snscb_mword_div_2);
1778321870Smav	ISP_IOXPUT_32(isp, src->snscb_reserved3, &dst->snscb_reserved3);
1779321870Smav	ISP_IOXPUT_32(isp, src->snscb_portid, &dst->snscb_portid);
1780155228Smjacob}
1781155228Smjacob
1782155228Smjacobvoid
1783321870Smavisp_get_gid_xx_response(ispsoftc_t *isp, sns_gid_xx_rsp_t *src, sns_gid_xx_rsp_t *dst, int nwords)
1784155228Smjacob{
1785321870Smav	int i, j;
1786321870Smav
1787155228Smjacob	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1788155228Smjacob	for (i = 0; i < nwords; i++) {
1789321870Smav		ISP_IOZGET_8(isp, &src->snscb_ports[i].control,
1790321870Smav		    dst->snscb_ports[i].control);
1791155228Smjacob		for (j = 0; j < 3; j++) {
1792321870Smav			ISP_IOZGET_8(isp, &src->snscb_ports[i].portid[j],
1793321870Smav			    dst->snscb_ports[i].portid[j]);
1794155228Smjacob		}
1795321870Smav		if (dst->snscb_ports[i].control & 0x80)
1796155228Smjacob			break;
1797155228Smjacob	}
1798155228Smjacob}
1799155228Smjacob
1800155228Smjacobvoid
1801196008Smjacobisp_get_gxn_id_response(ispsoftc_t *isp, sns_gxn_id_rsp_t *src, sns_gxn_id_rsp_t *dst)
1802155228Smjacob{
1803155228Smjacob	int i;
1804321870Smav
1805155228Smjacob	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1806321870Smav	for (i = 0; i < 8; i++)
1807321870Smav		ISP_IOZGET_8(isp, &src->snscb_wwn[i], dst->snscb_wwn[i]);
1808321870Smav}
1809321870Smav
1810321870Smavvoid
1811321870Smavisp_get_gft_id_response(ispsoftc_t *isp, sns_gft_id_rsp_t *src, sns_gft_id_rsp_t *dst)
1812321870Smav{
1813321870Smav	int i;
1814321870Smav
1815321870Smav	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1816196008Smjacob	for (i = 0; i < 8; i++) {
1817321870Smav		ISP_IOZGET_32(isp, &src->snscb_fc4_types[i],
1818321870Smav		    dst->snscb_fc4_types[i]);
1819196008Smjacob	}
1820155228Smjacob}
1821155228Smjacob
1822155228Smjacobvoid
1823196008Smjacobisp_get_gff_id_response(ispsoftc_t *isp, sns_gff_id_rsp_t *src, sns_gff_id_rsp_t *dst)
1824155228Smjacob{
1825155228Smjacob	int i;
1826321870Smav
1827155228Smjacob	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1828155228Smjacob	for (i = 0; i < 32; i++) {
1829321870Smav		ISP_IOZGET_32(isp, &src->snscb_fc4_features[i],
1830321870Smav		    dst->snscb_fc4_features[i]);
1831155228Smjacob	}
1832155228Smjacob}
1833155228Smjacob
1834155228Smjacobvoid
1835196008Smjacobisp_get_ga_nxt_response(ispsoftc_t *isp, sns_ga_nxt_rsp_t *src, sns_ga_nxt_rsp_t *dst)
1836155228Smjacob{
1837155228Smjacob	int i;
1838155228Smjacob	isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1839321870Smav	ISP_IOZGET_8(isp, &src->snscb_port_type, dst->snscb_port_type);
1840155228Smjacob	for (i = 0; i < 3; i++) {
1841321870Smav		ISP_IOZGET_8(isp, &src->snscb_port_id[i], dst->snscb_port_id[i]);
1842155228Smjacob	}
1843155228Smjacob	for (i = 0; i < 8; i++) {
1844321870Smav		ISP_IOZGET_8(isp, &src->snscb_portname[i], dst->snscb_portname[i]);
1845155228Smjacob	}
1846321870Smav	ISP_IOZGET_8(isp, &src->snscb_pnlen, dst->snscb_pnlen);
1847155228Smjacob	for (i = 0; i < 255; i++) {
1848321870Smav		ISP_IOZGET_8(isp, &src->snscb_pname[i], dst->snscb_pname[i]);
1849155228Smjacob	}
1850155228Smjacob	for (i = 0; i < 8; i++) {
1851321870Smav		ISP_IOZGET_8(isp, &src->snscb_nodename[i], dst->snscb_nodename[i]);
1852155228Smjacob	}
1853321870Smav	ISP_IOZGET_8(isp, &src->snscb_nnlen, dst->snscb_nnlen);
1854155228Smjacob	for (i = 0; i < 255; i++) {
1855321870Smav		ISP_IOZGET_8(isp, &src->snscb_nname[i], dst->snscb_nname[i]);
1856155228Smjacob	}
1857155228Smjacob	for (i = 0; i < 8; i++) {
1858321870Smav		ISP_IOZGET_8(isp, &src->snscb_ipassoc[i], dst->snscb_ipassoc[i]);
1859155228Smjacob	}
1860155228Smjacob	for (i = 0; i < 16; i++) {
1861321870Smav		ISP_IOZGET_8(isp, &src->snscb_ipaddr[i], dst->snscb_ipaddr[i]);
1862155228Smjacob	}
1863155228Smjacob	for (i = 0; i < 4; i++) {
1864321870Smav		ISP_IOZGET_8(isp, &src->snscb_svc_class[i], dst->snscb_svc_class[i]);
1865155228Smjacob	}
1866155228Smjacob	for (i = 0; i < 32; i++) {
1867321870Smav		ISP_IOZGET_8(isp, &src->snscb_fc4_types[i], dst->snscb_fc4_types[i]);
1868155228Smjacob	}
1869155228Smjacob	for (i = 0; i < 8; i++) {
1870321870Smav		ISP_IOZGET_8(isp, &src->snscb_fpname[i], dst->snscb_fpname[i]);
1871155228Smjacob	}
1872321870Smav	ISP_IOZGET_8(isp, &src->snscb_reserved, dst->snscb_reserved);
1873155228Smjacob	for (i = 0; i < 3; i++) {
1874321870Smav		ISP_IOZGET_8(isp, &src->snscb_hardaddr[i], dst->snscb_hardaddr[i]);
1875155228Smjacob	}
1876155228Smjacob}
1877155228Smjacob
1878163899Smjacobvoid
1879163899Smjacobisp_get_els(ispsoftc_t *isp, els_t *src, els_t *dst)
1880163899Smjacob{
1881163899Smjacob	int i;
1882163899Smjacob
1883163899Smjacob	isp_get_hdr(isp, &src->els_hdr, &dst->els_hdr);
1884163899Smjacob	ISP_IOXGET_32(isp, &src->els_handle, dst->els_handle);
1885163899Smjacob	ISP_IOXGET_16(isp, &src->els_status, dst->els_status);
1886163899Smjacob	ISP_IOXGET_16(isp, &src->els_nphdl, dst->els_nphdl);
1887163899Smjacob	ISP_IOXGET_16(isp, &src->els_xmit_dsd_count, dst->els_xmit_dsd_count);
1888163899Smjacob	ISP_IOXGET_8(isp, &src->els_vphdl, dst->els_vphdl);
1889163899Smjacob	ISP_IOXGET_8(isp, &src->els_sof, dst->els_sof);
1890163899Smjacob	ISP_IOXGET_32(isp, &src->els_rxid, dst->els_rxid);
1891163899Smjacob	ISP_IOXGET_16(isp, &src->els_recv_dsd_count, dst->els_recv_dsd_count);
1892163899Smjacob	ISP_IOXGET_8(isp, &src->els_opcode, dst->els_opcode);
1893163899Smjacob	ISP_IOXGET_8(isp, &src->els_reserved2, dst->els_reserved1);
1894163899Smjacob	ISP_IOXGET_8(isp, &src->els_did_lo, dst->els_did_lo);
1895163899Smjacob	ISP_IOXGET_8(isp, &src->els_did_mid, dst->els_did_mid);
1896163899Smjacob	ISP_IOXGET_8(isp, &src->els_did_hi, dst->els_did_hi);
1897163899Smjacob	ISP_IOXGET_8(isp, &src->els_reserved2, dst->els_reserved2);
1898163899Smjacob	ISP_IOXGET_16(isp, &src->els_reserved3, dst->els_reserved3);
1899163899Smjacob	ISP_IOXGET_16(isp, &src->els_ctl_flags, dst->els_ctl_flags);
1900163899Smjacob	ISP_IOXGET_32(isp, &src->els_bytecnt, dst->els_bytecnt);
1901163899Smjacob	ISP_IOXGET_32(isp, &src->els_subcode1, dst->els_subcode1);
1902163899Smjacob	ISP_IOXGET_32(isp, &src->els_subcode2, dst->els_subcode2);
1903163899Smjacob	for (i = 0; i < 20; i++) {
1904196008Smjacob		ISP_IOXGET_8(isp, &src->els_reserved4[i], dst->els_reserved4[i]);
1905163899Smjacob	}
1906163899Smjacob}
1907163899Smjacob
1908163899Smjacobvoid
1909163899Smjacobisp_put_els(ispsoftc_t *isp, els_t *src, els_t *dst)
1910163899Smjacob{
1911163899Smjacob	isp_put_hdr(isp, &src->els_hdr, &dst->els_hdr);
1912163899Smjacob	ISP_IOXPUT_32(isp, src->els_handle, &dst->els_handle);
1913163899Smjacob	ISP_IOXPUT_16(isp, src->els_status, &dst->els_status);
1914163899Smjacob	ISP_IOXPUT_16(isp, src->els_nphdl, &dst->els_nphdl);
1915163899Smjacob	ISP_IOXPUT_16(isp, src->els_xmit_dsd_count, &dst->els_xmit_dsd_count);
1916163899Smjacob	ISP_IOXPUT_8(isp, src->els_vphdl, &dst->els_vphdl);
1917163899Smjacob	ISP_IOXPUT_8(isp, src->els_sof, &dst->els_sof);
1918163899Smjacob	ISP_IOXPUT_32(isp, src->els_rxid, &dst->els_rxid);
1919163899Smjacob	ISP_IOXPUT_16(isp, src->els_recv_dsd_count, &dst->els_recv_dsd_count);
1920163899Smjacob	ISP_IOXPUT_8(isp, src->els_opcode, &dst->els_opcode);
1921163899Smjacob	ISP_IOXPUT_8(isp, src->els_reserved2, &dst->els_reserved1);
1922163899Smjacob	ISP_IOXPUT_8(isp, src->els_did_lo, &dst->els_did_lo);
1923163899Smjacob	ISP_IOXPUT_8(isp, src->els_did_mid, &dst->els_did_mid);
1924163899Smjacob	ISP_IOXPUT_8(isp, src->els_did_hi, &dst->els_did_hi);
1925163899Smjacob	ISP_IOXPUT_8(isp, src->els_reserved2, &dst->els_reserved2);
1926163899Smjacob	ISP_IOXPUT_16(isp, src->els_reserved3, &dst->els_reserved3);
1927163899Smjacob	ISP_IOXPUT_16(isp, src->els_ctl_flags, &dst->els_ctl_flags);
1928163899Smjacob	ISP_IOXPUT_32(isp, src->els_recv_bytecnt, &dst->els_recv_bytecnt);
1929163899Smjacob	ISP_IOXPUT_32(isp, src->els_xmit_bytecnt, &dst->els_xmit_bytecnt);
1930163899Smjacob	ISP_IOXPUT_32(isp, src->els_xmit_dsd_length, &dst->els_xmit_dsd_length);
1931163899Smjacob	ISP_IOXPUT_16(isp, src->els_xmit_dsd_a1500, &dst->els_xmit_dsd_a1500);
1932163899Smjacob	ISP_IOXPUT_16(isp, src->els_xmit_dsd_a3116, &dst->els_xmit_dsd_a3116);
1933163899Smjacob	ISP_IOXPUT_16(isp, src->els_xmit_dsd_a4732, &dst->els_xmit_dsd_a4732);
1934163899Smjacob	ISP_IOXPUT_16(isp, src->els_xmit_dsd_a6348, &dst->els_xmit_dsd_a6348);
1935163899Smjacob	ISP_IOXPUT_32(isp, src->els_recv_dsd_length, &dst->els_recv_dsd_length);
1936163899Smjacob	ISP_IOXPUT_16(isp, src->els_recv_dsd_a1500, &dst->els_recv_dsd_a1500);
1937163899Smjacob	ISP_IOXPUT_16(isp, src->els_recv_dsd_a3116, &dst->els_recv_dsd_a3116);
1938163899Smjacob	ISP_IOXPUT_16(isp, src->els_recv_dsd_a4732, &dst->els_recv_dsd_a4732);
1939163899Smjacob	ISP_IOXPUT_16(isp, src->els_recv_dsd_a6348, &dst->els_recv_dsd_a6348);
1940163899Smjacob}
1941163899Smjacob
1942163899Smjacob/*
1943163899Smjacob * FC Structure Canonicalization
1944163899Smjacob */
1945163899Smjacob
1946163899Smjacobvoid
1947163899Smjacobisp_get_fc_hdr(ispsoftc_t *isp, fc_hdr_t *src, fc_hdr_t *dst)
1948163899Smjacob{
1949163899Smjacob        ISP_IOZGET_8(isp, &src->r_ctl, dst->r_ctl);
1950163899Smjacob        ISP_IOZGET_8(isp, &src->d_id[0], dst->d_id[0]);
1951163899Smjacob        ISP_IOZGET_8(isp, &src->d_id[1], dst->d_id[1]);
1952163899Smjacob        ISP_IOZGET_8(isp, &src->d_id[2], dst->d_id[2]);
1953163899Smjacob        ISP_IOZGET_8(isp, &src->cs_ctl, dst->cs_ctl);
1954163899Smjacob        ISP_IOZGET_8(isp, &src->s_id[0], dst->s_id[0]);
1955163899Smjacob        ISP_IOZGET_8(isp, &src->s_id[1], dst->s_id[1]);
1956163899Smjacob        ISP_IOZGET_8(isp, &src->s_id[2], dst->s_id[2]);
1957163899Smjacob        ISP_IOZGET_8(isp, &src->type, dst->type);
1958196008Smjacob        ISP_IOZGET_8(isp, &src->f_ctl[0], dst->f_ctl[0]);
1959196008Smjacob        ISP_IOZGET_8(isp, &src->f_ctl[1], dst->f_ctl[1]);
1960196008Smjacob        ISP_IOZGET_8(isp, &src->f_ctl[2], dst->f_ctl[2]);
1961163899Smjacob        ISP_IOZGET_8(isp, &src->seq_id, dst->seq_id);
1962163899Smjacob        ISP_IOZGET_8(isp, &src->df_ctl, dst->df_ctl);
1963163899Smjacob        ISP_IOZGET_16(isp, &src->seq_cnt, dst->seq_cnt);
1964163899Smjacob        ISP_IOZGET_16(isp, &src->ox_id, dst->ox_id);
1965163899Smjacob        ISP_IOZGET_16(isp, &src->rx_id, dst->rx_id);
1966163899Smjacob        ISP_IOZGET_32(isp, &src->parameter, dst->parameter);
1967163899Smjacob}
1968163899Smjacob
1969163899Smjacobvoid
1970238869Smjacobisp_put_fc_hdr(ispsoftc_t *isp, fc_hdr_t *src, fc_hdr_t *dst)
1971238869Smjacob{
1972238869Smjacob        ISP_IOZPUT_8(isp, src->r_ctl, &dst->r_ctl);
1973238869Smjacob        ISP_IOZPUT_8(isp, src->d_id[0], &dst->d_id[0]);
1974238869Smjacob        ISP_IOZPUT_8(isp, src->d_id[1], &dst->d_id[1]);
1975238869Smjacob        ISP_IOZPUT_8(isp, src->d_id[2], &dst->d_id[2]);
1976238869Smjacob        ISP_IOZPUT_8(isp, src->cs_ctl, &dst->cs_ctl);
1977238869Smjacob        ISP_IOZPUT_8(isp, src->s_id[0], &dst->s_id[0]);
1978238869Smjacob        ISP_IOZPUT_8(isp, src->s_id[1], &dst->s_id[1]);
1979238869Smjacob        ISP_IOZPUT_8(isp, src->s_id[2], &dst->s_id[2]);
1980238869Smjacob        ISP_IOZPUT_8(isp, src->type, &dst->type);
1981238869Smjacob        ISP_IOZPUT_8(isp, src->f_ctl[0], &dst->f_ctl[0]);
1982238869Smjacob        ISP_IOZPUT_8(isp, src->f_ctl[1], &dst->f_ctl[1]);
1983238869Smjacob        ISP_IOZPUT_8(isp, src->f_ctl[2], &dst->f_ctl[2]);
1984238869Smjacob        ISP_IOZPUT_8(isp, src->seq_id, &dst->seq_id);
1985238869Smjacob        ISP_IOZPUT_8(isp, src->df_ctl, &dst->df_ctl);
1986238869Smjacob        ISP_IOZPUT_16(isp, src->seq_cnt, &dst->seq_cnt);
1987238869Smjacob        ISP_IOZPUT_16(isp, src->ox_id, &dst->ox_id);
1988238869Smjacob        ISP_IOZPUT_16(isp, src->rx_id, &dst->rx_id);
1989238869Smjacob        ISP_IOZPUT_32(isp, src->parameter, &dst->parameter);
1990238869Smjacob}
1991238869Smjacob
1992238869Smjacobvoid
1993163899Smjacobisp_get_fcp_cmnd_iu(ispsoftc_t *isp, fcp_cmnd_iu_t *src, fcp_cmnd_iu_t *dst)
1994163899Smjacob{
1995163899Smjacob	int i;
1996163899Smjacob
1997163899Smjacob	for (i = 0; i < 8; i++) {
1998163899Smjacob		ISP_IOZGET_8(isp, &src->fcp_cmnd_lun[i], dst->fcp_cmnd_lun[i]);
1999163899Smjacob	}
2000163899Smjacob        ISP_IOZGET_8(isp, &src->fcp_cmnd_crn, dst->fcp_cmnd_crn);
2001196008Smjacob        ISP_IOZGET_8(isp, &src->fcp_cmnd_task_attribute, dst->fcp_cmnd_task_attribute);
2002196008Smjacob        ISP_IOZGET_8(isp, &src->fcp_cmnd_task_management, dst->fcp_cmnd_task_management);
2003196008Smjacob        ISP_IOZGET_8(isp, &src->fcp_cmnd_alen_datadir, dst->fcp_cmnd_alen_datadir);
2004163899Smjacob	for (i = 0; i < 16; i++) {
2005196008Smjacob		ISP_IOZGET_8(isp, &src->cdb_dl.sf.fcp_cmnd_cdb[i], dst->cdb_dl.sf.fcp_cmnd_cdb[i]);
2006163899Smjacob	}
2007196008Smjacob	ISP_IOZGET_32(isp, &src->cdb_dl.sf.fcp_cmnd_dl, dst->cdb_dl.sf.fcp_cmnd_dl);
2008163899Smjacob}
2009163899Smjacob
2010163899Smjacobvoid
2011163899Smjacobisp_put_rft_id(ispsoftc_t *isp, rft_id_t *src, rft_id_t *dst)
2012163899Smjacob{
2013163899Smjacob	int i;
2014163899Smjacob	isp_put_ct_hdr(isp, &src->rftid_hdr, &dst->rftid_hdr);
2015163899Smjacob	ISP_IOZPUT_8(isp, src->rftid_reserved, &dst->rftid_reserved);
2016163899Smjacob	for (i = 0; i < 3; i++) {
2017163899Smjacob		ISP_IOZPUT_8(isp, src->rftid_portid[i], &dst->rftid_portid[i]);
2018163899Smjacob	}
2019163899Smjacob	for (i = 0; i < 8; i++) {
2020196008Smjacob		ISP_IOZPUT_32(isp, src->rftid_fc4types[i], &dst->rftid_fc4types[i]);
2021163899Smjacob	}
2022163899Smjacob}
2023163899Smjacob
2024163899Smjacobvoid
2025297751Smavisp_put_rspn_id(ispsoftc_t *isp, rspn_id_t *src, rspn_id_t *dst)
2026297751Smav{
2027297751Smav/*	int i;*/
2028297751Smav	isp_put_ct_hdr(isp, &src->rspnid_hdr, &dst->rspnid_hdr);
2029297751Smav	ISP_IOZPUT_8(isp, src->rspnid_reserved, &dst->rspnid_reserved);
2030297751Smav	ISP_IOZPUT_8(isp, src->rspnid_length, &dst->rspnid_length);
2031297751Smav/*	for (i = 0; i < src->rspnid_length; i++)
2032297751Smav		ISP_IOZPUT_8(isp, src->rspnid_name[i], &dst->rspnid_name[i]);*/
2033297751Smav}
2034297751Smav
2035297751Smavvoid
2036291000Smavisp_put_rff_id(ispsoftc_t *isp, rff_id_t *src, rff_id_t *dst)
2037291000Smav{
2038291000Smav	int i;
2039291000Smav
2040291000Smav	isp_put_ct_hdr(isp, &src->rffid_hdr, &dst->rffid_hdr);
2041291000Smav	ISP_IOZPUT_8(isp, src->rffid_reserved, &dst->rffid_reserved);
2042291000Smav	for (i = 0; i < 3; i++)
2043291000Smav		ISP_IOZPUT_8(isp, src->rffid_portid[i], &dst->rffid_portid[i]);
2044291000Smav	ISP_IOZPUT_16(isp, src->rffid_reserved2, &dst->rffid_reserved2);
2045291000Smav	ISP_IOZPUT_8(isp, src->rffid_fc4features, &dst->rffid_fc4features);
2046291000Smav	ISP_IOZPUT_8(isp, src->rffid_fc4type, &dst->rffid_fc4type);
2047291000Smav}
2048291000Smav
2049291000Smavvoid
2050297751Smavisp_put_rsnn_nn(ispsoftc_t *isp, rsnn_nn_t *src, rsnn_nn_t *dst)
2051297751Smav{
2052297751Smav	int i;
2053297751Smav	isp_put_ct_hdr(isp, &src->rsnnnn_hdr, &dst->rsnnnn_hdr);
2054297751Smav	for (i = 0; i < 8; i++)
2055297751Smav		ISP_IOZPUT_8(isp, src->rsnnnn_nodename[i], &dst->rsnnnn_nodename[i]);
2056297751Smav	ISP_IOZPUT_8(isp, src->rsnnnn_length, &dst->rsnnnn_length);
2057297751Smav/*	for (i = 0; i < src->rsnnnn_length; i++)
2058297751Smav		ISP_IOZPUT_8(isp, src->rsnnnn_name[i], &dst->rsnnnn_name[i]);*/
2059297751Smav}
2060297751Smav
2061297751Smavvoid
2062163899Smjacobisp_get_ct_hdr(ispsoftc_t *isp, ct_hdr_t *src, ct_hdr_t *dst)
2063163899Smjacob{
2064163899Smjacob	ISP_IOZGET_8(isp, &src->ct_revision, dst->ct_revision);
2065163899Smjacob	ISP_IOZGET_8(isp, &src->ct_in_id[0], dst->ct_in_id[0]);
2066163899Smjacob	ISP_IOZGET_8(isp, &src->ct_in_id[1], dst->ct_in_id[1]);
2067163899Smjacob	ISP_IOZGET_8(isp, &src->ct_in_id[2], dst->ct_in_id[2]);
2068163899Smjacob	ISP_IOZGET_8(isp, &src->ct_fcs_type, dst->ct_fcs_type);
2069163899Smjacob	ISP_IOZGET_8(isp, &src->ct_fcs_subtype, dst->ct_fcs_subtype);
2070163899Smjacob	ISP_IOZGET_8(isp, &src->ct_options, dst->ct_options);
2071163899Smjacob	ISP_IOZGET_8(isp, &src->ct_reserved0, dst->ct_reserved0);
2072163899Smjacob	ISP_IOZGET_16(isp, &src->ct_cmd_resp, dst->ct_cmd_resp);
2073163899Smjacob	ISP_IOZGET_16(isp, &src->ct_bcnt_resid, dst->ct_bcnt_resid);
2074163899Smjacob	ISP_IOZGET_8(isp, &src->ct_reserved1, dst->ct_reserved1);
2075163899Smjacob	ISP_IOZGET_8(isp, &src->ct_reason, dst->ct_reason);
2076163899Smjacob	ISP_IOZGET_8(isp, &src->ct_explanation, dst->ct_explanation);
2077163899Smjacob	ISP_IOZGET_8(isp, &src->ct_vunique, dst->ct_vunique);
2078163899Smjacob}
2079163899Smjacob
2080163899Smjacobvoid
2081163899Smjacobisp_put_ct_hdr(ispsoftc_t *isp, ct_hdr_t *src, ct_hdr_t *dst)
2082163899Smjacob{
2083163899Smjacob	ISP_IOZPUT_8(isp, src->ct_revision, &dst->ct_revision);
2084163899Smjacob	ISP_IOZPUT_8(isp, src->ct_in_id[0], &dst->ct_in_id[0]);
2085163899Smjacob	ISP_IOZPUT_8(isp, src->ct_in_id[1], &dst->ct_in_id[1]);
2086163899Smjacob	ISP_IOZPUT_8(isp, src->ct_in_id[2], &dst->ct_in_id[2]);
2087163899Smjacob	ISP_IOZPUT_8(isp, src->ct_fcs_type, &dst->ct_fcs_type);
2088163899Smjacob	ISP_IOZPUT_8(isp, src->ct_fcs_subtype, &dst->ct_fcs_subtype);
2089163899Smjacob	ISP_IOZPUT_8(isp, src->ct_options, &dst->ct_options);
2090163899Smjacob	ISP_IOZPUT_8(isp, src->ct_reserved0, &dst->ct_reserved0);
2091163899Smjacob	ISP_IOZPUT_16(isp, src->ct_cmd_resp, &dst->ct_cmd_resp);
2092163899Smjacob	ISP_IOZPUT_16(isp, src->ct_bcnt_resid, &dst->ct_bcnt_resid);
2093163899Smjacob	ISP_IOZPUT_8(isp, src->ct_reserved1, &dst->ct_reserved1);
2094163899Smjacob	ISP_IOZPUT_8(isp, src->ct_reason, &dst->ct_reason);
2095163899Smjacob	ISP_IOZPUT_8(isp, src->ct_explanation, &dst->ct_explanation);
2096163899Smjacob	ISP_IOZPUT_8(isp, src->ct_vunique, &dst->ct_vunique);
2097163899Smjacob}
2098163899Smjacob
2099238869Smjacobvoid
2100238869Smjacobisp_put_fcp_rsp_iu(ispsoftc_t *isp, fcp_rsp_iu_t *src, fcp_rsp_iu_t *dst)
2101238869Smjacob{
2102238869Smjacob	int i;
2103238869Smjacob	for (i = 0; i < ((sizeof (src->fcp_rsp_reserved))/(sizeof (src->fcp_rsp_reserved[0]))); i++) {
2104238869Smjacob		ISP_IOZPUT_8(isp, src->fcp_rsp_reserved[i], &dst->fcp_rsp_reserved[i]);
2105238869Smjacob	}
2106238869Smjacob	ISP_IOZPUT_16(isp, src->fcp_rsp_status_qualifier, &dst->fcp_rsp_status_qualifier);
2107238869Smjacob	ISP_IOZPUT_8(isp, src->fcp_rsp_bits, &dst->fcp_rsp_bits);
2108238869Smjacob	ISP_IOZPUT_8(isp, src->fcp_rsp_scsi_status, &dst->fcp_rsp_scsi_status);
2109238869Smjacob	ISP_IOZPUT_32(isp, src->fcp_rsp_resid, &dst->fcp_rsp_resid);
2110238869Smjacob	ISP_IOZPUT_32(isp, src->fcp_rsp_snslen, &dst->fcp_rsp_snslen);
2111238869Smjacob	ISP_IOZPUT_32(isp, src->fcp_rsp_rsplen, &dst->fcp_rsp_rsplen);
2112238869Smjacob}
2113238869Smjacob
2114196008Smjacob/*
2115285459Smav * Find port database entries
2116196008Smjacob */
2117196008Smjacobint
2118291080Smavisp_find_pdb_empty(ispsoftc_t *isp, int chan, fcportdb_t **lptr)
2119196008Smjacob{
2120291080Smav	fcparam *fcp = FCPARAM(isp, chan);
2121196008Smjacob	int i;
2122196008Smjacob
2123285459Smav	for (i = 0; i < MAX_FC_TARG; i++) {
2124284681Smav		fcportdb_t *lp = &fcp->portdb[i];
2125196008Smjacob
2126291080Smav		if (lp->state == FC_PORTDB_STATE_NIL) {
2127291080Smav			*lptr = lp;
2128291080Smav			return (1);
2129291080Smav		}
2130291080Smav	}
2131291080Smav	return (0);
2132291080Smav}
2133291080Smav
2134291080Smavint
2135291080Smavisp_find_pdb_by_wwpn(ispsoftc_t *isp, int chan, uint64_t wwpn, fcportdb_t **lptr)
2136291080Smav{
2137291080Smav	fcparam *fcp = FCPARAM(isp, chan);
2138291080Smav	int i;
2139291080Smav
2140291080Smav	for (i = 0; i < MAX_FC_TARG; i++) {
2141291080Smav		fcportdb_t *lp = &fcp->portdb[i];
2142291080Smav
2143285459Smav		if (lp->state == FC_PORTDB_STATE_NIL)
2144284681Smav			continue;
2145291080Smav		if (lp->port_wwn == wwpn) {
2146284681Smav			*lptr = lp;
2147284681Smav			return (1);
2148196008Smjacob		}
2149196008Smjacob	}
2150196008Smjacob	return (0);
2151196008Smjacob}
2152196008Smjacob
2153196008Smjacobint
2154291080Smavisp_find_pdb_by_handle(ispsoftc_t *isp, int chan, uint16_t handle,
2155291080Smav    fcportdb_t **lptr)
2156196008Smjacob{
2157291080Smav	fcparam *fcp = FCPARAM(isp, chan);
2158196008Smjacob	int i;
2159196008Smjacob
2160285459Smav	for (i = 0; i < MAX_FC_TARG; i++) {
2161285459Smav		fcportdb_t *lp = &fcp->portdb[i];
2162285459Smav
2163285459Smav		if (lp->state == FC_PORTDB_STATE_NIL)
2164285459Smav			continue;
2165285459Smav		if (lp->handle == handle) {
2166285459Smav			*lptr = lp;
2167285459Smav			return (1);
2168285459Smav		}
2169196008Smjacob	}
2170196008Smjacob	return (0);
2171196008Smjacob}
2172196008Smjacob
2173196008Smjacobint
2174291080Smavisp_find_pdb_by_portid(ispsoftc_t *isp, int chan, uint32_t portid,
2175291080Smav    fcportdb_t **lptr)
2176196008Smjacob{
2177291080Smav	fcparam *fcp = FCPARAM(isp, chan);
2178196008Smjacob	int i;
2179196008Smjacob
2180285459Smav	for (i = 0; i < MAX_FC_TARG; i++) {
2181196008Smjacob		fcportdb_t *lp = &fcp->portdb[i];
2182196008Smjacob
2183285459Smav		if (lp->state == FC_PORTDB_STATE_NIL)
2184196008Smjacob			continue;
2185291080Smav		if (lp->portid == portid) {
2186196008Smjacob			*lptr = lp;
2187196008Smjacob			return (1);
2188196008Smjacob		}
2189196008Smjacob	}
2190196008Smjacob	return (0);
2191196008Smjacob}
2192196008Smjacob
2193291080Smav#ifdef	ISP_TARGET_MODE
2194155228Smjacobvoid
2195196008Smjacobisp_find_chan_by_did(ispsoftc_t *isp, uint32_t did, uint16_t *cp)
2196196008Smjacob{
2197196008Smjacob	uint16_t chan;
2198196008Smjacob
2199196008Smjacob	*cp = ISP_NOCHAN;
2200196008Smjacob	for (chan = 0; chan < isp->isp_nchan; chan++) {
2201196008Smjacob		fcparam *fcp = FCPARAM(isp, chan);
2202290993Smav		if ((fcp->role & ISP_ROLE_TARGET) == 0 ||
2203297991Smav		    fcp->isp_loopstate < LOOP_HAVE_ADDR) {
2204196008Smjacob			continue;
2205196008Smjacob		}
2206196008Smjacob		if (fcp->isp_portid == did) {
2207196008Smjacob			*cp = chan;
2208196008Smjacob			break;
2209196008Smjacob		}
2210196008Smjacob	}
2211196008Smjacob}
2212196008Smjacob
2213196008Smjacob/*
2214196008Smjacob * Add an initiator device to the port database
2215196008Smjacob */
2216196008Smjacobvoid
2217289838Smavisp_add_wwn_entry(ispsoftc_t *isp, int chan, uint64_t wwpn, uint64_t wwnn,
2218289838Smav    uint16_t nphdl, uint32_t s_id, uint16_t prli_params)
2219196008Smjacob{
2220238869Smjacob	char buf[64];
2221196008Smjacob	fcparam *fcp;
2222196008Smjacob	fcportdb_t *lp;
2223285459Smav	int i, change;
2224196008Smjacob
2225196008Smjacob	fcp = FCPARAM(isp, chan);
2226196008Smjacob	if (nphdl >= MAX_NPORT_HANDLE) {
2227285459Smav		isp_prt(isp, ISP_LOGTINFO|ISP_LOGWARN, "Chan %d WWPN 0x%016llx "
2228285459Smav		    "PortID 0x%06x handle 0x%x -- bad handle",
2229289838Smav		    chan, (unsigned long long) wwpn, s_id, nphdl);
2230196008Smjacob		return;
2231196008Smjacob	}
2232196008Smjacob
2233284681Smav	/*
2234284681Smav	 * If valid record for requested handle already exists, update it
2235284681Smav	 * with new parameters.  Some cases of update can be suspicious,
2236284681Smav	 * so log them verbosely and dump the whole port database.
2237284681Smav	 */
2238291080Smav	if ((VALID_INI(wwpn) && isp_find_pdb_by_wwpn(isp, chan, wwpn, &lp)) ||
2239291144Smav	    (VALID_PORT(s_id) && isp_find_pdb_by_portid(isp, chan, s_id, &lp))) {
2240285459Smav		change = 0;
2241285459Smav		lp->new_portid = lp->portid;
2242285459Smav		lp->new_prli_word3 = lp->prli_word3;
2243291144Smav		if (VALID_PORT(s_id) && lp->portid != s_id) {
2244291144Smav			if (!VALID_PORT(lp->portid)) {
2245284681Smav				isp_prt(isp, ISP_LOGTINFO,
2246285459Smav				    "Chan %d WWPN 0x%016llx handle 0x%x "
2247285459Smav				    "gets PortID 0x%06x",
2248284681Smav				    chan, (unsigned long long) lp->port_wwn,
2249284681Smav				    nphdl, s_id);
2250284681Smav			} else {
2251284681Smav				isp_prt(isp, ISP_LOGTINFO|ISP_LOGWARN,
2252285459Smav				    "Chan %d WWPN 0x%016llx handle 0x%x "
2253285459Smav				    "changes PortID 0x%06x to 0x%06x",
2254284681Smav				    chan, (unsigned long long) lp->port_wwn,
2255284681Smav				    nphdl, lp->portid, s_id);
2256284681Smav				if (isp->isp_dblev & (ISP_LOGTINFO|ISP_LOGWARN))
2257284681Smav					isp_dump_portdb(isp, chan);
2258196008Smjacob			}
2259285459Smav			lp->new_portid = s_id;
2260285459Smav			change++;
2261196008Smjacob		}
2262289838Smav		if (VALID_INI(wwpn) && lp->port_wwn != wwpn) {
2263196008Smjacob			if (!VALID_INI(lp->port_wwn)) {
2264284681Smav				isp_prt(isp, ISP_LOGTINFO,
2265285459Smav				    "Chan %d PortID 0x%06x handle 0x%x "
2266289838Smav				    "gets WWPN 0x%016llxx",
2267285459Smav				    chan, lp->portid, nphdl,
2268289838Smav				    (unsigned long long) wwpn);
2269289838Smav			} else if (lp->port_wwn != wwpn) {
2270284681Smav				isp_prt(isp, ISP_LOGTINFO|ISP_LOGWARN,
2271285459Smav				    "Chan %d PortID 0x%06x handle 0x%x "
2272289838Smav				    "changes WWPN 0x%016llx to 0x%016llx",
2273285459Smav				    chan, lp->portid, nphdl,
2274284681Smav				    (unsigned long long) lp->port_wwn,
2275289838Smav				    (unsigned long long) wwpn);
2276284681Smav				if (isp->isp_dblev & (ISP_LOGTINFO|ISP_LOGWARN))
2277284681Smav					isp_dump_portdb(isp, chan);
2278196008Smjacob			}
2279289838Smav			lp->port_wwn = wwpn;
2280285459Smav			change++;
2281196008Smjacob		}
2282289838Smav		if (VALID_INI(wwnn) && lp->node_wwn != wwnn) {
2283289838Smav			if (!VALID_INI(lp->node_wwn)) {
2284289838Smav				isp_prt(isp, ISP_LOGTINFO,
2285289838Smav				    "Chan %d PortID 0x%06x handle 0x%x "
2286289838Smav				    "gets WWNN 0x%016llxx",
2287289838Smav				    chan, lp->portid, nphdl,
2288289838Smav				    (unsigned long long) wwnn);
2289289838Smav			} else if (lp->port_wwn != wwnn) {
2290289838Smav				isp_prt(isp, ISP_LOGTINFO,
2291289838Smav				    "Chan %d PortID 0x%06x handle 0x%x "
2292289838Smav				    "changes WWNN 0x%016llx to 0x%016llx",
2293289838Smav				    chan, lp->portid, nphdl,
2294289838Smav				    (unsigned long long) lp->node_wwn,
2295289838Smav				    (unsigned long long) wwnn);
2296289838Smav			}
2297289838Smav			lp->node_wwn = wwnn;
2298289838Smav			change++;
2299289838Smav		}
2300285459Smav		if (prli_params != 0 && lp->prli_word3 != prli_params) {
2301285459Smav			isp_gen_role_str(buf, sizeof (buf), prli_params);
2302284681Smav			isp_prt(isp, ISP_LOGTINFO|ISP_LOGCONFIG,
2303285459Smav			    "Chan %d WWPN 0x%016llx PortID 0x%06x "
2304285459Smav			    "handle 0x%x changes PRLI Word 3 %s",
2305284681Smav			    chan, (unsigned long long) lp->port_wwn,
2306285459Smav			    lp->portid, lp->handle, buf);
2307285459Smav			lp->new_prli_word3 = prli_params;
2308285459Smav			change++;
2309238869Smjacob		}
2310285459Smav		if (lp->handle != nphdl) {
2311285459Smav			isp_prt(isp, ISP_LOGTINFO|ISP_LOGCONFIG,
2312285459Smav			    "Chan %d WWPN 0x%016llx PortID 0x%06x "
2313285459Smav			    "changes handle 0x%x to 0x%x",
2314284681Smav			    chan, (unsigned long long) lp->port_wwn,
2315285459Smav			    lp->portid, lp->handle, nphdl);
2316285459Smav			lp->handle = nphdl;
2317285459Smav			change++;
2318196008Smjacob		}
2319285459Smav		lp->state = FC_PORTDB_STATE_VALID;
2320285459Smav		if (change) {
2321285459Smav			isp_async(isp, ISPASYNC_DEV_CHANGED, chan, lp);
2322285459Smav			lp->portid = lp->new_portid;
2323285459Smav			lp->prli_word3 = lp->new_prli_word3;
2324285459Smav		} else {
2325285459Smav			isp_prt(isp, ISP_LOGTINFO,
2326285459Smav			    "Chan %d WWPN 0x%016llx PortID 0x%06x "
2327285459Smav			    "handle 0x%x reentered",
2328284681Smav			    chan, (unsigned long long) lp->port_wwn,
2329285459Smav			    lp->portid, lp->handle);
2330285459Smav			isp_async(isp, ISPASYNC_DEV_STAYED, chan, lp);
2331196008Smjacob		}
2332285459Smav		return;
2333284681Smav	}
2334284681Smav
2335284681Smav	/* Search for room to insert new record. */
2336285459Smav	for (i = 0; i < MAX_FC_TARG; i++) {
2337285459Smav		if (fcp->portdb[i].state == FC_PORTDB_STATE_NIL)
2338285459Smav			break;
2339196008Smjacob	}
2340285459Smav	if (i >= MAX_FC_TARG) {
2341284681Smav		isp_prt(isp, ISP_LOGTINFO|ISP_LOGWARN,
2342285459Smav		    "Chan %d WWPN 0x%016llx PortID 0x%06x handle 0x%x "
2343284681Smav		    "-- no room in port database",
2344289838Smav		    chan, (unsigned long long) wwpn, s_id, nphdl);
2345284681Smav		if (isp->isp_dblev & (ISP_LOGTINFO|ISP_LOGWARN))
2346284681Smav			isp_dump_portdb(isp, chan);
2347196008Smjacob		return;
2348196008Smjacob	}
2349196008Smjacob
2350284681Smav	/* Insert new record and mark it valid. */
2351285459Smav	lp = &fcp->portdb[i];
2352196008Smjacob	ISP_MEMZERO(lp, sizeof (fcportdb_t));
2353196008Smjacob	lp->handle = nphdl;
2354196008Smjacob	lp->portid = s_id;
2355289838Smav	lp->port_wwn = wwpn;
2356289838Smav	lp->node_wwn = wwnn;
2357285459Smav	lp->prli_word3 = (prli_params != 0) ? prli_params : PRLI_WD3_INITIATOR_FUNCTION;
2358284681Smav	lp->state = FC_PORTDB_STATE_VALID;
2359284681Smav
2360238869Smjacob	isp_gen_role_str(buf, sizeof (buf), lp->prli_word3);
2361285459Smav	isp_prt(isp, ISP_LOGTINFO, "Chan %d WWPN 0x%016llx "
2362285459Smav	    "PortID 0x%06x handle 0x%x vtgt %d %s added", chan,
2363289838Smav	    (unsigned long long) wwpn, s_id, nphdl, i, buf);
2364196008Smjacob
2365285459Smav	/* Notify above levels about new port arrival. */
2366285459Smav	isp_async(isp, ISPASYNC_DEV_ARRIVED, chan, lp);
2367196008Smjacob}
2368196008Smjacob
2369196008Smjacob/*
2370196008Smjacob * Remove a target device to the port database
2371196008Smjacob */
2372196008Smjacobvoid
2373289838Smavisp_del_wwn_entry(ispsoftc_t *isp, int chan, uint64_t wwpn, uint16_t nphdl, uint32_t s_id)
2374196008Smjacob{
2375196008Smjacob	fcparam *fcp;
2376196008Smjacob	fcportdb_t *lp;
2377196008Smjacob
2378196008Smjacob	if (nphdl >= MAX_NPORT_HANDLE) {
2379285459Smav		isp_prt(isp, ISP_LOGWARN, "Chan %d WWPN 0x%016llx PortID 0x%06x bad handle 0x%x",
2380289838Smav		    chan, (unsigned long long) wwpn, s_id, nphdl);
2381196008Smjacob		return;
2382196008Smjacob	}
2383196008Smjacob
2384196008Smjacob	fcp = FCPARAM(isp, chan);
2385285459Smav	if (isp_find_pdb_by_handle(isp, chan, nphdl, &lp) == 0) {
2386285459Smav		isp_prt(isp, ISP_LOGWARN, "Chan %d WWPN 0x%016llx PortID 0x%06x handle 0x%x cannot be found to be deleted",
2387289838Smav		    chan, (unsigned long long) wwpn, s_id, nphdl);
2388196008Smjacob		isp_dump_portdb(isp, chan);
2389196008Smjacob		return;
2390196008Smjacob	}
2391285459Smav	isp_prt(isp, ISP_LOGTINFO, "Chan %d WWPN 0x%016llx PortID 0x%06x handle 0x%x vtgt %d deleted",
2392285459Smav	    chan, (unsigned long long) lp->port_wwn, lp->portid, nphdl, FC_PORTDB_TGT(isp, chan, lp));
2393285459Smav	lp->state = FC_PORTDB_STATE_NIL;
2394196008Smjacob
2395285459Smav	/* Notify above levels about gone port. */
2396285459Smav	isp_async(isp, ISPASYNC_DEV_GONE, chan, lp);
2397196008Smjacob}
2398196008Smjacob
2399196008Smjacobvoid
2400196008Smjacobisp_del_all_wwn_entries(ispsoftc_t *isp, int chan)
2401196008Smjacob{
2402196008Smjacob	fcparam *fcp;
2403196008Smjacob	int i;
2404196008Smjacob
2405196008Smjacob	if (!IS_FC(isp)) {
2406196008Smjacob		return;
2407196008Smjacob	}
2408196008Smjacob
2409196008Smjacob	/*
2410196008Smjacob	 * Handle iterations over all channels via recursion
2411196008Smjacob	 */
2412196008Smjacob	if (chan == ISP_NOCHAN) {
2413196008Smjacob		for (chan = 0; chan < isp->isp_nchan; chan++) {
2414196008Smjacob			isp_del_all_wwn_entries(isp, chan);
2415196008Smjacob		}
2416196008Smjacob		return;
2417196008Smjacob	}
2418196008Smjacob
2419196008Smjacob	if (chan > isp->isp_nchan) {
2420196008Smjacob		return;
2421196008Smjacob	}
2422196008Smjacob
2423196008Smjacob	fcp = FCPARAM(isp, chan);
2424196008Smjacob	if (fcp == NULL) {
2425196008Smjacob		return;
2426196008Smjacob	}
2427285459Smav	for (i = 0; i < MAX_FC_TARG; i++) {
2428285459Smav		fcportdb_t *lp = &fcp->portdb[i];
2429285459Smav
2430285459Smav		if (lp->state != FC_PORTDB_STATE_NIL)
2431196008Smjacob			isp_del_wwn_entry(isp, chan, lp->port_wwn, lp->handle, lp->portid);
2432196008Smjacob	}
2433196008Smjacob}
2434196008Smjacob
2435196008Smjacobvoid
2436196008Smjacobisp_del_wwn_entries(ispsoftc_t *isp, isp_notify_t *mp)
2437196008Smjacob{
2438196008Smjacob	fcportdb_t *lp;
2439196008Smjacob
2440196008Smjacob	/*
2441196008Smjacob	 * Handle iterations over all channels via recursion
2442196008Smjacob	 */
2443196008Smjacob	if (mp->nt_channel == ISP_NOCHAN) {
2444196008Smjacob		for (mp->nt_channel = 0; mp->nt_channel < isp->isp_nchan; mp->nt_channel++) {
2445196008Smjacob			isp_del_wwn_entries(isp, mp);
2446196008Smjacob		}
2447196008Smjacob		mp->nt_channel = ISP_NOCHAN;
2448196008Smjacob		return;
2449196008Smjacob	}
2450196008Smjacob
2451196008Smjacob	/*
2452196008Smjacob	 * We have an entry which is only partially identified.
2453196008Smjacob	 *
2454196008Smjacob	 * It's only known by WWN, N-Port handle, or Port ID.
2455196008Smjacob	 * We need to find the actual entry so we can delete it.
2456196008Smjacob	 */
2457196008Smjacob	if (mp->nt_nphdl != NIL_HANDLE) {
2458285459Smav		if (isp_find_pdb_by_handle(isp, mp->nt_channel, mp->nt_nphdl, &lp)) {
2459196008Smjacob			isp_del_wwn_entry(isp, mp->nt_channel, lp->port_wwn, lp->handle, lp->portid);
2460196008Smjacob			return;
2461196008Smjacob		}
2462196008Smjacob	}
2463291144Smav	if (VALID_INI(mp->nt_wwn)) {
2464291080Smav		if (isp_find_pdb_by_wwpn(isp, mp->nt_channel, mp->nt_wwn, &lp)) {
2465196008Smjacob			isp_del_wwn_entry(isp, mp->nt_channel, lp->port_wwn, lp->handle, lp->portid);
2466196008Smjacob			return;
2467196008Smjacob		}
2468196008Smjacob	}
2469291144Smav	if (VALID_PORT(mp->nt_sid)) {
2470291080Smav		if (isp_find_pdb_by_portid(isp, mp->nt_channel, mp->nt_sid, &lp)) {
2471196008Smjacob			isp_del_wwn_entry(isp, mp->nt_channel, lp->port_wwn, lp->handle, lp->portid);
2472196008Smjacob			return;
2473196008Smjacob		}
2474196008Smjacob	}
2475285459Smav	isp_prt(isp, ISP_LOGWARN, "Chan %d unable to find entry to delete WWPN 0x%016jx PortID 0x%06x handle 0x%x",
2476285459Smav	    mp->nt_channel, mp->nt_wwn, mp->nt_sid, mp->nt_nphdl);
2477196008Smjacob}
2478196008Smjacob
2479196008Smjacobvoid
2480163899Smjacobisp_put_atio2(ispsoftc_t *isp, at2_entry_t *src, at2_entry_t *dst)
2481155228Smjacob{
2482155228Smjacob	int i;
2483163899Smjacob	isp_put_hdr(isp, &src->at_header, &dst->at_header);
2484163899Smjacob	ISP_IOXPUT_32(isp, src->at_reserved, &dst->at_reserved);
2485163899Smjacob	ISP_IOXPUT_8(isp, src->at_lun, &dst->at_lun);
2486163899Smjacob	ISP_IOXPUT_8(isp, src->at_iid, &dst->at_iid);
2487163899Smjacob	ISP_IOXPUT_16(isp, src->at_rxid, &dst->at_rxid);
2488163899Smjacob	ISP_IOXPUT_16(isp, src->at_flags, &dst->at_flags);
2489163899Smjacob	ISP_IOXPUT_16(isp, src->at_status, &dst->at_status);
2490163899Smjacob	ISP_IOXPUT_8(isp, src->at_crn, &dst->at_crn);
2491163899Smjacob	ISP_IOXPUT_8(isp, src->at_taskcodes, &dst->at_taskcodes);
2492163899Smjacob	ISP_IOXPUT_8(isp, src->at_taskflags, &dst->at_taskflags);
2493163899Smjacob	ISP_IOXPUT_8(isp, src->at_execodes, &dst->at_execodes);
2494155228Smjacob	for (i = 0; i < ATIO2_CDBLEN; i++) {
2495163899Smjacob		ISP_IOXPUT_8(isp, src->at_cdb[i], &dst->at_cdb[i]);
2496155228Smjacob	}
2497163899Smjacob	ISP_IOXPUT_32(isp, src->at_datalen, &dst->at_datalen);
2498163899Smjacob	ISP_IOXPUT_16(isp, src->at_scclun, &dst->at_scclun);
2499155228Smjacob	for (i = 0; i < 4; i++) {
2500163899Smjacob		ISP_IOXPUT_16(isp, src->at_wwpn[i], &dst->at_wwpn[i]);
2501155228Smjacob	}
2502155228Smjacob	for (i = 0; i < 6; i++) {
2503196008Smjacob		ISP_IOXPUT_16(isp, src->at_reserved2[i], &dst->at_reserved2[i]);
2504155228Smjacob	}
2505163899Smjacob	ISP_IOXPUT_16(isp, src->at_oxid, &dst->at_oxid);
2506155228Smjacob}
2507155228Smjacob
2508155228Smjacobvoid
2509163899Smjacobisp_put_atio2e(ispsoftc_t *isp, at2e_entry_t *src, at2e_entry_t *dst)
2510155228Smjacob{
2511155228Smjacob	int i;
2512163899Smjacob	isp_put_hdr(isp, &src->at_header, &dst->at_header);
2513163899Smjacob	ISP_IOXPUT_32(isp, src->at_reserved, &dst->at_reserved);
2514163899Smjacob	ISP_IOXPUT_16(isp, src->at_iid, &dst->at_iid);
2515163899Smjacob	ISP_IOXPUT_16(isp, src->at_rxid, &dst->at_rxid);
2516163899Smjacob	ISP_IOXPUT_16(isp, src->at_flags, &dst->at_flags);
2517163899Smjacob	ISP_IOXPUT_16(isp, src->at_status, &dst->at_status);
2518163899Smjacob	ISP_IOXPUT_8(isp, src->at_crn, &dst->at_crn);
2519163899Smjacob	ISP_IOXPUT_8(isp, src->at_taskcodes, &dst->at_taskcodes);
2520163899Smjacob	ISP_IOXPUT_8(isp, src->at_taskflags, &dst->at_taskflags);
2521163899Smjacob	ISP_IOXPUT_8(isp, src->at_execodes, &dst->at_execodes);
2522155228Smjacob	for (i = 0; i < ATIO2_CDBLEN; i++) {
2523163899Smjacob		ISP_IOXPUT_8(isp, src->at_cdb[i], &dst->at_cdb[i]);
2524155228Smjacob	}
2525163899Smjacob	ISP_IOXPUT_32(isp, src->at_datalen, &dst->at_datalen);
2526163899Smjacob	ISP_IOXPUT_16(isp, src->at_scclun, &dst->at_scclun);
2527155228Smjacob	for (i = 0; i < 4; i++) {
2528163899Smjacob		ISP_IOXPUT_16(isp, src->at_wwpn[i], &dst->at_wwpn[i]);
2529155228Smjacob	}
2530155228Smjacob	for (i = 0; i < 6; i++) {
2531196008Smjacob		ISP_IOXPUT_16(isp, src->at_reserved2[i], &dst->at_reserved2[i]);
2532155228Smjacob	}
2533163899Smjacob	ISP_IOXPUT_16(isp, src->at_oxid, &dst->at_oxid);
2534155228Smjacob}
2535155228Smjacob
2536155228Smjacobvoid
2537163899Smjacobisp_get_atio2(ispsoftc_t *isp, at2_entry_t *src, at2_entry_t *dst)
2538155228Smjacob{
2539155228Smjacob	int i;
2540163899Smjacob	isp_get_hdr(isp, &src->at_header, &dst->at_header);
2541163899Smjacob	ISP_IOXGET_32(isp, &src->at_reserved, dst->at_reserved);
2542163899Smjacob	ISP_IOXGET_8(isp, &src->at_lun, dst->at_lun);
2543163899Smjacob	ISP_IOXGET_8(isp, &src->at_iid, dst->at_iid);
2544163899Smjacob	ISP_IOXGET_16(isp, &src->at_rxid, dst->at_rxid);
2545163899Smjacob	ISP_IOXGET_16(isp, &src->at_flags, dst->at_flags);
2546163899Smjacob	ISP_IOXGET_16(isp, &src->at_status, dst->at_status);
2547163899Smjacob	ISP_IOXGET_8(isp, &src->at_crn, dst->at_crn);
2548163899Smjacob	ISP_IOXGET_8(isp, &src->at_taskcodes, dst->at_taskcodes);
2549163899Smjacob	ISP_IOXGET_8(isp, &src->at_taskflags, dst->at_taskflags);
2550163899Smjacob	ISP_IOXGET_8(isp, &src->at_execodes, dst->at_execodes);
2551155228Smjacob	for (i = 0; i < ATIO2_CDBLEN; i++) {
2552163899Smjacob		ISP_IOXGET_8(isp, &src->at_cdb[i], dst->at_cdb[i]);
2553155228Smjacob	}
2554163899Smjacob	ISP_IOXGET_32(isp, &src->at_datalen, dst->at_datalen);
2555163899Smjacob	ISP_IOXGET_16(isp, &src->at_scclun, dst->at_scclun);
2556155228Smjacob	for (i = 0; i < 4; i++) {
2557163899Smjacob		ISP_IOXGET_16(isp, &src->at_wwpn[i], dst->at_wwpn[i]);
2558155228Smjacob	}
2559155228Smjacob	for (i = 0; i < 6; i++) {
2560196008Smjacob		ISP_IOXGET_16(isp, &src->at_reserved2[i], dst->at_reserved2[i]);
2561155228Smjacob	}
2562163899Smjacob	ISP_IOXGET_16(isp, &src->at_oxid, dst->at_oxid);
2563155228Smjacob}
2564155228Smjacob
2565155228Smjacobvoid
2566163899Smjacobisp_get_atio2e(ispsoftc_t *isp, at2e_entry_t *src, at2e_entry_t *dst)
2567155228Smjacob{
2568155228Smjacob	int i;
2569163899Smjacob	isp_get_hdr(isp, &src->at_header, &dst->at_header);
2570163899Smjacob	ISP_IOXGET_32(isp, &src->at_reserved, dst->at_reserved);
2571163899Smjacob	ISP_IOXGET_16(isp, &src->at_iid, dst->at_iid);
2572163899Smjacob	ISP_IOXGET_16(isp, &src->at_rxid, dst->at_rxid);
2573163899Smjacob	ISP_IOXGET_16(isp, &src->at_flags, dst->at_flags);
2574163899Smjacob	ISP_IOXGET_16(isp, &src->at_status, dst->at_status);
2575163899Smjacob	ISP_IOXGET_8(isp, &src->at_crn, dst->at_crn);
2576163899Smjacob	ISP_IOXGET_8(isp, &src->at_taskcodes, dst->at_taskcodes);
2577163899Smjacob	ISP_IOXGET_8(isp, &src->at_taskflags, dst->at_taskflags);
2578163899Smjacob	ISP_IOXGET_8(isp, &src->at_execodes, dst->at_execodes);
2579155228Smjacob	for (i = 0; i < ATIO2_CDBLEN; i++) {
2580163899Smjacob		ISP_IOXGET_8(isp, &src->at_cdb[i], dst->at_cdb[i]);
2581155228Smjacob	}
2582163899Smjacob	ISP_IOXGET_32(isp, &src->at_datalen, dst->at_datalen);
2583163899Smjacob	ISP_IOXGET_16(isp, &src->at_scclun, dst->at_scclun);
2584155228Smjacob	for (i = 0; i < 4; i++) {
2585163899Smjacob		ISP_IOXGET_16(isp, &src->at_wwpn[i], dst->at_wwpn[i]);
2586155228Smjacob	}
2587155228Smjacob	for (i = 0; i < 6; i++) {
2588196008Smjacob		ISP_IOXGET_16(isp, &src->at_reserved2[i], dst->at_reserved2[i]);
2589155228Smjacob	}
2590163899Smjacob	ISP_IOXGET_16(isp, &src->at_oxid, dst->at_oxid);
2591155228Smjacob}
2592155228Smjacob
2593155228Smjacobvoid
2594163899Smjacobisp_get_atio7(ispsoftc_t *isp, at7_entry_t *src, at7_entry_t *dst)
2595155228Smjacob{
2596163899Smjacob	ISP_IOXGET_8(isp, &src->at_type, dst->at_type);
2597163899Smjacob	ISP_IOXGET_8(isp, &src->at_count, dst->at_count);
2598163899Smjacob	ISP_IOXGET_16(isp, &src->at_ta_len, dst->at_ta_len);
2599163899Smjacob	ISP_IOXGET_32(isp, &src->at_rxid, dst->at_rxid);
2600163899Smjacob	isp_get_fc_hdr(isp, &src->at_hdr, &dst->at_hdr);
2601163899Smjacob	isp_get_fcp_cmnd_iu(isp, &src->at_cmnd, &dst->at_cmnd);
2602163899Smjacob}
2603163899Smjacob
2604163899Smjacobvoid
2605163899Smjacobisp_put_ctio2(ispsoftc_t *isp, ct2_entry_t *src, ct2_entry_t *dst)
2606155228Smjacob{
2607155228Smjacob	int i;
2608163899Smjacob	isp_put_hdr(isp, &src->ct_header, &dst->ct_header);
2609163899Smjacob	ISP_IOXPUT_32(isp, src->ct_syshandle, &dst->ct_syshandle);
2610163899Smjacob	ISP_IOXPUT_8(isp, src->ct_lun, &dst->ct_lun);
2611163899Smjacob	ISP_IOXPUT_8(isp, src->ct_iid, &dst->ct_iid);
2612163899Smjacob	ISP_IOXPUT_16(isp, src->ct_rxid, &dst->ct_rxid);
2613163899Smjacob	ISP_IOXPUT_16(isp, src->ct_flags, &dst->ct_flags);
2614163899Smjacob	ISP_IOXPUT_16(isp, src->ct_timeout, &dst->ct_timeout);
2615163899Smjacob	ISP_IOXPUT_16(isp, src->ct_seg_count, &dst->ct_seg_count);
2616163899Smjacob	ISP_IOXPUT_32(isp, src->ct_resid, &dst->ct_resid);
2617163899Smjacob	ISP_IOXPUT_32(isp, src->ct_reloff, &dst->ct_reloff);
2618163899Smjacob	if ((src->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) {
2619196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0._reserved, &dst->rsp.m0._reserved);
2620196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m0._reserved2, &dst->rsp.m0._reserved2);
2621196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m0.ct_scsi_status, &dst->rsp.m0.ct_scsi_status);
2622196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ct_xfrlen, &dst->rsp.m0.ct_xfrlen);
2623163899Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
2624155228Smjacob			for (i = 0; i < ISP_RQDSEG_T2; i++) {
2625196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg[i].ds_base, &dst->rsp.m0.u.ct_dataseg[i].ds_base);
2626196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg[i].ds_count, &dst->rsp.m0.u.ct_dataseg[i].ds_count);
2627155228Smjacob			}
2628163899Smjacob		} else if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO3) {
2629155228Smjacob			for (i = 0; i < ISP_RQDSEG_T3; i++) {
2630196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_base, &dst->rsp.m0.u.ct_dataseg64[i].ds_base);
2631196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_basehi, &dst->rsp.m0.u.ct_dataseg64[i].ds_basehi);
2632196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_count, &dst->rsp.m0.u.ct_dataseg64[i].ds_count);
2633155228Smjacob			}
2634163899Smjacob		} else if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO4) {
2635196008Smjacob			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,
2636163899Smjacob			    &dst->rsp.m0.u.ct_dslist.ds_segment);
2637196008Smjacob			ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dslist.ds_base, &dst->rsp.m0.u.ct_dslist.ds_base);
2638155228Smjacob		}
2639163899Smjacob	} else if ((src->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) {
2640196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1._reserved, &dst->rsp.m1._reserved);
2641196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1._reserved2, &dst->rsp.m1._reserved2);
2642196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_senselen, &dst->rsp.m1.ct_senselen);
2643196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_scsi_status, &dst->rsp.m1.ct_scsi_status);
2644196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_resplen, &dst->rsp.m1.ct_resplen);
2645155228Smjacob		for (i = 0; i < MAXRESPLEN; i++) {
2646196008Smjacob			ISP_IOXPUT_8(isp, src->rsp.m1.ct_resp[i], &dst->rsp.m1.ct_resp[i]);
2647155228Smjacob		}
2648155228Smjacob	} else {
2649196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2._reserved, &dst->rsp.m2._reserved);
2650196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m2._reserved2, &dst->rsp.m2._reserved2);
2651196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m2._reserved3, &dst->rsp.m2._reserved3);
2652196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_datalen, &dst->rsp.m2.ct_datalen);
2653238869Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
2654238869Smjacob			ISP_IOXPUT_32(isp, src->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_base, &dst->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_base);
2655238869Smjacob			ISP_IOXPUT_32(isp, src->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_count, &dst->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_count);
2656238869Smjacob		} else {
2657238869Smjacob			ISP_IOXPUT_32(isp, src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_base, &dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_base);
2658238869Smjacob			ISP_IOXPUT_32(isp, src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_basehi, &dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_basehi);
2659238869Smjacob			ISP_IOXPUT_32(isp, src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_count, &dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_count);
2660238869Smjacob		}
2661155228Smjacob	}
2662155228Smjacob}
2663155228Smjacob
2664155228Smjacobvoid
2665163899Smjacobisp_put_ctio2e(ispsoftc_t *isp, ct2e_entry_t *src, ct2e_entry_t *dst)
2666155228Smjacob{
2667155228Smjacob	int i;
2668163899Smjacob	isp_put_hdr(isp, &src->ct_header, &dst->ct_header);
2669163899Smjacob	ISP_IOXPUT_32(isp, src->ct_syshandle, &dst->ct_syshandle);
2670163899Smjacob	ISP_IOXPUT_16(isp, src->ct_iid, &dst->ct_iid);
2671163899Smjacob	ISP_IOXPUT_16(isp, src->ct_rxid, &dst->ct_rxid);
2672163899Smjacob	ISP_IOXPUT_16(isp, src->ct_flags, &dst->ct_flags);
2673163899Smjacob	ISP_IOXPUT_16(isp, src->ct_timeout, &dst->ct_timeout);
2674163899Smjacob	ISP_IOXPUT_16(isp, src->ct_seg_count, &dst->ct_seg_count);
2675163899Smjacob	ISP_IOXPUT_32(isp, src->ct_resid, &dst->ct_resid);
2676163899Smjacob	ISP_IOXPUT_32(isp, src->ct_reloff, &dst->ct_reloff);
2677163899Smjacob	if ((src->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) {
2678196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0._reserved, &dst->rsp.m0._reserved);
2679196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m0._reserved2, &dst->rsp.m0._reserved2);
2680196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m0.ct_scsi_status, &dst->rsp.m0.ct_scsi_status);
2681196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ct_xfrlen, &dst->rsp.m0.ct_xfrlen);
2682163899Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
2683155228Smjacob			for (i = 0; i < ISP_RQDSEG_T2; i++) {
2684196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg[i].ds_base, &dst->rsp.m0.u.ct_dataseg[i].ds_base);
2685196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg[i].ds_count, &dst->rsp.m0.u.ct_dataseg[i].ds_count);
2686155228Smjacob			}
2687163899Smjacob		} else if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO3) {
2688155228Smjacob			for (i = 0; i < ISP_RQDSEG_T3; i++) {
2689196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_base, &dst->rsp.m0.u.ct_dataseg64[i].ds_base);
2690196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_basehi, &dst->rsp.m0.u.ct_dataseg64[i].ds_basehi);
2691196008Smjacob				ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dataseg64[i].ds_count, &dst->rsp.m0.u.ct_dataseg64[i].ds_count);
2692155228Smjacob			}
2693163899Smjacob		} else if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO4) {
2694196008Smjacob			ISP_IOXPUT_16(isp, src->rsp.m0.u.ct_dslist.ds_type, &dst->rsp.m0.u.ct_dslist.ds_type);
2695196008Smjacob			ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dslist.ds_segment, &dst->rsp.m0.u.ct_dslist.ds_segment);
2696196008Smjacob			ISP_IOXPUT_32(isp, src->rsp.m0.u.ct_dslist.ds_base, &dst->rsp.m0.u.ct_dslist.ds_base);
2697155228Smjacob		}
2698163899Smjacob	} else if ((src->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) {
2699196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1._reserved, &dst->rsp.m1._reserved);
2700196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1._reserved2, &dst->rsp.m1._reserved2);
2701196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_senselen, &dst->rsp.m1.ct_senselen);
2702196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_scsi_status, &dst->rsp.m1.ct_scsi_status);
2703196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_resplen, &dst->rsp.m1.ct_resplen);
2704155228Smjacob		for (i = 0; i < MAXRESPLEN; i++) {
2705196008Smjacob			ISP_IOXPUT_8(isp, src->rsp.m1.ct_resp[i], &dst->rsp.m1.ct_resp[i]);
2706155228Smjacob		}
2707155228Smjacob	} else {
2708196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2._reserved, &dst->rsp.m2._reserved);
2709196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m2._reserved2, &dst->rsp.m2._reserved2);
2710196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m2._reserved3, &dst->rsp.m2._reserved3);
2711196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_datalen, &dst->rsp.m2.ct_datalen);
2712238869Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
2713238869Smjacob			ISP_IOXPUT_32(isp, src->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_base, &dst->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_base);
2714238869Smjacob			ISP_IOXPUT_32(isp, src->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_count, &dst->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_count);
2715238869Smjacob		} else {
2716238869Smjacob			ISP_IOXPUT_32(isp, src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_base, &dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_base);
2717238869Smjacob			ISP_IOXPUT_32(isp, src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_basehi, &dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_basehi);
2718238869Smjacob			ISP_IOXPUT_32(isp, src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_count, &dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_count);
2719238869Smjacob		}
2720155228Smjacob	}
2721155228Smjacob}
2722155228Smjacob
2723155228Smjacobvoid
2724163899Smjacobisp_put_ctio7(ispsoftc_t *isp, ct7_entry_t *src, ct7_entry_t *dst)
2725155228Smjacob{
2726163899Smjacob	int i;
2727163899Smjacob
2728163899Smjacob	isp_put_hdr(isp, &src->ct_header, &dst->ct_header);
2729163899Smjacob	ISP_IOXPUT_32(isp, src->ct_syshandle, &dst->ct_syshandle);
2730163899Smjacob	ISP_IOXPUT_16(isp, src->ct_nphdl, &dst->ct_nphdl);
2731163899Smjacob	ISP_IOXPUT_16(isp, src->ct_timeout, &dst->ct_timeout);
2732163899Smjacob	ISP_IOXPUT_16(isp, src->ct_seg_count, &dst->ct_seg_count);
2733196008Smjacob	ISP_IOXPUT_8(isp, src->ct_vpidx, &dst->ct_vpidx);
2734163899Smjacob	ISP_IOXPUT_8(isp, src->ct_xflags, &dst->ct_xflags);
2735163899Smjacob	ISP_IOXPUT_16(isp, src->ct_iid_lo, &dst->ct_iid_lo);
2736163899Smjacob	ISP_IOXPUT_8(isp, src->ct_iid_hi, &dst->ct_iid_hi);
2737163899Smjacob	ISP_IOXPUT_8(isp, src->ct_reserved, &dst->ct_reserved);
2738163899Smjacob	ISP_IOXPUT_32(isp, src->ct_rxid, &dst->ct_rxid);
2739163899Smjacob	ISP_IOXPUT_16(isp, src->ct_senselen, &dst->ct_senselen);
2740163899Smjacob	ISP_IOXPUT_16(isp, src->ct_flags, &dst->ct_flags);
2741163899Smjacob	ISP_IOXPUT_32(isp, src->ct_resid, &dst->ct_resid);
2742163899Smjacob	ISP_IOXPUT_16(isp, src->ct_oxid, &dst->ct_oxid);
2743163899Smjacob	ISP_IOXPUT_16(isp, src->ct_scsi_status, &dst->ct_scsi_status);
2744163899Smjacob	if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE0) {
2745163899Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.reloff, &dst->rsp.m0.reloff);
2746196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.reserved0, &dst->rsp.m0.reserved0);
2747196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ct_xfrlen, &dst->rsp.m0.ct_xfrlen);
2748196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.reserved1, &dst->rsp.m0.reserved1);
2749196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_base, &dst->rsp.m0.ds.ds_base);
2750196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_basehi, &dst->rsp.m0.ds.ds_basehi);
2751196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_count, &dst->rsp.m0.ds.ds_count);
2752163899Smjacob	} else if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE1) {
2753196008Smjacob		uint32_t *a, *b;
2754196008Smjacob
2755196008Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.ct_resplen, &dst->rsp.m1.ct_resplen);
2756163899Smjacob		ISP_IOXPUT_16(isp, src->rsp.m1.reserved, &dst->rsp.m1.reserved);
2757196008Smjacob		a = (uint32_t *) src->rsp.m1.ct_resp;
2758196008Smjacob		b = (uint32_t *) dst->rsp.m1.ct_resp;
2759196008Smjacob		for (i = 0; i < (ASIZE(src->rsp.m1.ct_resp) >> 2); i++) {
2760196008Smjacob			*b++ = ISP_SWAP32(isp, *a++);
2761163899Smjacob		}
2762163899Smjacob	} else {
2763196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.reserved0, &dst->rsp.m2.reserved0);
2764238869Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.reserved1, &dst->rsp.m2.reserved1);
2765196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_datalen, &dst->rsp.m2.ct_datalen);
2766238869Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.reserved2, &dst->rsp.m2.reserved2);
2767196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_base, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_base);
2768196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_basehi, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_basehi);
2769196008Smjacob		ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_count, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_count);
2770163899Smjacob	}
2771155228Smjacob}
2772155228Smjacob
2773163899Smjacob
2774155228Smjacobvoid
2775163899Smjacobisp_get_ctio2(ispsoftc_t *isp, ct2_entry_t *src, ct2_entry_t *dst)
2776155228Smjacob{
2777163899Smjacob	int i;
2778163899Smjacob
2779163899Smjacob	isp_get_hdr(isp, &src->ct_header, &dst->ct_header);
2780163899Smjacob	ISP_IOXGET_32(isp, &src->ct_syshandle, dst->ct_syshandle);
2781163899Smjacob	ISP_IOXGET_8(isp, &src->ct_lun, dst->ct_lun);
2782163899Smjacob	ISP_IOXGET_8(isp, &src->ct_iid, dst->ct_iid);
2783163899Smjacob	ISP_IOXGET_16(isp, &src->ct_rxid, dst->ct_rxid);
2784163899Smjacob	ISP_IOXGET_16(isp, &src->ct_flags, dst->ct_flags);
2785163899Smjacob	ISP_IOXGET_16(isp, &src->ct_status, dst->ct_status);
2786163899Smjacob	ISP_IOXGET_16(isp, &src->ct_timeout, dst->ct_timeout);
2787163899Smjacob	ISP_IOXGET_16(isp, &src->ct_seg_count, dst->ct_seg_count);
2788163899Smjacob	ISP_IOXGET_32(isp, &src->ct_reloff, dst->ct_reloff);
2789163899Smjacob	ISP_IOXGET_32(isp, &src->ct_resid, dst->ct_resid);
2790163899Smjacob	if ((dst->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) {
2791196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0._reserved, dst->rsp.m0._reserved);
2792196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m0._reserved2, dst->rsp.m0._reserved2);
2793196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m0.ct_scsi_status, dst->rsp.m0.ct_scsi_status);
2794196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ct_xfrlen, dst->rsp.m0.ct_xfrlen);
2795163899Smjacob		if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
2796163899Smjacob			for (i = 0; i < ISP_RQDSEG_T2; i++) {
2797196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg[i].ds_base, dst->rsp.m0.u.ct_dataseg[i].ds_base);
2798196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg[i].ds_count, dst->rsp.m0.u.ct_dataseg[i].ds_count);
2799163899Smjacob			}
2800163899Smjacob		} else if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO3) {
2801163899Smjacob			for (i = 0; i < ISP_RQDSEG_T3; i++) {
2802196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_base, dst->rsp.m0.u.ct_dataseg64[i].ds_base);
2803196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_basehi, dst->rsp.m0.u.ct_dataseg64[i].ds_basehi);
2804196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_count, dst->rsp.m0.u.ct_dataseg64[i].ds_count);
2805163899Smjacob			}
2806163899Smjacob		} else if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO4) {
2807196008Smjacob			ISP_IOXGET_16(isp, &src->rsp.m0.u.ct_dslist.ds_type, dst->rsp.m0.u.ct_dslist.ds_type);
2808196008Smjacob			ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dslist.ds_segment, dst->rsp.m0.u.ct_dslist.ds_segment);
2809196008Smjacob			ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dslist.ds_base, dst->rsp.m0.u.ct_dslist.ds_base);
2810163899Smjacob		}
2811163899Smjacob	} else if ((dst->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) {
2812196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1._reserved, dst->rsp.m1._reserved);
2813196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1._reserved2, dst->rsp.m1._reserved2);
2814196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_senselen, dst->rsp.m1.ct_senselen);
2815196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_scsi_status, dst->rsp.m1.ct_scsi_status);
2816196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_resplen, dst->rsp.m1.ct_resplen);
2817163899Smjacob		for (i = 0; i < MAXRESPLEN; i++) {
2818196008Smjacob			ISP_IOXGET_8(isp, &src->rsp.m1.ct_resp[i], dst->rsp.m1.ct_resp[i]);
2819163899Smjacob		}
2820163899Smjacob	} else {
2821196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2._reserved, dst->rsp.m2._reserved);
2822196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m2._reserved2, dst->rsp.m2._reserved2);
2823196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m2._reserved3, dst->rsp.m2._reserved3);
2824196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_datalen, dst->rsp.m2.ct_datalen);
2825238869Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
2826238869Smjacob			ISP_IOXGET_32(isp, &src->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_base, dst->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_base);
2827238869Smjacob			ISP_IOXGET_32(isp, &src->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_count, dst->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_count);
2828238869Smjacob		} else {
2829238869Smjacob			ISP_IOXGET_32(isp, &src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_base, dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_base);
2830238869Smjacob			ISP_IOXGET_32(isp, &src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_basehi, dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_basehi);
2831238869Smjacob			ISP_IOXGET_32(isp, &src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_count, dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_count);
2832238869Smjacob		}
2833163899Smjacob	}
2834155228Smjacob}
2835155228Smjacob
2836155228Smjacobvoid
2837163899Smjacobisp_get_ctio2e(ispsoftc_t *isp, ct2e_entry_t *src, ct2e_entry_t *dst)
2838163899Smjacob{
2839163899Smjacob	int i;
2840163899Smjacob
2841163899Smjacob	isp_get_hdr(isp, &src->ct_header, &dst->ct_header);
2842163899Smjacob	ISP_IOXGET_32(isp, &src->ct_syshandle, dst->ct_syshandle);
2843163899Smjacob	ISP_IOXGET_16(isp, &src->ct_iid, dst->ct_iid);
2844163899Smjacob	ISP_IOXGET_16(isp, &src->ct_rxid, dst->ct_rxid);
2845163899Smjacob	ISP_IOXGET_16(isp, &src->ct_flags, dst->ct_flags);
2846163899Smjacob	ISP_IOXGET_16(isp, &src->ct_status, dst->ct_status);
2847163899Smjacob	ISP_IOXGET_16(isp, &src->ct_timeout, dst->ct_timeout);
2848163899Smjacob	ISP_IOXGET_16(isp, &src->ct_seg_count, dst->ct_seg_count);
2849163899Smjacob	ISP_IOXGET_32(isp, &src->ct_reloff, dst->ct_reloff);
2850163899Smjacob	ISP_IOXGET_32(isp, &src->ct_resid, dst->ct_resid);
2851163899Smjacob	if ((dst->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) {
2852196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0._reserved, dst->rsp.m0._reserved);
2853196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m0._reserved2, dst->rsp.m0._reserved2);
2854196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m0.ct_scsi_status, dst->rsp.m0.ct_scsi_status);
2855196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ct_xfrlen, dst->rsp.m0.ct_xfrlen);
2856163899Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
2857163899Smjacob			for (i = 0; i < ISP_RQDSEG_T2; i++) {
2858196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg[i].ds_base, dst->rsp.m0.u.ct_dataseg[i].ds_base);
2859196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg[i].ds_count, dst->rsp.m0.u.ct_dataseg[i].ds_count);
2860163899Smjacob			}
2861163899Smjacob		} else if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO3) {
2862163899Smjacob			for (i = 0; i < ISP_RQDSEG_T3; i++) {
2863196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_base, dst->rsp.m0.u.ct_dataseg64[i].ds_base);
2864196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_basehi, dst->rsp.m0.u.ct_dataseg64[i].ds_basehi);
2865196008Smjacob				ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dataseg64[i].ds_count, dst->rsp.m0.u.ct_dataseg64[i].ds_count);
2866163899Smjacob			}
2867163899Smjacob		} else if (dst->ct_header.rqs_entry_type == RQSTYPE_CTIO4) {
2868196008Smjacob			ISP_IOXGET_16(isp, &src->rsp.m0.u.ct_dslist.ds_type, dst->rsp.m0.u.ct_dslist.ds_type);
2869196008Smjacob			ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dslist.ds_segment, dst->rsp.m0.u.ct_dslist.ds_segment);
2870196008Smjacob			ISP_IOXGET_32(isp, &src->rsp.m0.u.ct_dslist.ds_base, dst->rsp.m0.u.ct_dslist.ds_base);
2871163899Smjacob		}
2872163899Smjacob	} else if ((dst->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) {
2873196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1._reserved, dst->rsp.m1._reserved);
2874196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1._reserved2, dst->rsp.m1._reserved2);
2875196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_senselen, dst->rsp.m1.ct_senselen);
2876196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_scsi_status, dst->rsp.m1.ct_scsi_status);
2877196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_resplen, dst->rsp.m1.ct_resplen);
2878163899Smjacob		for (i = 0; i < MAXRESPLEN; i++) {
2879196008Smjacob			ISP_IOXGET_8(isp, &src->rsp.m1.ct_resp[i], dst->rsp.m1.ct_resp[i]);
2880163899Smjacob		}
2881163899Smjacob	} else {
2882196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2._reserved, dst->rsp.m2._reserved);
2883196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m2._reserved2, dst->rsp.m2._reserved2);
2884196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m2._reserved3, dst->rsp.m2._reserved3);
2885196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_datalen, dst->rsp.m2.ct_datalen);
2886238869Smjacob		if (src->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
2887238869Smjacob			ISP_IOXGET_32(isp, &src->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_base, dst->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_base);
2888238869Smjacob			ISP_IOXGET_32(isp, &src->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_count, dst->rsp.m2.u.ct_fcp_rsp_iudata_32.ds_count);
2889238869Smjacob		} else {
2890238869Smjacob			ISP_IOXGET_32(isp, &src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_base, dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_base);
2891238869Smjacob			ISP_IOXGET_32(isp, &src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_basehi, dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_basehi);
2892238869Smjacob			ISP_IOXGET_32(isp, &src->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_count, dst->rsp.m2.u.ct_fcp_rsp_iudata_64.ds_count);
2893238869Smjacob		}
2894163899Smjacob	}
2895163899Smjacob}
2896163899Smjacob
2897163899Smjacobvoid
2898163899Smjacobisp_get_ctio7(ispsoftc_t *isp, ct7_entry_t *src, ct7_entry_t *dst)
2899163899Smjacob{
2900163899Smjacob	int i;
2901163899Smjacob
2902163899Smjacob	isp_get_hdr(isp, &src->ct_header, &dst->ct_header);
2903163899Smjacob	ISP_IOXGET_32(isp, &src->ct_syshandle, dst->ct_syshandle);
2904163899Smjacob	ISP_IOXGET_16(isp, &src->ct_nphdl, dst->ct_nphdl);
2905163899Smjacob	ISP_IOXGET_16(isp, &src->ct_timeout, dst->ct_timeout);
2906163899Smjacob	ISP_IOXGET_16(isp, &src->ct_seg_count, dst->ct_seg_count);
2907196008Smjacob	ISP_IOXGET_8(isp, &src->ct_vpidx, dst->ct_vpidx);
2908163899Smjacob	ISP_IOXGET_8(isp, &src->ct_xflags, dst->ct_xflags);
2909163899Smjacob	ISP_IOXGET_16(isp, &src->ct_iid_lo, dst->ct_iid_lo);
2910163899Smjacob	ISP_IOXGET_8(isp, &src->ct_iid_hi, dst->ct_iid_hi);
2911163899Smjacob	ISP_IOXGET_8(isp, &src->ct_reserved, dst->ct_reserved);
2912163899Smjacob	ISP_IOXGET_32(isp, &src->ct_rxid, dst->ct_rxid);
2913163899Smjacob	ISP_IOXGET_16(isp, &src->ct_senselen, dst->ct_senselen);
2914163899Smjacob	ISP_IOXGET_16(isp, &src->ct_flags, dst->ct_flags);
2915163899Smjacob	ISP_IOXGET_32(isp, &src->ct_resid, dst->ct_resid);
2916163899Smjacob	ISP_IOXGET_16(isp, &src->ct_oxid, dst->ct_oxid);
2917163899Smjacob	ISP_IOXGET_16(isp, &src->ct_scsi_status, dst->ct_scsi_status);
2918163899Smjacob	if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE0) {
2919163899Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.reloff, dst->rsp.m0.reloff);
2920196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.reserved0, dst->rsp.m0.reserved0);
2921196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ct_xfrlen, dst->rsp.m0.ct_xfrlen);
2922196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.reserved1, dst->rsp.m0.reserved1);
2923196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_base, dst->rsp.m0.ds.ds_base);
2924196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_basehi, dst->rsp.m0.ds.ds_basehi);
2925196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_count, dst->rsp.m0.ds.ds_count);
2926163899Smjacob	} else if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE1) {
2927196008Smjacob		uint32_t *a, *b;
2928196008Smjacob
2929196008Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.ct_resplen, dst->rsp.m1.ct_resplen);
2930163899Smjacob		ISP_IOXGET_16(isp, &src->rsp.m1.reserved, dst->rsp.m1.reserved);
2931196008Smjacob		a = (uint32_t *) src->rsp.m1.ct_resp;
2932196008Smjacob		b = (uint32_t *) dst->rsp.m1.ct_resp;
2933163899Smjacob		for (i = 0; i < MAXRESPLEN_24XX; i++) {
2934196008Smjacob			ISP_IOXGET_8(isp, &src->rsp.m1.ct_resp[i], dst->rsp.m1.ct_resp[i]);
2935163899Smjacob		}
2936196008Smjacob		for (i = 0; i < (ASIZE(src->rsp.m1.ct_resp) >> 2); i++) {
2937196008Smjacob			*b++ = ISP_SWAP32(isp, *a++);
2938196008Smjacob		}
2939163899Smjacob	} else {
2940196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.reserved0, dst->rsp.m2.reserved0);
2941196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_datalen, dst->rsp.m2.ct_datalen);
2942196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.reserved1, dst->rsp.m2.reserved1);
2943196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_base, dst->rsp.m2.ct_fcp_rsp_iudata.ds_base);
2944196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_basehi, dst->rsp.m2.ct_fcp_rsp_iudata.ds_basehi);
2945196008Smjacob		ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_count, dst->rsp.m2.ct_fcp_rsp_iudata.ds_count);
2946163899Smjacob	}
2947163899Smjacob}
2948163899Smjacob
2949163899Smjacobvoid
2950196008Smjacobisp_put_notify_fc(ispsoftc_t *isp, in_fcentry_t *src, in_fcentry_t *dst)
2951155228Smjacob{
2952163899Smjacob	isp_put_hdr(isp, &src->in_header, &dst->in_header);
2953163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved, &dst->in_reserved);
2954163899Smjacob	ISP_IOXPUT_8(isp, src->in_lun, &dst->in_lun);
2955163899Smjacob	ISP_IOXPUT_8(isp, src->in_iid, &dst->in_iid);
2956163899Smjacob	ISP_IOXPUT_16(isp, src->in_scclun, &dst->in_scclun);
2957163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved2, &dst->in_reserved2);
2958163899Smjacob	ISP_IOXPUT_16(isp, src->in_status, &dst->in_status);
2959163899Smjacob	ISP_IOXPUT_16(isp, src->in_task_flags, &dst->in_task_flags);
2960163899Smjacob	ISP_IOXPUT_16(isp, src->in_seqid, &dst->in_seqid);
2961155228Smjacob}
2962155228Smjacob
2963155228Smjacobvoid
2964196008Smjacobisp_put_notify_fc_e(ispsoftc_t *isp, in_fcentry_e_t *src, in_fcentry_e_t *dst)
2965155228Smjacob{
2966163899Smjacob	isp_put_hdr(isp, &src->in_header, &dst->in_header);
2967163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved, &dst->in_reserved);
2968163899Smjacob	ISP_IOXPUT_16(isp, src->in_iid, &dst->in_iid);
2969163899Smjacob	ISP_IOXPUT_16(isp, src->in_scclun, &dst->in_scclun);
2970163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved2, &dst->in_reserved2);
2971163899Smjacob	ISP_IOXPUT_16(isp, src->in_status, &dst->in_status);
2972163899Smjacob	ISP_IOXPUT_16(isp, src->in_task_flags, &dst->in_task_flags);
2973163899Smjacob	ISP_IOXPUT_16(isp, src->in_seqid, &dst->in_seqid);
2974155228Smjacob}
2975155228Smjacob
2976155228Smjacobvoid
2977196008Smjacobisp_put_notify_24xx(ispsoftc_t *isp, in_fcentry_24xx_t *src, in_fcentry_24xx_t *dst)
2978155228Smjacob{
2979163899Smjacob	int i;
2980163899Smjacob
2981163899Smjacob	isp_put_hdr(isp, &src->in_header, &dst->in_header);
2982163899Smjacob	ISP_IOXPUT_32(isp, src->in_reserved, &dst->in_reserved);
2983163899Smjacob	ISP_IOXPUT_16(isp, src->in_nphdl, &dst->in_nphdl);
2984163899Smjacob	ISP_IOXPUT_16(isp, src->in_reserved1, &dst->in_reserved1);
2985163899Smjacob	ISP_IOXPUT_16(isp, src->in_flags, &dst->in_flags);
2986163899Smjacob	ISP_IOXPUT_16(isp, src->in_srr_rxid, &dst->in_srr_rxid);
2987163899Smjacob	ISP_IOXPUT_16(isp, src->in_status, &dst->in_status);
2988163899Smjacob	ISP_IOXPUT_8(isp, src->in_status_subcode, &dst->in_status_subcode);
2989289838Smav	ISP_IOXPUT_8(isp, src->in_fwhandle, &dst->in_fwhandle);
2990163899Smjacob	ISP_IOXPUT_32(isp, src->in_rxid, &dst->in_rxid);
2991163899Smjacob	ISP_IOXPUT_16(isp, src->in_srr_reloff_hi, &dst->in_srr_reloff_hi);
2992163899Smjacob	ISP_IOXPUT_16(isp, src->in_srr_reloff_lo, &dst->in_srr_reloff_lo);
2993163899Smjacob	ISP_IOXPUT_16(isp, src->in_srr_iu, &dst->in_srr_iu);
2994163899Smjacob	ISP_IOXPUT_16(isp, src->in_srr_oxid, &dst->in_srr_oxid);
2995196008Smjacob	ISP_IOXPUT_16(isp, src->in_nport_id_hi, &dst->in_nport_id_hi);
2996196008Smjacob	ISP_IOXPUT_8(isp, src->in_nport_id_lo, &dst->in_nport_id_lo);
2997196008Smjacob	ISP_IOXPUT_8(isp, src->in_reserved3, &dst->in_reserved3);
2998196008Smjacob	ISP_IOXPUT_16(isp, src->in_np_handle, &dst->in_np_handle);
2999196008Smjacob	for (i = 0; i < ASIZE(src->in_reserved4); i++) {
3000196008Smjacob		ISP_IOXPUT_8(isp, src->in_reserved4[i], &dst->in_reserved4[i]);
3001163899Smjacob	}
3002196008Smjacob	ISP_IOXPUT_8(isp, src->in_reserved5, &dst->in_reserved5);
3003196008Smjacob	ISP_IOXPUT_8(isp, src->in_vpidx, &dst->in_vpidx);
3004196008Smjacob	ISP_IOXPUT_32(isp, src->in_reserved6, &dst->in_reserved6);
3005163899Smjacob	ISP_IOXPUT_16(isp, src->in_portid_lo, &dst->in_portid_lo);
3006163899Smjacob	ISP_IOXPUT_8(isp, src->in_portid_hi, &dst->in_portid_hi);
3007196008Smjacob	ISP_IOXPUT_8(isp, src->in_reserved7, &dst->in_reserved7);
3008196008Smjacob	ISP_IOXPUT_16(isp, src->in_reserved8, &dst->in_reserved8);
3009163899Smjacob	ISP_IOXPUT_16(isp, src->in_oxid, &dst->in_oxid);
3010155228Smjacob}
3011155228Smjacob
3012155228Smjacobvoid
3013196008Smjacobisp_get_notify_fc(ispsoftc_t *isp, in_fcentry_t *src, in_fcentry_t *dst)
3014155228Smjacob{
3015163899Smjacob	isp_get_hdr(isp, &src->in_header, &dst->in_header);
3016163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved, dst->in_reserved);
3017163899Smjacob	ISP_IOXGET_8(isp, &src->in_lun, dst->in_lun);
3018163899Smjacob	ISP_IOXGET_8(isp, &src->in_iid, dst->in_iid);
3019163899Smjacob	ISP_IOXGET_16(isp, &src->in_scclun, dst->in_scclun);
3020163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved2, dst->in_reserved2);
3021163899Smjacob	ISP_IOXGET_16(isp, &src->in_status, dst->in_status);
3022163899Smjacob	ISP_IOXGET_16(isp, &src->in_task_flags, dst->in_task_flags);
3023163899Smjacob	ISP_IOXGET_16(isp, &src->in_seqid, dst->in_seqid);
3024155228Smjacob}
3025155228Smjacob
3026155228Smjacobvoid
3027196008Smjacobisp_get_notify_fc_e(ispsoftc_t *isp, in_fcentry_e_t *src, in_fcentry_e_t *dst)
3028155228Smjacob{
3029163899Smjacob	isp_get_hdr(isp, &src->in_header, &dst->in_header);
3030163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved, dst->in_reserved);
3031163899Smjacob	ISP_IOXGET_16(isp, &src->in_iid, dst->in_iid);
3032163899Smjacob	ISP_IOXGET_16(isp, &src->in_scclun, dst->in_scclun);
3033163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved2, dst->in_reserved2);
3034163899Smjacob	ISP_IOXGET_16(isp, &src->in_status, dst->in_status);
3035163899Smjacob	ISP_IOXGET_16(isp, &src->in_task_flags, dst->in_task_flags);
3036163899Smjacob	ISP_IOXGET_16(isp, &src->in_seqid, dst->in_seqid);
3037163899Smjacob}
3038163899Smjacob
3039163899Smjacobvoid
3040196008Smjacobisp_get_notify_24xx(ispsoftc_t *isp, in_fcentry_24xx_t *src, in_fcentry_24xx_t *dst)
3041163899Smjacob{
3042155228Smjacob	int i;
3043163899Smjacob
3044163899Smjacob	isp_get_hdr(isp, &src->in_header, &dst->in_header);
3045163899Smjacob	ISP_IOXGET_32(isp, &src->in_reserved, dst->in_reserved);
3046163899Smjacob	ISP_IOXGET_16(isp, &src->in_nphdl, dst->in_nphdl);
3047163899Smjacob	ISP_IOXGET_16(isp, &src->in_reserved1, dst->in_reserved1);
3048163899Smjacob	ISP_IOXGET_16(isp, &src->in_flags, dst->in_flags);
3049163899Smjacob	ISP_IOXGET_16(isp, &src->in_srr_rxid, dst->in_srr_rxid);
3050163899Smjacob	ISP_IOXGET_16(isp, &src->in_status, dst->in_status);
3051163899Smjacob	ISP_IOXGET_8(isp, &src->in_status_subcode, dst->in_status_subcode);
3052289838Smav	ISP_IOXGET_8(isp, &src->in_fwhandle, dst->in_fwhandle);
3053163899Smjacob	ISP_IOXGET_32(isp, &src->in_rxid, dst->in_rxid);
3054163899Smjacob	ISP_IOXGET_16(isp, &src->in_srr_reloff_hi, dst->in_srr_reloff_hi);
3055163899Smjacob	ISP_IOXGET_16(isp, &src->in_srr_reloff_lo, dst->in_srr_reloff_lo);
3056163899Smjacob	ISP_IOXGET_16(isp, &src->in_srr_iu, dst->in_srr_iu);
3057163899Smjacob	ISP_IOXGET_16(isp, &src->in_srr_oxid, dst->in_srr_oxid);
3058196008Smjacob	ISP_IOXGET_16(isp, &src->in_nport_id_hi, dst->in_nport_id_hi);
3059196008Smjacob	ISP_IOXGET_8(isp, &src->in_nport_id_lo, dst->in_nport_id_lo);
3060196008Smjacob	ISP_IOXGET_8(isp, &src->in_reserved3, dst->in_reserved3);
3061196008Smjacob	ISP_IOXGET_16(isp, &src->in_np_handle, dst->in_np_handle);
3062196008Smjacob	for (i = 0; i < ASIZE(src->in_reserved4); i++) {
3063196008Smjacob		ISP_IOXGET_8(isp, &src->in_reserved4[i], dst->in_reserved4[i]);
3064163899Smjacob	}
3065196008Smjacob	ISP_IOXGET_8(isp, &src->in_reserved5, dst->in_reserved5);
3066196008Smjacob	ISP_IOXGET_8(isp, &src->in_vpidx, dst->in_vpidx);
3067196008Smjacob	ISP_IOXGET_32(isp, &src->in_reserved6, dst->in_reserved6);
3068163899Smjacob	ISP_IOXGET_16(isp, &src->in_portid_lo, dst->in_portid_lo);
3069163899Smjacob	ISP_IOXGET_8(isp, &src->in_portid_hi, dst->in_portid_hi);
3070196008Smjacob	ISP_IOXGET_8(isp, &src->in_reserved7, dst->in_reserved7);
3071196008Smjacob	ISP_IOXGET_16(isp, &src->in_reserved8, dst->in_reserved8);
3072163899Smjacob	ISP_IOXGET_16(isp, &src->in_oxid, dst->in_oxid);
3073163899Smjacob}
3074163899Smjacob
3075163899Smjacobvoid
3076196008Smjacobisp_put_notify_ack_fc(ispsoftc_t *isp, na_fcentry_t *src, na_fcentry_t *dst)
3077155228Smjacob{
3078155228Smjacob	int i;
3079163899Smjacob	isp_put_hdr(isp, &src->na_header, &dst->na_header);
3080163899Smjacob	ISP_IOXPUT_32(isp, src->na_reserved, &dst->na_reserved);
3081163899Smjacob	ISP_IOXPUT_8(isp, src->na_reserved1, &dst->na_reserved1);
3082163899Smjacob	ISP_IOXPUT_8(isp, src->na_iid, &dst->na_iid);
3083163899Smjacob	ISP_IOXPUT_16(isp, src->na_response, &dst->na_response);
3084163899Smjacob	ISP_IOXPUT_16(isp, src->na_flags, &dst->na_flags);
3085163899Smjacob	ISP_IOXPUT_16(isp, src->na_reserved2, &dst->na_reserved2);
3086163899Smjacob	ISP_IOXPUT_16(isp, src->na_status, &dst->na_status);
3087163899Smjacob	ISP_IOXPUT_16(isp, src->na_task_flags, &dst->na_task_flags);
3088163899Smjacob	ISP_IOXPUT_16(isp, src->na_seqid, &dst->na_seqid);
3089155228Smjacob	for (i = 0; i < NA2_RSVDLEN; i++) {
3090196008Smjacob		ISP_IOXPUT_16(isp, src->na_reserved3[i], &dst->na_reserved3[i]);
3091155228Smjacob	}
3092155228Smjacob}
3093155228Smjacob
3094155228Smjacobvoid
3095196008Smjacobisp_put_notify_ack_fc_e(ispsoftc_t *isp, na_fcentry_e_t *src, na_fcentry_e_t *dst)
3096155228Smjacob{
3097155228Smjacob	int i;
3098163899Smjacob	isp_put_hdr(isp, &src->na_header, &dst->na_header);
3099163899Smjacob	ISP_IOXPUT_32(isp, src->na_reserved, &dst->na_reserved);
3100163899Smjacob	ISP_IOXPUT_16(isp, src->na_iid, &dst->na_iid);
3101163899Smjacob	ISP_IOXPUT_16(isp, src->na_response, &dst->na_response);
3102163899Smjacob	ISP_IOXPUT_16(isp, src->na_flags, &dst->na_flags);
3103163899Smjacob	ISP_IOXPUT_16(isp, src->na_reserved2, &dst->na_reserved2);
3104163899Smjacob	ISP_IOXPUT_16(isp, src->na_status, &dst->na_status);
3105163899Smjacob	ISP_IOXPUT_16(isp, src->na_task_flags, &dst->na_task_flags);
3106163899Smjacob	ISP_IOXPUT_16(isp, src->na_seqid, &dst->na_seqid);
3107155228Smjacob	for (i = 0; i < NA2_RSVDLEN; i++) {
3108196008Smjacob		ISP_IOXPUT_16(isp, src->na_reserved3[i], &dst->na_reserved3[i]);
3109155228Smjacob	}
3110155228Smjacob}
3111155228Smjacob
3112155228Smjacobvoid
3113196008Smjacobisp_put_notify_24xx_ack(ispsoftc_t *isp, na_fcentry_24xx_t *src, na_fcentry_24xx_t *dst)
3114155228Smjacob{
3115155228Smjacob	int i;
3116163899Smjacob
3117163899Smjacob	isp_put_hdr(isp, &src->na_header, &dst->na_header);
3118163899Smjacob	ISP_IOXPUT_32(isp, src->na_handle, &dst->na_handle);
3119163899Smjacob	ISP_IOXPUT_16(isp, src->na_nphdl, &dst->na_nphdl);
3120163899Smjacob	ISP_IOXPUT_16(isp, src->na_reserved1, &dst->na_reserved1);
3121163899Smjacob	ISP_IOXPUT_16(isp, src->na_flags, &dst->na_flags);
3122163899Smjacob	ISP_IOXPUT_16(isp, src->na_srr_rxid, &dst->na_srr_rxid);
3123163899Smjacob	ISP_IOXPUT_16(isp, src->na_status, &dst->na_status);
3124163899Smjacob	ISP_IOXPUT_8(isp, src->na_status_subcode, &dst->na_status_subcode);
3125289838Smav	ISP_IOXPUT_8(isp, src->na_fwhandle, &dst->na_fwhandle);
3126163899Smjacob	ISP_IOXPUT_32(isp, src->na_rxid, &dst->na_rxid);
3127163899Smjacob	ISP_IOXPUT_16(isp, src->na_srr_reloff_hi, &dst->na_srr_reloff_hi);
3128163899Smjacob	ISP_IOXPUT_16(isp, src->na_srr_reloff_lo, &dst->na_srr_reloff_lo);
3129163899Smjacob	ISP_IOXPUT_16(isp, src->na_srr_iu, &dst->na_srr_iu);
3130163899Smjacob	ISP_IOXPUT_16(isp, src->na_srr_flags, &dst->na_srr_flags);
3131163899Smjacob	for (i = 0; i < 18; i++) {
3132163899Smjacob		ISP_IOXPUT_8(isp, src->na_reserved3[i], &dst->na_reserved3[i]);
3133163899Smjacob	}
3134163899Smjacob	ISP_IOXPUT_8(isp, src->na_reserved4, &dst->na_reserved4);
3135196008Smjacob	ISP_IOXPUT_8(isp, src->na_vpidx, &dst->na_vpidx);
3136196008Smjacob	ISP_IOXPUT_8(isp, src->na_srr_reject_vunique, &dst->na_srr_reject_vunique);
3137196008Smjacob	ISP_IOXPUT_8(isp, src->na_srr_reject_explanation, &dst->na_srr_reject_explanation);
3138163899Smjacob	ISP_IOXPUT_8(isp, src->na_srr_reject_code, &dst->na_srr_reject_code);
3139163899Smjacob	ISP_IOXPUT_8(isp, src->na_reserved5, &dst->na_reserved5);
3140163899Smjacob	for (i = 0; i < 6; i++) {
3141163899Smjacob		ISP_IOXPUT_8(isp, src->na_reserved6[i], &dst->na_reserved6[i]);
3142163899Smjacob	}
3143163899Smjacob	ISP_IOXPUT_16(isp, src->na_oxid, &dst->na_oxid);
3144163899Smjacob}
3145163899Smjacob
3146163899Smjacobvoid
3147196008Smjacobisp_get_notify_ack_fc(ispsoftc_t *isp, na_fcentry_t *src, na_fcentry_t *dst)
3148163899Smjacob{
3149163899Smjacob	int i;
3150163899Smjacob	isp_get_hdr(isp, &src->na_header, &dst->na_header);
3151163899Smjacob	ISP_IOXGET_32(isp, &src->na_reserved, dst->na_reserved);
3152163899Smjacob	ISP_IOXGET_8(isp, &src->na_reserved1, dst->na_reserved1);
3153163899Smjacob	ISP_IOXGET_8(isp, &src->na_iid, dst->na_iid);
3154163899Smjacob	ISP_IOXGET_16(isp, &src->na_response, dst->na_response);
3155163899Smjacob	ISP_IOXGET_16(isp, &src->na_flags, dst->na_flags);
3156163899Smjacob	ISP_IOXGET_16(isp, &src->na_reserved2, dst->na_reserved2);
3157163899Smjacob	ISP_IOXGET_16(isp, &src->na_status, dst->na_status);
3158163899Smjacob	ISP_IOXGET_16(isp, &src->na_task_flags, dst->na_task_flags);
3159163899Smjacob	ISP_IOXGET_16(isp, &src->na_seqid, dst->na_seqid);
3160155228Smjacob	for (i = 0; i < NA2_RSVDLEN; i++) {
3161196008Smjacob		ISP_IOXGET_16(isp, &src->na_reserved3[i], dst->na_reserved3[i]);
3162155228Smjacob	}
3163155228Smjacob}
3164155228Smjacob
3165155228Smjacobvoid
3166196008Smjacobisp_get_notify_ack_fc_e(ispsoftc_t *isp, na_fcentry_e_t *src, na_fcentry_e_t *dst)
3167155228Smjacob{
3168155228Smjacob	int i;
3169163899Smjacob	isp_get_hdr(isp, &src->na_header, &dst->na_header);
3170163899Smjacob	ISP_IOXGET_32(isp, &src->na_reserved, dst->na_reserved);
3171163899Smjacob	ISP_IOXGET_16(isp, &src->na_iid, dst->na_iid);
3172163899Smjacob	ISP_IOXGET_16(isp, &src->na_response, dst->na_response);
3173163899Smjacob	ISP_IOXGET_16(isp, &src->na_flags, dst->na_flags);
3174163899Smjacob	ISP_IOXGET_16(isp, &src->na_reserved2, dst->na_reserved2);
3175163899Smjacob	ISP_IOXGET_16(isp, &src->na_status, dst->na_status);
3176163899Smjacob	ISP_IOXGET_16(isp, &src->na_task_flags, dst->na_task_flags);
3177163899Smjacob	ISP_IOXGET_16(isp, &src->na_seqid, dst->na_seqid);
3178155228Smjacob	for (i = 0; i < NA2_RSVDLEN; i++) {
3179196008Smjacob		ISP_IOXGET_16(isp, &src->na_reserved3[i], dst->na_reserved3[i]);
3180155228Smjacob	}
3181155228Smjacob}
3182163899Smjacob
3183163899Smjacobvoid
3184196008Smjacobisp_get_notify_ack_24xx(ispsoftc_t *isp, na_fcentry_24xx_t *src, na_fcentry_24xx_t *dst)
3185163899Smjacob{
3186163899Smjacob	int i;
3187163899Smjacob
3188163899Smjacob	isp_get_hdr(isp, &src->na_header, &dst->na_header);
3189163899Smjacob	ISP_IOXGET_32(isp, &src->na_handle, dst->na_handle);
3190163899Smjacob	ISP_IOXGET_16(isp, &src->na_nphdl, dst->na_nphdl);
3191163899Smjacob	ISP_IOXGET_16(isp, &src->na_reserved1, dst->na_reserved1);
3192163899Smjacob	ISP_IOXGET_16(isp, &src->na_flags, dst->na_flags);
3193163899Smjacob	ISP_IOXGET_16(isp, &src->na_srr_rxid, dst->na_srr_rxid);
3194163899Smjacob	ISP_IOXGET_16(isp, &src->na_status, dst->na_status);
3195163899Smjacob	ISP_IOXGET_8(isp, &src->na_status_subcode, dst->na_status_subcode);
3196289838Smav	ISP_IOXGET_8(isp, &src->na_fwhandle, dst->na_fwhandle);
3197163899Smjacob	ISP_IOXGET_32(isp, &src->na_rxid, dst->na_rxid);
3198163899Smjacob	ISP_IOXGET_16(isp, &src->na_srr_reloff_hi, dst->na_srr_reloff_hi);
3199163899Smjacob	ISP_IOXGET_16(isp, &src->na_srr_reloff_lo, dst->na_srr_reloff_lo);
3200163899Smjacob	ISP_IOXGET_16(isp, &src->na_srr_iu, dst->na_srr_iu);
3201163899Smjacob	ISP_IOXGET_16(isp, &src->na_srr_flags, dst->na_srr_flags);
3202163899Smjacob	for (i = 0; i < 18; i++) {
3203163899Smjacob		ISP_IOXGET_8(isp, &src->na_reserved3[i], dst->na_reserved3[i]);
3204163899Smjacob	}
3205163899Smjacob	ISP_IOXGET_8(isp, &src->na_reserved4, dst->na_reserved4);
3206196008Smjacob	ISP_IOXGET_8(isp, &src->na_vpidx, dst->na_vpidx);
3207196008Smjacob	ISP_IOXGET_8(isp, &src->na_srr_reject_vunique, dst->na_srr_reject_vunique);
3208196008Smjacob	ISP_IOXGET_8(isp, &src->na_srr_reject_explanation, dst->na_srr_reject_explanation);
3209163899Smjacob	ISP_IOXGET_8(isp, &src->na_srr_reject_code, dst->na_srr_reject_code);
3210163899Smjacob	ISP_IOXGET_8(isp, &src->na_reserved5, dst->na_reserved5);
3211163899Smjacob	for (i = 0; i < 6; i++) {
3212163899Smjacob		ISP_IOXGET_8(isp, &src->na_reserved6[i], dst->na_reserved6[i]);
3213163899Smjacob	}
3214163899Smjacob	ISP_IOXGET_16(isp, &src->na_oxid, dst->na_oxid);
3215163899Smjacob}
3216163899Smjacob
3217163899Smjacobvoid
3218163899Smjacobisp_get_abts(ispsoftc_t *isp, abts_t *src, abts_t *dst)
3219163899Smjacob{
3220163899Smjacob	int i;
3221163899Smjacob
3222163899Smjacob	isp_get_hdr(isp, &src->abts_header, &dst->abts_header);
3223163899Smjacob	for (i = 0; i < 6; i++) {
3224196008Smjacob		ISP_IOXGET_8(isp, &src->abts_reserved0[i], dst->abts_reserved0[i]);
3225163899Smjacob	}
3226163899Smjacob	ISP_IOXGET_16(isp, &src->abts_nphdl, dst->abts_nphdl);
3227163899Smjacob	ISP_IOXGET_16(isp, &src->abts_reserved1, dst->abts_reserved1);
3228163899Smjacob	ISP_IOXGET_16(isp, &src->abts_sof, dst->abts_sof);
3229163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rxid_abts, dst->abts_rxid_abts);
3230163899Smjacob	ISP_IOXGET_16(isp, &src->abts_did_lo, dst->abts_did_lo);
3231163899Smjacob	ISP_IOXGET_8(isp, &src->abts_did_hi, dst->abts_did_hi);
3232163899Smjacob	ISP_IOXGET_8(isp, &src->abts_r_ctl, dst->abts_r_ctl);
3233163899Smjacob	ISP_IOXGET_16(isp, &src->abts_sid_lo, dst->abts_sid_lo);
3234163899Smjacob	ISP_IOXGET_8(isp, &src->abts_sid_hi, dst->abts_sid_hi);
3235163899Smjacob	ISP_IOXGET_8(isp, &src->abts_cs_ctl, dst->abts_cs_ctl);
3236163899Smjacob	ISP_IOXGET_16(isp, &src->abts_fs_ctl, dst->abts_fs_ctl);
3237163899Smjacob	ISP_IOXGET_8(isp, &src->abts_f_ctl, dst->abts_f_ctl);
3238163899Smjacob	ISP_IOXGET_8(isp, &src->abts_type, dst->abts_type);
3239163899Smjacob	ISP_IOXGET_16(isp, &src->abts_seq_cnt, dst->abts_seq_cnt);
3240163899Smjacob	ISP_IOXGET_8(isp, &src->abts_df_ctl, dst->abts_df_ctl);
3241163899Smjacob	ISP_IOXGET_8(isp, &src->abts_seq_id, dst->abts_seq_id);
3242163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rx_id, dst->abts_rx_id);
3243163899Smjacob	ISP_IOXGET_16(isp, &src->abts_ox_id, dst->abts_ox_id);
3244163899Smjacob	ISP_IOXGET_32(isp, &src->abts_param, dst->abts_param);
3245163899Smjacob	for (i = 0; i < 16; i++) {
3246196008Smjacob		ISP_IOXGET_8(isp, &src->abts_reserved2[i], dst->abts_reserved2[i]);
3247163899Smjacob	}
3248163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rxid_task, dst->abts_rxid_task);
3249163899Smjacob}
3250163899Smjacob
3251163899Smjacobvoid
3252163899Smjacobisp_put_abts_rsp(ispsoftc_t *isp, abts_rsp_t *src, abts_rsp_t *dst)
3253163899Smjacob{
3254163899Smjacob	int i;
3255163899Smjacob
3256163899Smjacob	isp_put_hdr(isp, &src->abts_rsp_header, &dst->abts_rsp_header);
3257163899Smjacob	ISP_IOXPUT_32(isp, src->abts_rsp_handle, &dst->abts_rsp_handle);
3258163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_status, &dst->abts_rsp_status);
3259163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_nphdl, &dst->abts_rsp_nphdl);
3260163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_ctl_flags, &dst->abts_rsp_ctl_flags);
3261163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_sof, &dst->abts_rsp_sof);
3262163899Smjacob	ISP_IOXPUT_32(isp, src->abts_rsp_rxid_abts, &dst->abts_rsp_rxid_abts);
3263163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_did_lo, &dst->abts_rsp_did_lo);
3264163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_did_hi, &dst->abts_rsp_did_hi);
3265163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_r_ctl, &dst->abts_rsp_r_ctl);
3266163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_sid_lo, &dst->abts_rsp_sid_lo);
3267163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_sid_hi, &dst->abts_rsp_sid_hi);
3268163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_cs_ctl, &dst->abts_rsp_cs_ctl);
3269163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_f_ctl_lo, &dst->abts_rsp_f_ctl_lo);
3270163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_f_ctl_hi, &dst->abts_rsp_f_ctl_hi);
3271163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_type, &dst->abts_rsp_type);
3272163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_seq_cnt, &dst->abts_rsp_seq_cnt);
3273163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_df_ctl, &dst->abts_rsp_df_ctl);
3274163899Smjacob	ISP_IOXPUT_8(isp, src->abts_rsp_seq_id, &dst->abts_rsp_seq_id);
3275163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_rx_id, &dst->abts_rsp_rx_id);
3276163899Smjacob	ISP_IOXPUT_16(isp, src->abts_rsp_ox_id, &dst->abts_rsp_ox_id);
3277163899Smjacob	ISP_IOXPUT_32(isp, src->abts_rsp_param, &dst->abts_rsp_param);
3278163899Smjacob	if (src->abts_rsp_r_ctl == BA_ACC) {
3279196008Smjacob		ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.reserved, &dst->abts_rsp_payload.ba_acc.reserved);
3280196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_acc.last_seq_id, &dst->abts_rsp_payload.ba_acc.last_seq_id);
3281196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_acc.seq_id_valid, &dst->abts_rsp_payload.ba_acc.seq_id_valid);
3282196008Smjacob		ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.aborted_rx_id, &dst->abts_rsp_payload.ba_acc.aborted_rx_id);
3283196008Smjacob		ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.aborted_ox_id, &dst->abts_rsp_payload.ba_acc.aborted_ox_id);
3284196008Smjacob		ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.high_seq_cnt, &dst->abts_rsp_payload.ba_acc.high_seq_cnt);
3285196008Smjacob		ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.low_seq_cnt, &dst->abts_rsp_payload.ba_acc.low_seq_cnt);
3286163899Smjacob		for (i = 0; i < 4; i++) {
3287196008Smjacob			ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.reserved2[i], &dst->abts_rsp_payload.ba_acc.reserved2[i]);
3288163899Smjacob		}
3289163899Smjacob	} else if (src->abts_rsp_r_ctl == BA_RJT) {
3290196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.vendor_unique, &dst->abts_rsp_payload.ba_rjt.vendor_unique);
3291196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.explanation, &dst->abts_rsp_payload.ba_rjt.explanation);
3292196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.reason, &dst->abts_rsp_payload.ba_rjt.reason);
3293196008Smjacob		ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.reserved, &dst->abts_rsp_payload.ba_rjt.reserved);
3294163899Smjacob		for (i = 0; i < 12; i++) {
3295196008Smjacob			ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_rjt.reserved2[i], &dst->abts_rsp_payload.ba_rjt.reserved2[i]);
3296163899Smjacob		}
3297163899Smjacob	} else {
3298163899Smjacob		for (i = 0; i < 16; i++) {
3299196008Smjacob			ISP_IOXPUT_8(isp, src->abts_rsp_payload.reserved[i], &dst->abts_rsp_payload.reserved[i]);
3300163899Smjacob		}
3301163899Smjacob	}
3302163899Smjacob	ISP_IOXPUT_32(isp, src->abts_rsp_rxid_task, &dst->abts_rsp_rxid_task);
3303163899Smjacob}
3304163899Smjacob
3305163899Smjacobvoid
3306163899Smjacobisp_get_abts_rsp(ispsoftc_t *isp, abts_rsp_t *src, abts_rsp_t *dst)
3307163899Smjacob{
3308163899Smjacob	int i;
3309163899Smjacob
3310163899Smjacob	isp_get_hdr(isp, &src->abts_rsp_header, &dst->abts_rsp_header);
3311163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_handle, dst->abts_rsp_handle);
3312163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_status, dst->abts_rsp_status);
3313163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_nphdl, dst->abts_rsp_nphdl);
3314163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_ctl_flags, dst->abts_rsp_ctl_flags);
3315163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_sof, dst->abts_rsp_sof);
3316163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_rxid_abts, dst->abts_rsp_rxid_abts);
3317163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_did_lo, dst->abts_rsp_did_lo);
3318163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_did_hi, dst->abts_rsp_did_hi);
3319163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_r_ctl, dst->abts_rsp_r_ctl);
3320163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_sid_lo, dst->abts_rsp_sid_lo);
3321163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_sid_hi, dst->abts_rsp_sid_hi);
3322163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_cs_ctl, dst->abts_rsp_cs_ctl);
3323163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_f_ctl_lo, dst->abts_rsp_f_ctl_lo);
3324163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_f_ctl_hi, dst->abts_rsp_f_ctl_hi);
3325163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_type, dst->abts_rsp_type);
3326163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_seq_cnt, dst->abts_rsp_seq_cnt);
3327163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_df_ctl, dst->abts_rsp_df_ctl);
3328163899Smjacob	ISP_IOXGET_8(isp, &src->abts_rsp_seq_id, dst->abts_rsp_seq_id);
3329163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_rx_id, dst->abts_rsp_rx_id);
3330163899Smjacob	ISP_IOXGET_16(isp, &src->abts_rsp_ox_id, dst->abts_rsp_ox_id);
3331163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_param, dst->abts_rsp_param);
3332163899Smjacob	for (i = 0; i < 8; i++) {
3333196008Smjacob		ISP_IOXGET_8(isp, &src->abts_rsp_payload.rsp.reserved[i], dst->abts_rsp_payload.rsp.reserved[i]);
3334163899Smjacob	}
3335196008Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_payload.rsp.subcode1, dst->abts_rsp_payload.rsp.subcode1);
3336196008Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_payload.rsp.subcode2, dst->abts_rsp_payload.rsp.subcode2);
3337163899Smjacob	ISP_IOXGET_32(isp, &src->abts_rsp_rxid_task, dst->abts_rsp_rxid_task);
3338163899Smjacob}
3339155228Smjacob#endif	/* ISP_TARGET_MODE */
3340163899Smjacob/*
3341163899Smjacob * vim:ts=8:sw=8
3342163899Smjacob */
3343