153af7d22SMatt Jacob /*-
2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause
3718cf2ccSPedro F. Giffuni *
41b760be4SAlexander Motin * Copyright (c) 2009-2020 Alexander Motin <mav@FreeBSD.org>
52df76c16SMatt Jacob * Copyright (c) 1997-2009 by Matthew Jacob
653af7d22SMatt Jacob * All rights reserved.
753af7d22SMatt Jacob *
853af7d22SMatt Jacob * Redistribution and use in source and binary forms, with or without
953af7d22SMatt Jacob * modification, are permitted provided that the following conditions
1053af7d22SMatt Jacob * are met:
1153af7d22SMatt Jacob *
12e48b2487SMatt Jacob * 1. Redistributions of source code must retain the above copyright
13e48b2487SMatt Jacob * notice, this list of conditions and the following disclaimer.
14e48b2487SMatt Jacob * 2. Redistributions in binary form must reproduce the above copyright
15e48b2487SMatt Jacob * notice, this list of conditions and the following disclaimer in the
16e48b2487SMatt Jacob * documentation and/or other materials provided with the distribution.
17e48b2487SMatt Jacob *
18e48b2487SMatt Jacob * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1953af7d22SMatt Jacob * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2053af7d22SMatt Jacob * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21e48b2487SMatt Jacob * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
22e48b2487SMatt Jacob * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2353af7d22SMatt Jacob * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2453af7d22SMatt Jacob * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2553af7d22SMatt Jacob * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2653af7d22SMatt Jacob * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2753af7d22SMatt Jacob * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2853af7d22SMatt Jacob * SUCH DAMAGE.
292df76c16SMatt Jacob *
3053af7d22SMatt Jacob */
31799881e0SMatt Jacob /*
32799881e0SMatt Jacob * Qlogic Host Adapter Internal Library Functions
33799881e0SMatt Jacob */
341dae40ebSMatt Jacob #ifdef __NetBSD__
35e48b2487SMatt Jacob #include <sys/cdefs.h>
36e48b2487SMatt Jacob __KERNEL_RCSID(0, "$NetBSD$");
371dae40ebSMatt Jacob #include <dev/ic/isp_netbsd.h>
381dae40ebSMatt Jacob #endif
391dae40ebSMatt Jacob #ifdef __FreeBSD__
40799881e0SMatt Jacob #include <sys/cdefs.h>
4153af7d22SMatt Jacob #include <dev/isp/isp_freebsd.h>
421dae40ebSMatt Jacob #endif
431dae40ebSMatt Jacob #ifdef __OpenBSD__
441dae40ebSMatt Jacob #include <dev/ic/isp_openbsd.h>
451dae40ebSMatt Jacob #endif
461dae40ebSMatt Jacob #ifdef __linux__
471dae40ebSMatt Jacob #include "isp_linux.h"
481dae40ebSMatt Jacob #endif
491dae40ebSMatt Jacob #ifdef __svr4__
501dae40ebSMatt Jacob #include "isp_solaris.h"
511dae40ebSMatt Jacob #endif
5253af7d22SMatt Jacob
532df76c16SMatt Jacob const char *isp_class3_roles[4] = {
542df76c16SMatt Jacob "None", "Target", "Initiator", "Target/Initiator"
552df76c16SMatt Jacob };
562df76c16SMatt Jacob
572df76c16SMatt Jacob /*
582df76c16SMatt Jacob * Command shipping- finish off first queue entry and do dma mapping and additional segments as needed.
592df76c16SMatt Jacob *
602df76c16SMatt Jacob * Called with the first queue entry at least partially filled out.
612df76c16SMatt Jacob */
622df76c16SMatt Jacob int
isp_send_cmd(ispsoftc_t * isp,void * fqe,void * segp,uint32_t nsegs)63f6854a0cSAlexander Motin isp_send_cmd(ispsoftc_t *isp, void *fqe, void *segp, uint32_t nsegs)
642df76c16SMatt Jacob {
651b760be4SAlexander Motin ispcontreq64_t crq;
66f6854a0cSAlexander Motin uint8_t type, nqe = 1;
670f99cb55SAlexander Motin uint32_t seg, seglim, nxt;
682df76c16SMatt Jacob ispds64_t *dsp64 = NULL;
692df76c16SMatt Jacob void *qe0, *qe1;
702df76c16SMatt Jacob
712df76c16SMatt Jacob qe0 = isp_getrqentry(isp);
72f6854a0cSAlexander Motin if (qe0 == NULL)
732df76c16SMatt Jacob return (CMD_EAGAIN);
742df76c16SMatt Jacob nxt = ISP_NXT_QENTRY(isp->isp_reqidx, RQUEST_QUEUE_LEN(isp));
752df76c16SMatt Jacob type = ((isphdr_t *)fqe)->rqs_entry_type;
762df76c16SMatt Jacob
772df76c16SMatt Jacob /*
782df76c16SMatt Jacob * If we have no data to transmit, just copy the first IOCB and start it up.
792df76c16SMatt Jacob */
80f6854a0cSAlexander Motin if (nsegs == 0)
812df76c16SMatt Jacob goto copy_and_sync;
822df76c16SMatt Jacob
832df76c16SMatt Jacob /*
847e31684eSAlexander Motin * First figure out how many pieces of data to transfer, what
857e31684eSAlexander Motin * kind and how many we can put into the first queue entry.
862df76c16SMatt Jacob */
872df76c16SMatt Jacob switch (type) {
882df76c16SMatt Jacob case RQSTYPE_T7RQS:
892df76c16SMatt Jacob dsp64 = &((ispreqt7_t *)fqe)->req_dataseg;
902df76c16SMatt Jacob seglim = 1;
912df76c16SMatt Jacob break;
927e31684eSAlexander Motin #ifdef ISP_TARGET_MODE
937e31684eSAlexander Motin case RQSTYPE_CTIO7:
947e31684eSAlexander Motin dsp64 = &((ct7_entry_t *)fqe)->rsp.m0.ds;
957e31684eSAlexander Motin seglim = 1;
967e31684eSAlexander Motin break;
977e31684eSAlexander Motin #endif
982df76c16SMatt Jacob default:
99f6854a0cSAlexander Motin panic("%s: unsupported IOCB type 0x%x\n", __func__, type);
1002df76c16SMatt Jacob }
1017e31684eSAlexander Motin if (seglim > nsegs)
1022df76c16SMatt Jacob seglim = nsegs;
1037e31684eSAlexander Motin seg = 0;
1041b760be4SAlexander Motin while (seg < seglim)
1052df76c16SMatt Jacob XS_GET_DMA64_SEG(dsp64++, segp, seg++);
1062df76c16SMatt Jacob
1072df76c16SMatt Jacob /*
1082df76c16SMatt Jacob * Second, start building additional continuation segments as needed.
1092df76c16SMatt Jacob */
1102df76c16SMatt Jacob while (seg < nsegs) {
1110f99cb55SAlexander Motin if (!isp_rqentry_avail(isp, ++nqe))
1122df76c16SMatt Jacob return (CMD_EAGAIN);
1131b760be4SAlexander Motin
1141b760be4SAlexander Motin ISP_MEMZERO(&crq, QENTRY_LEN);
1151b760be4SAlexander Motin crq.req_header.rqs_entry_type = RQSTYPE_A64_CONT;
1161b760be4SAlexander Motin crq.req_header.rqs_entry_count = 1;
1171b760be4SAlexander Motin dsp64 = crq.req_dataseg;
1181b760be4SAlexander Motin
1191b760be4SAlexander Motin seglim = seg + ISP_CDSEG64;
1207e31684eSAlexander Motin if (seglim > nsegs)
1217e31684eSAlexander Motin seglim = nsegs;
1221b760be4SAlexander Motin while (seg < seglim)
1232df76c16SMatt Jacob XS_GET_DMA64_SEG(dsp64++, segp, seg++);
1240f99cb55SAlexander Motin
1250f99cb55SAlexander Motin qe1 = ISP_QUEUE_ENTRY(isp->isp_rquest, nxt);
1261b760be4SAlexander Motin isp_put_cont64_req(isp, &crq, qe1);
1272df76c16SMatt Jacob if (isp->isp_dblev & ISP_LOGDEBUG1) {
1285e3e6a82SAlexander Motin isp_print_bytes(isp, "additional queue entry",
1295e3e6a82SAlexander Motin QENTRY_LEN, qe1);
1302df76c16SMatt Jacob }
1310f99cb55SAlexander Motin
1320f99cb55SAlexander Motin nxt = ISP_NXT_QENTRY(nxt, RQUEST_QUEUE_LEN(isp));
1332df76c16SMatt Jacob }
1342df76c16SMatt Jacob
1352df76c16SMatt Jacob copy_and_sync:
1362df76c16SMatt Jacob ((isphdr_t *)fqe)->rqs_entry_count = nqe;
1372df76c16SMatt Jacob switch (type) {
1382df76c16SMatt Jacob case RQSTYPE_T7RQS:
1392df76c16SMatt Jacob ((ispreqt7_t *)fqe)->req_seg_count = nsegs;
1402df76c16SMatt Jacob isp_put_request_t7(isp, fqe, qe0);
1412df76c16SMatt Jacob break;
1427e31684eSAlexander Motin #ifdef ISP_TARGET_MODE
1437e31684eSAlexander Motin case RQSTYPE_CTIO7:
1447e31684eSAlexander Motin if (((ct7_entry_t *)fqe)->ct_flags & CT7_FLAG_MODE2) {
1457e31684eSAlexander Motin ((ct7_entry_t *)fqe)->ct_seg_count = 1;
1467e31684eSAlexander Motin } else {
1477e31684eSAlexander Motin ((ct7_entry_t *)fqe)->ct_seg_count = nsegs;
1487e31684eSAlexander Motin }
1497e31684eSAlexander Motin isp_put_ctio7(isp, fqe, qe0);
1507e31684eSAlexander Motin break;
1517e31684eSAlexander Motin #endif
1522df76c16SMatt Jacob default:
153f6854a0cSAlexander Motin panic("%s: unsupported IOCB type 0x%x\n", __func__, type);
1542df76c16SMatt Jacob }
1552df76c16SMatt Jacob if (isp->isp_dblev & ISP_LOGDEBUG1) {
1565e3e6a82SAlexander Motin isp_print_bytes(isp, "first queue entry", QENTRY_LEN, qe0);
1572df76c16SMatt Jacob }
1582df76c16SMatt Jacob ISP_ADD_REQUEST(isp, nxt);
159f6854a0cSAlexander Motin return (0);
1602df76c16SMatt Jacob }
1612df76c16SMatt Jacob
162970ceb2fSAlexander Motin uint32_t
isp_allocate_handle(ispsoftc_t * isp,void * xs,int type)163970ceb2fSAlexander Motin isp_allocate_handle(ispsoftc_t *isp, void *xs, int type)
16453af7d22SMatt Jacob {
165c8b8a2c4SMatt Jacob isp_hdl_t *hdp;
16653af7d22SMatt Jacob
167c8b8a2c4SMatt Jacob hdp = isp->isp_xffree;
168970ceb2fSAlexander Motin if (hdp == NULL)
169970ceb2fSAlexander Motin return (ISP_HANDLE_FREE);
170c8b8a2c4SMatt Jacob isp->isp_xffree = hdp->cmd;
171c8b8a2c4SMatt Jacob hdp->cmd = xs;
172c8b8a2c4SMatt Jacob hdp->handle = (hdp - isp->isp_xflist);
173970ceb2fSAlexander Motin hdp->handle |= (type << ISP_HANDLE_USAGE_SHIFT);
174c8b8a2c4SMatt Jacob hdp->handle |= (isp->isp_seqno++ << ISP_HANDLE_SEQ_SHIFT);
175970ceb2fSAlexander Motin return (hdp->handle);
17653af7d22SMatt Jacob }
17753af7d22SMatt Jacob
178970ceb2fSAlexander Motin void *
isp_find_xs(ispsoftc_t * isp,uint32_t handle)17910365e5aSMatt Jacob isp_find_xs(ispsoftc_t *isp, uint32_t handle)
18053af7d22SMatt Jacob {
181970ceb2fSAlexander Motin if (!ISP_VALID_HANDLE(isp, handle)) {
182c8b8a2c4SMatt Jacob isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle);
18353af7d22SMatt Jacob return (NULL);
18453af7d22SMatt Jacob }
185c8b8a2c4SMatt Jacob return (isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].cmd);
18653af7d22SMatt Jacob }
18753af7d22SMatt Jacob
18810365e5aSMatt Jacob uint32_t
isp_find_handle(ispsoftc_t * isp,void * xs)189970ceb2fSAlexander Motin isp_find_handle(ispsoftc_t *isp, void *xs)
19053af7d22SMatt Jacob {
191c8b8a2c4SMatt Jacob uint32_t i, foundhdl = ISP_HANDLE_FREE;
192c8b8a2c4SMatt Jacob
19353af7d22SMatt Jacob if (xs != NULL) {
1940b19f90aSAlexander Motin for (i = 0; i < ISP_HANDLE_NUM(isp); i++) {
195c8b8a2c4SMatt Jacob if (isp->isp_xflist[i].cmd != xs) {
196c8b8a2c4SMatt Jacob continue;
197c8b8a2c4SMatt Jacob }
198c8b8a2c4SMatt Jacob foundhdl = isp->isp_xflist[i].handle;
199c8b8a2c4SMatt Jacob break;
20053af7d22SMatt Jacob }
20153af7d22SMatt Jacob }
202c8b8a2c4SMatt Jacob return (foundhdl);
20353af7d22SMatt Jacob }
20453af7d22SMatt Jacob
20553af7d22SMatt Jacob void
isp_destroy_handle(ispsoftc_t * isp,uint32_t handle)20610365e5aSMatt Jacob isp_destroy_handle(ispsoftc_t *isp, uint32_t handle)
20753af7d22SMatt Jacob {
208970ceb2fSAlexander Motin if (!ISP_VALID_HANDLE(isp, handle)) {
209c8b8a2c4SMatt Jacob isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle);
210c8b8a2c4SMatt Jacob } else {
211c8b8a2c4SMatt Jacob isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].handle = ISP_HANDLE_FREE;
212c8b8a2c4SMatt Jacob isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].cmd = isp->isp_xffree;
213c8b8a2c4SMatt Jacob isp->isp_xffree = &isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)];
21453af7d22SMatt Jacob }
21553af7d22SMatt Jacob }
21653af7d22SMatt Jacob
21753af7d22SMatt Jacob #define TBA (4 * (((QENTRY_LEN >> 2) * 3) + 1) + 1)
21853af7d22SMatt Jacob void
isp_print_qentry(ispsoftc_t * isp,const char * msg,int idx,void * arg)2192df76c16SMatt Jacob isp_print_qentry(ispsoftc_t *isp, const char *msg, int idx, void *arg)
22053af7d22SMatt Jacob {
22153af7d22SMatt Jacob char buf[TBA];
22253af7d22SMatt Jacob int amt, i, j;
2231dae40ebSMatt Jacob uint8_t *ptr = arg;
22453af7d22SMatt Jacob
22553af7d22SMatt Jacob isp_prt(isp, ISP_LOGALL, "%s index %d=>", msg, idx);
22653af7d22SMatt Jacob for (buf[0] = 0, amt = i = 0; i < 4; i++) {
22753af7d22SMatt Jacob buf[0] = 0;
2282df76c16SMatt Jacob ISP_SNPRINTF(buf, TBA, " ");
22953af7d22SMatt Jacob for (j = 0; j < (QENTRY_LEN >> 2); j++) {
2302df76c16SMatt Jacob ISP_SNPRINTF(buf, TBA, "%s %02x", buf, ptr[amt++] & 0xff);
23153af7d22SMatt Jacob }
2328340692fSMatt Jacob isp_prt(isp, ISP_LOGALL, "%s", buf);
23353af7d22SMatt Jacob }
23453af7d22SMatt Jacob }
23553af7d22SMatt Jacob
23653af7d22SMatt Jacob void
isp_print_bytes(ispsoftc_t * isp,const char * msg,int amt,void * arg)2375f634111SMatt Jacob isp_print_bytes(ispsoftc_t *isp, const char *msg, int amt, void *arg)
23853af7d22SMatt Jacob {
23953af7d22SMatt Jacob char buf[128];
2401dae40ebSMatt Jacob uint8_t *ptr = arg;
24153af7d22SMatt Jacob int off;
24253af7d22SMatt Jacob
24353af7d22SMatt Jacob if (msg)
24453af7d22SMatt Jacob isp_prt(isp, ISP_LOGALL, "%s:", msg);
24553af7d22SMatt Jacob off = 0;
24653af7d22SMatt Jacob buf[0] = 0;
24753af7d22SMatt Jacob while (off < amt) {
24853af7d22SMatt Jacob int j, to;
24953af7d22SMatt Jacob to = off;
25053af7d22SMatt Jacob for (j = 0; j < 16; j++) {
2512df76c16SMatt Jacob ISP_SNPRINTF(buf, 128, "%s %02x", buf, ptr[off++] & 0xff);
2522df76c16SMatt Jacob if (off == amt) {
25353af7d22SMatt Jacob break;
25453af7d22SMatt Jacob }
2552df76c16SMatt Jacob }
25653af7d22SMatt Jacob isp_prt(isp, ISP_LOGALL, "0x%08x:%s", to, buf);
25753af7d22SMatt Jacob buf[0] = 0;
25853af7d22SMatt Jacob }
25953af7d22SMatt Jacob }
26053af7d22SMatt Jacob
26153af7d22SMatt Jacob /*
26253af7d22SMatt Jacob * Do the common path to try and ensure that link is up, we've scanned
26353af7d22SMatt Jacob * the fabric (if we're on a fabric), and that we've synchronized this
26453af7d22SMatt Jacob * all with our own database and done the appropriate logins.
26553af7d22SMatt Jacob *
26653af7d22SMatt Jacob * We repeatedly check for firmware state and loop state after each
26753af7d22SMatt Jacob * action because things may have changed while we were doing this.
26853af7d22SMatt Jacob * Any failure or change of state causes us to return a nonzero value.
26953af7d22SMatt Jacob *
27053af7d22SMatt Jacob * We assume we enter here with any locks held.
27153af7d22SMatt Jacob */
27253af7d22SMatt Jacob
27353af7d22SMatt Jacob int
isp_fc_runstate(ispsoftc_t * isp,int chan,int tval)2742df76c16SMatt Jacob isp_fc_runstate(ispsoftc_t *isp, int chan, int tval)
27553af7d22SMatt Jacob {
276e561aa79SAlexander Motin fcparam *fcp = FCPARAM(isp, chan);
277e561aa79SAlexander Motin int res;
27853af7d22SMatt Jacob
279e561aa79SAlexander Motin again:
280e561aa79SAlexander Motin if (fcp->role == ISP_ROLE_NONE)
28153af7d22SMatt Jacob return (-1);
282e561aa79SAlexander Motin res = isp_control(isp, ISPCTL_FCLINK_TEST, chan, tval);
283e561aa79SAlexander Motin if (res > 0)
284e561aa79SAlexander Motin goto again;
285e561aa79SAlexander Motin if (res < 0)
286e561aa79SAlexander Motin return (fcp->isp_loopstate);
287e561aa79SAlexander Motin res = isp_control(isp, ISPCTL_SCAN_LOOP, chan);
288e561aa79SAlexander Motin if (res > 0)
289e561aa79SAlexander Motin goto again;
290e561aa79SAlexander Motin if (res < 0)
291e561aa79SAlexander Motin return (fcp->isp_loopstate);
292e561aa79SAlexander Motin res = isp_control(isp, ISPCTL_SCAN_FABRIC, chan);
293e561aa79SAlexander Motin if (res > 0)
294e561aa79SAlexander Motin goto again;
295e561aa79SAlexander Motin if (res < 0)
296e561aa79SAlexander Motin return (fcp->isp_loopstate);
297e561aa79SAlexander Motin res = isp_control(isp, ISPCTL_PDB_SYNC, chan);
298e561aa79SAlexander Motin if (res > 0)
299e561aa79SAlexander Motin goto again;
300e561aa79SAlexander Motin return (fcp->isp_loopstate);
30153af7d22SMatt Jacob }
30253af7d22SMatt Jacob
303f7c631bcSMatt Jacob /*
3042df76c16SMatt Jacob * Fibre Channel Support routines
305f7c631bcSMatt Jacob */
306f7c631bcSMatt Jacob void
isp_dump_portdb(ispsoftc_t * isp,int chan)3072df76c16SMatt Jacob isp_dump_portdb(ispsoftc_t *isp, int chan)
308f7c631bcSMatt Jacob {
3092df76c16SMatt Jacob fcparam *fcp = FCPARAM(isp, chan);
310f7c631bcSMatt Jacob int i;
311f7c631bcSMatt Jacob
312f7c631bcSMatt Jacob for (i = 0; i < MAX_FC_TARG; i++) {
313e68eef14SAlexander Motin char buf1[64], buf2[64];
314f7c631bcSMatt Jacob const char *dbs[8] = {
315f7c631bcSMatt Jacob "NIL ",
316f7c631bcSMatt Jacob "PROB",
317f7c631bcSMatt Jacob "DEAD",
318f7c631bcSMatt Jacob "CHGD",
319f7c631bcSMatt Jacob "NEW ",
320f7c631bcSMatt Jacob "PVLD",
321f7c631bcSMatt Jacob "ZOMB",
322f7c631bcSMatt Jacob "VLD "
323f7c631bcSMatt Jacob };
324f7c631bcSMatt Jacob fcportdb_t *lp = &fcp->portdb[i];
325f7c631bcSMatt Jacob
326e68eef14SAlexander Motin if (lp->state == FC_PORTDB_STATE_NIL) {
327f7c631bcSMatt Jacob continue;
328f7c631bcSMatt Jacob }
329387d8239SMatt Jacob isp_gen_role_str(buf1, sizeof (buf1), lp->prli_word3);
330387d8239SMatt Jacob isp_gen_role_str(buf2, sizeof (buf2), lp->new_prli_word3);
3315fa351edSAlexander Motin isp_prt(isp, ISP_LOGALL, "Chan %d [%d]: hdl 0x%x %s %s 0x%06x =>%s 0x%06x; WWNN 0x%08x%08x WWPN 0x%08x%08x",
3325fa351edSAlexander Motin chan, i, lp->handle, dbs[lp->state], buf1, lp->portid, buf2, lp->new_portid,
3332df76c16SMatt Jacob (uint32_t) (lp->node_wwn >> 32), (uint32_t) (lp->node_wwn), (uint32_t) (lp->port_wwn >> 32), (uint32_t) (lp->port_wwn));
334f7c631bcSMatt Jacob }
335f7c631bcSMatt Jacob }
336f7c631bcSMatt Jacob
337387d8239SMatt Jacob void
isp_gen_role_str(char * buf,size_t len,uint16_t p3)338387d8239SMatt Jacob isp_gen_role_str(char *buf, size_t len, uint16_t p3)
339387d8239SMatt Jacob {
340387d8239SMatt Jacob int nd = 0;
341387d8239SMatt Jacob buf[0] = '(';
342387d8239SMatt Jacob buf[1] = 0;
343387d8239SMatt Jacob if (p3 & PRLI_WD3_ENHANCED_DISCOVERY) {
344387d8239SMatt Jacob nd++;
345387d8239SMatt Jacob strlcat(buf, "EDisc", len);
346387d8239SMatt Jacob }
347387d8239SMatt Jacob if (p3 & PRLI_WD3_REC_SUPPORT) {
348387d8239SMatt Jacob if (nd++) {
349387d8239SMatt Jacob strlcat(buf, ",", len);
350387d8239SMatt Jacob }
351387d8239SMatt Jacob strlcat(buf, "REC", len);
352387d8239SMatt Jacob }
353387d8239SMatt Jacob if (p3 & PRLI_WD3_TASK_RETRY_IDENTIFICATION_REQUESTED) {
354387d8239SMatt Jacob if (nd++) {
355387d8239SMatt Jacob strlcat(buf, ",", len);
356387d8239SMatt Jacob }
357387d8239SMatt Jacob strlcat(buf, "RetryID", len);
358387d8239SMatt Jacob }
359387d8239SMatt Jacob if (p3 & PRLI_WD3_RETRY) {
360387d8239SMatt Jacob if (nd++) {
361387d8239SMatt Jacob strlcat(buf, ",", len);
362387d8239SMatt Jacob }
363387d8239SMatt Jacob strlcat(buf, "Retry", len);
364387d8239SMatt Jacob }
365387d8239SMatt Jacob if (p3 & PRLI_WD3_CONFIRMED_COMPLETION_ALLOWED) {
366387d8239SMatt Jacob if (nd++) {
367387d8239SMatt Jacob strlcat(buf, ",", len);
368387d8239SMatt Jacob }
369387d8239SMatt Jacob strlcat(buf, "CNFRM", len);
370387d8239SMatt Jacob }
371387d8239SMatt Jacob if (p3 & PRLI_WD3_DATA_OVERLAY_ALLOWED) {
372387d8239SMatt Jacob if (nd++) {
373387d8239SMatt Jacob strlcat(buf, ",", len);
374387d8239SMatt Jacob }
375387d8239SMatt Jacob strlcat(buf, "DOver", len);
376387d8239SMatt Jacob }
377387d8239SMatt Jacob if (p3 & PRLI_WD3_INITIATOR_FUNCTION) {
378387d8239SMatt Jacob if (nd++) {
379387d8239SMatt Jacob strlcat(buf, ",", len);
380387d8239SMatt Jacob }
381387d8239SMatt Jacob strlcat(buf, "INI", len);
382387d8239SMatt Jacob }
383387d8239SMatt Jacob if (p3 & PRLI_WD3_TARGET_FUNCTION) {
384387d8239SMatt Jacob if (nd++) {
385387d8239SMatt Jacob strlcat(buf, ",", len);
386387d8239SMatt Jacob }
387387d8239SMatt Jacob strlcat(buf, "TGT", len);
388387d8239SMatt Jacob }
389387d8239SMatt Jacob if (p3 & PRLI_WD3_READ_FCP_XFER_RDY_DISABLED) {
390387d8239SMatt Jacob if (nd++) {
391387d8239SMatt Jacob strlcat(buf, ",", len);
392387d8239SMatt Jacob }
393387d8239SMatt Jacob strlcat(buf, "RdXfrDis", len);
394387d8239SMatt Jacob }
395387d8239SMatt Jacob if (p3 & PRLI_WD3_WRITE_FCP_XFER_RDY_DISABLED) {
396387d8239SMatt Jacob if (nd++) {
397387d8239SMatt Jacob strlcat(buf, ",", len);
398387d8239SMatt Jacob }
399387d8239SMatt Jacob strlcat(buf, "XfrDis", len);
400387d8239SMatt Jacob }
401387d8239SMatt Jacob strlcat(buf, ")", len);
402387d8239SMatt Jacob }
403387d8239SMatt Jacob
4042df76c16SMatt Jacob const char *
isp_fc_fw_statename(int state)4052df76c16SMatt Jacob isp_fc_fw_statename(int state)
4062df76c16SMatt Jacob {
4072df76c16SMatt Jacob switch (state) {
4082df76c16SMatt Jacob case FW_CONFIG_WAIT: return "Config Wait";
409b6bd5f7fSAlexander Motin case FW_WAIT_LINK: return "Wait Link";
4102df76c16SMatt Jacob case FW_WAIT_LOGIN: return "Wait Login";
4112df76c16SMatt Jacob case FW_READY: return "Ready";
4122df76c16SMatt Jacob case FW_LOSS_OF_SYNC: return "Loss Of Sync";
4132df76c16SMatt Jacob case FW_ERROR: return "Error";
4142df76c16SMatt Jacob case FW_REINIT: return "Re-Init";
4152df76c16SMatt Jacob case FW_NON_PART: return "Nonparticipating";
4162df76c16SMatt Jacob default: return "?????";
4172df76c16SMatt Jacob }
4182df76c16SMatt Jacob }
4192df76c16SMatt Jacob
4202df76c16SMatt Jacob const char *
isp_fc_loop_statename(int state)4212df76c16SMatt Jacob isp_fc_loop_statename(int state)
4222df76c16SMatt Jacob {
4232df76c16SMatt Jacob switch (state) {
4242df76c16SMatt Jacob case LOOP_NIL: return "NIL";
425e561aa79SAlexander Motin case LOOP_HAVE_LINK: return "Have Link";
426212fad74SAlexander Motin case LOOP_HAVE_ADDR: return "Have Address";
427b6bd5f7fSAlexander Motin case LOOP_TESTING_LINK: return "Testing Link";
428b6bd5f7fSAlexander Motin case LOOP_LTEST_DONE: return "Link Test Done";
429b6bd5f7fSAlexander Motin case LOOP_SCANNING_LOOP: return "Scanning Loop";
4302df76c16SMatt Jacob case LOOP_LSCAN_DONE: return "Loop Scan Done";
4312df76c16SMatt Jacob case LOOP_SCANNING_FABRIC: return "Scanning Fabric";
4322df76c16SMatt Jacob case LOOP_FSCAN_DONE: return "Fabric Scan Done";
4332df76c16SMatt Jacob case LOOP_SYNCING_PDB: return "Syncing PDB";
4342df76c16SMatt Jacob case LOOP_READY: return "Ready";
4352df76c16SMatt Jacob default: return "?????";
4362df76c16SMatt Jacob }
4372df76c16SMatt Jacob }
4382df76c16SMatt Jacob
4392df76c16SMatt Jacob const char *
isp_fc_toponame(fcparam * fcp)4402df76c16SMatt Jacob isp_fc_toponame(fcparam *fcp)
4412df76c16SMatt Jacob {
4422df76c16SMatt Jacob
443212fad74SAlexander Motin if (fcp->isp_loopstate < LOOP_HAVE_ADDR) {
4442df76c16SMatt Jacob return "Unavailable";
4452df76c16SMatt Jacob }
4462df76c16SMatt Jacob switch (fcp->isp_topo) {
447eea52482SAlexander Motin case TOPO_NL_PORT: return "Private Loop (NL_Port)";
448eea52482SAlexander Motin case TOPO_FL_PORT: return "Public Loop (FL_Port)";
449eea52482SAlexander Motin case TOPO_N_PORT: return "Point-to-Point (N_Port)";
450eea52482SAlexander Motin case TOPO_F_PORT: return "Fabric (F_Port)";
451eea52482SAlexander Motin case TOPO_PTP_STUB: return "Point-to-Point (no response)";
4522df76c16SMatt Jacob default: return "?????";
4532df76c16SMatt Jacob }
4542df76c16SMatt Jacob }
4552df76c16SMatt Jacob
4562df76c16SMatt Jacob void
isp_clear_commands(ispsoftc_t * isp)4572df76c16SMatt Jacob isp_clear_commands(ispsoftc_t *isp)
4582df76c16SMatt Jacob {
459c8b8a2c4SMatt Jacob uint32_t tmp;
460c8b8a2c4SMatt Jacob isp_hdl_t *hdp;
4612df76c16SMatt Jacob #ifdef ISP_TARGET_MODE
4622df76c16SMatt Jacob isp_notify_t notify;
4632df76c16SMatt Jacob #endif
4642df76c16SMatt Jacob
4650b19f90aSAlexander Motin for (tmp = 0; isp->isp_xflist && tmp < ISP_HANDLE_NUM(isp); tmp++) {
466c8b8a2c4SMatt Jacob
467c8b8a2c4SMatt Jacob hdp = &isp->isp_xflist[tmp];
46866e979f1SAlexander Motin switch (ISP_H2HT(hdp->handle)) {
46966e979f1SAlexander Motin case ISP_HANDLE_INITIATOR: {
470970ceb2fSAlexander Motin XS_T *xs = hdp->cmd;
471f6854a0cSAlexander Motin ISP_DMAFREE(isp, xs);
47266e979f1SAlexander Motin isp_destroy_handle(isp, hdp->handle);
473f6854a0cSAlexander Motin XS_SET_RESID(xs, XS_XFRLEN(xs));
4742df76c16SMatt Jacob XS_SETERR(xs, HBA_BUSRESET);
4752df76c16SMatt Jacob isp_done(xs);
47666e979f1SAlexander Motin break;
47766e979f1SAlexander Motin }
4782df76c16SMatt Jacob #ifdef ISP_TARGET_MODE
47966e979f1SAlexander Motin case ISP_HANDLE_TARGET: {
4801b760be4SAlexander Motin ct7_entry_t ctio;
4811b760be4SAlexander Motin
482f6854a0cSAlexander Motin ISP_DMAFREE(isp, hdp->cmd);
4831b760be4SAlexander Motin ISP_MEMZERO(&ctio, sizeof(ct7_entry_t));
4841b760be4SAlexander Motin ctio.ct_syshandle = hdp->handle;
4851b760be4SAlexander Motin ctio.ct_nphdl = CT_HBA_RESET;
4861b760be4SAlexander Motin ctio.ct_header.rqs_entry_type = RQSTYPE_CTIO7;
4871b760be4SAlexander Motin isp_async(isp, ISPASYNC_TARGET_ACTION, &ctio);
48866e979f1SAlexander Motin break;
48966e979f1SAlexander Motin }
490970ceb2fSAlexander Motin #endif
49166e979f1SAlexander Motin case ISP_HANDLE_CTRL:
492156c1ebeSAlexander Motin ISP_MEMZERO(hdp->cmd, QENTRY_LEN);
49366e979f1SAlexander Motin wakeup(hdp->cmd);
49466e979f1SAlexander Motin isp_destroy_handle(isp, hdp->handle);
49566e979f1SAlexander Motin break;
4962df76c16SMatt Jacob }
497970ceb2fSAlexander Motin }
498970ceb2fSAlexander Motin #ifdef ISP_TARGET_MODE
4992df76c16SMatt Jacob for (tmp = 0; tmp < isp->isp_nchan; tmp++) {
5002df76c16SMatt Jacob ISP_MEMZERO(¬ify, sizeof (isp_notify_t));
5012df76c16SMatt Jacob notify.nt_ncode = NT_HBA_RESET;
5022df76c16SMatt Jacob notify.nt_hba = isp;
5032df76c16SMatt Jacob notify.nt_wwn = INI_ANY;
5042df76c16SMatt Jacob notify.nt_nphdl = NIL_HANDLE;
5052df76c16SMatt Jacob notify.nt_sid = PORT_ANY;
5062df76c16SMatt Jacob notify.nt_did = PORT_ANY;
5072df76c16SMatt Jacob notify.nt_tgt = TGT_ANY;
5082df76c16SMatt Jacob notify.nt_channel = tmp;
5092df76c16SMatt Jacob notify.nt_lun = LUN_ANY;
5102df76c16SMatt Jacob notify.nt_tagval = TAG_ANY;
5112df76c16SMatt Jacob isp_async(isp, ISPASYNC_TARGET_NOTIFY, ¬ify);
5122df76c16SMatt Jacob }
5132df76c16SMatt Jacob #endif
5142df76c16SMatt Jacob }
5152df76c16SMatt Jacob
51653af7d22SMatt Jacob /*
51753af7d22SMatt Jacob * Functions to move stuff to a form that the QLogic RISC engine understands
51853af7d22SMatt Jacob * and functions to move stuff back to a form the processor understands.
51953af7d22SMatt Jacob *
52053af7d22SMatt Jacob * Each platform is required to provide the 8, 16 and 32 bit
52153af7d22SMatt Jacob * swizzle and unswizzle macros (ISP_IOX{PUT|GET}_{8,16,32})
52253af7d22SMatt Jacob *
52353af7d22SMatt Jacob * The assumption is that swizzling and unswizzling is mostly done 'in place'
52453af7d22SMatt Jacob * (with a few exceptions for efficiency).
52553af7d22SMatt Jacob */
52653af7d22SMatt Jacob
52753af7d22SMatt Jacob /*
52853af7d22SMatt Jacob * Swizzle/Copy Functions
52953af7d22SMatt Jacob */
53053af7d22SMatt Jacob void
isp_put_hdr(ispsoftc_t * isp,isphdr_t * hpsrc,isphdr_t * hpdst)53110365e5aSMatt Jacob isp_put_hdr(ispsoftc_t *isp, isphdr_t *hpsrc, isphdr_t *hpdst)
53253af7d22SMatt Jacob {
5332df76c16SMatt Jacob ISP_IOXPUT_8(isp, hpsrc->rqs_entry_type, &hpdst->rqs_entry_type);
5342df76c16SMatt Jacob ISP_IOXPUT_8(isp, hpsrc->rqs_entry_count, &hpdst->rqs_entry_count);
5352df76c16SMatt Jacob ISP_IOXPUT_8(isp, hpsrc->rqs_seqno, &hpdst->rqs_seqno);
5362df76c16SMatt Jacob ISP_IOXPUT_8(isp, hpsrc->rqs_flags, &hpdst->rqs_flags);
53753af7d22SMatt Jacob }
53853af7d22SMatt Jacob
53953af7d22SMatt Jacob void
isp_get_hdr(ispsoftc_t * isp,isphdr_t * hpsrc,isphdr_t * hpdst)54010365e5aSMatt Jacob isp_get_hdr(ispsoftc_t *isp, isphdr_t *hpsrc, isphdr_t *hpdst)
54153af7d22SMatt Jacob {
5422df76c16SMatt Jacob ISP_IOXGET_8(isp, &hpsrc->rqs_entry_type, hpdst->rqs_entry_type);
5432df76c16SMatt Jacob ISP_IOXGET_8(isp, &hpsrc->rqs_entry_count, hpdst->rqs_entry_count);
5442df76c16SMatt Jacob ISP_IOXGET_8(isp, &hpsrc->rqs_seqno, hpdst->rqs_seqno);
5452df76c16SMatt Jacob ISP_IOXGET_8(isp, &hpsrc->rqs_flags, hpdst->rqs_flags);
54653af7d22SMatt Jacob }
54753af7d22SMatt Jacob
54853af7d22SMatt Jacob int
isp_get_response_type(ispsoftc_t * isp,isphdr_t * hp)5491dae40ebSMatt Jacob isp_get_response_type(ispsoftc_t *isp, isphdr_t *hp)
55053af7d22SMatt Jacob {
5511dae40ebSMatt Jacob uint8_t type;
55253af7d22SMatt Jacob ISP_IOXGET_8(isp, &hp->rqs_entry_type, type);
55353af7d22SMatt Jacob return ((int)type);
55453af7d22SMatt Jacob }
55553af7d22SMatt Jacob
55653af7d22SMatt Jacob void
isp_put_marker_24xx(ispsoftc_t * isp,isp_marker_24xx_t * src,isp_marker_24xx_t * dst)5572df76c16SMatt Jacob isp_put_marker_24xx(ispsoftc_t *isp, isp_marker_24xx_t *src, isp_marker_24xx_t *dst)
55853af7d22SMatt Jacob {
55953af7d22SMatt Jacob int i;
56010365e5aSMatt Jacob isp_put_hdr(isp, &src->mrk_header, &dst->mrk_header);
56110365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->mrk_handle, &dst->mrk_handle);
56210365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->mrk_nphdl, &dst->mrk_nphdl);
56310365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->mrk_modifier, &dst->mrk_modifier);
56410365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->mrk_reserved0, &dst->mrk_reserved0);
56510365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->mrk_reserved1, &dst->mrk_reserved1);
56610365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->mrk_vphdl, &dst->mrk_vphdl);
56710365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->mrk_reserved2, &dst->mrk_reserved2);
5681b760be4SAlexander Motin for (i = 0; i < nitems(src->mrk_lun); i++) {
56910365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->mrk_lun[i], &dst->mrk_lun[i]);
57010365e5aSMatt Jacob }
5711b760be4SAlexander Motin for (i = 0; i < nitems(src->mrk_reserved3); i++) {
5722df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->mrk_reserved3[i], &dst->mrk_reserved3[i]);
57310365e5aSMatt Jacob }
57410365e5aSMatt Jacob }
57510365e5aSMatt Jacob
57610365e5aSMatt Jacob void
isp_put_request_t7(ispsoftc_t * isp,ispreqt7_t * src,ispreqt7_t * dst)57710365e5aSMatt Jacob isp_put_request_t7(ispsoftc_t *isp, ispreqt7_t *src, ispreqt7_t *dst)
57810365e5aSMatt Jacob {
57910365e5aSMatt Jacob int i;
58010365e5aSMatt Jacob uint32_t *a, *b;
58110365e5aSMatt Jacob
58210365e5aSMatt Jacob isp_put_hdr(isp, &src->req_header, &dst->req_header);
58310365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
58410365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->req_nphdl, &dst->req_nphdl);
58510365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
58610365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
58710365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->req_reserved, &dst->req_reserved);
58810365e5aSMatt Jacob a = (uint32_t *) src->req_lun;
58910365e5aSMatt Jacob b = (uint32_t *) dst->req_lun;
5901b760be4SAlexander Motin for (i = 0; i < (nitems(src->req_lun) >> 2); i++ ) {
5914607e8eeSMatt Jacob *b++ = ISP_SWAP32(isp, *a++);
59210365e5aSMatt Jacob }
59310365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->req_alen_datadir, &dst->req_alen_datadir);
59410365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->req_task_management, &dst->req_task_management);
59510365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->req_task_attribute, &dst->req_task_attribute);
59610365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->req_crn, &dst->req_crn);
59710365e5aSMatt Jacob a = (uint32_t *) src->req_cdb;
59810365e5aSMatt Jacob b = (uint32_t *) dst->req_cdb;
5991b760be4SAlexander Motin for (i = 0; i < (nitems(src->req_cdb) >> 2); i++) {
6004607e8eeSMatt Jacob *b++ = ISP_SWAP32(isp, *a++);
60110365e5aSMatt Jacob }
60210365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->req_dl, &dst->req_dl);
60310365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->req_tidlo, &dst->req_tidlo);
60410365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->req_tidhi, &dst->req_tidhi);
60510365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->req_vpidx, &dst->req_vpidx);
6062df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->req_dataseg.ds_base, &dst->req_dataseg.ds_base);
6072df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->req_dataseg.ds_basehi, &dst->req_dataseg.ds_basehi);
6082df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->req_dataseg.ds_count, &dst->req_dataseg.ds_count);
6092df76c16SMatt Jacob }
6102df76c16SMatt Jacob
6112df76c16SMatt Jacob void
isp_put_24xx_tmf(ispsoftc_t * isp,isp24xx_tmf_t * src,isp24xx_tmf_t * dst)6122df76c16SMatt Jacob isp_put_24xx_tmf(ispsoftc_t *isp, isp24xx_tmf_t *src, isp24xx_tmf_t *dst)
6132df76c16SMatt Jacob {
6142df76c16SMatt Jacob int i;
6152df76c16SMatt Jacob uint32_t *a, *b;
6162df76c16SMatt Jacob
6172df76c16SMatt Jacob isp_put_hdr(isp, &src->tmf_header, &dst->tmf_header);
6182df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->tmf_handle, &dst->tmf_handle);
6192df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->tmf_nphdl, &dst->tmf_nphdl);
6202df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->tmf_delay, &dst->tmf_delay);
6212df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->tmf_timeout, &dst->tmf_timeout);
6221b760be4SAlexander Motin for (i = 0; i < nitems(src->tmf_reserved0); i++) {
6232df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->tmf_reserved0[i], &dst->tmf_reserved0[i]);
6242df76c16SMatt Jacob }
6252df76c16SMatt Jacob a = (uint32_t *) src->tmf_lun;
6262df76c16SMatt Jacob b = (uint32_t *) dst->tmf_lun;
6271b760be4SAlexander Motin for (i = 0; i < (nitems(src->tmf_lun) >> 2); i++ ) {
6282df76c16SMatt Jacob *b++ = ISP_SWAP32(isp, *a++);
6292df76c16SMatt Jacob }
6302df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->tmf_flags, &dst->tmf_flags);
6311b760be4SAlexander Motin for (i = 0; i < nitems(src->tmf_reserved1); i++) {
6322df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->tmf_reserved1[i], &dst->tmf_reserved1[i]);
6332df76c16SMatt Jacob }
6342df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->tmf_tidlo, &dst->tmf_tidlo);
6352df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->tmf_tidhi, &dst->tmf_tidhi);
6362df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->tmf_vpidx, &dst->tmf_vpidx);
6371b760be4SAlexander Motin for (i = 0; i < nitems(src->tmf_reserved2); i++) {
6382df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->tmf_reserved2[i], &dst->tmf_reserved2[i]);
6392df76c16SMatt Jacob }
64010365e5aSMatt Jacob }
64110365e5aSMatt Jacob
64210365e5aSMatt Jacob void
isp_put_24xx_abrt(ispsoftc_t * isp,isp24xx_abrt_t * src,isp24xx_abrt_t * dst)64310365e5aSMatt Jacob isp_put_24xx_abrt(ispsoftc_t *isp, isp24xx_abrt_t *src, isp24xx_abrt_t *dst)
64410365e5aSMatt Jacob {
64510365e5aSMatt Jacob int i;
64610365e5aSMatt Jacob isp_put_hdr(isp, &src->abrt_header, &dst->abrt_header);
64710365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->abrt_handle, &dst->abrt_handle);
64810365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->abrt_nphdl, &dst->abrt_nphdl);
64910365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->abrt_options, &dst->abrt_options);
65010365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->abrt_cmd_handle, &dst->abrt_cmd_handle);
65118c74b22SAlexander Motin ISP_IOXPUT_16(isp, src->abrt_queue_number, &dst->abrt_queue_number);
6521b760be4SAlexander Motin for (i = 0; i < nitems(src->abrt_reserved); i++) {
6532df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->abrt_reserved[i], &dst->abrt_reserved[i]);
65410365e5aSMatt Jacob }
65510365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->abrt_tidlo, &dst->abrt_tidlo);
65610365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->abrt_tidhi, &dst->abrt_tidhi);
65710365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->abrt_vpidx, &dst->abrt_vpidx);
6581b760be4SAlexander Motin for (i = 0; i < nitems(src->abrt_reserved1); i++) {
6592df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->abrt_reserved1[i], &dst->abrt_reserved1[i]);
66010365e5aSMatt Jacob }
66110365e5aSMatt Jacob }
66210365e5aSMatt Jacob
66310365e5aSMatt Jacob void
isp_put_cont64_req(ispsoftc_t * isp,ispcontreq64_t * src,ispcontreq64_t * dst)66410365e5aSMatt Jacob isp_put_cont64_req(ispsoftc_t *isp, ispcontreq64_t *src, ispcontreq64_t *dst)
66553af7d22SMatt Jacob {
66653af7d22SMatt Jacob int i;
66710365e5aSMatt Jacob isp_put_hdr(isp, &src->req_header, &dst->req_header);
66853af7d22SMatt Jacob for (i = 0; i < ISP_CDSEG64; i++) {
6692df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
6702df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_basehi, &dst->req_dataseg[i].ds_basehi);
6712df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
67253af7d22SMatt Jacob }
67353af7d22SMatt Jacob }
67453af7d22SMatt Jacob
67553af7d22SMatt Jacob void
isp_get_cont_response(ispsoftc_t * isp,ispstatus_cont_t * src,ispstatus_cont_t * dst)676387d8239SMatt Jacob isp_get_cont_response(ispsoftc_t *isp, ispstatus_cont_t *src, ispstatus_cont_t *dst)
677387d8239SMatt Jacob {
678387d8239SMatt Jacob int i;
679387d8239SMatt Jacob uint32_t *a, *b;
6801b760be4SAlexander Motin
6811b760be4SAlexander Motin isp_get_hdr(isp, &src->req_header, &dst->req_header);
682387d8239SMatt Jacob a = (uint32_t *) src->req_sense_data;
683387d8239SMatt Jacob b = (uint32_t *) dst->req_sense_data;
6841b760be4SAlexander Motin for (i = 0; i < (sizeof (src->req_sense_data) / sizeof (uint32_t)); i++)
685387d8239SMatt Jacob ISP_IOZGET_32(isp, a++, *b++);
686387d8239SMatt Jacob }
687387d8239SMatt Jacob
688387d8239SMatt Jacob void
isp_get_24xx_response(ispsoftc_t * isp,isp24xx_statusreq_t * src,isp24xx_statusreq_t * dst)6892df76c16SMatt Jacob isp_get_24xx_response(ispsoftc_t *isp, isp24xx_statusreq_t *src, isp24xx_statusreq_t *dst)
69053af7d22SMatt Jacob {
69153af7d22SMatt Jacob int i;
6924607e8eeSMatt Jacob uint32_t *s, *d;
6934607e8eeSMatt Jacob
69410365e5aSMatt Jacob isp_get_hdr(isp, &src->req_header, &dst->req_header);
69510365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->req_handle, dst->req_handle);
6962df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->req_completion_status, dst->req_completion_status);
69710365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->req_oxid, dst->req_oxid);
69810365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->req_resid, dst->req_resid);
69910365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->req_reserved0, dst->req_reserved0);
70010365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->req_state_flags, dst->req_state_flags);
70192b25384SAlexander Motin ISP_IOXGET_16(isp, &src->req_retry_delay, dst->req_retry_delay);
70210365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->req_scsi_status, dst->req_scsi_status);
70310365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->req_fcp_residual, dst->req_fcp_residual);
70410365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->req_sense_len, dst->req_sense_len);
70510365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->req_response_len, dst->req_response_len);
7064607e8eeSMatt Jacob s = (uint32_t *)src->req_rsp_sense;
7074607e8eeSMatt Jacob d = (uint32_t *)dst->req_rsp_sense;
7081b760be4SAlexander Motin for (i = 0; i < (nitems(src->req_rsp_sense) >> 2); i++) {
7094607e8eeSMatt Jacob d[i] = ISP_SWAP32(isp, s[i]);
71053af7d22SMatt Jacob }
71153af7d22SMatt Jacob }
71253af7d22SMatt Jacob
71353af7d22SMatt Jacob void
isp_get_24xx_abrt(ispsoftc_t * isp,isp24xx_abrt_t * src,isp24xx_abrt_t * dst)71410365e5aSMatt Jacob isp_get_24xx_abrt(ispsoftc_t *isp, isp24xx_abrt_t *src, isp24xx_abrt_t *dst)
71510365e5aSMatt Jacob {
71610365e5aSMatt Jacob int i;
71710365e5aSMatt Jacob isp_get_hdr(isp, &src->abrt_header, &dst->abrt_header);
71810365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->abrt_handle, dst->abrt_handle);
71910365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abrt_nphdl, dst->abrt_nphdl);
72010365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abrt_options, dst->abrt_options);
72110365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->abrt_cmd_handle, dst->abrt_cmd_handle);
72218c74b22SAlexander Motin ISP_IOXGET_16(isp, &src->abrt_queue_number, dst->abrt_queue_number);
7231b760be4SAlexander Motin for (i = 0; i < nitems(src->abrt_reserved); i++) {
7242df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->abrt_reserved[i], dst->abrt_reserved[i]);
72510365e5aSMatt Jacob }
72610365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abrt_tidlo, dst->abrt_tidlo);
72710365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->abrt_tidhi, dst->abrt_tidhi);
72810365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->abrt_vpidx, dst->abrt_vpidx);
7291b760be4SAlexander Motin for (i = 0; i < nitems(src->abrt_reserved1); i++) {
7302df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->abrt_reserved1[i], dst->abrt_reserved1[i]);
73110365e5aSMatt Jacob }
73210365e5aSMatt Jacob }
73310365e5aSMatt Jacob
73453af7d22SMatt Jacob void
isp_put_icb_2400(ispsoftc_t * isp,isp_icb_2400_t * src,isp_icb_2400_t * dst)73510365e5aSMatt Jacob isp_put_icb_2400(ispsoftc_t *isp, isp_icb_2400_t *src, isp_icb_2400_t *dst)
73610365e5aSMatt Jacob {
73710365e5aSMatt Jacob int i;
73810365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_version, &dst->icb_version);
73910365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_reserved0, &dst->icb_reserved0);
74010365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_maxfrmlen, &dst->icb_maxfrmlen);
74110365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_execthrottle, &dst->icb_execthrottle);
74210365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_xchgcnt, &dst->icb_xchgcnt);
74310365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_hardaddr, &dst->icb_hardaddr);
74410365e5aSMatt Jacob for (i = 0; i < 8; i++) {
74510365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->icb_portname[i], &dst->icb_portname[i]);
74610365e5aSMatt Jacob }
74710365e5aSMatt Jacob for (i = 0; i < 8; i++) {
74810365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->icb_nodename[i], &dst->icb_nodename[i]);
74910365e5aSMatt Jacob }
75010365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_rspnsin, &dst->icb_rspnsin);
75110365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_rqstout, &dst->icb_rqstout);
75210365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_retry_count, &dst->icb_retry_count);
75310365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_priout, &dst->icb_priout);
75410365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_rsltqlen, &dst->icb_rsltqlen);
75510365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_rqstqlen, &dst->icb_rqstqlen);
75610365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_ldn_nols, &dst->icb_ldn_nols);
75710365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_prqstqlen, &dst->icb_prqstqlen);
75810365e5aSMatt Jacob for (i = 0; i < 4; i++) {
75910365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_rqstaddr[i], &dst->icb_rqstaddr[i]);
76010365e5aSMatt Jacob }
76110365e5aSMatt Jacob for (i = 0; i < 4; i++) {
76210365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_respaddr[i], &dst->icb_respaddr[i]);
76310365e5aSMatt Jacob }
76410365e5aSMatt Jacob for (i = 0; i < 4; i++) {
76510365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_priaddr[i], &dst->icb_priaddr[i]);
76610365e5aSMatt Jacob }
767829dfec0SAlexander Motin ISP_IOXPUT_16(isp, src->icb_msixresp, &dst->icb_msixresp);
768829dfec0SAlexander Motin ISP_IOXPUT_16(isp, src->icb_msixatio, &dst->icb_msixatio);
769829dfec0SAlexander Motin for (i = 0; i < 2; i++) {
7702df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->icb_reserved1[i], &dst->icb_reserved1[i]);
77110365e5aSMatt Jacob }
77210365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_atio_in, &dst->icb_atio_in);
77310365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_atioqlen, &dst->icb_atioqlen);
77410365e5aSMatt Jacob for (i = 0; i < 4; i++) {
7752df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->icb_atioqaddr[i], &dst->icb_atioqaddr[i]);
77610365e5aSMatt Jacob }
77710365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_idelaytimer, &dst->icb_idelaytimer);
77810365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->icb_logintime, &dst->icb_logintime);
77910365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->icb_fwoptions1, &dst->icb_fwoptions1);
78010365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->icb_fwoptions2, &dst->icb_fwoptions2);
78110365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->icb_fwoptions3, &dst->icb_fwoptions3);
782829dfec0SAlexander Motin ISP_IOXPUT_16(isp, src->icb_qos, &dst->icb_qos);
783829dfec0SAlexander Motin for (i = 0; i < 3; i++)
7842df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->icb_reserved2[i], &dst->icb_reserved2[i]);
785b05f17a1SAlexander Motin for (i = 0; i < 6; i++)
786b05f17a1SAlexander Motin ISP_IOXPUT_8(isp, src->icb_enodemac[i], &dst->icb_enodemac[i]);
787829dfec0SAlexander Motin ISP_IOXPUT_16(isp, src->icb_disctime, &dst->icb_disctime);
788829dfec0SAlexander Motin for (i = 0; i < 4; i++)
789829dfec0SAlexander Motin ISP_IOXPUT_16(isp, src->icb_reserved3[i], &dst->icb_reserved3[i]);
7902df76c16SMatt Jacob }
7912df76c16SMatt Jacob
7922df76c16SMatt Jacob void
isp_put_icb_2400_vpinfo(ispsoftc_t * isp,isp_icb_2400_vpinfo_t * src,isp_icb_2400_vpinfo_t * dst)7932df76c16SMatt Jacob isp_put_icb_2400_vpinfo(ispsoftc_t *isp, isp_icb_2400_vpinfo_t *src, isp_icb_2400_vpinfo_t *dst)
7942df76c16SMatt Jacob {
7952df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->vp_count, &dst->vp_count);
7962df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->vp_global_options, &dst->vp_global_options);
7972df76c16SMatt Jacob }
7982df76c16SMatt Jacob
7992df76c16SMatt Jacob void
isp_put_vp_port_info(ispsoftc_t * isp,vp_port_info_t * src,vp_port_info_t * dst)8002df76c16SMatt Jacob isp_put_vp_port_info(ispsoftc_t *isp, vp_port_info_t *src, vp_port_info_t *dst)
8012df76c16SMatt Jacob {
8022df76c16SMatt Jacob int i;
8032df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->vp_port_status, &dst->vp_port_status);
8042df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->vp_port_options, &dst->vp_port_options);
8052df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->vp_port_loopid, &dst->vp_port_loopid);
8062df76c16SMatt Jacob for (i = 0; i < 8; i++) {
8072df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->vp_port_portname[i], &dst->vp_port_portname[i]);
8082df76c16SMatt Jacob }
8092df76c16SMatt Jacob for (i = 0; i < 8; i++) {
8102df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->vp_port_nodename[i], &dst->vp_port_nodename[i]);
8112df76c16SMatt Jacob }
8122df76c16SMatt Jacob /* we never *put* portid_lo/portid_hi */
8132df76c16SMatt Jacob }
8142df76c16SMatt Jacob
8152df76c16SMatt Jacob void
isp_get_vp_port_info(ispsoftc_t * isp,vp_port_info_t * src,vp_port_info_t * dst)8162df76c16SMatt Jacob isp_get_vp_port_info(ispsoftc_t *isp, vp_port_info_t *src, vp_port_info_t *dst)
8172df76c16SMatt Jacob {
8182df76c16SMatt Jacob int i;
8192df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->vp_port_status, dst->vp_port_status);
8202df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->vp_port_options, dst->vp_port_options);
8212df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->vp_port_loopid, dst->vp_port_loopid);
8221b760be4SAlexander Motin for (i = 0; i < nitems(src->vp_port_portname); i++) {
8232df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->vp_port_portname[i], dst->vp_port_portname[i]);
8242df76c16SMatt Jacob }
8251b760be4SAlexander Motin for (i = 0; i < nitems(src->vp_port_nodename); i++) {
8262df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->vp_port_nodename[i], dst->vp_port_nodename[i]);
8272df76c16SMatt Jacob }
8282df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->vp_port_portid_lo, dst->vp_port_portid_lo);
8292df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->vp_port_portid_hi, dst->vp_port_portid_hi);
8302df76c16SMatt Jacob }
8312df76c16SMatt Jacob
8322df76c16SMatt Jacob void
isp_put_vp_ctrl_info(ispsoftc_t * isp,vp_ctrl_info_t * src,vp_ctrl_info_t * dst)8332df76c16SMatt Jacob isp_put_vp_ctrl_info(ispsoftc_t *isp, vp_ctrl_info_t *src, vp_ctrl_info_t *dst)
8342df76c16SMatt Jacob {
8352df76c16SMatt Jacob int i;
8362df76c16SMatt Jacob isp_put_hdr(isp, &src->vp_ctrl_hdr, &dst->vp_ctrl_hdr);
8372df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->vp_ctrl_handle, &dst->vp_ctrl_handle);
8382df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->vp_ctrl_index_fail, &dst->vp_ctrl_index_fail);
8392df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->vp_ctrl_status, &dst->vp_ctrl_status);
8402df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->vp_ctrl_command, &dst->vp_ctrl_command);
8412df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->vp_ctrl_vp_count, &dst->vp_ctrl_vp_count);
8421b760be4SAlexander Motin for (i = 0; i < nitems(src->vp_ctrl_idmap); i++) {
8432df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->vp_ctrl_idmap[i], &dst->vp_ctrl_idmap[i]);
8442df76c16SMatt Jacob }
8451b760be4SAlexander Motin for (i = 0; i < nitems(src->vp_ctrl_reserved); i++) {
84686a1e16dSAlexander Motin ISP_IOXPUT_16(isp, src->vp_ctrl_reserved[i], &dst->vp_ctrl_reserved[i]);
8472df76c16SMatt Jacob }
84886a1e16dSAlexander Motin ISP_IOXPUT_16(isp, src->vp_ctrl_fcf_index, &dst->vp_ctrl_fcf_index);
8492df76c16SMatt Jacob }
8502df76c16SMatt Jacob
8512df76c16SMatt Jacob void
isp_get_vp_ctrl_info(ispsoftc_t * isp,vp_ctrl_info_t * src,vp_ctrl_info_t * dst)8522df76c16SMatt Jacob isp_get_vp_ctrl_info(ispsoftc_t *isp, vp_ctrl_info_t *src, vp_ctrl_info_t *dst)
8532df76c16SMatt Jacob {
8542df76c16SMatt Jacob int i;
8552df76c16SMatt Jacob isp_get_hdr(isp, &src->vp_ctrl_hdr, &dst->vp_ctrl_hdr);
8562df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->vp_ctrl_handle, dst->vp_ctrl_handle);
8572df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->vp_ctrl_index_fail, dst->vp_ctrl_index_fail);
8582df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->vp_ctrl_status, dst->vp_ctrl_status);
8592df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->vp_ctrl_command, dst->vp_ctrl_command);
8602df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->vp_ctrl_vp_count, dst->vp_ctrl_vp_count);
8611b760be4SAlexander Motin for (i = 0; i < nitems(src->vp_ctrl_idmap); i++) {
8622df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->vp_ctrl_idmap[i], dst->vp_ctrl_idmap[i]);
8632df76c16SMatt Jacob }
8641b760be4SAlexander Motin for (i = 0; i < nitems(src->vp_ctrl_reserved); i++) {
86586a1e16dSAlexander Motin ISP_IOXGET_16(isp, &src->vp_ctrl_reserved[i], dst->vp_ctrl_reserved[i]);
8662df76c16SMatt Jacob }
86786a1e16dSAlexander Motin ISP_IOXGET_16(isp, &src->vp_ctrl_fcf_index, dst->vp_ctrl_fcf_index);
8682df76c16SMatt Jacob }
8692df76c16SMatt Jacob
8702df76c16SMatt Jacob void
isp_put_vp_modify(ispsoftc_t * isp,vp_modify_t * src,vp_modify_t * dst)8712df76c16SMatt Jacob isp_put_vp_modify(ispsoftc_t *isp, vp_modify_t *src, vp_modify_t *dst)
8722df76c16SMatt Jacob {
8732df76c16SMatt Jacob int i, j;
8742df76c16SMatt Jacob isp_put_hdr(isp, &src->vp_mod_hdr, &dst->vp_mod_hdr);
8752df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->vp_mod_hdl, &dst->vp_mod_hdl);
8762df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->vp_mod_reserved0, &dst->vp_mod_reserved0);
8772df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->vp_mod_status, &dst->vp_mod_status);
8782df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->vp_mod_cmd, &dst->vp_mod_cmd);
8792df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->vp_mod_cnt, &dst->vp_mod_cnt);
8802df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->vp_mod_idx0, &dst->vp_mod_idx0);
8812df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->vp_mod_idx1, &dst->vp_mod_idx1);
8821b760be4SAlexander Motin for (i = 0; i < nitems(src->vp_mod_ports); i++) {
8832df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->vp_mod_ports[i].options, &dst->vp_mod_ports[i].options);
8842df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->vp_mod_ports[i].loopid, &dst->vp_mod_ports[i].loopid);
8852df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->vp_mod_ports[i].reserved1, &dst->vp_mod_ports[i].reserved1);
8861b760be4SAlexander Motin for (j = 0; j < nitems(src->vp_mod_ports[i].wwpn); j++) {
8872df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->vp_mod_ports[i].wwpn[j], &dst->vp_mod_ports[i].wwpn[j]);
8882df76c16SMatt Jacob }
8891b760be4SAlexander Motin for (j = 0; j < nitems(src->vp_mod_ports[i].wwnn); j++) {
8902df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->vp_mod_ports[i].wwnn[j], &dst->vp_mod_ports[i].wwnn[j]);
8912df76c16SMatt Jacob }
8922df76c16SMatt Jacob }
8931b760be4SAlexander Motin for (i = 0; i < nitems(src->vp_mod_reserved2); i++) {
8942df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->vp_mod_reserved2[i], &dst->vp_mod_reserved2[i]);
8952df76c16SMatt Jacob }
8962df76c16SMatt Jacob }
8972df76c16SMatt Jacob
8982df76c16SMatt Jacob void
isp_get_vp_modify(ispsoftc_t * isp,vp_modify_t * src,vp_modify_t * dst)8992df76c16SMatt Jacob isp_get_vp_modify(ispsoftc_t *isp, vp_modify_t *src, vp_modify_t *dst)
9002df76c16SMatt Jacob {
9012df76c16SMatt Jacob int i, j;
9022df76c16SMatt Jacob isp_get_hdr(isp, &src->vp_mod_hdr, &dst->vp_mod_hdr);
9032df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->vp_mod_hdl, dst->vp_mod_hdl);
9042df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->vp_mod_reserved0, dst->vp_mod_reserved0);
9052df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->vp_mod_status, dst->vp_mod_status);
9062df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->vp_mod_cmd, dst->vp_mod_cmd);
9072df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->vp_mod_cnt, dst->vp_mod_cnt);
9082df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->vp_mod_idx0, dst->vp_mod_idx0);
9092df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->vp_mod_idx1, dst->vp_mod_idx1);
9101b760be4SAlexander Motin for (i = 0; i < nitems(src->vp_mod_ports); i++) {
9112df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->vp_mod_ports[i].options, dst->vp_mod_ports[i].options);
9122df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->vp_mod_ports[i].loopid, dst->vp_mod_ports[i].loopid);
9132df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->vp_mod_ports[i].reserved1, dst->vp_mod_ports[i].reserved1);
9141b760be4SAlexander Motin for (j = 0; j < nitems(src->vp_mod_ports[i].wwpn); j++) {
9152df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->vp_mod_ports[i].wwpn[j], dst->vp_mod_ports[i].wwpn[j]);
9162df76c16SMatt Jacob }
9171b760be4SAlexander Motin for (j = 0; j < nitems(src->vp_mod_ports[i].wwnn); j++) {
9182df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->vp_mod_ports[i].wwnn[j], dst->vp_mod_ports[i].wwnn[j]);
9192df76c16SMatt Jacob }
9202df76c16SMatt Jacob }
9211b760be4SAlexander Motin for (i = 0; i < nitems(src->vp_mod_reserved2); i++) {
9222df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->vp_mod_reserved2[i], dst->vp_mod_reserved2[i]);
92310365e5aSMatt Jacob }
92410365e5aSMatt Jacob }
92510365e5aSMatt Jacob
92610365e5aSMatt Jacob void
isp_get_pdb_24xx(ispsoftc_t * isp,isp_pdb_24xx_t * src,isp_pdb_24xx_t * dst)92710365e5aSMatt Jacob isp_get_pdb_24xx(ispsoftc_t *isp, isp_pdb_24xx_t *src, isp_pdb_24xx_t *dst)
92810365e5aSMatt Jacob {
92910365e5aSMatt Jacob int i;
93010365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->pdb_flags, dst->pdb_flags);
93110365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->pdb_curstate, dst->pdb_curstate);
93210365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->pdb_laststate, dst->pdb_laststate);
93310365e5aSMatt Jacob for (i = 0; i < 4; i++) {
9342df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->pdb_hardaddr_bits[i], dst->pdb_hardaddr_bits[i]);
93510365e5aSMatt Jacob }
93610365e5aSMatt Jacob for (i = 0; i < 4; i++) {
9372df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->pdb_portid_bits[i], dst->pdb_portid_bits[i]);
93810365e5aSMatt Jacob }
93910365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->pdb_retry_timer, dst->pdb_retry_timer);
94010365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->pdb_handle, dst->pdb_handle);
94110365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->pdb_rcv_dsize, dst->pdb_rcv_dsize);
94210365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->pdb_reserved0, dst->pdb_reserved0);
94310365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->pdb_prli_svc0, dst->pdb_prli_svc0);
94410365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->pdb_prli_svc3, dst->pdb_prli_svc3);
94510365e5aSMatt Jacob for (i = 0; i < 8; i++) {
94610365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->pdb_nodename[i], dst->pdb_nodename[i]);
94710365e5aSMatt Jacob }
94810365e5aSMatt Jacob for (i = 0; i < 8; i++) {
94910365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->pdb_portname[i], dst->pdb_portname[i]);
95010365e5aSMatt Jacob }
95110365e5aSMatt Jacob for (i = 0; i < 24; i++) {
9522df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->pdb_reserved1[i], dst->pdb_reserved1[i]);
95310365e5aSMatt Jacob }
95410365e5aSMatt Jacob }
95553af7d22SMatt Jacob
956b6983e5fSAlexander Motin void
isp_get_pnhle_24xx(ispsoftc_t * isp,isp_pnhle_24xx_t * src,isp_pnhle_24xx_t * dst)957b6983e5fSAlexander Motin isp_get_pnhle_24xx(ispsoftc_t *isp, isp_pnhle_24xx_t *src, isp_pnhle_24xx_t *dst)
958b6983e5fSAlexander Motin {
959b6983e5fSAlexander Motin
960b6983e5fSAlexander Motin ISP_IOXGET_16(isp, &src->pnhle_port_id_lo, dst->pnhle_port_id_lo);
961b6983e5fSAlexander Motin ISP_IOXGET_16(isp, &src->pnhle_port_id_hi, dst->pnhle_port_id_hi);
962b6983e5fSAlexander Motin ISP_IOXGET_16(isp, &src->pnhle_handle, dst->pnhle_handle);
963b6983e5fSAlexander Motin ISP_IOXGET_16(isp, &src->pnhle_reserved, dst->pnhle_reserved);
964b6983e5fSAlexander Motin }
965b6983e5fSAlexander Motin
96653af7d22SMatt Jacob /*
96710365e5aSMatt Jacob * PLOGI/LOGO IOCB canonicalization
96810365e5aSMatt Jacob */
96910365e5aSMatt Jacob
97010365e5aSMatt Jacob void
isp_get_plogx(ispsoftc_t * isp,isp_plogx_t * src,isp_plogx_t * dst)97110365e5aSMatt Jacob isp_get_plogx(ispsoftc_t *isp, isp_plogx_t *src, isp_plogx_t *dst)
97210365e5aSMatt Jacob {
97310365e5aSMatt Jacob int i;
97410365e5aSMatt Jacob isp_get_hdr(isp, &src->plogx_header, &dst->plogx_header);
97510365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->plogx_handle, dst->plogx_handle);
97610365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->plogx_status, dst->plogx_status);
97710365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->plogx_nphdl, dst->plogx_nphdl);
97810365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->plogx_flags, dst->plogx_flags);
97910365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->plogx_vphdl, dst->plogx_vphdl);
98010365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->plogx_portlo, dst->plogx_portlo);
98110365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->plogx_rspsz_porthi, dst->plogx_rspsz_porthi);
98210365e5aSMatt Jacob for (i = 0; i < 11; i++) {
9832df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->plogx_ioparm[i].lo16, dst->plogx_ioparm[i].lo16);
9842df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->plogx_ioparm[i].hi16, dst->plogx_ioparm[i].hi16);
98510365e5aSMatt Jacob }
98610365e5aSMatt Jacob }
98710365e5aSMatt Jacob
98810365e5aSMatt Jacob void
isp_put_plogx(ispsoftc_t * isp,isp_plogx_t * src,isp_plogx_t * dst)98910365e5aSMatt Jacob isp_put_plogx(ispsoftc_t *isp, isp_plogx_t *src, isp_plogx_t *dst)
99010365e5aSMatt Jacob {
99110365e5aSMatt Jacob int i;
99210365e5aSMatt Jacob isp_put_hdr(isp, &src->plogx_header, &dst->plogx_header);
99310365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->plogx_handle, &dst->plogx_handle);
99410365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->plogx_status, &dst->plogx_status);
99510365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->plogx_nphdl, &dst->plogx_nphdl);
99610365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->plogx_flags, &dst->plogx_flags);
99710365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->plogx_vphdl, &dst->plogx_vphdl);
99810365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->plogx_portlo, &dst->plogx_portlo);
99910365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->plogx_rspsz_porthi, &dst->plogx_rspsz_porthi);
100010365e5aSMatt Jacob for (i = 0; i < 11; i++) {
10012df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->plogx_ioparm[i].lo16, &dst->plogx_ioparm[i].lo16);
10022df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->plogx_ioparm[i].hi16, &dst->plogx_ioparm[i].hi16);
100310365e5aSMatt Jacob }
100410365e5aSMatt Jacob }
100510365e5aSMatt Jacob
100610365e5aSMatt Jacob /*
10072df76c16SMatt Jacob * Report ID canonicalization
10082df76c16SMatt Jacob */
10092df76c16SMatt Jacob void
isp_get_ridacq(ispsoftc_t * isp,isp_ridacq_t * src,isp_ridacq_t * dst)10102df76c16SMatt Jacob isp_get_ridacq(ispsoftc_t *isp, isp_ridacq_t *src, isp_ridacq_t *dst)
10112df76c16SMatt Jacob {
10122df76c16SMatt Jacob int i;
10132df76c16SMatt Jacob isp_get_hdr(isp, &src->ridacq_hdr, &dst->ridacq_hdr);
10142df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->ridacq_handle, dst->ridacq_handle);
10156d53b0a7SAlexander Motin ISP_IOXGET_8(isp, &src->ridacq_vp_acquired, dst->ridacq_vp_acquired);
10166d53b0a7SAlexander Motin ISP_IOXGET_8(isp, &src->ridacq_vp_setup, dst->ridacq_vp_setup);
10176d53b0a7SAlexander Motin ISP_IOXGET_8(isp, &src->ridacq_vp_index, dst->ridacq_vp_index);
10186d53b0a7SAlexander Motin ISP_IOXGET_8(isp, &src->ridacq_vp_status, dst->ridacq_vp_status);
10192df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->ridacq_vp_port_lo, dst->ridacq_vp_port_lo);
10202df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->ridacq_vp_port_hi, dst->ridacq_vp_port_hi);
10212df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->ridacq_format, dst->ridacq_format);
10222df76c16SMatt Jacob for (i = 0; i < sizeof (src->ridacq_map) / sizeof (src->ridacq_map[0]); i++) {
10232df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->ridacq_map[i], dst->ridacq_map[i]);
10242df76c16SMatt Jacob }
10252df76c16SMatt Jacob for (i = 0; i < sizeof (src->ridacq_reserved1) / sizeof (src->ridacq_reserved1[0]); i++) {
10262df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->ridacq_reserved1[i], dst->ridacq_reserved1[i]);
10272df76c16SMatt Jacob }
10282df76c16SMatt Jacob }
10292df76c16SMatt Jacob
10302df76c16SMatt Jacob
10312df76c16SMatt Jacob /*
103210365e5aSMatt Jacob * CT Passthru canonicalization
103353af7d22SMatt Jacob */
103453af7d22SMatt Jacob void
isp_get_ct_pt(ispsoftc_t * isp,isp_ct_pt_t * src,isp_ct_pt_t * dst)103510365e5aSMatt Jacob isp_get_ct_pt(ispsoftc_t *isp, isp_ct_pt_t *src, isp_ct_pt_t *dst)
103653af7d22SMatt Jacob {
103710365e5aSMatt Jacob int i;
103810365e5aSMatt Jacob
103910365e5aSMatt Jacob isp_get_hdr(isp, &src->ctp_header, &dst->ctp_header);
104010365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->ctp_handle, dst->ctp_handle);
104110365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->ctp_status, dst->ctp_status);
104210365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->ctp_nphdl, dst->ctp_nphdl);
104310365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->ctp_cmd_cnt, dst->ctp_cmd_cnt);
10442df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->ctp_vpidx, dst->ctp_vpidx);
10452df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->ctp_reserved0, dst->ctp_reserved0);
104610365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->ctp_time, dst->ctp_time);
10472df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->ctp_reserved1, dst->ctp_reserved1);
104810365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->ctp_rsp_cnt, dst->ctp_rsp_cnt);
104910365e5aSMatt Jacob for (i = 0; i < 5; i++) {
10502df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->ctp_reserved2[i], dst->ctp_reserved2[i]);
105110365e5aSMatt Jacob }
105210365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->ctp_rsp_bcnt, dst->ctp_rsp_bcnt);
105310365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->ctp_cmd_bcnt, dst->ctp_cmd_bcnt);
105410365e5aSMatt Jacob for (i = 0; i < 2; i++) {
10552df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_base, dst->ctp_dataseg[i].ds_base);
10562df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_basehi, dst->ctp_dataseg[i].ds_basehi);
10572df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_count, dst->ctp_dataseg[i].ds_count);
105810365e5aSMatt Jacob }
105910365e5aSMatt Jacob }
106010365e5aSMatt Jacob
106110365e5aSMatt Jacob void
isp_put_ct_pt(ispsoftc_t * isp,isp_ct_pt_t * src,isp_ct_pt_t * dst)106210365e5aSMatt Jacob isp_put_ct_pt(ispsoftc_t *isp, isp_ct_pt_t *src, isp_ct_pt_t *dst)
106310365e5aSMatt Jacob {
106410365e5aSMatt Jacob int i;
106510365e5aSMatt Jacob
106610365e5aSMatt Jacob isp_put_hdr(isp, &src->ctp_header, &dst->ctp_header);
106710365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->ctp_handle, &dst->ctp_handle);
106810365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->ctp_status, &dst->ctp_status);
106910365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->ctp_nphdl, &dst->ctp_nphdl);
107010365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->ctp_cmd_cnt, &dst->ctp_cmd_cnt);
10712df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->ctp_vpidx, &dst->ctp_vpidx);
10722df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->ctp_reserved0, &dst->ctp_reserved0);
107310365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->ctp_time, &dst->ctp_time);
10742df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->ctp_reserved1, &dst->ctp_reserved1);
107510365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->ctp_rsp_cnt, &dst->ctp_rsp_cnt);
107610365e5aSMatt Jacob for (i = 0; i < 5; i++) {
10772df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->ctp_reserved2[i], &dst->ctp_reserved2[i]);
107810365e5aSMatt Jacob }
107910365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->ctp_rsp_bcnt, &dst->ctp_rsp_bcnt);
108010365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->ctp_cmd_bcnt, &dst->ctp_cmd_bcnt);
108110365e5aSMatt Jacob for (i = 0; i < 2; i++) {
10822df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_base, &dst->ctp_dataseg[i].ds_base);
10832df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_basehi, &dst->ctp_dataseg[i].ds_basehi);
10842df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_count, &dst->ctp_dataseg[i].ds_count);
108510365e5aSMatt Jacob }
108653af7d22SMatt Jacob }
108753af7d22SMatt Jacob
108804697f7aSMatt Jacob void
isp_put_gid_ft_request(ispsoftc_t * isp,sns_gid_ft_req_t * src,sns_gid_ft_req_t * dst)10892df76c16SMatt Jacob isp_put_gid_ft_request(ispsoftc_t *isp, sns_gid_ft_req_t *src, sns_gid_ft_req_t *dst)
109053af7d22SMatt Jacob {
109153af7d22SMatt Jacob ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
109210365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->snscb_reserved0, &dst->snscb_reserved0);
109353af7d22SMatt Jacob ISP_IOXPUT_16(isp, src->snscb_addr[0], &dst->snscb_addr[0]);
109453af7d22SMatt Jacob ISP_IOXPUT_16(isp, src->snscb_addr[1], &dst->snscb_addr[1]);
109553af7d22SMatt Jacob ISP_IOXPUT_16(isp, src->snscb_addr[2], &dst->snscb_addr[2]);
109653af7d22SMatt Jacob ISP_IOXPUT_16(isp, src->snscb_addr[3], &dst->snscb_addr[3]);
109753af7d22SMatt Jacob ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
109810365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->snscb_reserved1, &dst->snscb_reserved1);
109953af7d22SMatt Jacob ISP_IOXPUT_16(isp, src->snscb_cmd, &dst->snscb_cmd);
110053af7d22SMatt Jacob ISP_IOXPUT_16(isp, src->snscb_mword_div_2, &dst->snscb_mword_div_2);
110110365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->snscb_reserved3, &dst->snscb_reserved3);
110253af7d22SMatt Jacob ISP_IOXPUT_32(isp, src->snscb_fc4_type, &dst->snscb_fc4_type);
110353af7d22SMatt Jacob }
110453af7d22SMatt Jacob
110553af7d22SMatt Jacob void
isp_get_gid_xx_response(ispsoftc_t * isp,sns_gid_xx_rsp_t * src,sns_gid_xx_rsp_t * dst,int nwords)1106a94fab67SAlexander Motin isp_get_gid_xx_response(ispsoftc_t *isp, sns_gid_xx_rsp_t *src, sns_gid_xx_rsp_t *dst, int nwords)
110753af7d22SMatt Jacob {
1108a94fab67SAlexander Motin int i, j;
110953af7d22SMatt Jacob
111053af7d22SMatt Jacob isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
111153af7d22SMatt Jacob for (i = 0; i < nwords; i++) {
1112a94fab67SAlexander Motin ISP_IOZGET_8(isp, &src->snscb_ports[i].control,
1113a94fab67SAlexander Motin dst->snscb_ports[i].control);
111453af7d22SMatt Jacob for (j = 0; j < 3; j++) {
1115a94fab67SAlexander Motin ISP_IOZGET_8(isp, &src->snscb_ports[i].portid[j],
1116a94fab67SAlexander Motin dst->snscb_ports[i].portid[j]);
111753af7d22SMatt Jacob }
1118a94fab67SAlexander Motin if (dst->snscb_ports[i].control & 0x80)
111953af7d22SMatt Jacob break;
112053af7d22SMatt Jacob }
112153af7d22SMatt Jacob }
112253af7d22SMatt Jacob
112353af7d22SMatt Jacob void
isp_get_gxn_id_response(ispsoftc_t * isp,sns_gxn_id_rsp_t * src,sns_gxn_id_rsp_t * dst)11242df76c16SMatt Jacob isp_get_gxn_id_response(ispsoftc_t *isp, sns_gxn_id_rsp_t *src, sns_gxn_id_rsp_t *dst)
112553af7d22SMatt Jacob {
112653af7d22SMatt Jacob int i;
1127a94fab67SAlexander Motin
1128a94fab67SAlexander Motin isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1129a94fab67SAlexander Motin for (i = 0; i < 8; i++)
1130a94fab67SAlexander Motin ISP_IOZGET_8(isp, &src->snscb_wwn[i], dst->snscb_wwn[i]);
1131a94fab67SAlexander Motin }
1132a94fab67SAlexander Motin
1133a94fab67SAlexander Motin void
isp_get_gft_id_response(ispsoftc_t * isp,sns_gft_id_rsp_t * src,sns_gft_id_rsp_t * dst)1134a94fab67SAlexander Motin isp_get_gft_id_response(ispsoftc_t *isp, sns_gft_id_rsp_t *src, sns_gft_id_rsp_t *dst)
1135a94fab67SAlexander Motin {
1136a94fab67SAlexander Motin int i;
1137a94fab67SAlexander Motin
113853af7d22SMatt Jacob isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
11392df76c16SMatt Jacob for (i = 0; i < 8; i++) {
1140a94fab67SAlexander Motin ISP_IOZGET_32(isp, &src->snscb_fc4_types[i],
1141a94fab67SAlexander Motin dst->snscb_fc4_types[i]);
114253af7d22SMatt Jacob }
11432df76c16SMatt Jacob }
114453af7d22SMatt Jacob
114553af7d22SMatt Jacob void
isp_get_gff_id_response(ispsoftc_t * isp,sns_gff_id_rsp_t * src,sns_gff_id_rsp_t * dst)11462df76c16SMatt Jacob isp_get_gff_id_response(ispsoftc_t *isp, sns_gff_id_rsp_t *src, sns_gff_id_rsp_t *dst)
114753af7d22SMatt Jacob {
114853af7d22SMatt Jacob int i;
1149a94fab67SAlexander Motin
115053af7d22SMatt Jacob isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
115153af7d22SMatt Jacob for (i = 0; i < 32; i++) {
1152a94fab67SAlexander Motin ISP_IOZGET_32(isp, &src->snscb_fc4_features[i],
1153a94fab67SAlexander Motin dst->snscb_fc4_features[i]);
115453af7d22SMatt Jacob }
115553af7d22SMatt Jacob }
115653af7d22SMatt Jacob
115753af7d22SMatt Jacob void
isp_get_ga_nxt_response(ispsoftc_t * isp,sns_ga_nxt_rsp_t * src,sns_ga_nxt_rsp_t * dst)11582df76c16SMatt Jacob isp_get_ga_nxt_response(ispsoftc_t *isp, sns_ga_nxt_rsp_t *src, sns_ga_nxt_rsp_t *dst)
115953af7d22SMatt Jacob {
116053af7d22SMatt Jacob int i;
116153af7d22SMatt Jacob isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
1162a94fab67SAlexander Motin ISP_IOZGET_8(isp, &src->snscb_port_type, dst->snscb_port_type);
116353af7d22SMatt Jacob for (i = 0; i < 3; i++) {
1164a94fab67SAlexander Motin ISP_IOZGET_8(isp, &src->snscb_port_id[i], dst->snscb_port_id[i]);
116553af7d22SMatt Jacob }
116653af7d22SMatt Jacob for (i = 0; i < 8; i++) {
1167a94fab67SAlexander Motin ISP_IOZGET_8(isp, &src->snscb_portname[i], dst->snscb_portname[i]);
116853af7d22SMatt Jacob }
1169a94fab67SAlexander Motin ISP_IOZGET_8(isp, &src->snscb_pnlen, dst->snscb_pnlen);
117053af7d22SMatt Jacob for (i = 0; i < 255; i++) {
1171a94fab67SAlexander Motin ISP_IOZGET_8(isp, &src->snscb_pname[i], dst->snscb_pname[i]);
117253af7d22SMatt Jacob }
117353af7d22SMatt Jacob for (i = 0; i < 8; i++) {
1174a94fab67SAlexander Motin ISP_IOZGET_8(isp, &src->snscb_nodename[i], dst->snscb_nodename[i]);
117553af7d22SMatt Jacob }
1176a94fab67SAlexander Motin ISP_IOZGET_8(isp, &src->snscb_nnlen, dst->snscb_nnlen);
117753af7d22SMatt Jacob for (i = 0; i < 255; i++) {
1178a94fab67SAlexander Motin ISP_IOZGET_8(isp, &src->snscb_nname[i], dst->snscb_nname[i]);
117953af7d22SMatt Jacob }
118053af7d22SMatt Jacob for (i = 0; i < 8; i++) {
1181a94fab67SAlexander Motin ISP_IOZGET_8(isp, &src->snscb_ipassoc[i], dst->snscb_ipassoc[i]);
118253af7d22SMatt Jacob }
118353af7d22SMatt Jacob for (i = 0; i < 16; i++) {
1184a94fab67SAlexander Motin ISP_IOZGET_8(isp, &src->snscb_ipaddr[i], dst->snscb_ipaddr[i]);
118553af7d22SMatt Jacob }
118653af7d22SMatt Jacob for (i = 0; i < 4; i++) {
1187a94fab67SAlexander Motin ISP_IOZGET_8(isp, &src->snscb_svc_class[i], dst->snscb_svc_class[i]);
118853af7d22SMatt Jacob }
118953af7d22SMatt Jacob for (i = 0; i < 32; i++) {
1190a94fab67SAlexander Motin ISP_IOZGET_8(isp, &src->snscb_fc4_types[i], dst->snscb_fc4_types[i]);
119153af7d22SMatt Jacob }
119253af7d22SMatt Jacob for (i = 0; i < 8; i++) {
1193a94fab67SAlexander Motin ISP_IOZGET_8(isp, &src->snscb_fpname[i], dst->snscb_fpname[i]);
119453af7d22SMatt Jacob }
1195a94fab67SAlexander Motin ISP_IOZGET_8(isp, &src->snscb_reserved, dst->snscb_reserved);
119653af7d22SMatt Jacob for (i = 0; i < 3; i++) {
1197a94fab67SAlexander Motin ISP_IOZGET_8(isp, &src->snscb_hardaddr[i], dst->snscb_hardaddr[i]);
119853af7d22SMatt Jacob }
119953af7d22SMatt Jacob }
120053af7d22SMatt Jacob
120110365e5aSMatt Jacob /*
120210365e5aSMatt Jacob * FC Structure Canonicalization
120310365e5aSMatt Jacob */
120410365e5aSMatt Jacob
120510365e5aSMatt Jacob void
isp_get_fc_hdr(ispsoftc_t * isp,fc_hdr_t * src,fc_hdr_t * dst)120610365e5aSMatt Jacob isp_get_fc_hdr(ispsoftc_t *isp, fc_hdr_t *src, fc_hdr_t *dst)
120710365e5aSMatt Jacob {
120810365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->r_ctl, dst->r_ctl);
120910365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->d_id[0], dst->d_id[0]);
121010365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->d_id[1], dst->d_id[1]);
121110365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->d_id[2], dst->d_id[2]);
121210365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->cs_ctl, dst->cs_ctl);
121310365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->s_id[0], dst->s_id[0]);
121410365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->s_id[1], dst->s_id[1]);
121510365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->s_id[2], dst->s_id[2]);
121610365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->type, dst->type);
12172df76c16SMatt Jacob ISP_IOZGET_8(isp, &src->f_ctl[0], dst->f_ctl[0]);
12182df76c16SMatt Jacob ISP_IOZGET_8(isp, &src->f_ctl[1], dst->f_ctl[1]);
12192df76c16SMatt Jacob ISP_IOZGET_8(isp, &src->f_ctl[2], dst->f_ctl[2]);
122010365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->seq_id, dst->seq_id);
122110365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->df_ctl, dst->df_ctl);
122210365e5aSMatt Jacob ISP_IOZGET_16(isp, &src->seq_cnt, dst->seq_cnt);
122310365e5aSMatt Jacob ISP_IOZGET_16(isp, &src->ox_id, dst->ox_id);
122410365e5aSMatt Jacob ISP_IOZGET_16(isp, &src->rx_id, dst->rx_id);
122510365e5aSMatt Jacob ISP_IOZGET_32(isp, &src->parameter, dst->parameter);
122610365e5aSMatt Jacob }
122710365e5aSMatt Jacob
122810365e5aSMatt Jacob void
isp_put_fc_hdr(ispsoftc_t * isp,fc_hdr_t * src,fc_hdr_t * dst)1229387d8239SMatt Jacob isp_put_fc_hdr(ispsoftc_t *isp, fc_hdr_t *src, fc_hdr_t *dst)
1230387d8239SMatt Jacob {
1231387d8239SMatt Jacob ISP_IOZPUT_8(isp, src->r_ctl, &dst->r_ctl);
1232387d8239SMatt Jacob ISP_IOZPUT_8(isp, src->d_id[0], &dst->d_id[0]);
1233387d8239SMatt Jacob ISP_IOZPUT_8(isp, src->d_id[1], &dst->d_id[1]);
1234387d8239SMatt Jacob ISP_IOZPUT_8(isp, src->d_id[2], &dst->d_id[2]);
1235387d8239SMatt Jacob ISP_IOZPUT_8(isp, src->cs_ctl, &dst->cs_ctl);
1236387d8239SMatt Jacob ISP_IOZPUT_8(isp, src->s_id[0], &dst->s_id[0]);
1237387d8239SMatt Jacob ISP_IOZPUT_8(isp, src->s_id[1], &dst->s_id[1]);
1238387d8239SMatt Jacob ISP_IOZPUT_8(isp, src->s_id[2], &dst->s_id[2]);
1239387d8239SMatt Jacob ISP_IOZPUT_8(isp, src->type, &dst->type);
1240387d8239SMatt Jacob ISP_IOZPUT_8(isp, src->f_ctl[0], &dst->f_ctl[0]);
1241387d8239SMatt Jacob ISP_IOZPUT_8(isp, src->f_ctl[1], &dst->f_ctl[1]);
1242387d8239SMatt Jacob ISP_IOZPUT_8(isp, src->f_ctl[2], &dst->f_ctl[2]);
1243387d8239SMatt Jacob ISP_IOZPUT_8(isp, src->seq_id, &dst->seq_id);
1244387d8239SMatt Jacob ISP_IOZPUT_8(isp, src->df_ctl, &dst->df_ctl);
1245387d8239SMatt Jacob ISP_IOZPUT_16(isp, src->seq_cnt, &dst->seq_cnt);
1246387d8239SMatt Jacob ISP_IOZPUT_16(isp, src->ox_id, &dst->ox_id);
1247387d8239SMatt Jacob ISP_IOZPUT_16(isp, src->rx_id, &dst->rx_id);
1248387d8239SMatt Jacob ISP_IOZPUT_32(isp, src->parameter, &dst->parameter);
1249387d8239SMatt Jacob }
1250387d8239SMatt Jacob
1251387d8239SMatt Jacob void
isp_get_fcp_cmnd_iu(ispsoftc_t * isp,fcp_cmnd_iu_t * src,fcp_cmnd_iu_t * dst)125210365e5aSMatt Jacob isp_get_fcp_cmnd_iu(ispsoftc_t *isp, fcp_cmnd_iu_t *src, fcp_cmnd_iu_t *dst)
125310365e5aSMatt Jacob {
125410365e5aSMatt Jacob int i;
125510365e5aSMatt Jacob
125610365e5aSMatt Jacob for (i = 0; i < 8; i++) {
125710365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->fcp_cmnd_lun[i], dst->fcp_cmnd_lun[i]);
125810365e5aSMatt Jacob }
125910365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->fcp_cmnd_crn, dst->fcp_cmnd_crn);
12602df76c16SMatt Jacob ISP_IOZGET_8(isp, &src->fcp_cmnd_task_attribute, dst->fcp_cmnd_task_attribute);
12612df76c16SMatt Jacob ISP_IOZGET_8(isp, &src->fcp_cmnd_task_management, dst->fcp_cmnd_task_management);
12622df76c16SMatt Jacob ISP_IOZGET_8(isp, &src->fcp_cmnd_alen_datadir, dst->fcp_cmnd_alen_datadir);
126310365e5aSMatt Jacob for (i = 0; i < 16; i++) {
12642df76c16SMatt Jacob ISP_IOZGET_8(isp, &src->cdb_dl.sf.fcp_cmnd_cdb[i], dst->cdb_dl.sf.fcp_cmnd_cdb[i]);
126510365e5aSMatt Jacob }
12662df76c16SMatt Jacob ISP_IOZGET_32(isp, &src->cdb_dl.sf.fcp_cmnd_dl, dst->cdb_dl.sf.fcp_cmnd_dl);
126710365e5aSMatt Jacob }
126810365e5aSMatt Jacob
126910365e5aSMatt Jacob void
isp_put_rft_id(ispsoftc_t * isp,rft_id_t * src,rft_id_t * dst)127010365e5aSMatt Jacob isp_put_rft_id(ispsoftc_t *isp, rft_id_t *src, rft_id_t *dst)
127110365e5aSMatt Jacob {
127210365e5aSMatt Jacob int i;
127310365e5aSMatt Jacob isp_put_ct_hdr(isp, &src->rftid_hdr, &dst->rftid_hdr);
127410365e5aSMatt Jacob ISP_IOZPUT_8(isp, src->rftid_reserved, &dst->rftid_reserved);
127510365e5aSMatt Jacob for (i = 0; i < 3; i++) {
127610365e5aSMatt Jacob ISP_IOZPUT_8(isp, src->rftid_portid[i], &dst->rftid_portid[i]);
127710365e5aSMatt Jacob }
127810365e5aSMatt Jacob for (i = 0; i < 8; i++) {
12792df76c16SMatt Jacob ISP_IOZPUT_32(isp, src->rftid_fc4types[i], &dst->rftid_fc4types[i]);
128010365e5aSMatt Jacob }
128110365e5aSMatt Jacob }
128210365e5aSMatt Jacob
128310365e5aSMatt Jacob void
isp_put_rspn_id(ispsoftc_t * isp,rspn_id_t * src,rspn_id_t * dst)12847e53e7acSAlexander Motin isp_put_rspn_id(ispsoftc_t *isp, rspn_id_t *src, rspn_id_t *dst)
12857e53e7acSAlexander Motin {
12867e53e7acSAlexander Motin /* int i;*/
12877e53e7acSAlexander Motin isp_put_ct_hdr(isp, &src->rspnid_hdr, &dst->rspnid_hdr);
12887e53e7acSAlexander Motin ISP_IOZPUT_8(isp, src->rspnid_reserved, &dst->rspnid_reserved);
12897e53e7acSAlexander Motin ISP_IOZPUT_8(isp, src->rspnid_length, &dst->rspnid_length);
12907e53e7acSAlexander Motin /* for (i = 0; i < src->rspnid_length; i++)
12917e53e7acSAlexander Motin ISP_IOZPUT_8(isp, src->rspnid_name[i], &dst->rspnid_name[i]);*/
12927e53e7acSAlexander Motin }
12937e53e7acSAlexander Motin
12947e53e7acSAlexander Motin void
isp_put_rff_id(ispsoftc_t * isp,rff_id_t * src,rff_id_t * dst)129592056a05SAlexander Motin isp_put_rff_id(ispsoftc_t *isp, rff_id_t *src, rff_id_t *dst)
129692056a05SAlexander Motin {
129792056a05SAlexander Motin int i;
129892056a05SAlexander Motin
129992056a05SAlexander Motin isp_put_ct_hdr(isp, &src->rffid_hdr, &dst->rffid_hdr);
130092056a05SAlexander Motin ISP_IOZPUT_8(isp, src->rffid_reserved, &dst->rffid_reserved);
130192056a05SAlexander Motin for (i = 0; i < 3; i++)
130292056a05SAlexander Motin ISP_IOZPUT_8(isp, src->rffid_portid[i], &dst->rffid_portid[i]);
130392056a05SAlexander Motin ISP_IOZPUT_16(isp, src->rffid_reserved2, &dst->rffid_reserved2);
130492056a05SAlexander Motin ISP_IOZPUT_8(isp, src->rffid_fc4features, &dst->rffid_fc4features);
130592056a05SAlexander Motin ISP_IOZPUT_8(isp, src->rffid_fc4type, &dst->rffid_fc4type);
130692056a05SAlexander Motin }
130792056a05SAlexander Motin
130892056a05SAlexander Motin void
isp_put_rsnn_nn(ispsoftc_t * isp,rsnn_nn_t * src,rsnn_nn_t * dst)13097e53e7acSAlexander Motin isp_put_rsnn_nn(ispsoftc_t *isp, rsnn_nn_t *src, rsnn_nn_t *dst)
13107e53e7acSAlexander Motin {
13117e53e7acSAlexander Motin int i;
13127e53e7acSAlexander Motin isp_put_ct_hdr(isp, &src->rsnnnn_hdr, &dst->rsnnnn_hdr);
13137e53e7acSAlexander Motin for (i = 0; i < 8; i++)
13147e53e7acSAlexander Motin ISP_IOZPUT_8(isp, src->rsnnnn_nodename[i], &dst->rsnnnn_nodename[i]);
13157e53e7acSAlexander Motin ISP_IOZPUT_8(isp, src->rsnnnn_length, &dst->rsnnnn_length);
13167e53e7acSAlexander Motin /* for (i = 0; i < src->rsnnnn_length; i++)
13177e53e7acSAlexander Motin ISP_IOZPUT_8(isp, src->rsnnnn_name[i], &dst->rsnnnn_name[i]);*/
13187e53e7acSAlexander Motin }
13197e53e7acSAlexander Motin
13207e53e7acSAlexander Motin void
isp_get_ct_hdr(ispsoftc_t * isp,ct_hdr_t * src,ct_hdr_t * dst)132110365e5aSMatt Jacob isp_get_ct_hdr(ispsoftc_t *isp, ct_hdr_t *src, ct_hdr_t *dst)
132210365e5aSMatt Jacob {
132310365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->ct_revision, dst->ct_revision);
132410365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->ct_in_id[0], dst->ct_in_id[0]);
132510365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->ct_in_id[1], dst->ct_in_id[1]);
132610365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->ct_in_id[2], dst->ct_in_id[2]);
132710365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->ct_fcs_type, dst->ct_fcs_type);
132810365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->ct_fcs_subtype, dst->ct_fcs_subtype);
132910365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->ct_options, dst->ct_options);
133010365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->ct_reserved0, dst->ct_reserved0);
133110365e5aSMatt Jacob ISP_IOZGET_16(isp, &src->ct_cmd_resp, dst->ct_cmd_resp);
133210365e5aSMatt Jacob ISP_IOZGET_16(isp, &src->ct_bcnt_resid, dst->ct_bcnt_resid);
133310365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->ct_reserved1, dst->ct_reserved1);
133410365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->ct_reason, dst->ct_reason);
133510365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->ct_explanation, dst->ct_explanation);
133610365e5aSMatt Jacob ISP_IOZGET_8(isp, &src->ct_vunique, dst->ct_vunique);
133710365e5aSMatt Jacob }
133810365e5aSMatt Jacob
133910365e5aSMatt Jacob void
isp_put_ct_hdr(ispsoftc_t * isp,ct_hdr_t * src,ct_hdr_t * dst)134010365e5aSMatt Jacob isp_put_ct_hdr(ispsoftc_t *isp, ct_hdr_t *src, ct_hdr_t *dst)
134110365e5aSMatt Jacob {
134210365e5aSMatt Jacob ISP_IOZPUT_8(isp, src->ct_revision, &dst->ct_revision);
134310365e5aSMatt Jacob ISP_IOZPUT_8(isp, src->ct_in_id[0], &dst->ct_in_id[0]);
134410365e5aSMatt Jacob ISP_IOZPUT_8(isp, src->ct_in_id[1], &dst->ct_in_id[1]);
134510365e5aSMatt Jacob ISP_IOZPUT_8(isp, src->ct_in_id[2], &dst->ct_in_id[2]);
134610365e5aSMatt Jacob ISP_IOZPUT_8(isp, src->ct_fcs_type, &dst->ct_fcs_type);
134710365e5aSMatt Jacob ISP_IOZPUT_8(isp, src->ct_fcs_subtype, &dst->ct_fcs_subtype);
134810365e5aSMatt Jacob ISP_IOZPUT_8(isp, src->ct_options, &dst->ct_options);
134910365e5aSMatt Jacob ISP_IOZPUT_8(isp, src->ct_reserved0, &dst->ct_reserved0);
135010365e5aSMatt Jacob ISP_IOZPUT_16(isp, src->ct_cmd_resp, &dst->ct_cmd_resp);
135110365e5aSMatt Jacob ISP_IOZPUT_16(isp, src->ct_bcnt_resid, &dst->ct_bcnt_resid);
135210365e5aSMatt Jacob ISP_IOZPUT_8(isp, src->ct_reserved1, &dst->ct_reserved1);
135310365e5aSMatt Jacob ISP_IOZPUT_8(isp, src->ct_reason, &dst->ct_reason);
135410365e5aSMatt Jacob ISP_IOZPUT_8(isp, src->ct_explanation, &dst->ct_explanation);
135510365e5aSMatt Jacob ISP_IOZPUT_8(isp, src->ct_vunique, &dst->ct_vunique);
135610365e5aSMatt Jacob }
135710365e5aSMatt Jacob
1358387d8239SMatt Jacob void
isp_put_fcp_rsp_iu(ispsoftc_t * isp,fcp_rsp_iu_t * src,fcp_rsp_iu_t * dst)1359387d8239SMatt Jacob isp_put_fcp_rsp_iu(ispsoftc_t *isp, fcp_rsp_iu_t *src, fcp_rsp_iu_t *dst)
1360387d8239SMatt Jacob {
1361387d8239SMatt Jacob int i;
1362387d8239SMatt Jacob for (i = 0; i < ((sizeof (src->fcp_rsp_reserved))/(sizeof (src->fcp_rsp_reserved[0]))); i++) {
1363387d8239SMatt Jacob ISP_IOZPUT_8(isp, src->fcp_rsp_reserved[i], &dst->fcp_rsp_reserved[i]);
1364387d8239SMatt Jacob }
1365387d8239SMatt Jacob ISP_IOZPUT_16(isp, src->fcp_rsp_status_qualifier, &dst->fcp_rsp_status_qualifier);
1366387d8239SMatt Jacob ISP_IOZPUT_8(isp, src->fcp_rsp_bits, &dst->fcp_rsp_bits);
1367387d8239SMatt Jacob ISP_IOZPUT_8(isp, src->fcp_rsp_scsi_status, &dst->fcp_rsp_scsi_status);
1368387d8239SMatt Jacob ISP_IOZPUT_32(isp, src->fcp_rsp_resid, &dst->fcp_rsp_resid);
1369387d8239SMatt Jacob ISP_IOZPUT_32(isp, src->fcp_rsp_snslen, &dst->fcp_rsp_snslen);
1370387d8239SMatt Jacob ISP_IOZPUT_32(isp, src->fcp_rsp_rsplen, &dst->fcp_rsp_rsplen);
1371387d8239SMatt Jacob }
1372387d8239SMatt Jacob
13732df76c16SMatt Jacob /*
1374e68eef14SAlexander Motin * Find port database entries
13752df76c16SMatt Jacob */
13762df76c16SMatt Jacob int
isp_find_pdb_empty(ispsoftc_t * isp,int chan,fcportdb_t ** lptr)1377eea52482SAlexander Motin isp_find_pdb_empty(ispsoftc_t *isp, int chan, fcportdb_t **lptr)
13782df76c16SMatt Jacob {
1379eea52482SAlexander Motin fcparam *fcp = FCPARAM(isp, chan);
13802df76c16SMatt Jacob int i;
13812df76c16SMatt Jacob
1382e68eef14SAlexander Motin for (i = 0; i < MAX_FC_TARG; i++) {
13832df76c16SMatt Jacob fcportdb_t *lp = &fcp->portdb[i];
13842df76c16SMatt Jacob
1385eea52482SAlexander Motin if (lp->state == FC_PORTDB_STATE_NIL) {
13862df76c16SMatt Jacob *lptr = lp;
13872df76c16SMatt Jacob return (1);
13882df76c16SMatt Jacob }
13892df76c16SMatt Jacob }
13902df76c16SMatt Jacob return (0);
13912df76c16SMatt Jacob }
13922df76c16SMatt Jacob
13932df76c16SMatt Jacob int
isp_find_pdb_by_wwpn(ispsoftc_t * isp,int chan,uint64_t wwpn,fcportdb_t ** lptr)1394eea52482SAlexander Motin isp_find_pdb_by_wwpn(ispsoftc_t *isp, int chan, uint64_t wwpn, fcportdb_t **lptr)
13952df76c16SMatt Jacob {
1396eea52482SAlexander Motin fcparam *fcp = FCPARAM(isp, chan);
13972df76c16SMatt Jacob int i;
13982df76c16SMatt Jacob
1399eea52482SAlexander Motin for (i = 0; i < MAX_FC_TARG; i++) {
1400eea52482SAlexander Motin fcportdb_t *lp = &fcp->portdb[i];
1401eea52482SAlexander Motin
1402eea52482SAlexander Motin if (lp->state == FC_PORTDB_STATE_NIL)
1403eea52482SAlexander Motin continue;
1404eea52482SAlexander Motin if (lp->port_wwn == wwpn) {
1405eea52482SAlexander Motin *lptr = lp;
1406eea52482SAlexander Motin return (1);
1407eea52482SAlexander Motin }
1408eea52482SAlexander Motin }
140930363120SAlexander Motin return (0);
1410eea52482SAlexander Motin }
1411eea52482SAlexander Motin
1412eea52482SAlexander Motin int
isp_find_pdb_by_handle(ispsoftc_t * isp,int chan,uint16_t handle,fcportdb_t ** lptr)1413eea52482SAlexander Motin isp_find_pdb_by_handle(ispsoftc_t *isp, int chan, uint16_t handle,
1414eea52482SAlexander Motin fcportdb_t **lptr)
1415eea52482SAlexander Motin {
1416eea52482SAlexander Motin fcparam *fcp = FCPARAM(isp, chan);
1417eea52482SAlexander Motin int i;
1418eea52482SAlexander Motin
1419e68eef14SAlexander Motin for (i = 0; i < MAX_FC_TARG; i++) {
1420e68eef14SAlexander Motin fcportdb_t *lp = &fcp->portdb[i];
1421e68eef14SAlexander Motin
1422e68eef14SAlexander Motin if (lp->state == FC_PORTDB_STATE_NIL)
1423e68eef14SAlexander Motin continue;
1424e68eef14SAlexander Motin if (lp->handle == handle) {
1425e68eef14SAlexander Motin *lptr = lp;
14262df76c16SMatt Jacob return (1);
14272df76c16SMatt Jacob }
1428e68eef14SAlexander Motin }
14292df76c16SMatt Jacob return (0);
14302df76c16SMatt Jacob }
14312df76c16SMatt Jacob
14322df76c16SMatt Jacob int
isp_find_pdb_by_portid(ispsoftc_t * isp,int chan,uint32_t portid,fcportdb_t ** lptr)1433eea52482SAlexander Motin isp_find_pdb_by_portid(ispsoftc_t *isp, int chan, uint32_t portid,
1434eea52482SAlexander Motin fcportdb_t **lptr)
14352df76c16SMatt Jacob {
1436eea52482SAlexander Motin fcparam *fcp = FCPARAM(isp, chan);
14372df76c16SMatt Jacob int i;
14382df76c16SMatt Jacob
1439e68eef14SAlexander Motin for (i = 0; i < MAX_FC_TARG; i++) {
14402df76c16SMatt Jacob fcportdb_t *lp = &fcp->portdb[i];
14412df76c16SMatt Jacob
1442e68eef14SAlexander Motin if (lp->state == FC_PORTDB_STATE_NIL)
14432df76c16SMatt Jacob continue;
1444eea52482SAlexander Motin if (lp->portid == portid) {
14452df76c16SMatt Jacob *lptr = lp;
14462df76c16SMatt Jacob return (1);
14472df76c16SMatt Jacob }
14482df76c16SMatt Jacob }
14492df76c16SMatt Jacob return (0);
14502df76c16SMatt Jacob }
14512df76c16SMatt Jacob
1452eea52482SAlexander Motin #ifdef ISP_TARGET_MODE
14532df76c16SMatt Jacob void
isp_find_chan_by_did(ispsoftc_t * isp,uint32_t did,uint16_t * cp)14542df76c16SMatt Jacob isp_find_chan_by_did(ispsoftc_t *isp, uint32_t did, uint16_t *cp)
14552df76c16SMatt Jacob {
14562df76c16SMatt Jacob uint16_t chan;
14572df76c16SMatt Jacob
14582df76c16SMatt Jacob *cp = ISP_NOCHAN;
14592df76c16SMatt Jacob for (chan = 0; chan < isp->isp_nchan; chan++) {
14602df76c16SMatt Jacob fcparam *fcp = FCPARAM(isp, chan);
1461b6bd5f7fSAlexander Motin if ((fcp->role & ISP_ROLE_TARGET) == 0 ||
1462212fad74SAlexander Motin fcp->isp_loopstate < LOOP_HAVE_ADDR) {
14632df76c16SMatt Jacob continue;
14642df76c16SMatt Jacob }
14652df76c16SMatt Jacob if (fcp->isp_portid == did) {
14662df76c16SMatt Jacob *cp = chan;
14672df76c16SMatt Jacob break;
14682df76c16SMatt Jacob }
14692df76c16SMatt Jacob }
14702df76c16SMatt Jacob }
14712df76c16SMatt Jacob
14722df76c16SMatt Jacob /*
14732df76c16SMatt Jacob * Add an initiator device to the port database
14742df76c16SMatt Jacob */
14752df76c16SMatt Jacob void
isp_add_wwn_entry(ispsoftc_t * isp,int chan,uint64_t wwpn,uint64_t wwnn,uint16_t nphdl,uint32_t s_id,uint16_t prli_params)147637a7daacSAlexander Motin isp_add_wwn_entry(ispsoftc_t *isp, int chan, uint64_t wwpn, uint64_t wwnn,
147737a7daacSAlexander Motin uint16_t nphdl, uint32_t s_id, uint16_t prli_params)
14782df76c16SMatt Jacob {
1479387d8239SMatt Jacob char buf[64];
14802df76c16SMatt Jacob fcparam *fcp;
14812df76c16SMatt Jacob fcportdb_t *lp;
1482e68eef14SAlexander Motin int i, change;
14832df76c16SMatt Jacob
14842df76c16SMatt Jacob fcp = FCPARAM(isp, chan);
14852df76c16SMatt Jacob if (nphdl >= MAX_NPORT_HANDLE) {
1486e68eef14SAlexander Motin isp_prt(isp, ISP_LOGTINFO|ISP_LOGWARN, "Chan %d WWPN 0x%016llx "
1487e68eef14SAlexander Motin "PortID 0x%06x handle 0x%x -- bad handle",
148837a7daacSAlexander Motin chan, (unsigned long long) wwpn, s_id, nphdl);
14892df76c16SMatt Jacob return;
14902df76c16SMatt Jacob }
14912df76c16SMatt Jacob
14922df76c16SMatt Jacob /*
149330363120SAlexander Motin * If valid record for requested handle already exists, update it
149430363120SAlexander Motin * with new parameters. Some cases of update can be suspicious,
149530363120SAlexander Motin * so log them verbosely and dump the whole port database.
14962df76c16SMatt Jacob */
1497eea52482SAlexander Motin if ((VALID_INI(wwpn) && isp_find_pdb_by_wwpn(isp, chan, wwpn, &lp)) ||
14984187a965SAlexander Motin (VALID_PORT(s_id) && isp_find_pdb_by_portid(isp, chan, s_id, &lp))) {
1499e68eef14SAlexander Motin change = 0;
1500e68eef14SAlexander Motin lp->new_portid = lp->portid;
1501e68eef14SAlexander Motin lp->new_prli_word3 = lp->prli_word3;
15024187a965SAlexander Motin if (VALID_PORT(s_id) && lp->portid != s_id) {
15034187a965SAlexander Motin if (!VALID_PORT(lp->portid)) {
150430363120SAlexander Motin isp_prt(isp, ISP_LOGTINFO,
1505e68eef14SAlexander Motin "Chan %d WWPN 0x%016llx handle 0x%x "
150630363120SAlexander Motin "gets PortID 0x%06x",
150730363120SAlexander Motin chan, (unsigned long long) lp->port_wwn,
150830363120SAlexander Motin nphdl, s_id);
150930363120SAlexander Motin } else {
151030363120SAlexander Motin isp_prt(isp, ISP_LOGTINFO|ISP_LOGWARN,
1511e68eef14SAlexander Motin "Chan %d WWPN 0x%016llx handle 0x%x "
151230363120SAlexander Motin "changes PortID 0x%06x to 0x%06x",
151330363120SAlexander Motin chan, (unsigned long long) lp->port_wwn,
151430363120SAlexander Motin nphdl, lp->portid, s_id);
151530363120SAlexander Motin if (isp->isp_dblev & (ISP_LOGTINFO|ISP_LOGWARN))
151630363120SAlexander Motin isp_dump_portdb(isp, chan);
151730363120SAlexander Motin }
1518e68eef14SAlexander Motin lp->new_portid = s_id;
1519e68eef14SAlexander Motin change++;
15202df76c16SMatt Jacob }
152137a7daacSAlexander Motin if (VALID_INI(wwpn) && lp->port_wwn != wwpn) {
15222df76c16SMatt Jacob if (!VALID_INI(lp->port_wwn)) {
152330363120SAlexander Motin isp_prt(isp, ISP_LOGTINFO,
1524e68eef14SAlexander Motin "Chan %d PortID 0x%06x handle 0x%x "
152537a7daacSAlexander Motin "gets WWPN 0x%016llxx",
1526e68eef14SAlexander Motin chan, lp->portid, nphdl,
152737a7daacSAlexander Motin (unsigned long long) wwpn);
152837a7daacSAlexander Motin } else if (lp->port_wwn != wwpn) {
152930363120SAlexander Motin isp_prt(isp, ISP_LOGTINFO|ISP_LOGWARN,
1530e68eef14SAlexander Motin "Chan %d PortID 0x%06x handle 0x%x "
153137a7daacSAlexander Motin "changes WWPN 0x%016llx to 0x%016llx",
1532e68eef14SAlexander Motin chan, lp->portid, nphdl,
153330363120SAlexander Motin (unsigned long long) lp->port_wwn,
153437a7daacSAlexander Motin (unsigned long long) wwpn);
153530363120SAlexander Motin if (isp->isp_dblev & (ISP_LOGTINFO|ISP_LOGWARN))
15362df76c16SMatt Jacob isp_dump_portdb(isp, chan);
15372df76c16SMatt Jacob }
153837a7daacSAlexander Motin lp->port_wwn = wwpn;
153937a7daacSAlexander Motin change++;
154037a7daacSAlexander Motin }
154137a7daacSAlexander Motin if (VALID_INI(wwnn) && lp->node_wwn != wwnn) {
154237a7daacSAlexander Motin if (!VALID_INI(lp->node_wwn)) {
154337a7daacSAlexander Motin isp_prt(isp, ISP_LOGTINFO,
154437a7daacSAlexander Motin "Chan %d PortID 0x%06x handle 0x%x "
154537a7daacSAlexander Motin "gets WWNN 0x%016llxx",
154637a7daacSAlexander Motin chan, lp->portid, nphdl,
154737a7daacSAlexander Motin (unsigned long long) wwnn);
154837a7daacSAlexander Motin } else if (lp->port_wwn != wwnn) {
154937a7daacSAlexander Motin isp_prt(isp, ISP_LOGTINFO,
155037a7daacSAlexander Motin "Chan %d PortID 0x%06x handle 0x%x "
155137a7daacSAlexander Motin "changes WWNN 0x%016llx to 0x%016llx",
155237a7daacSAlexander Motin chan, lp->portid, nphdl,
155337a7daacSAlexander Motin (unsigned long long) lp->node_wwn,
155437a7daacSAlexander Motin (unsigned long long) wwnn);
155537a7daacSAlexander Motin }
155637a7daacSAlexander Motin lp->node_wwn = wwnn;
1557e68eef14SAlexander Motin change++;
15582df76c16SMatt Jacob }
1559e68eef14SAlexander Motin if (prli_params != 0 && lp->prli_word3 != prli_params) {
1560e68eef14SAlexander Motin isp_gen_role_str(buf, sizeof (buf), prli_params);
156130363120SAlexander Motin isp_prt(isp, ISP_LOGTINFO|ISP_LOGCONFIG,
1562e68eef14SAlexander Motin "Chan %d WWPN 0x%016llx PortID 0x%06x "
1563e68eef14SAlexander Motin "handle 0x%x changes PRLI Word 3 %s",
156430363120SAlexander Motin chan, (unsigned long long) lp->port_wwn,
1565e68eef14SAlexander Motin lp->portid, lp->handle, buf);
1566e68eef14SAlexander Motin lp->new_prli_word3 = prli_params;
1567e68eef14SAlexander Motin change++;
1568387d8239SMatt Jacob }
1569e68eef14SAlexander Motin if (lp->handle != nphdl) {
1570e68eef14SAlexander Motin isp_prt(isp, ISP_LOGTINFO|ISP_LOGCONFIG,
1571e68eef14SAlexander Motin "Chan %d WWPN 0x%016llx PortID 0x%06x "
1572e68eef14SAlexander Motin "changes handle 0x%x to 0x%x",
1573e68eef14SAlexander Motin chan, (unsigned long long) lp->port_wwn,
1574e68eef14SAlexander Motin lp->portid, lp->handle, nphdl);
1575e68eef14SAlexander Motin lp->handle = nphdl;
1576e68eef14SAlexander Motin change++;
1577e68eef14SAlexander Motin }
1578e68eef14SAlexander Motin lp->state = FC_PORTDB_STATE_VALID;
1579e68eef14SAlexander Motin if (change) {
1580e68eef14SAlexander Motin isp_async(isp, ISPASYNC_DEV_CHANGED, chan, lp);
1581e68eef14SAlexander Motin lp->portid = lp->new_portid;
1582e68eef14SAlexander Motin lp->prli_word3 = lp->new_prli_word3;
1583e68eef14SAlexander Motin } else {
158430363120SAlexander Motin isp_prt(isp, ISP_LOGTINFO,
1585e68eef14SAlexander Motin "Chan %d WWPN 0x%016llx PortID 0x%06x "
1586e68eef14SAlexander Motin "handle 0x%x reentered",
158730363120SAlexander Motin chan, (unsigned long long) lp->port_wwn,
1588e68eef14SAlexander Motin lp->portid, lp->handle);
1589e68eef14SAlexander Motin isp_async(isp, ISPASYNC_DEV_STAYED, chan, lp);
15902df76c16SMatt Jacob }
159130363120SAlexander Motin return;
1592e68eef14SAlexander Motin }
159330363120SAlexander Motin
159430363120SAlexander Motin /* Search for room to insert new record. */
1595e68eef14SAlexander Motin for (i = 0; i < MAX_FC_TARG; i++) {
1596e68eef14SAlexander Motin if (fcp->portdb[i].state == FC_PORTDB_STATE_NIL)
15972df76c16SMatt Jacob break;
15982df76c16SMatt Jacob }
1599e68eef14SAlexander Motin if (i >= MAX_FC_TARG) {
160030363120SAlexander Motin isp_prt(isp, ISP_LOGTINFO|ISP_LOGWARN,
1601e68eef14SAlexander Motin "Chan %d WWPN 0x%016llx PortID 0x%06x handle 0x%x "
160230363120SAlexander Motin "-- no room in port database",
160337a7daacSAlexander Motin chan, (unsigned long long) wwpn, s_id, nphdl);
160430363120SAlexander Motin if (isp->isp_dblev & (ISP_LOGTINFO|ISP_LOGWARN))
160530363120SAlexander Motin isp_dump_portdb(isp, chan);
16062df76c16SMatt Jacob return;
16072df76c16SMatt Jacob }
16082df76c16SMatt Jacob
160930363120SAlexander Motin /* Insert new record and mark it valid. */
1610e68eef14SAlexander Motin lp = &fcp->portdb[i];
16112df76c16SMatt Jacob ISP_MEMZERO(lp, sizeof (fcportdb_t));
16122df76c16SMatt Jacob lp->handle = nphdl;
16132df76c16SMatt Jacob lp->portid = s_id;
161437a7daacSAlexander Motin lp->port_wwn = wwpn;
161537a7daacSAlexander Motin lp->node_wwn = wwnn;
1616e68eef14SAlexander Motin lp->prli_word3 = (prli_params != 0) ? prli_params : PRLI_WD3_INITIATOR_FUNCTION;
161730363120SAlexander Motin lp->state = FC_PORTDB_STATE_VALID;
161830363120SAlexander Motin
1619387d8239SMatt Jacob isp_gen_role_str(buf, sizeof (buf), lp->prli_word3);
1620e68eef14SAlexander Motin isp_prt(isp, ISP_LOGTINFO, "Chan %d WWPN 0x%016llx "
1621e68eef14SAlexander Motin "PortID 0x%06x handle 0x%x vtgt %d %s added", chan,
162237a7daacSAlexander Motin (unsigned long long) wwpn, s_id, nphdl, i, buf);
16232df76c16SMatt Jacob
1624e68eef14SAlexander Motin /* Notify above levels about new port arrival. */
1625e68eef14SAlexander Motin isp_async(isp, ISPASYNC_DEV_ARRIVED, chan, lp);
16262df76c16SMatt Jacob }
16272df76c16SMatt Jacob
16282df76c16SMatt Jacob /*
16292df76c16SMatt Jacob * Remove a target device to the port database
16302df76c16SMatt Jacob */
16312df76c16SMatt Jacob void
isp_del_wwn_entry(ispsoftc_t * isp,int chan,uint64_t wwpn,uint16_t nphdl,uint32_t s_id)163237a7daacSAlexander Motin isp_del_wwn_entry(ispsoftc_t *isp, int chan, uint64_t wwpn, uint16_t nphdl, uint32_t s_id)
16332df76c16SMatt Jacob {
16342df76c16SMatt Jacob fcportdb_t *lp;
16352df76c16SMatt Jacob
16362df76c16SMatt Jacob if (nphdl >= MAX_NPORT_HANDLE) {
1637e68eef14SAlexander Motin isp_prt(isp, ISP_LOGWARN, "Chan %d WWPN 0x%016llx PortID 0x%06x bad handle 0x%x",
163837a7daacSAlexander Motin chan, (unsigned long long) wwpn, s_id, nphdl);
16392df76c16SMatt Jacob return;
16402df76c16SMatt Jacob }
16412df76c16SMatt Jacob
1642e68eef14SAlexander Motin if (isp_find_pdb_by_handle(isp, chan, nphdl, &lp) == 0) {
1643e68eef14SAlexander Motin isp_prt(isp, ISP_LOGWARN, "Chan %d WWPN 0x%016llx PortID 0x%06x handle 0x%x cannot be found to be deleted",
164437a7daacSAlexander Motin chan, (unsigned long long) wwpn, s_id, nphdl);
16452df76c16SMatt Jacob isp_dump_portdb(isp, chan);
16462df76c16SMatt Jacob return;
16472df76c16SMatt Jacob }
1648e68eef14SAlexander Motin isp_prt(isp, ISP_LOGTINFO, "Chan %d WWPN 0x%016llx PortID 0x%06x handle 0x%x vtgt %d deleted",
1649e68eef14SAlexander Motin chan, (unsigned long long) lp->port_wwn, lp->portid, nphdl, FC_PORTDB_TGT(isp, chan, lp));
1650e68eef14SAlexander Motin lp->state = FC_PORTDB_STATE_NIL;
16512df76c16SMatt Jacob
1652e68eef14SAlexander Motin /* Notify above levels about gone port. */
1653e68eef14SAlexander Motin isp_async(isp, ISPASYNC_DEV_GONE, chan, lp);
16542df76c16SMatt Jacob }
1655156c1ebeSAlexander Motin #endif /* ISP_TARGET_MODE */
16562df76c16SMatt Jacob
16572df76c16SMatt Jacob void
isp_get_atio7(ispsoftc_t * isp,at7_entry_t * src,at7_entry_t * dst)165810365e5aSMatt Jacob isp_get_atio7(ispsoftc_t *isp, at7_entry_t *src, at7_entry_t *dst)
165910365e5aSMatt Jacob {
166010365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->at_type, dst->at_type);
166110365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->at_count, dst->at_count);
166210365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->at_ta_len, dst->at_ta_len);
166310365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->at_rxid, dst->at_rxid);
166410365e5aSMatt Jacob isp_get_fc_hdr(isp, &src->at_hdr, &dst->at_hdr);
166510365e5aSMatt Jacob isp_get_fcp_cmnd_iu(isp, &src->at_cmnd, &dst->at_cmnd);
166610365e5aSMatt Jacob }
166710365e5aSMatt Jacob
166810365e5aSMatt Jacob void
isp_put_ctio7(ispsoftc_t * isp,ct7_entry_t * src,ct7_entry_t * dst)166910365e5aSMatt Jacob isp_put_ctio7(ispsoftc_t *isp, ct7_entry_t *src, ct7_entry_t *dst)
167053af7d22SMatt Jacob {
167110365e5aSMatt Jacob int i;
167210365e5aSMatt Jacob
167310365e5aSMatt Jacob isp_put_hdr(isp, &src->ct_header, &dst->ct_header);
167410365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->ct_syshandle, &dst->ct_syshandle);
167510365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->ct_nphdl, &dst->ct_nphdl);
167610365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->ct_timeout, &dst->ct_timeout);
167710365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->ct_seg_count, &dst->ct_seg_count);
16782df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->ct_vpidx, &dst->ct_vpidx);
167910365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->ct_xflags, &dst->ct_xflags);
168010365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->ct_iid_lo, &dst->ct_iid_lo);
168110365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->ct_iid_hi, &dst->ct_iid_hi);
168210365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->ct_reserved, &dst->ct_reserved);
168310365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->ct_rxid, &dst->ct_rxid);
168410365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->ct_senselen, &dst->ct_senselen);
168510365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->ct_flags, &dst->ct_flags);
168610365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->ct_resid, &dst->ct_resid);
168710365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->ct_oxid, &dst->ct_oxid);
168810365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->ct_scsi_status, &dst->ct_scsi_status);
168910365e5aSMatt Jacob if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE0) {
169010365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->rsp.m0.reloff, &dst->rsp.m0.reloff);
16912df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->rsp.m0.reserved0, &dst->rsp.m0.reserved0);
16922df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->rsp.m0.ct_xfrlen, &dst->rsp.m0.ct_xfrlen);
16932df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->rsp.m0.reserved1, &dst->rsp.m0.reserved1);
16942df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_base, &dst->rsp.m0.ds.ds_base);
16952df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_basehi, &dst->rsp.m0.ds.ds_basehi);
16962df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_count, &dst->rsp.m0.ds.ds_count);
169710365e5aSMatt Jacob } else if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE1) {
16982df76c16SMatt Jacob uint32_t *a, *b;
16992df76c16SMatt Jacob
17002df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->rsp.m1.ct_resplen, &dst->rsp.m1.ct_resplen);
170110365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->rsp.m1.reserved, &dst->rsp.m1.reserved);
17022df76c16SMatt Jacob a = (uint32_t *) src->rsp.m1.ct_resp;
17032df76c16SMatt Jacob b = (uint32_t *) dst->rsp.m1.ct_resp;
17041b760be4SAlexander Motin for (i = 0; i < (nitems(src->rsp.m1.ct_resp) >> 2); i++) {
17052df76c16SMatt Jacob *b++ = ISP_SWAP32(isp, *a++);
170610365e5aSMatt Jacob }
170710365e5aSMatt Jacob } else {
17082df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->rsp.m2.reserved0, &dst->rsp.m2.reserved0);
17092df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->rsp.m2.reserved1, &dst->rsp.m2.reserved1);
1710387d8239SMatt Jacob ISP_IOXPUT_32(isp, src->rsp.m2.ct_datalen, &dst->rsp.m2.ct_datalen);
1711387d8239SMatt Jacob ISP_IOXPUT_32(isp, src->rsp.m2.reserved2, &dst->rsp.m2.reserved2);
17122df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_base, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_base);
17132df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_basehi, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_basehi);
17142df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_count, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_count);
171510365e5aSMatt Jacob }
171610365e5aSMatt Jacob }
171710365e5aSMatt Jacob
171810365e5aSMatt Jacob void
isp_get_ctio7(ispsoftc_t * isp,ct7_entry_t * src,ct7_entry_t * dst)171910365e5aSMatt Jacob isp_get_ctio7(ispsoftc_t *isp, ct7_entry_t *src, ct7_entry_t *dst)
172010365e5aSMatt Jacob {
172110365e5aSMatt Jacob int i;
172210365e5aSMatt Jacob
172310365e5aSMatt Jacob isp_get_hdr(isp, &src->ct_header, &dst->ct_header);
172410365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->ct_syshandle, dst->ct_syshandle);
172510365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->ct_nphdl, dst->ct_nphdl);
172610365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->ct_timeout, dst->ct_timeout);
172710365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->ct_seg_count, dst->ct_seg_count);
17282df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->ct_vpidx, dst->ct_vpidx);
172910365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->ct_xflags, dst->ct_xflags);
173010365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->ct_iid_lo, dst->ct_iid_lo);
173110365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->ct_iid_hi, dst->ct_iid_hi);
173210365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->ct_reserved, dst->ct_reserved);
173310365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->ct_rxid, dst->ct_rxid);
173410365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->ct_senselen, dst->ct_senselen);
173510365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->ct_flags, dst->ct_flags);
173610365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->ct_resid, dst->ct_resid);
173710365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->ct_oxid, dst->ct_oxid);
173810365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->ct_scsi_status, dst->ct_scsi_status);
173910365e5aSMatt Jacob if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE0) {
174010365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->rsp.m0.reloff, dst->rsp.m0.reloff);
17412df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->rsp.m0.reserved0, dst->rsp.m0.reserved0);
17422df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->rsp.m0.ct_xfrlen, dst->rsp.m0.ct_xfrlen);
17432df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->rsp.m0.reserved1, dst->rsp.m0.reserved1);
17442df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_base, dst->rsp.m0.ds.ds_base);
17452df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_basehi, dst->rsp.m0.ds.ds_basehi);
17462df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_count, dst->rsp.m0.ds.ds_count);
174710365e5aSMatt Jacob } else if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE1) {
17482df76c16SMatt Jacob uint32_t *a, *b;
17492df76c16SMatt Jacob
17502df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->rsp.m1.ct_resplen, dst->rsp.m1.ct_resplen);
175110365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->rsp.m1.reserved, dst->rsp.m1.reserved);
17522df76c16SMatt Jacob a = (uint32_t *) src->rsp.m1.ct_resp;
17532df76c16SMatt Jacob b = (uint32_t *) dst->rsp.m1.ct_resp;
175410365e5aSMatt Jacob for (i = 0; i < MAXRESPLEN_24XX; i++) {
17552df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->rsp.m1.ct_resp[i], dst->rsp.m1.ct_resp[i]);
17562df76c16SMatt Jacob }
17571b760be4SAlexander Motin for (i = 0; i < (nitems(src->rsp.m1.ct_resp) >> 2); i++) {
17582df76c16SMatt Jacob *b++ = ISP_SWAP32(isp, *a++);
175910365e5aSMatt Jacob }
176010365e5aSMatt Jacob } else {
17612df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->rsp.m2.reserved0, dst->rsp.m2.reserved0);
17622df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->rsp.m2.ct_datalen, dst->rsp.m2.ct_datalen);
17632df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->rsp.m2.reserved1, dst->rsp.m2.reserved1);
17642df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_base, dst->rsp.m2.ct_fcp_rsp_iudata.ds_base);
17652df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_basehi, dst->rsp.m2.ct_fcp_rsp_iudata.ds_basehi);
17662df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_count, dst->rsp.m2.ct_fcp_rsp_iudata.ds_count);
176710365e5aSMatt Jacob }
176853af7d22SMatt Jacob }
176953af7d22SMatt Jacob
177053af7d22SMatt Jacob void
isp_put_notify_24xx(ispsoftc_t * isp,in_fcentry_24xx_t * src,in_fcentry_24xx_t * dst)17712df76c16SMatt Jacob isp_put_notify_24xx(ispsoftc_t *isp, in_fcentry_24xx_t *src, in_fcentry_24xx_t *dst)
177253af7d22SMatt Jacob {
177353af7d22SMatt Jacob int i;
177410365e5aSMatt Jacob
177510365e5aSMatt Jacob isp_put_hdr(isp, &src->in_header, &dst->in_header);
177610365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->in_reserved, &dst->in_reserved);
177710365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->in_nphdl, &dst->in_nphdl);
177810365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->in_reserved1, &dst->in_reserved1);
177910365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->in_flags, &dst->in_flags);
178010365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->in_srr_rxid, &dst->in_srr_rxid);
178110365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->in_status, &dst->in_status);
178210365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->in_status_subcode, &dst->in_status_subcode);
178337a7daacSAlexander Motin ISP_IOXPUT_8(isp, src->in_fwhandle, &dst->in_fwhandle);
178410365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->in_rxid, &dst->in_rxid);
178510365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->in_srr_reloff_hi, &dst->in_srr_reloff_hi);
178610365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->in_srr_reloff_lo, &dst->in_srr_reloff_lo);
178710365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->in_srr_iu, &dst->in_srr_iu);
178810365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->in_srr_oxid, &dst->in_srr_oxid);
17892df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->in_nport_id_hi, &dst->in_nport_id_hi);
17902df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->in_nport_id_lo, &dst->in_nport_id_lo);
17912df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->in_reserved3, &dst->in_reserved3);
17922df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->in_np_handle, &dst->in_np_handle);
17931b760be4SAlexander Motin for (i = 0; i < nitems(src->in_reserved4); i++) {
17942df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->in_reserved4[i], &dst->in_reserved4[i]);
179510365e5aSMatt Jacob }
17962df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->in_reserved5, &dst->in_reserved5);
17972df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->in_vpidx, &dst->in_vpidx);
17982df76c16SMatt Jacob ISP_IOXPUT_32(isp, src->in_reserved6, &dst->in_reserved6);
179910365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->in_portid_lo, &dst->in_portid_lo);
180010365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->in_portid_hi, &dst->in_portid_hi);
18012df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->in_reserved7, &dst->in_reserved7);
18022df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->in_reserved8, &dst->in_reserved8);
180310365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->in_oxid, &dst->in_oxid);
180410365e5aSMatt Jacob }
180510365e5aSMatt Jacob
180610365e5aSMatt Jacob void
isp_get_notify_24xx(ispsoftc_t * isp,in_fcentry_24xx_t * src,in_fcentry_24xx_t * dst)18072df76c16SMatt Jacob isp_get_notify_24xx(ispsoftc_t *isp, in_fcentry_24xx_t *src, in_fcentry_24xx_t *dst)
180810365e5aSMatt Jacob {
180910365e5aSMatt Jacob int i;
181010365e5aSMatt Jacob
181110365e5aSMatt Jacob isp_get_hdr(isp, &src->in_header, &dst->in_header);
181210365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->in_reserved, dst->in_reserved);
181310365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->in_nphdl, dst->in_nphdl);
181410365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->in_reserved1, dst->in_reserved1);
181510365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->in_flags, dst->in_flags);
181610365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->in_srr_rxid, dst->in_srr_rxid);
181710365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->in_status, dst->in_status);
181810365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->in_status_subcode, dst->in_status_subcode);
181937a7daacSAlexander Motin ISP_IOXGET_8(isp, &src->in_fwhandle, dst->in_fwhandle);
182010365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->in_rxid, dst->in_rxid);
182110365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->in_srr_reloff_hi, dst->in_srr_reloff_hi);
182210365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->in_srr_reloff_lo, dst->in_srr_reloff_lo);
182310365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->in_srr_iu, dst->in_srr_iu);
182410365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->in_srr_oxid, dst->in_srr_oxid);
18252df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->in_nport_id_hi, dst->in_nport_id_hi);
18262df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->in_nport_id_lo, dst->in_nport_id_lo);
18272df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->in_reserved3, dst->in_reserved3);
18282df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->in_np_handle, dst->in_np_handle);
18291b760be4SAlexander Motin for (i = 0; i < nitems(src->in_reserved4); i++) {
18302df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->in_reserved4[i], dst->in_reserved4[i]);
183110365e5aSMatt Jacob }
18322df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->in_reserved5, dst->in_reserved5);
18332df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->in_vpidx, dst->in_vpidx);
18342df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->in_reserved6, dst->in_reserved6);
183510365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->in_portid_lo, dst->in_portid_lo);
183610365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->in_portid_hi, dst->in_portid_hi);
18372df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->in_reserved7, dst->in_reserved7);
18382df76c16SMatt Jacob ISP_IOXGET_16(isp, &src->in_reserved8, dst->in_reserved8);
183910365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->in_oxid, dst->in_oxid);
184010365e5aSMatt Jacob }
184110365e5aSMatt Jacob
184210365e5aSMatt Jacob void
isp_put_notify_ack_24xx(ispsoftc_t * isp,na_fcentry_24xx_t * src,na_fcentry_24xx_t * dst)18431b760be4SAlexander Motin isp_put_notify_ack_24xx(ispsoftc_t *isp, na_fcentry_24xx_t *src, na_fcentry_24xx_t *dst)
184453af7d22SMatt Jacob {
184553af7d22SMatt Jacob int i;
184610365e5aSMatt Jacob
184710365e5aSMatt Jacob isp_put_hdr(isp, &src->na_header, &dst->na_header);
184810365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->na_handle, &dst->na_handle);
184910365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->na_nphdl, &dst->na_nphdl);
185010365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->na_reserved1, &dst->na_reserved1);
185110365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->na_flags, &dst->na_flags);
185210365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->na_srr_rxid, &dst->na_srr_rxid);
185310365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->na_status, &dst->na_status);
185410365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->na_status_subcode, &dst->na_status_subcode);
185537a7daacSAlexander Motin ISP_IOXPUT_8(isp, src->na_fwhandle, &dst->na_fwhandle);
185610365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->na_rxid, &dst->na_rxid);
185710365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->na_srr_reloff_hi, &dst->na_srr_reloff_hi);
185810365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->na_srr_reloff_lo, &dst->na_srr_reloff_lo);
185910365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->na_srr_iu, &dst->na_srr_iu);
186010365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->na_srr_flags, &dst->na_srr_flags);
186110365e5aSMatt Jacob for (i = 0; i < 18; i++) {
186210365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->na_reserved3[i], &dst->na_reserved3[i]);
186310365e5aSMatt Jacob }
186410365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->na_reserved4, &dst->na_reserved4);
18652df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->na_vpidx, &dst->na_vpidx);
18662df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->na_srr_reject_vunique, &dst->na_srr_reject_vunique);
18672df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->na_srr_reject_explanation, &dst->na_srr_reject_explanation);
186810365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->na_srr_reject_code, &dst->na_srr_reject_code);
186910365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->na_reserved5, &dst->na_reserved5);
187010365e5aSMatt Jacob for (i = 0; i < 6; i++) {
187110365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->na_reserved6[i], &dst->na_reserved6[i]);
187210365e5aSMatt Jacob }
187310365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->na_oxid, &dst->na_oxid);
187410365e5aSMatt Jacob }
187510365e5aSMatt Jacob
187610365e5aSMatt Jacob void
isp_get_notify_ack_24xx(ispsoftc_t * isp,na_fcentry_24xx_t * src,na_fcentry_24xx_t * dst)18772df76c16SMatt Jacob isp_get_notify_ack_24xx(ispsoftc_t *isp, na_fcentry_24xx_t *src, na_fcentry_24xx_t *dst)
187810365e5aSMatt Jacob {
187910365e5aSMatt Jacob int i;
188010365e5aSMatt Jacob
188110365e5aSMatt Jacob isp_get_hdr(isp, &src->na_header, &dst->na_header);
188210365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->na_handle, dst->na_handle);
188310365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->na_nphdl, dst->na_nphdl);
188410365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->na_reserved1, dst->na_reserved1);
188510365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->na_flags, dst->na_flags);
188610365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->na_srr_rxid, dst->na_srr_rxid);
188710365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->na_status, dst->na_status);
188810365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->na_status_subcode, dst->na_status_subcode);
188937a7daacSAlexander Motin ISP_IOXGET_8(isp, &src->na_fwhandle, dst->na_fwhandle);
189010365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->na_rxid, dst->na_rxid);
189110365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->na_srr_reloff_hi, dst->na_srr_reloff_hi);
189210365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->na_srr_reloff_lo, dst->na_srr_reloff_lo);
189310365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->na_srr_iu, dst->na_srr_iu);
189410365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->na_srr_flags, dst->na_srr_flags);
189510365e5aSMatt Jacob for (i = 0; i < 18; i++) {
189610365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->na_reserved3[i], dst->na_reserved3[i]);
189710365e5aSMatt Jacob }
189810365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->na_reserved4, dst->na_reserved4);
18992df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->na_vpidx, dst->na_vpidx);
19002df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->na_srr_reject_vunique, dst->na_srr_reject_vunique);
19012df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->na_srr_reject_explanation, dst->na_srr_reject_explanation);
190210365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->na_srr_reject_code, dst->na_srr_reject_code);
190310365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->na_reserved5, dst->na_reserved5);
190410365e5aSMatt Jacob for (i = 0; i < 6; i++) {
190510365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->na_reserved6[i], dst->na_reserved6[i]);
190610365e5aSMatt Jacob }
190710365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->na_oxid, dst->na_oxid);
190810365e5aSMatt Jacob }
190910365e5aSMatt Jacob
191010365e5aSMatt Jacob void
isp_get_abts(ispsoftc_t * isp,abts_t * src,abts_t * dst)191110365e5aSMatt Jacob isp_get_abts(ispsoftc_t *isp, abts_t *src, abts_t *dst)
191210365e5aSMatt Jacob {
191310365e5aSMatt Jacob int i;
191410365e5aSMatt Jacob
191510365e5aSMatt Jacob isp_get_hdr(isp, &src->abts_header, &dst->abts_header);
191610365e5aSMatt Jacob for (i = 0; i < 6; i++) {
19172df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->abts_reserved0[i], dst->abts_reserved0[i]);
191810365e5aSMatt Jacob }
191910365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abts_nphdl, dst->abts_nphdl);
192010365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abts_reserved1, dst->abts_reserved1);
192110365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abts_sof, dst->abts_sof);
192210365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->abts_rxid_abts, dst->abts_rxid_abts);
192310365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abts_did_lo, dst->abts_did_lo);
192410365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->abts_did_hi, dst->abts_did_hi);
192510365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->abts_r_ctl, dst->abts_r_ctl);
192610365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abts_sid_lo, dst->abts_sid_lo);
192710365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->abts_sid_hi, dst->abts_sid_hi);
192810365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->abts_cs_ctl, dst->abts_cs_ctl);
192910365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abts_fs_ctl, dst->abts_fs_ctl);
193010365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->abts_f_ctl, dst->abts_f_ctl);
193110365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->abts_type, dst->abts_type);
193210365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abts_seq_cnt, dst->abts_seq_cnt);
193310365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->abts_df_ctl, dst->abts_df_ctl);
193410365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->abts_seq_id, dst->abts_seq_id);
193510365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abts_rx_id, dst->abts_rx_id);
193610365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abts_ox_id, dst->abts_ox_id);
193710365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->abts_param, dst->abts_param);
193810365e5aSMatt Jacob for (i = 0; i < 16; i++) {
19392df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->abts_reserved2[i], dst->abts_reserved2[i]);
194010365e5aSMatt Jacob }
194110365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->abts_rxid_task, dst->abts_rxid_task);
194210365e5aSMatt Jacob }
194310365e5aSMatt Jacob
194410365e5aSMatt Jacob void
isp_put_abts_rsp(ispsoftc_t * isp,abts_rsp_t * src,abts_rsp_t * dst)194510365e5aSMatt Jacob isp_put_abts_rsp(ispsoftc_t *isp, abts_rsp_t *src, abts_rsp_t *dst)
194610365e5aSMatt Jacob {
194710365e5aSMatt Jacob int i;
194810365e5aSMatt Jacob
194910365e5aSMatt Jacob isp_put_hdr(isp, &src->abts_rsp_header, &dst->abts_rsp_header);
195010365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->abts_rsp_handle, &dst->abts_rsp_handle);
195110365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->abts_rsp_status, &dst->abts_rsp_status);
195210365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->abts_rsp_nphdl, &dst->abts_rsp_nphdl);
195310365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->abts_rsp_ctl_flags, &dst->abts_rsp_ctl_flags);
195410365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->abts_rsp_sof, &dst->abts_rsp_sof);
195510365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->abts_rsp_rxid_abts, &dst->abts_rsp_rxid_abts);
195610365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->abts_rsp_did_lo, &dst->abts_rsp_did_lo);
195710365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->abts_rsp_did_hi, &dst->abts_rsp_did_hi);
195810365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->abts_rsp_r_ctl, &dst->abts_rsp_r_ctl);
195910365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->abts_rsp_sid_lo, &dst->abts_rsp_sid_lo);
196010365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->abts_rsp_sid_hi, &dst->abts_rsp_sid_hi);
196110365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->abts_rsp_cs_ctl, &dst->abts_rsp_cs_ctl);
196210365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->abts_rsp_f_ctl_lo, &dst->abts_rsp_f_ctl_lo);
196310365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->abts_rsp_f_ctl_hi, &dst->abts_rsp_f_ctl_hi);
196410365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->abts_rsp_type, &dst->abts_rsp_type);
196510365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->abts_rsp_seq_cnt, &dst->abts_rsp_seq_cnt);
196610365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->abts_rsp_df_ctl, &dst->abts_rsp_df_ctl);
196710365e5aSMatt Jacob ISP_IOXPUT_8(isp, src->abts_rsp_seq_id, &dst->abts_rsp_seq_id);
196810365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->abts_rsp_rx_id, &dst->abts_rsp_rx_id);
196910365e5aSMatt Jacob ISP_IOXPUT_16(isp, src->abts_rsp_ox_id, &dst->abts_rsp_ox_id);
197010365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->abts_rsp_param, &dst->abts_rsp_param);
197110365e5aSMatt Jacob if (src->abts_rsp_r_ctl == BA_ACC) {
19722df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.reserved, &dst->abts_rsp_payload.ba_acc.reserved);
19732df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_acc.last_seq_id, &dst->abts_rsp_payload.ba_acc.last_seq_id);
19742df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_acc.seq_id_valid, &dst->abts_rsp_payload.ba_acc.seq_id_valid);
19752df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.aborted_rx_id, &dst->abts_rsp_payload.ba_acc.aborted_rx_id);
19762df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.aborted_ox_id, &dst->abts_rsp_payload.ba_acc.aborted_ox_id);
19772df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.high_seq_cnt, &dst->abts_rsp_payload.ba_acc.high_seq_cnt);
19782df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.low_seq_cnt, &dst->abts_rsp_payload.ba_acc.low_seq_cnt);
197910365e5aSMatt Jacob for (i = 0; i < 4; i++) {
19802df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.reserved2[i], &dst->abts_rsp_payload.ba_acc.reserved2[i]);
198110365e5aSMatt Jacob }
198210365e5aSMatt Jacob } else if (src->abts_rsp_r_ctl == BA_RJT) {
19832df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.vendor_unique, &dst->abts_rsp_payload.ba_rjt.vendor_unique);
19842df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.explanation, &dst->abts_rsp_payload.ba_rjt.explanation);
19852df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.reason, &dst->abts_rsp_payload.ba_rjt.reason);
19862df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.reserved, &dst->abts_rsp_payload.ba_rjt.reserved);
198710365e5aSMatt Jacob for (i = 0; i < 12; i++) {
19882df76c16SMatt Jacob ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_rjt.reserved2[i], &dst->abts_rsp_payload.ba_rjt.reserved2[i]);
198910365e5aSMatt Jacob }
199010365e5aSMatt Jacob } else {
199110365e5aSMatt Jacob for (i = 0; i < 16; i++) {
19922df76c16SMatt Jacob ISP_IOXPUT_8(isp, src->abts_rsp_payload.reserved[i], &dst->abts_rsp_payload.reserved[i]);
199310365e5aSMatt Jacob }
199410365e5aSMatt Jacob }
199510365e5aSMatt Jacob ISP_IOXPUT_32(isp, src->abts_rsp_rxid_task, &dst->abts_rsp_rxid_task);
199610365e5aSMatt Jacob }
199710365e5aSMatt Jacob
199810365e5aSMatt Jacob void
isp_get_abts_rsp(ispsoftc_t * isp,abts_rsp_t * src,abts_rsp_t * dst)199910365e5aSMatt Jacob isp_get_abts_rsp(ispsoftc_t *isp, abts_rsp_t *src, abts_rsp_t *dst)
200010365e5aSMatt Jacob {
200110365e5aSMatt Jacob int i;
200210365e5aSMatt Jacob
200310365e5aSMatt Jacob isp_get_hdr(isp, &src->abts_rsp_header, &dst->abts_rsp_header);
200410365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->abts_rsp_handle, dst->abts_rsp_handle);
200510365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abts_rsp_status, dst->abts_rsp_status);
200610365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abts_rsp_nphdl, dst->abts_rsp_nphdl);
200710365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abts_rsp_ctl_flags, dst->abts_rsp_ctl_flags);
200810365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abts_rsp_sof, dst->abts_rsp_sof);
200910365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->abts_rsp_rxid_abts, dst->abts_rsp_rxid_abts);
201010365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abts_rsp_did_lo, dst->abts_rsp_did_lo);
201110365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->abts_rsp_did_hi, dst->abts_rsp_did_hi);
201210365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->abts_rsp_r_ctl, dst->abts_rsp_r_ctl);
201310365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abts_rsp_sid_lo, dst->abts_rsp_sid_lo);
201410365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->abts_rsp_sid_hi, dst->abts_rsp_sid_hi);
201510365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->abts_rsp_cs_ctl, dst->abts_rsp_cs_ctl);
201610365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abts_rsp_f_ctl_lo, dst->abts_rsp_f_ctl_lo);
201710365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->abts_rsp_f_ctl_hi, dst->abts_rsp_f_ctl_hi);
201810365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->abts_rsp_type, dst->abts_rsp_type);
201910365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abts_rsp_seq_cnt, dst->abts_rsp_seq_cnt);
202010365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->abts_rsp_df_ctl, dst->abts_rsp_df_ctl);
202110365e5aSMatt Jacob ISP_IOXGET_8(isp, &src->abts_rsp_seq_id, dst->abts_rsp_seq_id);
202210365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abts_rsp_rx_id, dst->abts_rsp_rx_id);
202310365e5aSMatt Jacob ISP_IOXGET_16(isp, &src->abts_rsp_ox_id, dst->abts_rsp_ox_id);
202410365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->abts_rsp_param, dst->abts_rsp_param);
202510365e5aSMatt Jacob for (i = 0; i < 8; i++) {
20262df76c16SMatt Jacob ISP_IOXGET_8(isp, &src->abts_rsp_payload.rsp.reserved[i], dst->abts_rsp_payload.rsp.reserved[i]);
202710365e5aSMatt Jacob }
20282df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->abts_rsp_payload.rsp.subcode1, dst->abts_rsp_payload.rsp.subcode1);
20292df76c16SMatt Jacob ISP_IOXGET_32(isp, &src->abts_rsp_payload.rsp.subcode2, dst->abts_rsp_payload.rsp.subcode2);
203010365e5aSMatt Jacob ISP_IOXGET_32(isp, &src->abts_rsp_rxid_task, dst->abts_rsp_rxid_task);
203110365e5aSMatt Jacob }
2032156c1ebeSAlexander Motin
2033156c1ebeSAlexander Motin void
isp_put_entry(ispsoftc_t * isp,void * src,void * dst)2034156c1ebeSAlexander Motin isp_put_entry(ispsoftc_t *isp, void *src, void *dst)
2035156c1ebeSAlexander Motin {
2036156c1ebeSAlexander Motin uint8_t etype = ((isphdr_t *)src)->rqs_entry_type;
2037156c1ebeSAlexander Motin
2038156c1ebeSAlexander Motin switch (etype) {
2039156c1ebeSAlexander Motin case RQSTYPE_NOTIFY_ACK:
2040156c1ebeSAlexander Motin isp_put_notify_ack_24xx(isp, (na_fcentry_24xx_t *)src,
2041156c1ebeSAlexander Motin (na_fcentry_24xx_t *)dst);
2042156c1ebeSAlexander Motin break;
2043156c1ebeSAlexander Motin case RQSTYPE_CTIO7:
2044156c1ebeSAlexander Motin isp_put_ctio7(isp, (ct7_entry_t *)src, (ct7_entry_t *)dst);
2045156c1ebeSAlexander Motin break;
2046156c1ebeSAlexander Motin case RQSTYPE_TSK_MGMT:
2047156c1ebeSAlexander Motin isp_put_24xx_tmf(isp, (isp24xx_tmf_t *)src, (isp24xx_tmf_t *)dst);
2048156c1ebeSAlexander Motin break;
2049156c1ebeSAlexander Motin case RQSTYPE_CT_PASSTHRU:
2050156c1ebeSAlexander Motin isp_put_ct_pt(isp, (isp_ct_pt_t *)src, (isp_ct_pt_t *)dst);
2051156c1ebeSAlexander Motin break;
2052156c1ebeSAlexander Motin case RQSTYPE_VP_CTRL:
2053156c1ebeSAlexander Motin isp_put_vp_ctrl_info(isp, (vp_ctrl_info_t *)src, (vp_ctrl_info_t *)dst);
2054156c1ebeSAlexander Motin break;
2055156c1ebeSAlexander Motin case RQSTYPE_VP_MODIFY:
2056156c1ebeSAlexander Motin isp_put_vp_modify(isp, (vp_modify_t *)src, (vp_modify_t *)dst);
2057156c1ebeSAlexander Motin break;
2058156c1ebeSAlexander Motin case RQSTYPE_ABORT_IO:
2059156c1ebeSAlexander Motin isp_put_24xx_abrt(isp, (isp24xx_abrt_t *)src, (isp24xx_abrt_t *)dst);
2060156c1ebeSAlexander Motin break;
2061156c1ebeSAlexander Motin case RQSTYPE_LOGIN:
2062156c1ebeSAlexander Motin isp_put_plogx(isp, (isp_plogx_t *)src, (isp_plogx_t *)dst);
2063156c1ebeSAlexander Motin break;
2064156c1ebeSAlexander Motin case RQSTYPE_ABTS_RSP:
2065156c1ebeSAlexander Motin isp_put_abts_rsp(isp, (abts_rsp_t *)src, (abts_rsp_t *)dst);
2066156c1ebeSAlexander Motin break;
2067156c1ebeSAlexander Motin default:
2068156c1ebeSAlexander Motin panic("%s: Unknown type 0x%x\n", __func__, etype);
2069156c1ebeSAlexander Motin }
2070156c1ebeSAlexander Motin }
2071156c1ebeSAlexander Motin
2072156c1ebeSAlexander Motin void
isp_get_entry(ispsoftc_t * isp,void * src,void * dst)2073156c1ebeSAlexander Motin isp_get_entry(ispsoftc_t *isp, void *src, void *dst)
2074156c1ebeSAlexander Motin {
2075156c1ebeSAlexander Motin uint8_t etype;
2076156c1ebeSAlexander Motin
2077156c1ebeSAlexander Motin isp_get_hdr(isp, src, (isphdr_t *)dst);
2078156c1ebeSAlexander Motin etype = ((isphdr_t *)dst)->rqs_entry_type;
2079156c1ebeSAlexander Motin switch (etype) {
2080156c1ebeSAlexander Motin case 0: /* After isp_clear_commands() */
2081156c1ebeSAlexander Motin ISP_MEMZERO(dst, QENTRY_LEN);
2082156c1ebeSAlexander Motin break;
2083156c1ebeSAlexander Motin case RQSTYPE_RESPONSE:
2084156c1ebeSAlexander Motin isp_get_24xx_response(isp, (isp24xx_statusreq_t *)src, (isp24xx_statusreq_t *)dst);
2085156c1ebeSAlexander Motin break;
2086156c1ebeSAlexander Motin case RQSTYPE_CT_PASSTHRU:
2087156c1ebeSAlexander Motin isp_get_ct_pt(isp, (isp_ct_pt_t *)src, (isp_ct_pt_t *)dst);
2088156c1ebeSAlexander Motin break;
2089156c1ebeSAlexander Motin case RQSTYPE_VP_CTRL:
2090156c1ebeSAlexander Motin isp_get_vp_ctrl_info(isp, (vp_ctrl_info_t *)src, (vp_ctrl_info_t *)dst);
2091156c1ebeSAlexander Motin break;
2092156c1ebeSAlexander Motin case RQSTYPE_VP_MODIFY:
2093156c1ebeSAlexander Motin isp_get_vp_modify(isp, (vp_modify_t *)src, (vp_modify_t *)dst);
2094156c1ebeSAlexander Motin break;
2095156c1ebeSAlexander Motin case RQSTYPE_ABORT_IO:
2096156c1ebeSAlexander Motin isp_get_24xx_abrt(isp, (isp24xx_abrt_t *)src, (isp24xx_abrt_t *)dst);
2097156c1ebeSAlexander Motin break;
2098156c1ebeSAlexander Motin case RQSTYPE_LOGIN:
2099156c1ebeSAlexander Motin isp_get_plogx(isp, (isp_plogx_t *)src, (isp_plogx_t *)dst);
2100156c1ebeSAlexander Motin break;
2101156c1ebeSAlexander Motin default:
2102156c1ebeSAlexander Motin panic("%s: Unknown type 0x%x\n", __func__, etype);
2103156c1ebeSAlexander Motin }
2104156c1ebeSAlexander Motin }
2105156c1ebeSAlexander Motin
2106156c1ebeSAlexander Motin int
isp_send_entry(ispsoftc_t * isp,void * src)2107156c1ebeSAlexander Motin isp_send_entry(ispsoftc_t *isp, void *src)
2108156c1ebeSAlexander Motin {
2109156c1ebeSAlexander Motin void *outp;
2110156c1ebeSAlexander Motin
2111156c1ebeSAlexander Motin outp = isp_getrqentry(isp);
2112156c1ebeSAlexander Motin if (outp == NULL) {
2113156c1ebeSAlexander Motin isp_prt(isp, ISP_LOGWARN, "%s: Request Queue Overflow", __func__);
2114156c1ebeSAlexander Motin return (-1);
2115156c1ebeSAlexander Motin }
2116156c1ebeSAlexander Motin isp_put_entry(isp, src, outp);
2117156c1ebeSAlexander Motin if (isp->isp_dblev & ISP_LOGTDEBUG2)
2118156c1ebeSAlexander Motin isp_print_qentry(isp, __func__, isp->isp_reqidx, outp);
2119156c1ebeSAlexander Motin ISP_SYNC_REQUEST(isp);
2120156c1ebeSAlexander Motin return (0);
2121156c1ebeSAlexander Motin }
2122156c1ebeSAlexander Motin
2123156c1ebeSAlexander Motin int
isp_exec_entry_mbox(ispsoftc_t * isp,void * src,void * dst,int timeout)2124156c1ebeSAlexander Motin isp_exec_entry_mbox(ispsoftc_t *isp, void *src, void *dst, int timeout)
2125156c1ebeSAlexander Motin {
2126156c1ebeSAlexander Motin mbreg_t mbs;
2127156c1ebeSAlexander Motin
2128156c1ebeSAlexander Motin isp_put_entry(isp, src, isp->isp_iocb);
2129156c1ebeSAlexander Motin MEMORYBARRIER(isp, SYNC_IFORDEV, 0, 2 * QENTRY_LEN, 0);
2130156c1ebeSAlexander Motin
2131156c1ebeSAlexander Motin MBSINIT(&mbs, MBOX_EXEC_COMMAND_IOCB_A64, MBLOGALL,
2132156c1ebeSAlexander Motin MBCMD_DEFAULT_TIMEOUT + timeout * 1000000);
2133156c1ebeSAlexander Motin mbs.param[1] = QENTRY_LEN;
2134156c1ebeSAlexander Motin mbs.param[2] = DMA_WD1(isp->isp_iocb_dma);
2135156c1ebeSAlexander Motin mbs.param[3] = DMA_WD0(isp->isp_iocb_dma);
2136156c1ebeSAlexander Motin mbs.param[6] = DMA_WD3(isp->isp_iocb_dma);
2137156c1ebeSAlexander Motin mbs.param[7] = DMA_WD2(isp->isp_iocb_dma);
2138156c1ebeSAlexander Motin isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs);
2139156c1ebeSAlexander Motin if (mbs.param[0] != MBOX_COMMAND_COMPLETE)
2140156c1ebeSAlexander Motin return (EIO);
2141156c1ebeSAlexander Motin
2142156c1ebeSAlexander Motin MEMORYBARRIER(isp, SYNC_IFORCPU, QENTRY_LEN, QENTRY_LEN, 0);
2143156c1ebeSAlexander Motin isp_get_entry(isp, &((isp24xx_statusreq_t *)isp->isp_iocb)[1], dst);
2144156c1ebeSAlexander Motin return (0);
2145156c1ebeSAlexander Motin }
2146156c1ebeSAlexander Motin
2147156c1ebeSAlexander Motin int
isp_exec_entry_queue(ispsoftc_t * isp,void * src,void * dst,int timeout)2148156c1ebeSAlexander Motin isp_exec_entry_queue(ispsoftc_t *isp, void *src, void *dst, int timeout)
2149156c1ebeSAlexander Motin {
2150156c1ebeSAlexander Motin uint8_t resp[QENTRY_LEN];
2151156c1ebeSAlexander Motin uint32_t hdl;
2152156c1ebeSAlexander Motin
2153156c1ebeSAlexander Motin timeout *= hz;
2154156c1ebeSAlexander Motin again:
2155156c1ebeSAlexander Motin /* Wait for empty request queue slot. */
2156156c1ebeSAlexander Motin while (!isp_rqentry_avail(isp, QENTRY_MAX) && timeout-- > 0)
2157156c1ebeSAlexander Motin msleep(resp, &isp->isp_lock, 0, "isprqa", 1);
2158156c1ebeSAlexander Motin if (timeout <= 0)
2159156c1ebeSAlexander Motin return (ENOMEM);
2160156c1ebeSAlexander Motin
2161156c1ebeSAlexander Motin /* Allocate handle. Should always be available, but stay safe. */
2162156c1ebeSAlexander Motin hdl = isp_allocate_handle(isp, resp, ISP_HANDLE_CTRL);
2163156c1ebeSAlexander Motin if (hdl == 0) {
2164156c1ebeSAlexander Motin if (timeout-- > 0) {
2165156c1ebeSAlexander Motin msleep(resp, &isp->isp_lock, 0, "ispha", 1);
2166156c1ebeSAlexander Motin goto again;
2167156c1ebeSAlexander Motin }
2168156c1ebeSAlexander Motin return (ENOMEM);
2169156c1ebeSAlexander Motin }
2170156c1ebeSAlexander Motin ((uint32_t *)src)[1] = hdl;
2171156c1ebeSAlexander Motin
2172156c1ebeSAlexander Motin /* Execute the request and wait for response. */
2173156c1ebeSAlexander Motin isp_send_entry(isp, src);
2174156c1ebeSAlexander Motin if (msleep(resp, &isp->isp_lock, 0, "ispeeq", timeout) != 0) {
2175156c1ebeSAlexander Motin isp_destroy_handle(isp, hdl);
2176156c1ebeSAlexander Motin return (EWOULDBLOCK);
2177156c1ebeSAlexander Motin }
2178156c1ebeSAlexander Motin isp_get_entry(isp, resp, dst);
2179156c1ebeSAlexander Motin return (0);
2180156c1ebeSAlexander Motin }
2181156c1ebeSAlexander Motin
218210365e5aSMatt Jacob /*
218310365e5aSMatt Jacob * vim:ts=8:sw=8
218410365e5aSMatt Jacob */
2185