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