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