The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/isp/isp_library.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
    3  *
    4  *  Copyright (c) 2009-2020 Alexander Motin <mav@FreeBSD.org>
    5  *  Copyright (c) 1997-2009 by Matthew Jacob
    6  *  All rights reserved.
    7  *
    8  *  Redistribution and use in source and binary forms, with or without
    9  *  modification, are permitted provided that the following conditions
   10  *  are met:
   11  *
   12  *  1. Redistributions of source code must retain the above copyright
   13  *     notice, this list of conditions and the following disclaimer.
   14  *  2. Redistributions in binary form must reproduce the above copyright
   15  *     notice, this list of conditions and the following disclaimer in the
   16  *     documentation and/or other materials provided with the distribution.
   17  *
   18  *  THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   19  *  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   20  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   21  *  ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
   22  *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   23  *  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   24  *  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   25  *  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   26  *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   27  *  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   28  *  SUCH DAMAGE.
   29  *
   30  */
   31 /*
   32  * Qlogic Host Adapter Internal Library Functions
   33  */
   34 #ifdef  __NetBSD__
   35 #include <sys/cdefs.h>
   36 __KERNEL_RCSID(0, "$NetBSD$");
   37 #include <dev/ic/isp_netbsd.h>
   38 #endif
   39 #ifdef  __FreeBSD__
   40 #include <sys/cdefs.h>
   41 __FBSDID("$FreeBSD$");
   42 #include <dev/isp/isp_freebsd.h>
   43 #endif
   44 #ifdef  __OpenBSD__
   45 #include <dev/ic/isp_openbsd.h>
   46 #endif
   47 #ifdef  __linux__
   48 #include "isp_linux.h"
   49 #endif
   50 #ifdef  __svr4__
   51 #include "isp_solaris.h"
   52 #endif
   53 
   54 const char *isp_class3_roles[4] = {
   55     "None", "Target", "Initiator", "Target/Initiator"
   56 };
   57 
   58 /*
   59  * Command shipping- finish off first queue entry and do dma mapping and additional segments as needed.
   60  *
   61  * Called with the first queue entry at least partially filled out.
   62  */
   63 int
   64 isp_send_cmd(ispsoftc_t *isp, void *fqe, void *segp, uint32_t nsegs)
   65 {
   66         ispcontreq64_t crq;
   67         uint8_t type, nqe = 1;
   68         uint32_t seg, seglim, nxt;
   69         ispds64_t *dsp64 = NULL;
   70         void *qe0, *qe1;
   71 
   72         qe0 = isp_getrqentry(isp);
   73         if (qe0 == NULL)
   74                 return (CMD_EAGAIN);
   75         nxt = ISP_NXT_QENTRY(isp->isp_reqidx, RQUEST_QUEUE_LEN(isp));
   76         type = ((isphdr_t *)fqe)->rqs_entry_type;
   77 
   78         /*
   79          * If we have no data to transmit, just copy the first IOCB and start it up.
   80          */
   81         if (nsegs == 0)
   82                 goto copy_and_sync;
   83 
   84         /*
   85          * First figure out how many pieces of data to transfer, what
   86          * kind and how many we can put into the first queue entry.
   87          */
   88         switch (type) {
   89         case RQSTYPE_T7RQS:
   90                 dsp64 = &((ispreqt7_t *)fqe)->req_dataseg;
   91                 seglim = 1;
   92                 break;
   93 #ifdef  ISP_TARGET_MODE
   94         case RQSTYPE_CTIO7:
   95                 dsp64 = &((ct7_entry_t *)fqe)->rsp.m0.ds;
   96                 seglim = 1;
   97                 break;
   98 #endif
   99         default:
  100                 panic("%s: unsupported IOCB type 0x%x\n", __func__, type);
  101         }
  102         if (seglim > nsegs)
  103                 seglim = nsegs;
  104         seg = 0;
  105         while (seg < seglim)
  106                 XS_GET_DMA64_SEG(dsp64++, segp, seg++);
  107 
  108         /*
  109          * Second, start building additional continuation segments as needed.
  110          */
  111         while (seg < nsegs) {
  112                 if (!isp_rqentry_avail(isp, ++nqe))
  113                         return (CMD_EAGAIN);
  114 
  115                 ISP_MEMZERO(&crq, QENTRY_LEN);
  116                 crq.req_header.rqs_entry_type = RQSTYPE_A64_CONT;
  117                 crq.req_header.rqs_entry_count = 1;
  118                 dsp64 = crq.req_dataseg;
  119 
  120                 seglim = seg + ISP_CDSEG64;
  121                 if (seglim > nsegs)
  122                         seglim = nsegs;
  123                 while (seg < seglim)
  124                         XS_GET_DMA64_SEG(dsp64++, segp, seg++);
  125 
  126                 qe1 = ISP_QUEUE_ENTRY(isp->isp_rquest, nxt);
  127                 isp_put_cont64_req(isp, &crq, qe1);
  128                 if (isp->isp_dblev & ISP_LOGDEBUG1) {
  129                         isp_print_bytes(isp, "additional queue entry",
  130                             QENTRY_LEN, qe1);
  131                 }
  132 
  133                 nxt = ISP_NXT_QENTRY(nxt, RQUEST_QUEUE_LEN(isp));
  134         }
  135 
  136 copy_and_sync:
  137         ((isphdr_t *)fqe)->rqs_entry_count = nqe;
  138         switch (type) {
  139         case RQSTYPE_T7RQS:
  140                 ((ispreqt7_t *)fqe)->req_seg_count = nsegs;
  141                 isp_put_request_t7(isp, fqe, qe0);
  142                 break;
  143 #ifdef  ISP_TARGET_MODE
  144         case RQSTYPE_CTIO7:
  145                 if (((ct7_entry_t *)fqe)->ct_flags & CT7_FLAG_MODE2) {
  146                         ((ct7_entry_t *)fqe)->ct_seg_count = 1;
  147                 } else {
  148                         ((ct7_entry_t *)fqe)->ct_seg_count = nsegs;
  149                 }
  150                 isp_put_ctio7(isp, fqe, qe0);
  151                 break;
  152 #endif
  153         default:
  154                 panic("%s: unsupported IOCB type 0x%x\n", __func__, type);
  155         }
  156         if (isp->isp_dblev & ISP_LOGDEBUG1) {
  157                 isp_print_bytes(isp, "first queue entry", QENTRY_LEN, qe0);
  158         }
  159         ISP_ADD_REQUEST(isp, nxt);
  160         return (0);
  161 }
  162 
  163 uint32_t
  164 isp_allocate_handle(ispsoftc_t *isp, void *xs, int type)
  165 {
  166         isp_hdl_t *hdp;
  167 
  168         hdp = isp->isp_xffree;
  169         if (hdp == NULL)
  170                 return (ISP_HANDLE_FREE);
  171         isp->isp_xffree = hdp->cmd;
  172         hdp->cmd = xs;
  173         hdp->handle = (hdp - isp->isp_xflist);
  174         hdp->handle |= (type << ISP_HANDLE_USAGE_SHIFT);
  175         hdp->handle |= (isp->isp_seqno++ << ISP_HANDLE_SEQ_SHIFT);
  176         return (hdp->handle);
  177 }
  178 
  179 void *
  180 isp_find_xs(ispsoftc_t *isp, uint32_t handle)
  181 {
  182         if (!ISP_VALID_HANDLE(isp, handle)) {
  183                 isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle);
  184                 return (NULL);
  185         }
  186         return (isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].cmd);
  187 }
  188 
  189 uint32_t
  190 isp_find_handle(ispsoftc_t *isp, void *xs)
  191 {
  192         uint32_t i, foundhdl = ISP_HANDLE_FREE;
  193 
  194         if (xs != NULL) {
  195                 for (i = 0; i < ISP_HANDLE_NUM(isp); i++) {
  196                         if (isp->isp_xflist[i].cmd != xs) {
  197                                 continue;
  198                         }
  199                         foundhdl = isp->isp_xflist[i].handle;
  200                         break;
  201                 }
  202         }
  203         return (foundhdl);
  204 }
  205 
  206 void
  207 isp_destroy_handle(ispsoftc_t *isp, uint32_t handle)
  208 {
  209         if (!ISP_VALID_HANDLE(isp, handle)) {
  210                 isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle);
  211         } else {
  212                 isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].handle = ISP_HANDLE_FREE;
  213                 isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].cmd = isp->isp_xffree;
  214                 isp->isp_xffree = &isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)];
  215         }
  216 }
  217 
  218 #define TBA     (4 * (((QENTRY_LEN >> 2) * 3) + 1) + 1)
  219 void
  220 isp_print_qentry(ispsoftc_t *isp, const char *msg, int idx, void *arg)
  221 {
  222         char buf[TBA];
  223         int amt, i, j;
  224         uint8_t *ptr = arg;
  225 
  226         isp_prt(isp, ISP_LOGALL, "%s index %d=>", msg, idx);
  227         for (buf[0] = 0, amt = i = 0; i < 4; i++) {
  228                 buf[0] = 0;
  229                 ISP_SNPRINTF(buf, TBA, "  ");
  230                 for (j = 0; j < (QENTRY_LEN >> 2); j++) {
  231                         ISP_SNPRINTF(buf, TBA, "%s %02x", buf, ptr[amt++] & 0xff);
  232                 }
  233                 isp_prt(isp, ISP_LOGALL, "%s", buf);
  234         }
  235 }
  236 
  237 void
  238 isp_print_bytes(ispsoftc_t *isp, const char *msg, int amt, void *arg)
  239 {
  240         char buf[128];
  241         uint8_t *ptr = arg;
  242         int off;
  243 
  244         if (msg)
  245                 isp_prt(isp, ISP_LOGALL, "%s:", msg);
  246         off = 0;
  247         buf[0] = 0;
  248         while (off < amt) {
  249                 int j, to;
  250                 to = off;
  251                 for (j = 0; j < 16; j++) {
  252                         ISP_SNPRINTF(buf, 128, "%s %02x", buf, ptr[off++] & 0xff);
  253                         if (off == amt) {
  254                                 break;
  255                         }
  256                 }
  257                 isp_prt(isp, ISP_LOGALL, "0x%08x:%s", to, buf);
  258                 buf[0] = 0;
  259         }
  260 }
  261 
  262 /*
  263  * Do the common path to try and ensure that link is up, we've scanned
  264  * the fabric (if we're on a fabric), and that we've synchronized this
  265  * all with our own database and done the appropriate logins.
  266  *
  267  * We repeatedly check for firmware state and loop state after each
  268  * action because things may have changed while we were doing this.
  269  * Any failure or change of state causes us to return a nonzero value.
  270  *
  271  * We assume we enter here with any locks held.
  272  */
  273 
  274 int
  275 isp_fc_runstate(ispsoftc_t *isp, int chan, int tval)
  276 {
  277         fcparam *fcp = FCPARAM(isp, chan);
  278         int res;
  279 
  280 again:
  281         if (fcp->role == ISP_ROLE_NONE)
  282                 return (-1);
  283         res = isp_control(isp, ISPCTL_FCLINK_TEST, chan, tval);
  284         if (res > 0)
  285                 goto again;
  286         if (res < 0)
  287                 return (fcp->isp_loopstate);
  288         res = isp_control(isp, ISPCTL_SCAN_LOOP, chan);
  289         if (res > 0)
  290                 goto again;
  291         if (res < 0)
  292                 return (fcp->isp_loopstate);
  293         res = isp_control(isp, ISPCTL_SCAN_FABRIC, chan);
  294         if (res > 0)
  295                 goto again;
  296         if (res < 0)
  297                 return (fcp->isp_loopstate);
  298         res = isp_control(isp, ISPCTL_PDB_SYNC, chan);
  299         if (res > 0)
  300                 goto again;
  301         return (fcp->isp_loopstate);
  302 }
  303 
  304 /*
  305  * Fibre Channel Support routines
  306  */
  307 void
  308 isp_dump_portdb(ispsoftc_t *isp, int chan)
  309 {
  310         fcparam *fcp = FCPARAM(isp, chan);
  311         int i;
  312 
  313         for (i = 0; i < MAX_FC_TARG; i++) {
  314                 char buf1[64], buf2[64];
  315                 const char *dbs[8] = {
  316                         "NIL ",
  317                         "PROB",
  318                         "DEAD",
  319                         "CHGD",
  320                         "NEW ",
  321                         "PVLD",
  322                         "ZOMB",
  323                         "VLD "
  324                 };
  325                 fcportdb_t *lp = &fcp->portdb[i];
  326 
  327                 if (lp->state == FC_PORTDB_STATE_NIL) {
  328                         continue;
  329                 }
  330                 isp_gen_role_str(buf1, sizeof (buf1), lp->prli_word3);
  331                 isp_gen_role_str(buf2, sizeof (buf2), lp->new_prli_word3);
  332                 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",
  333                     chan, i, lp->handle, dbs[lp->state], buf1, lp->portid, buf2, lp->new_portid,
  334                     (uint32_t) (lp->node_wwn >> 32), (uint32_t) (lp->node_wwn), (uint32_t) (lp->port_wwn >> 32), (uint32_t) (lp->port_wwn));
  335         }
  336 }
  337 
  338 void
  339 isp_gen_role_str(char *buf, size_t len, uint16_t p3)
  340 {
  341         int nd = 0;
  342         buf[0] = '(';
  343         buf[1] = 0;
  344         if (p3 & PRLI_WD3_ENHANCED_DISCOVERY) {
  345                 nd++;
  346                 strlcat(buf, "EDisc", len);
  347         }
  348         if (p3 & PRLI_WD3_REC_SUPPORT) {
  349                 if (nd++) {
  350                         strlcat(buf, ",", len);
  351                 }
  352                 strlcat(buf, "REC", len);
  353         }
  354         if (p3 & PRLI_WD3_TASK_RETRY_IDENTIFICATION_REQUESTED) {
  355                 if (nd++) {
  356                         strlcat(buf, ",", len);
  357                 }
  358                 strlcat(buf, "RetryID", len);
  359         }
  360         if (p3 & PRLI_WD3_RETRY) {
  361                 if (nd++) {
  362                         strlcat(buf, ",", len);
  363                 }
  364                 strlcat(buf, "Retry", len);
  365         }
  366         if (p3 & PRLI_WD3_CONFIRMED_COMPLETION_ALLOWED) {
  367                 if (nd++) {
  368                         strlcat(buf, ",", len);
  369                 }
  370                 strlcat(buf, "CNFRM", len);
  371         }
  372         if (p3 & PRLI_WD3_DATA_OVERLAY_ALLOWED) {
  373                 if (nd++) {
  374                         strlcat(buf, ",", len);
  375                 }
  376                 strlcat(buf, "DOver", len);
  377         }
  378         if (p3 & PRLI_WD3_INITIATOR_FUNCTION) {
  379                 if (nd++) {
  380                         strlcat(buf, ",", len);
  381                 }
  382                 strlcat(buf, "INI", len);
  383         }
  384         if (p3 & PRLI_WD3_TARGET_FUNCTION) {
  385                 if (nd++) {
  386                         strlcat(buf, ",", len);
  387                 }
  388                 strlcat(buf, "TGT", len);
  389         }
  390         if (p3 & PRLI_WD3_READ_FCP_XFER_RDY_DISABLED) {
  391                 if (nd++) {
  392                         strlcat(buf, ",", len);
  393                 }
  394                 strlcat(buf, "RdXfrDis", len);
  395         }
  396         if (p3 & PRLI_WD3_WRITE_FCP_XFER_RDY_DISABLED) {
  397                 if (nd++) {
  398                         strlcat(buf, ",", len);
  399                 }
  400                 strlcat(buf, "XfrDis", len);
  401         }
  402         strlcat(buf, ")", len);
  403 }
  404 
  405 const char *
  406 isp_fc_fw_statename(int state)
  407 {
  408         switch (state) {
  409         case FW_CONFIG_WAIT:    return "Config Wait";
  410         case FW_WAIT_LINK:      return "Wait Link";
  411         case FW_WAIT_LOGIN:     return "Wait Login";
  412         case FW_READY:          return "Ready";
  413         case FW_LOSS_OF_SYNC:   return "Loss Of Sync";
  414         case FW_ERROR:          return "Error";
  415         case FW_REINIT:         return "Re-Init";
  416         case FW_NON_PART:       return "Nonparticipating";
  417         default:                return "?????";
  418         }
  419 }
  420 
  421 const char *
  422 isp_fc_loop_statename(int state)
  423 {
  424         switch (state) {
  425         case LOOP_NIL:                  return "NIL";
  426         case LOOP_HAVE_LINK:            return "Have Link";
  427         case LOOP_HAVE_ADDR:            return "Have Address";
  428         case LOOP_TESTING_LINK:         return "Testing Link";
  429         case LOOP_LTEST_DONE:           return "Link Test Done";
  430         case LOOP_SCANNING_LOOP:        return "Scanning Loop";
  431         case LOOP_LSCAN_DONE:           return "Loop Scan Done";
  432         case LOOP_SCANNING_FABRIC:      return "Scanning Fabric";
  433         case LOOP_FSCAN_DONE:           return "Fabric Scan Done";
  434         case LOOP_SYNCING_PDB:          return "Syncing PDB";
  435         case LOOP_READY:                return "Ready"; 
  436         default:                        return "?????";
  437         }
  438 }
  439 
  440 const char *
  441 isp_fc_toponame(fcparam *fcp)
  442 {
  443 
  444         if (fcp->isp_loopstate < LOOP_HAVE_ADDR) {
  445                 return "Unavailable";
  446         }
  447         switch (fcp->isp_topo) {
  448         case TOPO_NL_PORT:      return "Private Loop (NL_Port)";
  449         case TOPO_FL_PORT:      return "Public Loop (FL_Port)";
  450         case TOPO_N_PORT:       return "Point-to-Point (N_Port)";
  451         case TOPO_F_PORT:       return "Fabric (F_Port)";
  452         case TOPO_PTP_STUB:     return "Point-to-Point (no response)";
  453         default:                return "?????";
  454         }
  455 }
  456 
  457 void
  458 isp_clear_commands(ispsoftc_t *isp)
  459 {
  460         uint32_t tmp;
  461         isp_hdl_t *hdp;
  462 #ifdef  ISP_TARGET_MODE
  463         isp_notify_t notify;
  464 #endif
  465 
  466         for (tmp = 0; isp->isp_xflist && tmp < ISP_HANDLE_NUM(isp); tmp++) {
  467 
  468                 hdp = &isp->isp_xflist[tmp];
  469                 switch (ISP_H2HT(hdp->handle)) {
  470                 case ISP_HANDLE_INITIATOR: {
  471                         XS_T *xs = hdp->cmd;
  472                         ISP_DMAFREE(isp, xs);
  473                         isp_destroy_handle(isp, hdp->handle);
  474                         XS_SET_RESID(xs, XS_XFRLEN(xs));
  475                         XS_SETERR(xs, HBA_BUSRESET);
  476                         isp_done(xs);
  477                         break;
  478                 }
  479 #ifdef  ISP_TARGET_MODE
  480                 case ISP_HANDLE_TARGET: {
  481                         ct7_entry_t ctio;
  482 
  483                         ISP_DMAFREE(isp, hdp->cmd);
  484                         ISP_MEMZERO(&ctio, sizeof(ct7_entry_t));
  485                         ctio.ct_syshandle = hdp->handle;
  486                         ctio.ct_nphdl = CT_HBA_RESET;
  487                         ctio.ct_header.rqs_entry_type = RQSTYPE_CTIO7;
  488                         isp_async(isp, ISPASYNC_TARGET_ACTION, &ctio);
  489                         break;
  490                 }
  491 #endif
  492                 case ISP_HANDLE_CTRL:
  493                         ISP_MEMZERO(hdp->cmd, QENTRY_LEN);
  494                         wakeup(hdp->cmd);
  495                         isp_destroy_handle(isp, hdp->handle);
  496                         break;
  497                 }
  498         }
  499 #ifdef  ISP_TARGET_MODE
  500         for (tmp = 0; tmp < isp->isp_nchan; tmp++) {
  501                 ISP_MEMZERO(&notify, sizeof (isp_notify_t));
  502                 notify.nt_ncode = NT_HBA_RESET;
  503                 notify.nt_hba = isp;
  504                 notify.nt_wwn = INI_ANY;
  505                 notify.nt_nphdl = NIL_HANDLE;
  506                 notify.nt_sid = PORT_ANY;
  507                 notify.nt_did = PORT_ANY;
  508                 notify.nt_tgt = TGT_ANY;
  509                 notify.nt_channel = tmp;
  510                 notify.nt_lun = LUN_ANY;
  511                 notify.nt_tagval = TAG_ANY;
  512                 isp_async(isp, ISPASYNC_TARGET_NOTIFY, &notify);
  513         }
  514 #endif
  515 }
  516 
  517 /*
  518  * Functions to move stuff to a form that the QLogic RISC engine understands
  519  * and functions to move stuff back to a form the processor understands.
  520  *
  521  * Each platform is required to provide the 8, 16 and 32 bit
  522  * swizzle and unswizzle macros (ISP_IOX{PUT|GET}_{8,16,32})
  523  *
  524  * The assumption is that swizzling and unswizzling is mostly done 'in place'
  525  * (with a few exceptions for efficiency).
  526  */
  527 
  528 /*
  529  * Swizzle/Copy Functions
  530  */
  531 void
  532 isp_put_hdr(ispsoftc_t *isp, isphdr_t *hpsrc, isphdr_t *hpdst)
  533 {
  534         ISP_IOXPUT_8(isp, hpsrc->rqs_entry_type, &hpdst->rqs_entry_type);
  535         ISP_IOXPUT_8(isp, hpsrc->rqs_entry_count, &hpdst->rqs_entry_count);
  536         ISP_IOXPUT_8(isp, hpsrc->rqs_seqno, &hpdst->rqs_seqno);
  537         ISP_IOXPUT_8(isp, hpsrc->rqs_flags, &hpdst->rqs_flags);
  538 }
  539 
  540 void
  541 isp_get_hdr(ispsoftc_t *isp, isphdr_t *hpsrc, isphdr_t *hpdst)
  542 {
  543         ISP_IOXGET_8(isp, &hpsrc->rqs_entry_type, hpdst->rqs_entry_type);
  544         ISP_IOXGET_8(isp, &hpsrc->rqs_entry_count, hpdst->rqs_entry_count);
  545         ISP_IOXGET_8(isp, &hpsrc->rqs_seqno, hpdst->rqs_seqno);
  546         ISP_IOXGET_8(isp, &hpsrc->rqs_flags, hpdst->rqs_flags);
  547 }
  548 
  549 int
  550 isp_get_response_type(ispsoftc_t *isp, isphdr_t *hp)
  551 {
  552         uint8_t type;
  553         ISP_IOXGET_8(isp, &hp->rqs_entry_type, type);
  554         return ((int)type);
  555 }
  556 
  557 void
  558 isp_put_marker_24xx(ispsoftc_t *isp, isp_marker_24xx_t *src, isp_marker_24xx_t *dst)
  559 {
  560         int i;
  561         isp_put_hdr(isp, &src->mrk_header, &dst->mrk_header);
  562         ISP_IOXPUT_32(isp, src->mrk_handle, &dst->mrk_handle);
  563         ISP_IOXPUT_16(isp, src->mrk_nphdl, &dst->mrk_nphdl);
  564         ISP_IOXPUT_8(isp, src->mrk_modifier, &dst->mrk_modifier);
  565         ISP_IOXPUT_8(isp, src->mrk_reserved0, &dst->mrk_reserved0);
  566         ISP_IOXPUT_8(isp, src->mrk_reserved1, &dst->mrk_reserved1);
  567         ISP_IOXPUT_8(isp, src->mrk_vphdl, &dst->mrk_vphdl);
  568         ISP_IOXPUT_8(isp, src->mrk_reserved2, &dst->mrk_reserved2);
  569         for (i = 0; i < nitems(src->mrk_lun); i++) {
  570                 ISP_IOXPUT_8(isp, src->mrk_lun[i], &dst->mrk_lun[i]);
  571         }
  572         for (i = 0; i < nitems(src->mrk_reserved3); i++) {
  573                 ISP_IOXPUT_8(isp, src->mrk_reserved3[i], &dst->mrk_reserved3[i]);
  574         }
  575 }
  576 
  577 void
  578 isp_put_request_t7(ispsoftc_t *isp, ispreqt7_t *src, ispreqt7_t *dst)
  579 {
  580         int i;
  581         uint32_t *a, *b;
  582 
  583         isp_put_hdr(isp, &src->req_header, &dst->req_header);
  584         ISP_IOXPUT_32(isp, src->req_handle, &dst->req_handle);
  585         ISP_IOXPUT_16(isp, src->req_nphdl, &dst->req_nphdl);
  586         ISP_IOXPUT_16(isp, src->req_time, &dst->req_time);
  587         ISP_IOXPUT_16(isp, src->req_seg_count, &dst->req_seg_count);
  588         ISP_IOXPUT_16(isp, src->req_reserved, &dst->req_reserved);
  589         a = (uint32_t *) src->req_lun;
  590         b = (uint32_t *) dst->req_lun;
  591         for (i = 0; i < (nitems(src->req_lun) >> 2); i++ ) {
  592                 *b++ = ISP_SWAP32(isp, *a++);
  593         }
  594         ISP_IOXPUT_8(isp, src->req_alen_datadir, &dst->req_alen_datadir);
  595         ISP_IOXPUT_8(isp, src->req_task_management, &dst->req_task_management);
  596         ISP_IOXPUT_8(isp, src->req_task_attribute, &dst->req_task_attribute);
  597         ISP_IOXPUT_8(isp, src->req_crn, &dst->req_crn);
  598         a = (uint32_t *) src->req_cdb;
  599         b = (uint32_t *) dst->req_cdb;
  600         for (i = 0; i < (nitems(src->req_cdb) >> 2); i++) {
  601                 *b++ = ISP_SWAP32(isp, *a++);
  602         }
  603         ISP_IOXPUT_32(isp, src->req_dl, &dst->req_dl);
  604         ISP_IOXPUT_16(isp, src->req_tidlo, &dst->req_tidlo);
  605         ISP_IOXPUT_8(isp, src->req_tidhi, &dst->req_tidhi);
  606         ISP_IOXPUT_8(isp, src->req_vpidx, &dst->req_vpidx);
  607         ISP_IOXPUT_32(isp, src->req_dataseg.ds_base, &dst->req_dataseg.ds_base);
  608         ISP_IOXPUT_32(isp, src->req_dataseg.ds_basehi, &dst->req_dataseg.ds_basehi);
  609         ISP_IOXPUT_32(isp, src->req_dataseg.ds_count, &dst->req_dataseg.ds_count);
  610 }
  611 
  612 void
  613 isp_put_24xx_tmf(ispsoftc_t *isp, isp24xx_tmf_t *src, isp24xx_tmf_t *dst)
  614 {
  615         int i;
  616         uint32_t *a, *b;
  617 
  618         isp_put_hdr(isp, &src->tmf_header, &dst->tmf_header);
  619         ISP_IOXPUT_32(isp, src->tmf_handle, &dst->tmf_handle);
  620         ISP_IOXPUT_16(isp, src->tmf_nphdl, &dst->tmf_nphdl);
  621         ISP_IOXPUT_16(isp, src->tmf_delay, &dst->tmf_delay);
  622         ISP_IOXPUT_16(isp, src->tmf_timeout, &dst->tmf_timeout);
  623         for (i = 0; i < nitems(src->tmf_reserved0); i++) {
  624                 ISP_IOXPUT_8(isp, src->tmf_reserved0[i], &dst->tmf_reserved0[i]);
  625         }
  626         a = (uint32_t *) src->tmf_lun;
  627         b = (uint32_t *) dst->tmf_lun;
  628         for (i = 0; i < (nitems(src->tmf_lun) >> 2); i++ ) {
  629                 *b++ = ISP_SWAP32(isp, *a++);
  630         }
  631         ISP_IOXPUT_32(isp, src->tmf_flags, &dst->tmf_flags);
  632         for (i = 0; i < nitems(src->tmf_reserved1); i++) {
  633                 ISP_IOXPUT_8(isp, src->tmf_reserved1[i], &dst->tmf_reserved1[i]);
  634         }
  635         ISP_IOXPUT_16(isp, src->tmf_tidlo, &dst->tmf_tidlo);
  636         ISP_IOXPUT_8(isp, src->tmf_tidhi, &dst->tmf_tidhi);
  637         ISP_IOXPUT_8(isp, src->tmf_vpidx, &dst->tmf_vpidx);
  638         for (i = 0; i < nitems(src->tmf_reserved2); i++) {
  639                 ISP_IOXPUT_8(isp, src->tmf_reserved2[i], &dst->tmf_reserved2[i]);
  640         }
  641 }
  642 
  643 void
  644 isp_put_24xx_abrt(ispsoftc_t *isp, isp24xx_abrt_t *src, isp24xx_abrt_t *dst)
  645 {
  646         int i;
  647         isp_put_hdr(isp, &src->abrt_header, &dst->abrt_header);
  648         ISP_IOXPUT_32(isp, src->abrt_handle, &dst->abrt_handle);
  649         ISP_IOXPUT_16(isp, src->abrt_nphdl, &dst->abrt_nphdl);
  650         ISP_IOXPUT_16(isp, src->abrt_options, &dst->abrt_options);
  651         ISP_IOXPUT_32(isp, src->abrt_cmd_handle, &dst->abrt_cmd_handle);
  652         ISP_IOXPUT_16(isp, src->abrt_queue_number, &dst->abrt_queue_number);
  653         for (i = 0; i < nitems(src->abrt_reserved); i++) {
  654                 ISP_IOXPUT_8(isp, src->abrt_reserved[i], &dst->abrt_reserved[i]);
  655         }
  656         ISP_IOXPUT_16(isp, src->abrt_tidlo, &dst->abrt_tidlo);
  657         ISP_IOXPUT_8(isp, src->abrt_tidhi, &dst->abrt_tidhi);
  658         ISP_IOXPUT_8(isp, src->abrt_vpidx, &dst->abrt_vpidx);
  659         for (i = 0; i < nitems(src->abrt_reserved1); i++) {
  660                 ISP_IOXPUT_8(isp, src->abrt_reserved1[i], &dst->abrt_reserved1[i]);
  661         }
  662 }
  663 
  664 void
  665 isp_put_cont64_req(ispsoftc_t *isp, ispcontreq64_t *src, ispcontreq64_t *dst)
  666 {
  667         int i;
  668         isp_put_hdr(isp, &src->req_header, &dst->req_header);
  669         for (i = 0; i < ISP_CDSEG64; i++) {
  670                 ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_base, &dst->req_dataseg[i].ds_base);
  671                 ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_basehi, &dst->req_dataseg[i].ds_basehi);
  672                 ISP_IOXPUT_32(isp, src->req_dataseg[i].ds_count, &dst->req_dataseg[i].ds_count);
  673         }
  674 }
  675 
  676 void
  677 isp_get_cont_response(ispsoftc_t *isp, ispstatus_cont_t *src, ispstatus_cont_t *dst)
  678 {
  679         int i;
  680         uint32_t *a, *b;
  681 
  682         isp_get_hdr(isp, &src->req_header, &dst->req_header);
  683         a = (uint32_t *) src->req_sense_data;
  684         b = (uint32_t *) dst->req_sense_data;
  685         for (i = 0; i < (sizeof (src->req_sense_data) / sizeof (uint32_t)); i++)
  686                 ISP_IOZGET_32(isp, a++, *b++);
  687 }
  688 
  689 void
  690 isp_get_24xx_response(ispsoftc_t *isp, isp24xx_statusreq_t *src, isp24xx_statusreq_t *dst)
  691 {
  692         int i;
  693         uint32_t *s, *d;
  694 
  695         isp_get_hdr(isp, &src->req_header, &dst->req_header);
  696         ISP_IOXGET_32(isp, &src->req_handle, dst->req_handle);
  697         ISP_IOXGET_16(isp, &src->req_completion_status, dst->req_completion_status);
  698         ISP_IOXGET_16(isp, &src->req_oxid, dst->req_oxid);
  699         ISP_IOXGET_32(isp, &src->req_resid, dst->req_resid);
  700         ISP_IOXGET_16(isp, &src->req_reserved0, dst->req_reserved0);
  701         ISP_IOXGET_16(isp, &src->req_state_flags, dst->req_state_flags);
  702         ISP_IOXGET_16(isp, &src->req_retry_delay, dst->req_retry_delay);
  703         ISP_IOXGET_16(isp, &src->req_scsi_status, dst->req_scsi_status);
  704         ISP_IOXGET_32(isp, &src->req_fcp_residual, dst->req_fcp_residual);
  705         ISP_IOXGET_32(isp, &src->req_sense_len, dst->req_sense_len);
  706         ISP_IOXGET_32(isp, &src->req_response_len, dst->req_response_len);
  707         s = (uint32_t *)src->req_rsp_sense;
  708         d = (uint32_t *)dst->req_rsp_sense;
  709         for (i = 0; i < (nitems(src->req_rsp_sense) >> 2); i++) {
  710                 d[i] = ISP_SWAP32(isp, s[i]);
  711         }
  712 }
  713 
  714 void
  715 isp_get_24xx_abrt(ispsoftc_t *isp, isp24xx_abrt_t *src, isp24xx_abrt_t *dst)
  716 {
  717         int i;
  718         isp_get_hdr(isp, &src->abrt_header, &dst->abrt_header);
  719         ISP_IOXGET_32(isp, &src->abrt_handle, dst->abrt_handle);
  720         ISP_IOXGET_16(isp, &src->abrt_nphdl, dst->abrt_nphdl);
  721         ISP_IOXGET_16(isp, &src->abrt_options, dst->abrt_options);
  722         ISP_IOXGET_32(isp, &src->abrt_cmd_handle, dst->abrt_cmd_handle);
  723         ISP_IOXGET_16(isp, &src->abrt_queue_number, dst->abrt_queue_number);
  724         for (i = 0; i < nitems(src->abrt_reserved); i++) {
  725                 ISP_IOXGET_8(isp, &src->abrt_reserved[i], dst->abrt_reserved[i]);
  726         }
  727         ISP_IOXGET_16(isp, &src->abrt_tidlo, dst->abrt_tidlo);
  728         ISP_IOXGET_8(isp, &src->abrt_tidhi, dst->abrt_tidhi);
  729         ISP_IOXGET_8(isp, &src->abrt_vpidx, dst->abrt_vpidx);
  730         for (i = 0; i < nitems(src->abrt_reserved1); i++) {
  731                 ISP_IOXGET_8(isp, &src->abrt_reserved1[i], dst->abrt_reserved1[i]);
  732         }
  733 }
  734 
  735 void
  736 isp_put_icb_2400(ispsoftc_t *isp, isp_icb_2400_t *src, isp_icb_2400_t *dst)
  737 {
  738         int i;
  739         ISP_IOXPUT_16(isp, src->icb_version, &dst->icb_version);
  740         ISP_IOXPUT_16(isp, src->icb_reserved0, &dst->icb_reserved0);
  741         ISP_IOXPUT_16(isp, src->icb_maxfrmlen, &dst->icb_maxfrmlen);
  742         ISP_IOXPUT_16(isp, src->icb_execthrottle, &dst->icb_execthrottle);
  743         ISP_IOXPUT_16(isp, src->icb_xchgcnt, &dst->icb_xchgcnt);
  744         ISP_IOXPUT_16(isp, src->icb_hardaddr, &dst->icb_hardaddr);
  745         for (i = 0; i < 8; i++) {
  746                 ISP_IOXPUT_8(isp, src->icb_portname[i], &dst->icb_portname[i]);
  747         }
  748         for (i = 0; i < 8; i++) {
  749                 ISP_IOXPUT_8(isp, src->icb_nodename[i], &dst->icb_nodename[i]);
  750         }
  751         ISP_IOXPUT_16(isp, src->icb_rspnsin, &dst->icb_rspnsin);
  752         ISP_IOXPUT_16(isp, src->icb_rqstout, &dst->icb_rqstout);
  753         ISP_IOXPUT_16(isp, src->icb_retry_count, &dst->icb_retry_count);
  754         ISP_IOXPUT_16(isp, src->icb_priout, &dst->icb_priout);
  755         ISP_IOXPUT_16(isp, src->icb_rsltqlen, &dst->icb_rsltqlen);
  756         ISP_IOXPUT_16(isp, src->icb_rqstqlen, &dst->icb_rqstqlen);
  757         ISP_IOXPUT_16(isp, src->icb_ldn_nols, &dst->icb_ldn_nols);
  758         ISP_IOXPUT_16(isp, src->icb_prqstqlen, &dst->icb_prqstqlen);
  759         for (i = 0; i < 4; i++) {
  760                 ISP_IOXPUT_16(isp, src->icb_rqstaddr[i], &dst->icb_rqstaddr[i]);
  761         }
  762         for (i = 0; i < 4; i++) {
  763                 ISP_IOXPUT_16(isp, src->icb_respaddr[i], &dst->icb_respaddr[i]);
  764         }
  765         for (i = 0; i < 4; i++) {
  766                 ISP_IOXPUT_16(isp, src->icb_priaddr[i], &dst->icb_priaddr[i]);
  767         }
  768         ISP_IOXPUT_16(isp, src->icb_msixresp, &dst->icb_msixresp);
  769         ISP_IOXPUT_16(isp, src->icb_msixatio, &dst->icb_msixatio);
  770         for (i = 0; i < 2; i++) {
  771                 ISP_IOXPUT_16(isp, src->icb_reserved1[i], &dst->icb_reserved1[i]);
  772         }
  773         ISP_IOXPUT_16(isp, src->icb_atio_in, &dst->icb_atio_in);
  774         ISP_IOXPUT_16(isp, src->icb_atioqlen, &dst->icb_atioqlen);
  775         for (i = 0; i < 4; i++) {
  776                 ISP_IOXPUT_16(isp, src->icb_atioqaddr[i], &dst->icb_atioqaddr[i]);
  777         }
  778         ISP_IOXPUT_16(isp, src->icb_idelaytimer, &dst->icb_idelaytimer);
  779         ISP_IOXPUT_16(isp, src->icb_logintime, &dst->icb_logintime);
  780         ISP_IOXPUT_32(isp, src->icb_fwoptions1, &dst->icb_fwoptions1);
  781         ISP_IOXPUT_32(isp, src->icb_fwoptions2, &dst->icb_fwoptions2);
  782         ISP_IOXPUT_32(isp, src->icb_fwoptions3, &dst->icb_fwoptions3);
  783         ISP_IOXPUT_16(isp, src->icb_qos, &dst->icb_qos);
  784         for (i = 0; i < 3; i++)
  785                 ISP_IOXPUT_16(isp, src->icb_reserved2[i], &dst->icb_reserved2[i]);
  786         for (i = 0; i < 6; i++)
  787                 ISP_IOXPUT_8(isp, src->icb_enodemac[i], &dst->icb_enodemac[i]);
  788         ISP_IOXPUT_16(isp, src->icb_disctime, &dst->icb_disctime);
  789         for (i = 0; i < 4; i++)
  790                 ISP_IOXPUT_16(isp, src->icb_reserved3[i], &dst->icb_reserved3[i]);
  791 }
  792 
  793 void
  794 isp_put_icb_2400_vpinfo(ispsoftc_t *isp, isp_icb_2400_vpinfo_t *src, isp_icb_2400_vpinfo_t *dst)
  795 {
  796         ISP_IOXPUT_16(isp, src->vp_count, &dst->vp_count);
  797         ISP_IOXPUT_16(isp, src->vp_global_options, &dst->vp_global_options);
  798 }
  799 
  800 void
  801 isp_put_vp_port_info(ispsoftc_t *isp, vp_port_info_t *src, vp_port_info_t *dst)
  802 {
  803         int i;
  804         ISP_IOXPUT_16(isp, src->vp_port_status, &dst->vp_port_status);
  805         ISP_IOXPUT_8(isp, src->vp_port_options, &dst->vp_port_options);
  806         ISP_IOXPUT_8(isp, src->vp_port_loopid, &dst->vp_port_loopid);
  807         for (i = 0; i < 8; i++) {
  808                 ISP_IOXPUT_8(isp, src->vp_port_portname[i], &dst->vp_port_portname[i]);
  809         }
  810         for (i = 0; i < 8; i++) {
  811                 ISP_IOXPUT_8(isp, src->vp_port_nodename[i], &dst->vp_port_nodename[i]);
  812         }
  813         /* we never *put* portid_lo/portid_hi */
  814 }
  815 
  816 void
  817 isp_get_vp_port_info(ispsoftc_t *isp, vp_port_info_t *src, vp_port_info_t *dst)
  818 {
  819         int i;
  820         ISP_IOXGET_16(isp, &src->vp_port_status, dst->vp_port_status);
  821         ISP_IOXGET_8(isp, &src->vp_port_options, dst->vp_port_options);
  822         ISP_IOXGET_8(isp, &src->vp_port_loopid, dst->vp_port_loopid);
  823         for (i = 0; i < nitems(src->vp_port_portname); i++) {
  824                 ISP_IOXGET_8(isp, &src->vp_port_portname[i], dst->vp_port_portname[i]);
  825         }
  826         for (i = 0; i < nitems(src->vp_port_nodename); i++) {
  827                 ISP_IOXGET_8(isp, &src->vp_port_nodename[i], dst->vp_port_nodename[i]);
  828         }
  829         ISP_IOXGET_16(isp, &src->vp_port_portid_lo, dst->vp_port_portid_lo);
  830         ISP_IOXGET_16(isp, &src->vp_port_portid_hi, dst->vp_port_portid_hi);
  831 }
  832 
  833 void
  834 isp_put_vp_ctrl_info(ispsoftc_t *isp, vp_ctrl_info_t *src, vp_ctrl_info_t *dst)
  835 {
  836         int i;
  837         isp_put_hdr(isp, &src->vp_ctrl_hdr, &dst->vp_ctrl_hdr);
  838         ISP_IOXPUT_32(isp, src->vp_ctrl_handle, &dst->vp_ctrl_handle);
  839         ISP_IOXPUT_16(isp, src->vp_ctrl_index_fail, &dst->vp_ctrl_index_fail);
  840         ISP_IOXPUT_16(isp, src->vp_ctrl_status, &dst->vp_ctrl_status);
  841         ISP_IOXPUT_16(isp, src->vp_ctrl_command, &dst->vp_ctrl_command);
  842         ISP_IOXPUT_16(isp, src->vp_ctrl_vp_count, &dst->vp_ctrl_vp_count);
  843         for (i = 0; i < nitems(src->vp_ctrl_idmap); i++) {
  844                 ISP_IOXPUT_16(isp, src->vp_ctrl_idmap[i], &dst->vp_ctrl_idmap[i]);
  845         }
  846         for (i = 0; i < nitems(src->vp_ctrl_reserved); i++) {
  847                 ISP_IOXPUT_16(isp, src->vp_ctrl_reserved[i], &dst->vp_ctrl_reserved[i]);
  848         }
  849         ISP_IOXPUT_16(isp, src->vp_ctrl_fcf_index, &dst->vp_ctrl_fcf_index);
  850 }
  851 
  852 void
  853 isp_get_vp_ctrl_info(ispsoftc_t *isp, vp_ctrl_info_t *src, vp_ctrl_info_t *dst)
  854 {
  855         int i;
  856         isp_get_hdr(isp, &src->vp_ctrl_hdr, &dst->vp_ctrl_hdr);
  857         ISP_IOXGET_32(isp, &src->vp_ctrl_handle, dst->vp_ctrl_handle);
  858         ISP_IOXGET_16(isp, &src->vp_ctrl_index_fail, dst->vp_ctrl_index_fail);
  859         ISP_IOXGET_16(isp, &src->vp_ctrl_status, dst->vp_ctrl_status);
  860         ISP_IOXGET_16(isp, &src->vp_ctrl_command, dst->vp_ctrl_command);
  861         ISP_IOXGET_16(isp, &src->vp_ctrl_vp_count, dst->vp_ctrl_vp_count);
  862         for (i = 0; i < nitems(src->vp_ctrl_idmap); i++) {
  863                 ISP_IOXGET_16(isp, &src->vp_ctrl_idmap[i], dst->vp_ctrl_idmap[i]);
  864         }
  865         for (i = 0; i < nitems(src->vp_ctrl_reserved); i++) {
  866                 ISP_IOXGET_16(isp, &src->vp_ctrl_reserved[i], dst->vp_ctrl_reserved[i]);
  867         }
  868         ISP_IOXGET_16(isp, &src->vp_ctrl_fcf_index, dst->vp_ctrl_fcf_index);
  869 }
  870 
  871 void
  872 isp_put_vp_modify(ispsoftc_t *isp, vp_modify_t *src, vp_modify_t *dst)
  873 {
  874         int i, j;
  875         isp_put_hdr(isp, &src->vp_mod_hdr, &dst->vp_mod_hdr);
  876         ISP_IOXPUT_32(isp, src->vp_mod_hdl, &dst->vp_mod_hdl);
  877         ISP_IOXPUT_16(isp, src->vp_mod_reserved0, &dst->vp_mod_reserved0);
  878         ISP_IOXPUT_16(isp, src->vp_mod_status, &dst->vp_mod_status);
  879         ISP_IOXPUT_8(isp, src->vp_mod_cmd, &dst->vp_mod_cmd);
  880         ISP_IOXPUT_8(isp, src->vp_mod_cnt, &dst->vp_mod_cnt);
  881         ISP_IOXPUT_8(isp, src->vp_mod_idx0, &dst->vp_mod_idx0);
  882         ISP_IOXPUT_8(isp, src->vp_mod_idx1, &dst->vp_mod_idx1);
  883         for (i = 0; i < nitems(src->vp_mod_ports); i++) {
  884                 ISP_IOXPUT_8(isp, src->vp_mod_ports[i].options, &dst->vp_mod_ports[i].options);
  885                 ISP_IOXPUT_8(isp, src->vp_mod_ports[i].loopid, &dst->vp_mod_ports[i].loopid);
  886                 ISP_IOXPUT_16(isp, src->vp_mod_ports[i].reserved1, &dst->vp_mod_ports[i].reserved1);
  887                 for (j = 0; j < nitems(src->vp_mod_ports[i].wwpn); j++) {
  888                         ISP_IOXPUT_8(isp, src->vp_mod_ports[i].wwpn[j], &dst->vp_mod_ports[i].wwpn[j]);
  889                 }
  890                 for (j = 0; j < nitems(src->vp_mod_ports[i].wwnn); j++) {
  891                         ISP_IOXPUT_8(isp, src->vp_mod_ports[i].wwnn[j], &dst->vp_mod_ports[i].wwnn[j]);
  892                 }
  893         }
  894         for (i = 0; i < nitems(src->vp_mod_reserved2); i++) {
  895                 ISP_IOXPUT_8(isp, src->vp_mod_reserved2[i], &dst->vp_mod_reserved2[i]);
  896         }
  897 }
  898 
  899 void
  900 isp_get_vp_modify(ispsoftc_t *isp, vp_modify_t *src, vp_modify_t *dst)
  901 {
  902         int i, j;
  903         isp_get_hdr(isp, &src->vp_mod_hdr, &dst->vp_mod_hdr);
  904         ISP_IOXGET_32(isp, &src->vp_mod_hdl, dst->vp_mod_hdl);
  905         ISP_IOXGET_16(isp, &src->vp_mod_reserved0, dst->vp_mod_reserved0);
  906         ISP_IOXGET_16(isp, &src->vp_mod_status, dst->vp_mod_status);
  907         ISP_IOXGET_8(isp, &src->vp_mod_cmd, dst->vp_mod_cmd);
  908         ISP_IOXGET_8(isp, &src->vp_mod_cnt, dst->vp_mod_cnt);
  909         ISP_IOXGET_8(isp, &src->vp_mod_idx0, dst->vp_mod_idx0);
  910         ISP_IOXGET_8(isp, &src->vp_mod_idx1, dst->vp_mod_idx1);
  911         for (i = 0; i < nitems(src->vp_mod_ports); i++) {
  912                 ISP_IOXGET_8(isp, &src->vp_mod_ports[i].options, dst->vp_mod_ports[i].options);
  913                 ISP_IOXGET_8(isp, &src->vp_mod_ports[i].loopid, dst->vp_mod_ports[i].loopid);
  914                 ISP_IOXGET_16(isp, &src->vp_mod_ports[i].reserved1, dst->vp_mod_ports[i].reserved1);
  915                 for (j = 0; j < nitems(src->vp_mod_ports[i].wwpn); j++) {
  916                         ISP_IOXGET_8(isp, &src->vp_mod_ports[i].wwpn[j], dst->vp_mod_ports[i].wwpn[j]);
  917                 }
  918                 for (j = 0; j < nitems(src->vp_mod_ports[i].wwnn); j++) {
  919                         ISP_IOXGET_8(isp, &src->vp_mod_ports[i].wwnn[j], dst->vp_mod_ports[i].wwnn[j]);
  920                 }
  921         }
  922         for (i = 0; i < nitems(src->vp_mod_reserved2); i++) {
  923                 ISP_IOXGET_8(isp, &src->vp_mod_reserved2[i], dst->vp_mod_reserved2[i]);
  924         }
  925 }
  926 
  927 void
  928 isp_get_pdb_24xx(ispsoftc_t *isp, isp_pdb_24xx_t *src, isp_pdb_24xx_t *dst)
  929 {
  930         int i;
  931         ISP_IOXGET_16(isp, &src->pdb_flags, dst->pdb_flags);
  932         ISP_IOXGET_8(isp, &src->pdb_curstate, dst->pdb_curstate);
  933         ISP_IOXGET_8(isp, &src->pdb_laststate, dst->pdb_laststate);
  934         for (i = 0; i < 4; i++) {
  935                 ISP_IOXGET_8(isp, &src->pdb_hardaddr_bits[i], dst->pdb_hardaddr_bits[i]);
  936         }
  937         for (i = 0; i < 4; i++) {
  938                 ISP_IOXGET_8(isp, &src->pdb_portid_bits[i], dst->pdb_portid_bits[i]);
  939         }
  940         ISP_IOXGET_16(isp, &src->pdb_retry_timer, dst->pdb_retry_timer);
  941         ISP_IOXGET_16(isp, &src->pdb_handle, dst->pdb_handle);
  942         ISP_IOXGET_16(isp, &src->pdb_rcv_dsize, dst->pdb_rcv_dsize);
  943         ISP_IOXGET_16(isp, &src->pdb_reserved0, dst->pdb_reserved0);
  944         ISP_IOXGET_16(isp, &src->pdb_prli_svc0, dst->pdb_prli_svc0);
  945         ISP_IOXGET_16(isp, &src->pdb_prli_svc3, dst->pdb_prli_svc3);
  946         for (i = 0; i < 8; i++) {
  947                 ISP_IOXGET_8(isp, &src->pdb_nodename[i], dst->pdb_nodename[i]);
  948         }
  949         for (i = 0; i < 8; i++) {
  950                 ISP_IOXGET_8(isp, &src->pdb_portname[i], dst->pdb_portname[i]);
  951         }
  952         for (i = 0; i < 24; i++) {
  953                 ISP_IOXGET_8(isp, &src->pdb_reserved1[i], dst->pdb_reserved1[i]);
  954         }
  955 }
  956 
  957 void
  958 isp_get_pnhle_24xx(ispsoftc_t *isp, isp_pnhle_24xx_t *src, isp_pnhle_24xx_t *dst)
  959 {
  960 
  961         ISP_IOXGET_16(isp, &src->pnhle_port_id_lo, dst->pnhle_port_id_lo);
  962         ISP_IOXGET_16(isp, &src->pnhle_port_id_hi, dst->pnhle_port_id_hi);
  963         ISP_IOXGET_16(isp, &src->pnhle_handle, dst->pnhle_handle);
  964         ISP_IOXGET_16(isp, &src->pnhle_reserved, dst->pnhle_reserved);
  965 }
  966 
  967 /*
  968  * PLOGI/LOGO IOCB canonicalization
  969  */
  970 
  971 void
  972 isp_get_plogx(ispsoftc_t *isp, isp_plogx_t *src, isp_plogx_t *dst)
  973 {
  974         int i;
  975         isp_get_hdr(isp, &src->plogx_header, &dst->plogx_header);
  976         ISP_IOXGET_32(isp, &src->plogx_handle, dst->plogx_handle);
  977         ISP_IOXGET_16(isp, &src->plogx_status, dst->plogx_status);
  978         ISP_IOXGET_16(isp, &src->plogx_nphdl, dst->plogx_nphdl);
  979         ISP_IOXGET_16(isp, &src->plogx_flags, dst->plogx_flags);
  980         ISP_IOXGET_16(isp, &src->plogx_vphdl, dst->plogx_vphdl);
  981         ISP_IOXGET_16(isp, &src->plogx_portlo, dst->plogx_portlo);
  982         ISP_IOXGET_16(isp, &src->plogx_rspsz_porthi, dst->plogx_rspsz_porthi);
  983         for (i = 0; i < 11; i++) {
  984                 ISP_IOXGET_16(isp, &src->plogx_ioparm[i].lo16, dst->plogx_ioparm[i].lo16);
  985                 ISP_IOXGET_16(isp, &src->plogx_ioparm[i].hi16, dst->plogx_ioparm[i].hi16);
  986         }
  987 }
  988 
  989 void
  990 isp_put_plogx(ispsoftc_t *isp, isp_plogx_t *src, isp_plogx_t *dst)
  991 {
  992         int i;
  993         isp_put_hdr(isp, &src->plogx_header, &dst->plogx_header);
  994         ISP_IOXPUT_32(isp, src->plogx_handle, &dst->plogx_handle);
  995         ISP_IOXPUT_16(isp, src->plogx_status, &dst->plogx_status);
  996         ISP_IOXPUT_16(isp, src->plogx_nphdl, &dst->plogx_nphdl);
  997         ISP_IOXPUT_16(isp, src->plogx_flags, &dst->plogx_flags);
  998         ISP_IOXPUT_16(isp, src->plogx_vphdl, &dst->plogx_vphdl);
  999         ISP_IOXPUT_16(isp, src->plogx_portlo, &dst->plogx_portlo);
 1000         ISP_IOXPUT_16(isp, src->plogx_rspsz_porthi, &dst->plogx_rspsz_porthi);
 1001         for (i = 0; i < 11; i++) {
 1002                 ISP_IOXPUT_16(isp, src->plogx_ioparm[i].lo16, &dst->plogx_ioparm[i].lo16);
 1003                 ISP_IOXPUT_16(isp, src->plogx_ioparm[i].hi16, &dst->plogx_ioparm[i].hi16);
 1004         }
 1005 }
 1006 
 1007 /*
 1008  * Report ID canonicalization
 1009  */
 1010 void
 1011 isp_get_ridacq(ispsoftc_t *isp, isp_ridacq_t *src, isp_ridacq_t *dst)
 1012 {
 1013         int i;
 1014         isp_get_hdr(isp, &src->ridacq_hdr, &dst->ridacq_hdr);
 1015         ISP_IOXGET_32(isp, &src->ridacq_handle, dst->ridacq_handle);
 1016         ISP_IOXGET_8(isp, &src->ridacq_vp_acquired, dst->ridacq_vp_acquired);
 1017         ISP_IOXGET_8(isp, &src->ridacq_vp_setup, dst->ridacq_vp_setup);
 1018         ISP_IOXGET_8(isp, &src->ridacq_vp_index, dst->ridacq_vp_index);
 1019         ISP_IOXGET_8(isp, &src->ridacq_vp_status, dst->ridacq_vp_status);
 1020         ISP_IOXGET_16(isp, &src->ridacq_vp_port_lo, dst->ridacq_vp_port_lo);
 1021         ISP_IOXGET_8(isp, &src->ridacq_vp_port_hi, dst->ridacq_vp_port_hi);
 1022         ISP_IOXGET_8(isp, &src->ridacq_format, dst->ridacq_format);
 1023         for (i = 0; i < sizeof (src->ridacq_map) / sizeof (src->ridacq_map[0]); i++) {
 1024                 ISP_IOXGET_16(isp, &src->ridacq_map[i], dst->ridacq_map[i]);
 1025         }
 1026         for (i = 0; i < sizeof (src->ridacq_reserved1) / sizeof (src->ridacq_reserved1[0]); i++) {
 1027                 ISP_IOXGET_16(isp, &src->ridacq_reserved1[i], dst->ridacq_reserved1[i]);
 1028         }
 1029 }
 1030 
 1031 
 1032 /*
 1033  * CT Passthru canonicalization
 1034  */
 1035 void
 1036 isp_get_ct_pt(ispsoftc_t *isp, isp_ct_pt_t *src, isp_ct_pt_t *dst)
 1037 {
 1038         int i;
 1039 
 1040         isp_get_hdr(isp, &src->ctp_header, &dst->ctp_header);
 1041         ISP_IOXGET_32(isp, &src->ctp_handle, dst->ctp_handle);
 1042         ISP_IOXGET_16(isp, &src->ctp_status, dst->ctp_status);
 1043         ISP_IOXGET_16(isp, &src->ctp_nphdl, dst->ctp_nphdl);
 1044         ISP_IOXGET_16(isp, &src->ctp_cmd_cnt, dst->ctp_cmd_cnt);
 1045         ISP_IOXGET_8(isp, &src->ctp_vpidx, dst->ctp_vpidx);
 1046         ISP_IOXGET_8(isp, &src->ctp_reserved0, dst->ctp_reserved0);
 1047         ISP_IOXGET_16(isp, &src->ctp_time, dst->ctp_time);
 1048         ISP_IOXGET_16(isp, &src->ctp_reserved1, dst->ctp_reserved1);
 1049         ISP_IOXGET_16(isp, &src->ctp_rsp_cnt, dst->ctp_rsp_cnt);
 1050         for (i = 0; i < 5; i++) {
 1051                 ISP_IOXGET_16(isp, &src->ctp_reserved2[i], dst->ctp_reserved2[i]);
 1052         }
 1053         ISP_IOXGET_32(isp, &src->ctp_rsp_bcnt, dst->ctp_rsp_bcnt);
 1054         ISP_IOXGET_32(isp, &src->ctp_cmd_bcnt, dst->ctp_cmd_bcnt);
 1055         for (i = 0; i < 2; i++) {
 1056                 ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_base, dst->ctp_dataseg[i].ds_base);
 1057                 ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_basehi, dst->ctp_dataseg[i].ds_basehi);
 1058                 ISP_IOXGET_32(isp, &src->ctp_dataseg[i].ds_count, dst->ctp_dataseg[i].ds_count);
 1059         }
 1060 }
 1061 
 1062 void
 1063 isp_put_ct_pt(ispsoftc_t *isp, isp_ct_pt_t *src, isp_ct_pt_t *dst)
 1064 {
 1065         int i;
 1066 
 1067         isp_put_hdr(isp, &src->ctp_header, &dst->ctp_header);
 1068         ISP_IOXPUT_32(isp, src->ctp_handle, &dst->ctp_handle);
 1069         ISP_IOXPUT_16(isp, src->ctp_status, &dst->ctp_status);
 1070         ISP_IOXPUT_16(isp, src->ctp_nphdl, &dst->ctp_nphdl);
 1071         ISP_IOXPUT_16(isp, src->ctp_cmd_cnt, &dst->ctp_cmd_cnt);
 1072         ISP_IOXPUT_8(isp, src->ctp_vpidx, &dst->ctp_vpidx);
 1073         ISP_IOXPUT_8(isp, src->ctp_reserved0, &dst->ctp_reserved0);
 1074         ISP_IOXPUT_16(isp, src->ctp_time, &dst->ctp_time);
 1075         ISP_IOXPUT_16(isp, src->ctp_reserved1, &dst->ctp_reserved1);
 1076         ISP_IOXPUT_16(isp, src->ctp_rsp_cnt, &dst->ctp_rsp_cnt);
 1077         for (i = 0; i < 5; i++) {
 1078                 ISP_IOXPUT_16(isp, src->ctp_reserved2[i], &dst->ctp_reserved2[i]);
 1079         }
 1080         ISP_IOXPUT_32(isp, src->ctp_rsp_bcnt, &dst->ctp_rsp_bcnt);
 1081         ISP_IOXPUT_32(isp, src->ctp_cmd_bcnt, &dst->ctp_cmd_bcnt);
 1082         for (i = 0; i < 2; i++) {
 1083                 ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_base, &dst->ctp_dataseg[i].ds_base);
 1084                 ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_basehi, &dst->ctp_dataseg[i].ds_basehi);
 1085                 ISP_IOXPUT_32(isp, src->ctp_dataseg[i].ds_count, &dst->ctp_dataseg[i].ds_count);
 1086         }
 1087 }
 1088 
 1089 void
 1090 isp_put_gid_ft_request(ispsoftc_t *isp, sns_gid_ft_req_t *src, sns_gid_ft_req_t *dst)
 1091 {
 1092         ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
 1093         ISP_IOXPUT_16(isp, src->snscb_reserved0, &dst->snscb_reserved0);
 1094         ISP_IOXPUT_16(isp, src->snscb_addr[0], &dst->snscb_addr[0]);
 1095         ISP_IOXPUT_16(isp, src->snscb_addr[1], &dst->snscb_addr[1]);
 1096         ISP_IOXPUT_16(isp, src->snscb_addr[2], &dst->snscb_addr[2]);
 1097         ISP_IOXPUT_16(isp, src->snscb_addr[3], &dst->snscb_addr[3]);
 1098         ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
 1099         ISP_IOXPUT_16(isp, src->snscb_reserved1, &dst->snscb_reserved1);
 1100         ISP_IOXPUT_16(isp, src->snscb_cmd, &dst->snscb_cmd);
 1101         ISP_IOXPUT_16(isp, src->snscb_mword_div_2, &dst->snscb_mword_div_2);
 1102         ISP_IOXPUT_32(isp, src->snscb_reserved3, &dst->snscb_reserved3);
 1103         ISP_IOXPUT_32(isp, src->snscb_fc4_type, &dst->snscb_fc4_type);
 1104 }
 1105 
 1106 void
 1107 isp_get_gid_xx_response(ispsoftc_t *isp, sns_gid_xx_rsp_t *src, sns_gid_xx_rsp_t *dst, int nwords)
 1108 {
 1109         int i, j;
 1110 
 1111         isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
 1112         for (i = 0; i < nwords; i++) {
 1113                 ISP_IOZGET_8(isp, &src->snscb_ports[i].control,
 1114                     dst->snscb_ports[i].control);
 1115                 for (j = 0; j < 3; j++) {
 1116                         ISP_IOZGET_8(isp, &src->snscb_ports[i].portid[j],
 1117                             dst->snscb_ports[i].portid[j]);
 1118                 }
 1119                 if (dst->snscb_ports[i].control & 0x80)
 1120                         break;
 1121         }
 1122 }
 1123 
 1124 void
 1125 isp_get_gxn_id_response(ispsoftc_t *isp, sns_gxn_id_rsp_t *src, sns_gxn_id_rsp_t *dst)
 1126 {
 1127         int i;
 1128 
 1129         isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
 1130         for (i = 0; i < 8; i++)
 1131                 ISP_IOZGET_8(isp, &src->snscb_wwn[i], dst->snscb_wwn[i]);
 1132 }
 1133 
 1134 void
 1135 isp_get_gft_id_response(ispsoftc_t *isp, sns_gft_id_rsp_t *src, sns_gft_id_rsp_t *dst)
 1136 {
 1137         int i;
 1138 
 1139         isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
 1140         for (i = 0; i < 8; i++) {
 1141                 ISP_IOZGET_32(isp, &src->snscb_fc4_types[i],
 1142                     dst->snscb_fc4_types[i]);
 1143         }
 1144 }
 1145 
 1146 void
 1147 isp_get_gff_id_response(ispsoftc_t *isp, sns_gff_id_rsp_t *src, sns_gff_id_rsp_t *dst)
 1148 {
 1149         int i;
 1150 
 1151         isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
 1152         for (i = 0; i < 32; i++) {
 1153                 ISP_IOZGET_32(isp, &src->snscb_fc4_features[i],
 1154                     dst->snscb_fc4_features[i]);
 1155         }
 1156 }
 1157 
 1158 void
 1159 isp_get_ga_nxt_response(ispsoftc_t *isp, sns_ga_nxt_rsp_t *src, sns_ga_nxt_rsp_t *dst)
 1160 {
 1161         int i;
 1162         isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
 1163         ISP_IOZGET_8(isp, &src->snscb_port_type, dst->snscb_port_type);
 1164         for (i = 0; i < 3; i++) {
 1165                 ISP_IOZGET_8(isp, &src->snscb_port_id[i], dst->snscb_port_id[i]);
 1166         }
 1167         for (i = 0; i < 8; i++) {
 1168                 ISP_IOZGET_8(isp, &src->snscb_portname[i], dst->snscb_portname[i]);
 1169         }
 1170         ISP_IOZGET_8(isp, &src->snscb_pnlen, dst->snscb_pnlen);
 1171         for (i = 0; i < 255; i++) {
 1172                 ISP_IOZGET_8(isp, &src->snscb_pname[i], dst->snscb_pname[i]);
 1173         }
 1174         for (i = 0; i < 8; i++) {
 1175                 ISP_IOZGET_8(isp, &src->snscb_nodename[i], dst->snscb_nodename[i]);
 1176         }
 1177         ISP_IOZGET_8(isp, &src->snscb_nnlen, dst->snscb_nnlen);
 1178         for (i = 0; i < 255; i++) {
 1179                 ISP_IOZGET_8(isp, &src->snscb_nname[i], dst->snscb_nname[i]);
 1180         }
 1181         for (i = 0; i < 8; i++) {
 1182                 ISP_IOZGET_8(isp, &src->snscb_ipassoc[i], dst->snscb_ipassoc[i]);
 1183         }
 1184         for (i = 0; i < 16; i++) {
 1185                 ISP_IOZGET_8(isp, &src->snscb_ipaddr[i], dst->snscb_ipaddr[i]);
 1186         }
 1187         for (i = 0; i < 4; i++) {
 1188                 ISP_IOZGET_8(isp, &src->snscb_svc_class[i], dst->snscb_svc_class[i]);
 1189         }
 1190         for (i = 0; i < 32; i++) {
 1191                 ISP_IOZGET_8(isp, &src->snscb_fc4_types[i], dst->snscb_fc4_types[i]);
 1192         }
 1193         for (i = 0; i < 8; i++) {
 1194                 ISP_IOZGET_8(isp, &src->snscb_fpname[i], dst->snscb_fpname[i]);
 1195         }
 1196         ISP_IOZGET_8(isp, &src->snscb_reserved, dst->snscb_reserved);
 1197         for (i = 0; i < 3; i++) {
 1198                 ISP_IOZGET_8(isp, &src->snscb_hardaddr[i], dst->snscb_hardaddr[i]);
 1199         }
 1200 }
 1201 
 1202 /*
 1203  * FC Structure Canonicalization
 1204  */
 1205 
 1206 void
 1207 isp_get_fc_hdr(ispsoftc_t *isp, fc_hdr_t *src, fc_hdr_t *dst)
 1208 {
 1209         ISP_IOZGET_8(isp, &src->r_ctl, dst->r_ctl);
 1210         ISP_IOZGET_8(isp, &src->d_id[0], dst->d_id[0]);
 1211         ISP_IOZGET_8(isp, &src->d_id[1], dst->d_id[1]);
 1212         ISP_IOZGET_8(isp, &src->d_id[2], dst->d_id[2]);
 1213         ISP_IOZGET_8(isp, &src->cs_ctl, dst->cs_ctl);
 1214         ISP_IOZGET_8(isp, &src->s_id[0], dst->s_id[0]);
 1215         ISP_IOZGET_8(isp, &src->s_id[1], dst->s_id[1]);
 1216         ISP_IOZGET_8(isp, &src->s_id[2], dst->s_id[2]);
 1217         ISP_IOZGET_8(isp, &src->type, dst->type);
 1218         ISP_IOZGET_8(isp, &src->f_ctl[0], dst->f_ctl[0]);
 1219         ISP_IOZGET_8(isp, &src->f_ctl[1], dst->f_ctl[1]);
 1220         ISP_IOZGET_8(isp, &src->f_ctl[2], dst->f_ctl[2]);
 1221         ISP_IOZGET_8(isp, &src->seq_id, dst->seq_id);
 1222         ISP_IOZGET_8(isp, &src->df_ctl, dst->df_ctl);
 1223         ISP_IOZGET_16(isp, &src->seq_cnt, dst->seq_cnt);
 1224         ISP_IOZGET_16(isp, &src->ox_id, dst->ox_id);
 1225         ISP_IOZGET_16(isp, &src->rx_id, dst->rx_id);
 1226         ISP_IOZGET_32(isp, &src->parameter, dst->parameter);
 1227 }
 1228 
 1229 void
 1230 isp_put_fc_hdr(ispsoftc_t *isp, fc_hdr_t *src, fc_hdr_t *dst)
 1231 {
 1232         ISP_IOZPUT_8(isp, src->r_ctl, &dst->r_ctl);
 1233         ISP_IOZPUT_8(isp, src->d_id[0], &dst->d_id[0]);
 1234         ISP_IOZPUT_8(isp, src->d_id[1], &dst->d_id[1]);
 1235         ISP_IOZPUT_8(isp, src->d_id[2], &dst->d_id[2]);
 1236         ISP_IOZPUT_8(isp, src->cs_ctl, &dst->cs_ctl);
 1237         ISP_IOZPUT_8(isp, src->s_id[0], &dst->s_id[0]);
 1238         ISP_IOZPUT_8(isp, src->s_id[1], &dst->s_id[1]);
 1239         ISP_IOZPUT_8(isp, src->s_id[2], &dst->s_id[2]);
 1240         ISP_IOZPUT_8(isp, src->type, &dst->type);
 1241         ISP_IOZPUT_8(isp, src->f_ctl[0], &dst->f_ctl[0]);
 1242         ISP_IOZPUT_8(isp, src->f_ctl[1], &dst->f_ctl[1]);
 1243         ISP_IOZPUT_8(isp, src->f_ctl[2], &dst->f_ctl[2]);
 1244         ISP_IOZPUT_8(isp, src->seq_id, &dst->seq_id);
 1245         ISP_IOZPUT_8(isp, src->df_ctl, &dst->df_ctl);
 1246         ISP_IOZPUT_16(isp, src->seq_cnt, &dst->seq_cnt);
 1247         ISP_IOZPUT_16(isp, src->ox_id, &dst->ox_id);
 1248         ISP_IOZPUT_16(isp, src->rx_id, &dst->rx_id);
 1249         ISP_IOZPUT_32(isp, src->parameter, &dst->parameter);
 1250 }
 1251 
 1252 void
 1253 isp_get_fcp_cmnd_iu(ispsoftc_t *isp, fcp_cmnd_iu_t *src, fcp_cmnd_iu_t *dst)
 1254 {
 1255         int i;
 1256 
 1257         for (i = 0; i < 8; i++) {
 1258                 ISP_IOZGET_8(isp, &src->fcp_cmnd_lun[i], dst->fcp_cmnd_lun[i]);
 1259         }
 1260         ISP_IOZGET_8(isp, &src->fcp_cmnd_crn, dst->fcp_cmnd_crn);
 1261         ISP_IOZGET_8(isp, &src->fcp_cmnd_task_attribute, dst->fcp_cmnd_task_attribute);
 1262         ISP_IOZGET_8(isp, &src->fcp_cmnd_task_management, dst->fcp_cmnd_task_management);
 1263         ISP_IOZGET_8(isp, &src->fcp_cmnd_alen_datadir, dst->fcp_cmnd_alen_datadir);
 1264         for (i = 0; i < 16; i++) {
 1265                 ISP_IOZGET_8(isp, &src->cdb_dl.sf.fcp_cmnd_cdb[i], dst->cdb_dl.sf.fcp_cmnd_cdb[i]);
 1266         }
 1267         ISP_IOZGET_32(isp, &src->cdb_dl.sf.fcp_cmnd_dl, dst->cdb_dl.sf.fcp_cmnd_dl);
 1268 }
 1269 
 1270 void
 1271 isp_put_rft_id(ispsoftc_t *isp, rft_id_t *src, rft_id_t *dst)
 1272 {
 1273         int i;
 1274         isp_put_ct_hdr(isp, &src->rftid_hdr, &dst->rftid_hdr);
 1275         ISP_IOZPUT_8(isp, src->rftid_reserved, &dst->rftid_reserved);
 1276         for (i = 0; i < 3; i++) {
 1277                 ISP_IOZPUT_8(isp, src->rftid_portid[i], &dst->rftid_portid[i]);
 1278         }
 1279         for (i = 0; i < 8; i++) {
 1280                 ISP_IOZPUT_32(isp, src->rftid_fc4types[i], &dst->rftid_fc4types[i]);
 1281         }
 1282 }
 1283 
 1284 void
 1285 isp_put_rspn_id(ispsoftc_t *isp, rspn_id_t *src, rspn_id_t *dst)
 1286 {
 1287 /*      int i;*/
 1288         isp_put_ct_hdr(isp, &src->rspnid_hdr, &dst->rspnid_hdr);
 1289         ISP_IOZPUT_8(isp, src->rspnid_reserved, &dst->rspnid_reserved);
 1290         ISP_IOZPUT_8(isp, src->rspnid_length, &dst->rspnid_length);
 1291 /*      for (i = 0; i < src->rspnid_length; i++)
 1292                 ISP_IOZPUT_8(isp, src->rspnid_name[i], &dst->rspnid_name[i]);*/
 1293 }
 1294 
 1295 void
 1296 isp_put_rff_id(ispsoftc_t *isp, rff_id_t *src, rff_id_t *dst)
 1297 {
 1298         int i;
 1299 
 1300         isp_put_ct_hdr(isp, &src->rffid_hdr, &dst->rffid_hdr);
 1301         ISP_IOZPUT_8(isp, src->rffid_reserved, &dst->rffid_reserved);
 1302         for (i = 0; i < 3; i++)
 1303                 ISP_IOZPUT_8(isp, src->rffid_portid[i], &dst->rffid_portid[i]);
 1304         ISP_IOZPUT_16(isp, src->rffid_reserved2, &dst->rffid_reserved2);
 1305         ISP_IOZPUT_8(isp, src->rffid_fc4features, &dst->rffid_fc4features);
 1306         ISP_IOZPUT_8(isp, src->rffid_fc4type, &dst->rffid_fc4type);
 1307 }
 1308 
 1309 void
 1310 isp_put_rsnn_nn(ispsoftc_t *isp, rsnn_nn_t *src, rsnn_nn_t *dst)
 1311 {
 1312         int i;
 1313         isp_put_ct_hdr(isp, &src->rsnnnn_hdr, &dst->rsnnnn_hdr);
 1314         for (i = 0; i < 8; i++)
 1315                 ISP_IOZPUT_8(isp, src->rsnnnn_nodename[i], &dst->rsnnnn_nodename[i]);
 1316         ISP_IOZPUT_8(isp, src->rsnnnn_length, &dst->rsnnnn_length);
 1317 /*      for (i = 0; i < src->rsnnnn_length; i++)
 1318                 ISP_IOZPUT_8(isp, src->rsnnnn_name[i], &dst->rsnnnn_name[i]);*/
 1319 }
 1320 
 1321 void
 1322 isp_get_ct_hdr(ispsoftc_t *isp, ct_hdr_t *src, ct_hdr_t *dst)
 1323 {
 1324         ISP_IOZGET_8(isp, &src->ct_revision, dst->ct_revision);
 1325         ISP_IOZGET_8(isp, &src->ct_in_id[0], dst->ct_in_id[0]);
 1326         ISP_IOZGET_8(isp, &src->ct_in_id[1], dst->ct_in_id[1]);
 1327         ISP_IOZGET_8(isp, &src->ct_in_id[2], dst->ct_in_id[2]);
 1328         ISP_IOZGET_8(isp, &src->ct_fcs_type, dst->ct_fcs_type);
 1329         ISP_IOZGET_8(isp, &src->ct_fcs_subtype, dst->ct_fcs_subtype);
 1330         ISP_IOZGET_8(isp, &src->ct_options, dst->ct_options);
 1331         ISP_IOZGET_8(isp, &src->ct_reserved0, dst->ct_reserved0);
 1332         ISP_IOZGET_16(isp, &src->ct_cmd_resp, dst->ct_cmd_resp);
 1333         ISP_IOZGET_16(isp, &src->ct_bcnt_resid, dst->ct_bcnt_resid);
 1334         ISP_IOZGET_8(isp, &src->ct_reserved1, dst->ct_reserved1);
 1335         ISP_IOZGET_8(isp, &src->ct_reason, dst->ct_reason);
 1336         ISP_IOZGET_8(isp, &src->ct_explanation, dst->ct_explanation);
 1337         ISP_IOZGET_8(isp, &src->ct_vunique, dst->ct_vunique);
 1338 }
 1339 
 1340 void
 1341 isp_put_ct_hdr(ispsoftc_t *isp, ct_hdr_t *src, ct_hdr_t *dst)
 1342 {
 1343         ISP_IOZPUT_8(isp, src->ct_revision, &dst->ct_revision);
 1344         ISP_IOZPUT_8(isp, src->ct_in_id[0], &dst->ct_in_id[0]);
 1345         ISP_IOZPUT_8(isp, src->ct_in_id[1], &dst->ct_in_id[1]);
 1346         ISP_IOZPUT_8(isp, src->ct_in_id[2], &dst->ct_in_id[2]);
 1347         ISP_IOZPUT_8(isp, src->ct_fcs_type, &dst->ct_fcs_type);
 1348         ISP_IOZPUT_8(isp, src->ct_fcs_subtype, &dst->ct_fcs_subtype);
 1349         ISP_IOZPUT_8(isp, src->ct_options, &dst->ct_options);
 1350         ISP_IOZPUT_8(isp, src->ct_reserved0, &dst->ct_reserved0);
 1351         ISP_IOZPUT_16(isp, src->ct_cmd_resp, &dst->ct_cmd_resp);
 1352         ISP_IOZPUT_16(isp, src->ct_bcnt_resid, &dst->ct_bcnt_resid);
 1353         ISP_IOZPUT_8(isp, src->ct_reserved1, &dst->ct_reserved1);
 1354         ISP_IOZPUT_8(isp, src->ct_reason, &dst->ct_reason);
 1355         ISP_IOZPUT_8(isp, src->ct_explanation, &dst->ct_explanation);
 1356         ISP_IOZPUT_8(isp, src->ct_vunique, &dst->ct_vunique);
 1357 }
 1358 
 1359 void
 1360 isp_put_fcp_rsp_iu(ispsoftc_t *isp, fcp_rsp_iu_t *src, fcp_rsp_iu_t *dst)
 1361 {
 1362         int i;
 1363         for (i = 0; i < ((sizeof (src->fcp_rsp_reserved))/(sizeof (src->fcp_rsp_reserved[0]))); i++) {
 1364                 ISP_IOZPUT_8(isp, src->fcp_rsp_reserved[i], &dst->fcp_rsp_reserved[i]);
 1365         }
 1366         ISP_IOZPUT_16(isp, src->fcp_rsp_status_qualifier, &dst->fcp_rsp_status_qualifier);
 1367         ISP_IOZPUT_8(isp, src->fcp_rsp_bits, &dst->fcp_rsp_bits);
 1368         ISP_IOZPUT_8(isp, src->fcp_rsp_scsi_status, &dst->fcp_rsp_scsi_status);
 1369         ISP_IOZPUT_32(isp, src->fcp_rsp_resid, &dst->fcp_rsp_resid);
 1370         ISP_IOZPUT_32(isp, src->fcp_rsp_snslen, &dst->fcp_rsp_snslen);
 1371         ISP_IOZPUT_32(isp, src->fcp_rsp_rsplen, &dst->fcp_rsp_rsplen);
 1372 }
 1373 
 1374 /*
 1375  * Find port database entries
 1376  */
 1377 int
 1378 isp_find_pdb_empty(ispsoftc_t *isp, int chan, fcportdb_t **lptr)
 1379 {
 1380         fcparam *fcp = FCPARAM(isp, chan);
 1381         int i;
 1382 
 1383         for (i = 0; i < MAX_FC_TARG; i++) {
 1384                 fcportdb_t *lp = &fcp->portdb[i];
 1385 
 1386                 if (lp->state == FC_PORTDB_STATE_NIL) {
 1387                         *lptr = lp;
 1388                         return (1);
 1389                 }
 1390         }
 1391         return (0);
 1392 }
 1393 
 1394 int
 1395 isp_find_pdb_by_wwpn(ispsoftc_t *isp, int chan, uint64_t wwpn, fcportdb_t **lptr)
 1396 {
 1397         fcparam *fcp = FCPARAM(isp, chan);
 1398         int i;
 1399 
 1400         for (i = 0; i < MAX_FC_TARG; i++) {
 1401                 fcportdb_t *lp = &fcp->portdb[i];
 1402 
 1403                 if (lp->state == FC_PORTDB_STATE_NIL)
 1404                         continue;
 1405                 if (lp->port_wwn == wwpn) {
 1406                         *lptr = lp;
 1407                         return (1);
 1408                 }
 1409         }
 1410         return (0);
 1411 }
 1412 
 1413 int
 1414 isp_find_pdb_by_handle(ispsoftc_t *isp, int chan, uint16_t handle,
 1415     fcportdb_t **lptr)
 1416 {
 1417         fcparam *fcp = FCPARAM(isp, chan);
 1418         int i;
 1419 
 1420         for (i = 0; i < MAX_FC_TARG; i++) {
 1421                 fcportdb_t *lp = &fcp->portdb[i];
 1422 
 1423                 if (lp->state == FC_PORTDB_STATE_NIL)
 1424                         continue;
 1425                 if (lp->handle == handle) {
 1426                         *lptr = lp;
 1427                         return (1);
 1428                 }
 1429         }
 1430         return (0);
 1431 }
 1432 
 1433 int
 1434 isp_find_pdb_by_portid(ispsoftc_t *isp, int chan, uint32_t portid,
 1435     fcportdb_t **lptr)
 1436 {
 1437         fcparam *fcp = FCPARAM(isp, chan);
 1438         int i;
 1439 
 1440         for (i = 0; i < MAX_FC_TARG; i++) {
 1441                 fcportdb_t *lp = &fcp->portdb[i];
 1442 
 1443                 if (lp->state == FC_PORTDB_STATE_NIL)
 1444                         continue;
 1445                 if (lp->portid == portid) {
 1446                         *lptr = lp;
 1447                         return (1);
 1448                 }
 1449         }
 1450         return (0);
 1451 }
 1452 
 1453 #ifdef  ISP_TARGET_MODE
 1454 void
 1455 isp_find_chan_by_did(ispsoftc_t *isp, uint32_t did, uint16_t *cp)
 1456 {
 1457         uint16_t chan;
 1458 
 1459         *cp = ISP_NOCHAN;
 1460         for (chan = 0; chan < isp->isp_nchan; chan++) {
 1461                 fcparam *fcp = FCPARAM(isp, chan);
 1462                 if ((fcp->role & ISP_ROLE_TARGET) == 0 ||
 1463                     fcp->isp_loopstate < LOOP_HAVE_ADDR) {
 1464                         continue;
 1465                 }
 1466                 if (fcp->isp_portid == did) {
 1467                         *cp = chan;
 1468                         break;
 1469                 }
 1470         }
 1471 }
 1472 
 1473 /*
 1474  * Add an initiator device to the port database
 1475  */
 1476 void
 1477 isp_add_wwn_entry(ispsoftc_t *isp, int chan, uint64_t wwpn, uint64_t wwnn,
 1478     uint16_t nphdl, uint32_t s_id, uint16_t prli_params)
 1479 {
 1480         char buf[64];
 1481         fcparam *fcp;
 1482         fcportdb_t *lp;
 1483         int i, change;
 1484 
 1485         fcp = FCPARAM(isp, chan);
 1486         if (nphdl >= MAX_NPORT_HANDLE) {
 1487                 isp_prt(isp, ISP_LOGTINFO|ISP_LOGWARN, "Chan %d WWPN 0x%016llx "
 1488                     "PortID 0x%06x handle 0x%x -- bad handle",
 1489                     chan, (unsigned long long) wwpn, s_id, nphdl);
 1490                 return;
 1491         }
 1492 
 1493         /*
 1494          * If valid record for requested handle already exists, update it
 1495          * with new parameters.  Some cases of update can be suspicious,
 1496          * so log them verbosely and dump the whole port database.
 1497          */
 1498         if ((VALID_INI(wwpn) && isp_find_pdb_by_wwpn(isp, chan, wwpn, &lp)) ||
 1499             (VALID_PORT(s_id) && isp_find_pdb_by_portid(isp, chan, s_id, &lp))) {
 1500                 change = 0;
 1501                 lp->new_portid = lp->portid;
 1502                 lp->new_prli_word3 = lp->prli_word3;
 1503                 if (VALID_PORT(s_id) && lp->portid != s_id) {
 1504                         if (!VALID_PORT(lp->portid)) {
 1505                                 isp_prt(isp, ISP_LOGTINFO,
 1506                                     "Chan %d WWPN 0x%016llx handle 0x%x "
 1507                                     "gets PortID 0x%06x",
 1508                                     chan, (unsigned long long) lp->port_wwn,
 1509                                     nphdl, s_id);
 1510                         } else {
 1511                                 isp_prt(isp, ISP_LOGTINFO|ISP_LOGWARN,
 1512                                     "Chan %d WWPN 0x%016llx handle 0x%x "
 1513                                     "changes PortID 0x%06x to 0x%06x",
 1514                                     chan, (unsigned long long) lp->port_wwn,
 1515                                     nphdl, lp->portid, s_id);
 1516                                 if (isp->isp_dblev & (ISP_LOGTINFO|ISP_LOGWARN))
 1517                                         isp_dump_portdb(isp, chan);
 1518                         }
 1519                         lp->new_portid = s_id;
 1520                         change++;
 1521                 }
 1522                 if (VALID_INI(wwpn) && lp->port_wwn != wwpn) {
 1523                         if (!VALID_INI(lp->port_wwn)) {
 1524                                 isp_prt(isp, ISP_LOGTINFO,
 1525                                     "Chan %d PortID 0x%06x handle 0x%x "
 1526                                     "gets WWPN 0x%016llxx",
 1527                                     chan, lp->portid, nphdl,
 1528                                     (unsigned long long) wwpn);
 1529                         } else if (lp->port_wwn != wwpn) {
 1530                                 isp_prt(isp, ISP_LOGTINFO|ISP_LOGWARN,
 1531                                     "Chan %d PortID 0x%06x handle 0x%x "
 1532                                     "changes WWPN 0x%016llx to 0x%016llx",
 1533                                     chan, lp->portid, nphdl,
 1534                                     (unsigned long long) lp->port_wwn,
 1535                                     (unsigned long long) wwpn);
 1536                                 if (isp->isp_dblev & (ISP_LOGTINFO|ISP_LOGWARN))
 1537                                         isp_dump_portdb(isp, chan);
 1538                         }
 1539                         lp->port_wwn = wwpn;
 1540                         change++;
 1541                 }
 1542                 if (VALID_INI(wwnn) && lp->node_wwn != wwnn) {
 1543                         if (!VALID_INI(lp->node_wwn)) {
 1544                                 isp_prt(isp, ISP_LOGTINFO,
 1545                                     "Chan %d PortID 0x%06x handle 0x%x "
 1546                                     "gets WWNN 0x%016llxx",
 1547                                     chan, lp->portid, nphdl,
 1548                                     (unsigned long long) wwnn);
 1549                         } else if (lp->port_wwn != wwnn) {
 1550                                 isp_prt(isp, ISP_LOGTINFO,
 1551                                     "Chan %d PortID 0x%06x handle 0x%x "
 1552                                     "changes WWNN 0x%016llx to 0x%016llx",
 1553                                     chan, lp->portid, nphdl,
 1554                                     (unsigned long long) lp->node_wwn,
 1555                                     (unsigned long long) wwnn);
 1556                         }
 1557                         lp->node_wwn = wwnn;
 1558                         change++;
 1559                 }
 1560                 if (prli_params != 0 && lp->prli_word3 != prli_params) {
 1561                         isp_gen_role_str(buf, sizeof (buf), prli_params);
 1562                         isp_prt(isp, ISP_LOGTINFO|ISP_LOGCONFIG,
 1563                             "Chan %d WWPN 0x%016llx PortID 0x%06x "
 1564                             "handle 0x%x changes PRLI Word 3 %s",
 1565                             chan, (unsigned long long) lp->port_wwn,
 1566                             lp->portid, lp->handle, buf);
 1567                         lp->new_prli_word3 = prli_params;
 1568                         change++;
 1569                 }
 1570                 if (lp->handle != nphdl) {
 1571                         isp_prt(isp, ISP_LOGTINFO|ISP_LOGCONFIG,
 1572                             "Chan %d WWPN 0x%016llx PortID 0x%06x "
 1573                             "changes handle 0x%x to 0x%x",
 1574                             chan, (unsigned long long) lp->port_wwn,
 1575                             lp->portid, lp->handle, nphdl);
 1576                         lp->handle = nphdl;
 1577                         change++;
 1578                 }
 1579                 lp->state = FC_PORTDB_STATE_VALID;
 1580                 if (change) {
 1581                         isp_async(isp, ISPASYNC_DEV_CHANGED, chan, lp);
 1582                         lp->portid = lp->new_portid;
 1583                         lp->prli_word3 = lp->new_prli_word3;
 1584                 } else {
 1585                         isp_prt(isp, ISP_LOGTINFO,
 1586                             "Chan %d WWPN 0x%016llx PortID 0x%06x "
 1587                             "handle 0x%x reentered",
 1588                             chan, (unsigned long long) lp->port_wwn,
 1589                             lp->portid, lp->handle);
 1590                         isp_async(isp, ISPASYNC_DEV_STAYED, chan, lp);
 1591                 }
 1592                 return;
 1593         }
 1594 
 1595         /* Search for room to insert new record. */
 1596         for (i = 0; i < MAX_FC_TARG; i++) {
 1597                 if (fcp->portdb[i].state == FC_PORTDB_STATE_NIL)
 1598                         break;
 1599         }
 1600         if (i >= MAX_FC_TARG) {
 1601                 isp_prt(isp, ISP_LOGTINFO|ISP_LOGWARN,
 1602                     "Chan %d WWPN 0x%016llx PortID 0x%06x handle 0x%x "
 1603                     "-- no room in port database",
 1604                     chan, (unsigned long long) wwpn, s_id, nphdl);
 1605                 if (isp->isp_dblev & (ISP_LOGTINFO|ISP_LOGWARN))
 1606                         isp_dump_portdb(isp, chan);
 1607                 return;
 1608         }
 1609 
 1610         /* Insert new record and mark it valid. */
 1611         lp = &fcp->portdb[i];
 1612         ISP_MEMZERO(lp, sizeof (fcportdb_t));
 1613         lp->handle = nphdl;
 1614         lp->portid = s_id;
 1615         lp->port_wwn = wwpn;
 1616         lp->node_wwn = wwnn;
 1617         lp->prli_word3 = (prli_params != 0) ? prli_params : PRLI_WD3_INITIATOR_FUNCTION;
 1618         lp->state = FC_PORTDB_STATE_VALID;
 1619 
 1620         isp_gen_role_str(buf, sizeof (buf), lp->prli_word3);
 1621         isp_prt(isp, ISP_LOGTINFO, "Chan %d WWPN 0x%016llx "
 1622             "PortID 0x%06x handle 0x%x vtgt %d %s added", chan,
 1623             (unsigned long long) wwpn, s_id, nphdl, i, buf);
 1624 
 1625         /* Notify above levels about new port arrival. */
 1626         isp_async(isp, ISPASYNC_DEV_ARRIVED, chan, lp);
 1627 }
 1628 
 1629 /*
 1630  * Remove a target device to the port database
 1631  */
 1632 void
 1633 isp_del_wwn_entry(ispsoftc_t *isp, int chan, uint64_t wwpn, uint16_t nphdl, uint32_t s_id)
 1634 {
 1635         fcportdb_t *lp;
 1636 
 1637         if (nphdl >= MAX_NPORT_HANDLE) {
 1638                 isp_prt(isp, ISP_LOGWARN, "Chan %d WWPN 0x%016llx PortID 0x%06x bad handle 0x%x",
 1639                     chan, (unsigned long long) wwpn, s_id, nphdl);
 1640                 return;
 1641         }
 1642 
 1643         if (isp_find_pdb_by_handle(isp, chan, nphdl, &lp) == 0) {
 1644                 isp_prt(isp, ISP_LOGWARN, "Chan %d WWPN 0x%016llx PortID 0x%06x handle 0x%x cannot be found to be deleted",
 1645                     chan, (unsigned long long) wwpn, s_id, nphdl);
 1646                 isp_dump_portdb(isp, chan);
 1647                 return;
 1648         }
 1649         isp_prt(isp, ISP_LOGTINFO, "Chan %d WWPN 0x%016llx PortID 0x%06x handle 0x%x vtgt %d deleted",
 1650             chan, (unsigned long long) lp->port_wwn, lp->portid, nphdl, FC_PORTDB_TGT(isp, chan, lp));
 1651         lp->state = FC_PORTDB_STATE_NIL;
 1652 
 1653         /* Notify above levels about gone port. */
 1654         isp_async(isp, ISPASYNC_DEV_GONE, chan, lp);
 1655 }
 1656 #endif  /* ISP_TARGET_MODE */
 1657 
 1658 void
 1659 isp_get_atio7(ispsoftc_t *isp, at7_entry_t *src, at7_entry_t *dst)
 1660 {
 1661         ISP_IOXGET_8(isp, &src->at_type, dst->at_type);
 1662         ISP_IOXGET_8(isp, &src->at_count, dst->at_count);
 1663         ISP_IOXGET_16(isp, &src->at_ta_len, dst->at_ta_len);
 1664         ISP_IOXGET_32(isp, &src->at_rxid, dst->at_rxid);
 1665         isp_get_fc_hdr(isp, &src->at_hdr, &dst->at_hdr);
 1666         isp_get_fcp_cmnd_iu(isp, &src->at_cmnd, &dst->at_cmnd);
 1667 }
 1668 
 1669 void
 1670 isp_put_ctio7(ispsoftc_t *isp, ct7_entry_t *src, ct7_entry_t *dst)
 1671 {
 1672         int i;
 1673 
 1674         isp_put_hdr(isp, &src->ct_header, &dst->ct_header);
 1675         ISP_IOXPUT_32(isp, src->ct_syshandle, &dst->ct_syshandle);
 1676         ISP_IOXPUT_16(isp, src->ct_nphdl, &dst->ct_nphdl);
 1677         ISP_IOXPUT_16(isp, src->ct_timeout, &dst->ct_timeout);
 1678         ISP_IOXPUT_16(isp, src->ct_seg_count, &dst->ct_seg_count);
 1679         ISP_IOXPUT_8(isp, src->ct_vpidx, &dst->ct_vpidx);
 1680         ISP_IOXPUT_8(isp, src->ct_xflags, &dst->ct_xflags);
 1681         ISP_IOXPUT_16(isp, src->ct_iid_lo, &dst->ct_iid_lo);
 1682         ISP_IOXPUT_8(isp, src->ct_iid_hi, &dst->ct_iid_hi);
 1683         ISP_IOXPUT_8(isp, src->ct_reserved, &dst->ct_reserved);
 1684         ISP_IOXPUT_32(isp, src->ct_rxid, &dst->ct_rxid);
 1685         ISP_IOXPUT_16(isp, src->ct_senselen, &dst->ct_senselen);
 1686         ISP_IOXPUT_16(isp, src->ct_flags, &dst->ct_flags);
 1687         ISP_IOXPUT_32(isp, src->ct_resid, &dst->ct_resid);
 1688         ISP_IOXPUT_16(isp, src->ct_oxid, &dst->ct_oxid);
 1689         ISP_IOXPUT_16(isp, src->ct_scsi_status, &dst->ct_scsi_status);
 1690         if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE0) {
 1691                 ISP_IOXPUT_32(isp, src->rsp.m0.reloff, &dst->rsp.m0.reloff);
 1692                 ISP_IOXPUT_32(isp, src->rsp.m0.reserved0, &dst->rsp.m0.reserved0);
 1693                 ISP_IOXPUT_32(isp, src->rsp.m0.ct_xfrlen, &dst->rsp.m0.ct_xfrlen);
 1694                 ISP_IOXPUT_32(isp, src->rsp.m0.reserved1, &dst->rsp.m0.reserved1);
 1695                 ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_base, &dst->rsp.m0.ds.ds_base);
 1696                 ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_basehi, &dst->rsp.m0.ds.ds_basehi);
 1697                 ISP_IOXPUT_32(isp, src->rsp.m0.ds.ds_count, &dst->rsp.m0.ds.ds_count);
 1698         } else if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE1) {
 1699                 uint32_t *a, *b;
 1700 
 1701                 ISP_IOXPUT_16(isp, src->rsp.m1.ct_resplen, &dst->rsp.m1.ct_resplen);
 1702                 ISP_IOXPUT_16(isp, src->rsp.m1.reserved, &dst->rsp.m1.reserved);
 1703                 a = (uint32_t *) src->rsp.m1.ct_resp;
 1704                 b = (uint32_t *) dst->rsp.m1.ct_resp;
 1705                 for (i = 0; i < (nitems(src->rsp.m1.ct_resp) >> 2); i++) {
 1706                         *b++ = ISP_SWAP32(isp, *a++);
 1707                 }
 1708         } else {
 1709                 ISP_IOXPUT_32(isp, src->rsp.m2.reserved0, &dst->rsp.m2.reserved0);
 1710                 ISP_IOXPUT_32(isp, src->rsp.m2.reserved1, &dst->rsp.m2.reserved1);
 1711                 ISP_IOXPUT_32(isp, src->rsp.m2.ct_datalen, &dst->rsp.m2.ct_datalen);
 1712                 ISP_IOXPUT_32(isp, src->rsp.m2.reserved2, &dst->rsp.m2.reserved2);
 1713                 ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_base, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_base);
 1714                 ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_basehi, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_basehi);
 1715                 ISP_IOXPUT_32(isp, src->rsp.m2.ct_fcp_rsp_iudata.ds_count, &dst->rsp.m2.ct_fcp_rsp_iudata.ds_count);
 1716         }
 1717 }
 1718 
 1719 void
 1720 isp_get_ctio7(ispsoftc_t *isp, ct7_entry_t *src, ct7_entry_t *dst)
 1721 {
 1722         int i;
 1723 
 1724         isp_get_hdr(isp, &src->ct_header, &dst->ct_header);
 1725         ISP_IOXGET_32(isp, &src->ct_syshandle, dst->ct_syshandle);
 1726         ISP_IOXGET_16(isp, &src->ct_nphdl, dst->ct_nphdl);
 1727         ISP_IOXGET_16(isp, &src->ct_timeout, dst->ct_timeout);
 1728         ISP_IOXGET_16(isp, &src->ct_seg_count, dst->ct_seg_count);
 1729         ISP_IOXGET_8(isp, &src->ct_vpidx, dst->ct_vpidx);
 1730         ISP_IOXGET_8(isp, &src->ct_xflags, dst->ct_xflags);
 1731         ISP_IOXGET_16(isp, &src->ct_iid_lo, dst->ct_iid_lo);
 1732         ISP_IOXGET_8(isp, &src->ct_iid_hi, dst->ct_iid_hi);
 1733         ISP_IOXGET_8(isp, &src->ct_reserved, dst->ct_reserved);
 1734         ISP_IOXGET_32(isp, &src->ct_rxid, dst->ct_rxid);
 1735         ISP_IOXGET_16(isp, &src->ct_senselen, dst->ct_senselen);
 1736         ISP_IOXGET_16(isp, &src->ct_flags, dst->ct_flags);
 1737         ISP_IOXGET_32(isp, &src->ct_resid, dst->ct_resid);
 1738         ISP_IOXGET_16(isp, &src->ct_oxid, dst->ct_oxid);
 1739         ISP_IOXGET_16(isp, &src->ct_scsi_status, dst->ct_scsi_status);
 1740         if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE0) {
 1741                 ISP_IOXGET_32(isp, &src->rsp.m0.reloff, dst->rsp.m0.reloff);
 1742                 ISP_IOXGET_32(isp, &src->rsp.m0.reserved0, dst->rsp.m0.reserved0);
 1743                 ISP_IOXGET_32(isp, &src->rsp.m0.ct_xfrlen, dst->rsp.m0.ct_xfrlen);
 1744                 ISP_IOXGET_32(isp, &src->rsp.m0.reserved1, dst->rsp.m0.reserved1);
 1745                 ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_base, dst->rsp.m0.ds.ds_base);
 1746                 ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_basehi, dst->rsp.m0.ds.ds_basehi);
 1747                 ISP_IOXGET_32(isp, &src->rsp.m0.ds.ds_count, dst->rsp.m0.ds.ds_count);
 1748         } else if ((dst->ct_flags & CT7_FLAG_MMASK) == CT7_FLAG_MODE1) {
 1749                 uint32_t *a, *b;
 1750 
 1751                 ISP_IOXGET_16(isp, &src->rsp.m1.ct_resplen, dst->rsp.m1.ct_resplen);
 1752                 ISP_IOXGET_16(isp, &src->rsp.m1.reserved, dst->rsp.m1.reserved);
 1753                 a = (uint32_t *) src->rsp.m1.ct_resp;
 1754                 b = (uint32_t *) dst->rsp.m1.ct_resp;
 1755                 for (i = 0; i < MAXRESPLEN_24XX; i++) {
 1756                         ISP_IOXGET_8(isp, &src->rsp.m1.ct_resp[i], dst->rsp.m1.ct_resp[i]);
 1757                 }
 1758                 for (i = 0; i < (nitems(src->rsp.m1.ct_resp) >> 2); i++) {
 1759                         *b++ = ISP_SWAP32(isp, *a++);
 1760                 }
 1761         } else {
 1762                 ISP_IOXGET_32(isp, &src->rsp.m2.reserved0, dst->rsp.m2.reserved0);
 1763                 ISP_IOXGET_32(isp, &src->rsp.m2.ct_datalen, dst->rsp.m2.ct_datalen);
 1764                 ISP_IOXGET_32(isp, &src->rsp.m2.reserved1, dst->rsp.m2.reserved1);
 1765                 ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_base, dst->rsp.m2.ct_fcp_rsp_iudata.ds_base);
 1766                 ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_basehi, dst->rsp.m2.ct_fcp_rsp_iudata.ds_basehi);
 1767                 ISP_IOXGET_32(isp, &src->rsp.m2.ct_fcp_rsp_iudata.ds_count, dst->rsp.m2.ct_fcp_rsp_iudata.ds_count);
 1768         }
 1769 }
 1770 
 1771 void
 1772 isp_put_notify_24xx(ispsoftc_t *isp, in_fcentry_24xx_t *src, in_fcentry_24xx_t *dst)
 1773 {
 1774         int i;
 1775 
 1776         isp_put_hdr(isp, &src->in_header, &dst->in_header);
 1777         ISP_IOXPUT_32(isp, src->in_reserved, &dst->in_reserved);
 1778         ISP_IOXPUT_16(isp, src->in_nphdl, &dst->in_nphdl);
 1779         ISP_IOXPUT_16(isp, src->in_reserved1, &dst->in_reserved1);
 1780         ISP_IOXPUT_16(isp, src->in_flags, &dst->in_flags);
 1781         ISP_IOXPUT_16(isp, src->in_srr_rxid, &dst->in_srr_rxid);
 1782         ISP_IOXPUT_16(isp, src->in_status, &dst->in_status);
 1783         ISP_IOXPUT_8(isp, src->in_status_subcode, &dst->in_status_subcode);
 1784         ISP_IOXPUT_8(isp, src->in_fwhandle, &dst->in_fwhandle);
 1785         ISP_IOXPUT_32(isp, src->in_rxid, &dst->in_rxid);
 1786         ISP_IOXPUT_16(isp, src->in_srr_reloff_hi, &dst->in_srr_reloff_hi);
 1787         ISP_IOXPUT_16(isp, src->in_srr_reloff_lo, &dst->in_srr_reloff_lo);
 1788         ISP_IOXPUT_16(isp, src->in_srr_iu, &dst->in_srr_iu);
 1789         ISP_IOXPUT_16(isp, src->in_srr_oxid, &dst->in_srr_oxid);
 1790         ISP_IOXPUT_16(isp, src->in_nport_id_hi, &dst->in_nport_id_hi);
 1791         ISP_IOXPUT_8(isp, src->in_nport_id_lo, &dst->in_nport_id_lo);
 1792         ISP_IOXPUT_8(isp, src->in_reserved3, &dst->in_reserved3);
 1793         ISP_IOXPUT_16(isp, src->in_np_handle, &dst->in_np_handle);
 1794         for (i = 0; i < nitems(src->in_reserved4); i++) {
 1795                 ISP_IOXPUT_8(isp, src->in_reserved4[i], &dst->in_reserved4[i]);
 1796         }
 1797         ISP_IOXPUT_8(isp, src->in_reserved5, &dst->in_reserved5);
 1798         ISP_IOXPUT_8(isp, src->in_vpidx, &dst->in_vpidx);
 1799         ISP_IOXPUT_32(isp, src->in_reserved6, &dst->in_reserved6);
 1800         ISP_IOXPUT_16(isp, src->in_portid_lo, &dst->in_portid_lo);
 1801         ISP_IOXPUT_8(isp, src->in_portid_hi, &dst->in_portid_hi);
 1802         ISP_IOXPUT_8(isp, src->in_reserved7, &dst->in_reserved7);
 1803         ISP_IOXPUT_16(isp, src->in_reserved8, &dst->in_reserved8);
 1804         ISP_IOXPUT_16(isp, src->in_oxid, &dst->in_oxid);
 1805 }
 1806 
 1807 void
 1808 isp_get_notify_24xx(ispsoftc_t *isp, in_fcentry_24xx_t *src, in_fcentry_24xx_t *dst)
 1809 {
 1810         int i;
 1811 
 1812         isp_get_hdr(isp, &src->in_header, &dst->in_header);
 1813         ISP_IOXGET_32(isp, &src->in_reserved, dst->in_reserved);
 1814         ISP_IOXGET_16(isp, &src->in_nphdl, dst->in_nphdl);
 1815         ISP_IOXGET_16(isp, &src->in_reserved1, dst->in_reserved1);
 1816         ISP_IOXGET_16(isp, &src->in_flags, dst->in_flags);
 1817         ISP_IOXGET_16(isp, &src->in_srr_rxid, dst->in_srr_rxid);
 1818         ISP_IOXGET_16(isp, &src->in_status, dst->in_status);
 1819         ISP_IOXGET_8(isp, &src->in_status_subcode, dst->in_status_subcode);
 1820         ISP_IOXGET_8(isp, &src->in_fwhandle, dst->in_fwhandle);
 1821         ISP_IOXGET_32(isp, &src->in_rxid, dst->in_rxid);
 1822         ISP_IOXGET_16(isp, &src->in_srr_reloff_hi, dst->in_srr_reloff_hi);
 1823         ISP_IOXGET_16(isp, &src->in_srr_reloff_lo, dst->in_srr_reloff_lo);
 1824         ISP_IOXGET_16(isp, &src->in_srr_iu, dst->in_srr_iu);
 1825         ISP_IOXGET_16(isp, &src->in_srr_oxid, dst->in_srr_oxid);
 1826         ISP_IOXGET_16(isp, &src->in_nport_id_hi, dst->in_nport_id_hi);
 1827         ISP_IOXGET_8(isp, &src->in_nport_id_lo, dst->in_nport_id_lo);
 1828         ISP_IOXGET_8(isp, &src->in_reserved3, dst->in_reserved3);
 1829         ISP_IOXGET_16(isp, &src->in_np_handle, dst->in_np_handle);
 1830         for (i = 0; i < nitems(src->in_reserved4); i++) {
 1831                 ISP_IOXGET_8(isp, &src->in_reserved4[i], dst->in_reserved4[i]);
 1832         }
 1833         ISP_IOXGET_8(isp, &src->in_reserved5, dst->in_reserved5);
 1834         ISP_IOXGET_8(isp, &src->in_vpidx, dst->in_vpidx);
 1835         ISP_IOXGET_32(isp, &src->in_reserved6, dst->in_reserved6);
 1836         ISP_IOXGET_16(isp, &src->in_portid_lo, dst->in_portid_lo);
 1837         ISP_IOXGET_8(isp, &src->in_portid_hi, dst->in_portid_hi);
 1838         ISP_IOXGET_8(isp, &src->in_reserved7, dst->in_reserved7);
 1839         ISP_IOXGET_16(isp, &src->in_reserved8, dst->in_reserved8);
 1840         ISP_IOXGET_16(isp, &src->in_oxid, dst->in_oxid);
 1841 }
 1842 
 1843 void
 1844 isp_put_notify_ack_24xx(ispsoftc_t *isp, na_fcentry_24xx_t *src, na_fcentry_24xx_t *dst)
 1845 {
 1846         int i;
 1847 
 1848         isp_put_hdr(isp, &src->na_header, &dst->na_header);
 1849         ISP_IOXPUT_32(isp, src->na_handle, &dst->na_handle);
 1850         ISP_IOXPUT_16(isp, src->na_nphdl, &dst->na_nphdl);
 1851         ISP_IOXPUT_16(isp, src->na_reserved1, &dst->na_reserved1);
 1852         ISP_IOXPUT_16(isp, src->na_flags, &dst->na_flags);
 1853         ISP_IOXPUT_16(isp, src->na_srr_rxid, &dst->na_srr_rxid);
 1854         ISP_IOXPUT_16(isp, src->na_status, &dst->na_status);
 1855         ISP_IOXPUT_8(isp, src->na_status_subcode, &dst->na_status_subcode);
 1856         ISP_IOXPUT_8(isp, src->na_fwhandle, &dst->na_fwhandle);
 1857         ISP_IOXPUT_32(isp, src->na_rxid, &dst->na_rxid);
 1858         ISP_IOXPUT_16(isp, src->na_srr_reloff_hi, &dst->na_srr_reloff_hi);
 1859         ISP_IOXPUT_16(isp, src->na_srr_reloff_lo, &dst->na_srr_reloff_lo);
 1860         ISP_IOXPUT_16(isp, src->na_srr_iu, &dst->na_srr_iu);
 1861         ISP_IOXPUT_16(isp, src->na_srr_flags, &dst->na_srr_flags);
 1862         for (i = 0; i < 18; i++) {
 1863                 ISP_IOXPUT_8(isp, src->na_reserved3[i], &dst->na_reserved3[i]);
 1864         }
 1865         ISP_IOXPUT_8(isp, src->na_reserved4, &dst->na_reserved4);
 1866         ISP_IOXPUT_8(isp, src->na_vpidx, &dst->na_vpidx);
 1867         ISP_IOXPUT_8(isp, src->na_srr_reject_vunique, &dst->na_srr_reject_vunique);
 1868         ISP_IOXPUT_8(isp, src->na_srr_reject_explanation, &dst->na_srr_reject_explanation);
 1869         ISP_IOXPUT_8(isp, src->na_srr_reject_code, &dst->na_srr_reject_code);
 1870         ISP_IOXPUT_8(isp, src->na_reserved5, &dst->na_reserved5);
 1871         for (i = 0; i < 6; i++) {
 1872                 ISP_IOXPUT_8(isp, src->na_reserved6[i], &dst->na_reserved6[i]);
 1873         }
 1874         ISP_IOXPUT_16(isp, src->na_oxid, &dst->na_oxid);
 1875 }
 1876 
 1877 void
 1878 isp_get_notify_ack_24xx(ispsoftc_t *isp, na_fcentry_24xx_t *src, na_fcentry_24xx_t *dst)
 1879 {
 1880         int i;
 1881 
 1882         isp_get_hdr(isp, &src->na_header, &dst->na_header);
 1883         ISP_IOXGET_32(isp, &src->na_handle, dst->na_handle);
 1884         ISP_IOXGET_16(isp, &src->na_nphdl, dst->na_nphdl);
 1885         ISP_IOXGET_16(isp, &src->na_reserved1, dst->na_reserved1);
 1886         ISP_IOXGET_16(isp, &src->na_flags, dst->na_flags);
 1887         ISP_IOXGET_16(isp, &src->na_srr_rxid, dst->na_srr_rxid);
 1888         ISP_IOXGET_16(isp, &src->na_status, dst->na_status);
 1889         ISP_IOXGET_8(isp, &src->na_status_subcode, dst->na_status_subcode);
 1890         ISP_IOXGET_8(isp, &src->na_fwhandle, dst->na_fwhandle);
 1891         ISP_IOXGET_32(isp, &src->na_rxid, dst->na_rxid);
 1892         ISP_IOXGET_16(isp, &src->na_srr_reloff_hi, dst->na_srr_reloff_hi);
 1893         ISP_IOXGET_16(isp, &src->na_srr_reloff_lo, dst->na_srr_reloff_lo);
 1894         ISP_IOXGET_16(isp, &src->na_srr_iu, dst->na_srr_iu);
 1895         ISP_IOXGET_16(isp, &src->na_srr_flags, dst->na_srr_flags);
 1896         for (i = 0; i < 18; i++) {
 1897                 ISP_IOXGET_8(isp, &src->na_reserved3[i], dst->na_reserved3[i]);
 1898         }
 1899         ISP_IOXGET_8(isp, &src->na_reserved4, dst->na_reserved4);
 1900         ISP_IOXGET_8(isp, &src->na_vpidx, dst->na_vpidx);
 1901         ISP_IOXGET_8(isp, &src->na_srr_reject_vunique, dst->na_srr_reject_vunique);
 1902         ISP_IOXGET_8(isp, &src->na_srr_reject_explanation, dst->na_srr_reject_explanation);
 1903         ISP_IOXGET_8(isp, &src->na_srr_reject_code, dst->na_srr_reject_code);
 1904         ISP_IOXGET_8(isp, &src->na_reserved5, dst->na_reserved5);
 1905         for (i = 0; i < 6; i++) {
 1906                 ISP_IOXGET_8(isp, &src->na_reserved6[i], dst->na_reserved6[i]);
 1907         }
 1908         ISP_IOXGET_16(isp, &src->na_oxid, dst->na_oxid);
 1909 }
 1910 
 1911 void
 1912 isp_get_abts(ispsoftc_t *isp, abts_t *src, abts_t *dst)
 1913 {
 1914         int i;
 1915 
 1916         isp_get_hdr(isp, &src->abts_header, &dst->abts_header);
 1917         for (i = 0; i < 6; i++) {
 1918                 ISP_IOXGET_8(isp, &src->abts_reserved0[i], dst->abts_reserved0[i]);
 1919         }
 1920         ISP_IOXGET_16(isp, &src->abts_nphdl, dst->abts_nphdl);
 1921         ISP_IOXGET_16(isp, &src->abts_reserved1, dst->abts_reserved1);
 1922         ISP_IOXGET_16(isp, &src->abts_sof, dst->abts_sof);
 1923         ISP_IOXGET_32(isp, &src->abts_rxid_abts, dst->abts_rxid_abts);
 1924         ISP_IOXGET_16(isp, &src->abts_did_lo, dst->abts_did_lo);
 1925         ISP_IOXGET_8(isp, &src->abts_did_hi, dst->abts_did_hi);
 1926         ISP_IOXGET_8(isp, &src->abts_r_ctl, dst->abts_r_ctl);
 1927         ISP_IOXGET_16(isp, &src->abts_sid_lo, dst->abts_sid_lo);
 1928         ISP_IOXGET_8(isp, &src->abts_sid_hi, dst->abts_sid_hi);
 1929         ISP_IOXGET_8(isp, &src->abts_cs_ctl, dst->abts_cs_ctl);
 1930         ISP_IOXGET_16(isp, &src->abts_fs_ctl, dst->abts_fs_ctl);
 1931         ISP_IOXGET_8(isp, &src->abts_f_ctl, dst->abts_f_ctl);
 1932         ISP_IOXGET_8(isp, &src->abts_type, dst->abts_type);
 1933         ISP_IOXGET_16(isp, &src->abts_seq_cnt, dst->abts_seq_cnt);
 1934         ISP_IOXGET_8(isp, &src->abts_df_ctl, dst->abts_df_ctl);
 1935         ISP_IOXGET_8(isp, &src->abts_seq_id, dst->abts_seq_id);
 1936         ISP_IOXGET_16(isp, &src->abts_rx_id, dst->abts_rx_id);
 1937         ISP_IOXGET_16(isp, &src->abts_ox_id, dst->abts_ox_id);
 1938         ISP_IOXGET_32(isp, &src->abts_param, dst->abts_param);
 1939         for (i = 0; i < 16; i++) {
 1940                 ISP_IOXGET_8(isp, &src->abts_reserved2[i], dst->abts_reserved2[i]);
 1941         }
 1942         ISP_IOXGET_32(isp, &src->abts_rxid_task, dst->abts_rxid_task);
 1943 }
 1944 
 1945 void
 1946 isp_put_abts_rsp(ispsoftc_t *isp, abts_rsp_t *src, abts_rsp_t *dst)
 1947 {
 1948         int i;
 1949 
 1950         isp_put_hdr(isp, &src->abts_rsp_header, &dst->abts_rsp_header);
 1951         ISP_IOXPUT_32(isp, src->abts_rsp_handle, &dst->abts_rsp_handle);
 1952         ISP_IOXPUT_16(isp, src->abts_rsp_status, &dst->abts_rsp_status);
 1953         ISP_IOXPUT_16(isp, src->abts_rsp_nphdl, &dst->abts_rsp_nphdl);
 1954         ISP_IOXPUT_16(isp, src->abts_rsp_ctl_flags, &dst->abts_rsp_ctl_flags);
 1955         ISP_IOXPUT_16(isp, src->abts_rsp_sof, &dst->abts_rsp_sof);
 1956         ISP_IOXPUT_32(isp, src->abts_rsp_rxid_abts, &dst->abts_rsp_rxid_abts);
 1957         ISP_IOXPUT_16(isp, src->abts_rsp_did_lo, &dst->abts_rsp_did_lo);
 1958         ISP_IOXPUT_8(isp, src->abts_rsp_did_hi, &dst->abts_rsp_did_hi);
 1959         ISP_IOXPUT_8(isp, src->abts_rsp_r_ctl, &dst->abts_rsp_r_ctl);
 1960         ISP_IOXPUT_16(isp, src->abts_rsp_sid_lo, &dst->abts_rsp_sid_lo);
 1961         ISP_IOXPUT_8(isp, src->abts_rsp_sid_hi, &dst->abts_rsp_sid_hi);
 1962         ISP_IOXPUT_8(isp, src->abts_rsp_cs_ctl, &dst->abts_rsp_cs_ctl);
 1963         ISP_IOXPUT_16(isp, src->abts_rsp_f_ctl_lo, &dst->abts_rsp_f_ctl_lo);
 1964         ISP_IOXPUT_8(isp, src->abts_rsp_f_ctl_hi, &dst->abts_rsp_f_ctl_hi);
 1965         ISP_IOXPUT_8(isp, src->abts_rsp_type, &dst->abts_rsp_type);
 1966         ISP_IOXPUT_16(isp, src->abts_rsp_seq_cnt, &dst->abts_rsp_seq_cnt);
 1967         ISP_IOXPUT_8(isp, src->abts_rsp_df_ctl, &dst->abts_rsp_df_ctl);
 1968         ISP_IOXPUT_8(isp, src->abts_rsp_seq_id, &dst->abts_rsp_seq_id);
 1969         ISP_IOXPUT_16(isp, src->abts_rsp_rx_id, &dst->abts_rsp_rx_id);
 1970         ISP_IOXPUT_16(isp, src->abts_rsp_ox_id, &dst->abts_rsp_ox_id);
 1971         ISP_IOXPUT_32(isp, src->abts_rsp_param, &dst->abts_rsp_param);
 1972         if (src->abts_rsp_r_ctl == BA_ACC) {
 1973                 ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.reserved, &dst->abts_rsp_payload.ba_acc.reserved);
 1974                 ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_acc.last_seq_id, &dst->abts_rsp_payload.ba_acc.last_seq_id);
 1975                 ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_acc.seq_id_valid, &dst->abts_rsp_payload.ba_acc.seq_id_valid);
 1976                 ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.aborted_rx_id, &dst->abts_rsp_payload.ba_acc.aborted_rx_id);
 1977                 ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.aborted_ox_id, &dst->abts_rsp_payload.ba_acc.aborted_ox_id);
 1978                 ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.high_seq_cnt, &dst->abts_rsp_payload.ba_acc.high_seq_cnt);
 1979                 ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.low_seq_cnt, &dst->abts_rsp_payload.ba_acc.low_seq_cnt);
 1980                 for (i = 0; i < 4; i++) {
 1981                         ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_acc.reserved2[i], &dst->abts_rsp_payload.ba_acc.reserved2[i]);
 1982                 }
 1983         } else if (src->abts_rsp_r_ctl == BA_RJT) {
 1984                 ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.vendor_unique, &dst->abts_rsp_payload.ba_rjt.vendor_unique);
 1985                 ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.explanation, &dst->abts_rsp_payload.ba_rjt.explanation);
 1986                 ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.reason, &dst->abts_rsp_payload.ba_rjt.reason);
 1987                 ISP_IOXPUT_8(isp, src->abts_rsp_payload.ba_rjt.reserved, &dst->abts_rsp_payload.ba_rjt.reserved);
 1988                 for (i = 0; i < 12; i++) {
 1989                         ISP_IOXPUT_16(isp, src->abts_rsp_payload.ba_rjt.reserved2[i], &dst->abts_rsp_payload.ba_rjt.reserved2[i]);
 1990                 }
 1991         } else {
 1992                 for (i = 0; i < 16; i++) {
 1993                         ISP_IOXPUT_8(isp, src->abts_rsp_payload.reserved[i], &dst->abts_rsp_payload.reserved[i]);
 1994                 }
 1995         }
 1996         ISP_IOXPUT_32(isp, src->abts_rsp_rxid_task, &dst->abts_rsp_rxid_task);
 1997 }
 1998 
 1999 void
 2000 isp_get_abts_rsp(ispsoftc_t *isp, abts_rsp_t *src, abts_rsp_t *dst)
 2001 {
 2002         int i;
 2003 
 2004         isp_get_hdr(isp, &src->abts_rsp_header, &dst->abts_rsp_header);
 2005         ISP_IOXGET_32(isp, &src->abts_rsp_handle, dst->abts_rsp_handle);
 2006         ISP_IOXGET_16(isp, &src->abts_rsp_status, dst->abts_rsp_status);
 2007         ISP_IOXGET_16(isp, &src->abts_rsp_nphdl, dst->abts_rsp_nphdl);
 2008         ISP_IOXGET_16(isp, &src->abts_rsp_ctl_flags, dst->abts_rsp_ctl_flags);
 2009         ISP_IOXGET_16(isp, &src->abts_rsp_sof, dst->abts_rsp_sof);
 2010         ISP_IOXGET_32(isp, &src->abts_rsp_rxid_abts, dst->abts_rsp_rxid_abts);
 2011         ISP_IOXGET_16(isp, &src->abts_rsp_did_lo, dst->abts_rsp_did_lo);
 2012         ISP_IOXGET_8(isp, &src->abts_rsp_did_hi, dst->abts_rsp_did_hi);
 2013         ISP_IOXGET_8(isp, &src->abts_rsp_r_ctl, dst->abts_rsp_r_ctl);
 2014         ISP_IOXGET_16(isp, &src->abts_rsp_sid_lo, dst->abts_rsp_sid_lo);
 2015         ISP_IOXGET_8(isp, &src->abts_rsp_sid_hi, dst->abts_rsp_sid_hi);
 2016         ISP_IOXGET_8(isp, &src->abts_rsp_cs_ctl, dst->abts_rsp_cs_ctl);
 2017         ISP_IOXGET_16(isp, &src->abts_rsp_f_ctl_lo, dst->abts_rsp_f_ctl_lo);
 2018         ISP_IOXGET_8(isp, &src->abts_rsp_f_ctl_hi, dst->abts_rsp_f_ctl_hi);
 2019         ISP_IOXGET_8(isp, &src->abts_rsp_type, dst->abts_rsp_type);
 2020         ISP_IOXGET_16(isp, &src->abts_rsp_seq_cnt, dst->abts_rsp_seq_cnt);
 2021         ISP_IOXGET_8(isp, &src->abts_rsp_df_ctl, dst->abts_rsp_df_ctl);
 2022         ISP_IOXGET_8(isp, &src->abts_rsp_seq_id, dst->abts_rsp_seq_id);
 2023         ISP_IOXGET_16(isp, &src->abts_rsp_rx_id, dst->abts_rsp_rx_id);
 2024         ISP_IOXGET_16(isp, &src->abts_rsp_ox_id, dst->abts_rsp_ox_id);
 2025         ISP_IOXGET_32(isp, &src->abts_rsp_param, dst->abts_rsp_param);
 2026         for (i = 0; i < 8; i++) {
 2027                 ISP_IOXGET_8(isp, &src->abts_rsp_payload.rsp.reserved[i], dst->abts_rsp_payload.rsp.reserved[i]);
 2028         }
 2029         ISP_IOXGET_32(isp, &src->abts_rsp_payload.rsp.subcode1, dst->abts_rsp_payload.rsp.subcode1);
 2030         ISP_IOXGET_32(isp, &src->abts_rsp_payload.rsp.subcode2, dst->abts_rsp_payload.rsp.subcode2);
 2031         ISP_IOXGET_32(isp, &src->abts_rsp_rxid_task, dst->abts_rsp_rxid_task);
 2032 }
 2033 
 2034 void
 2035 isp_put_entry(ispsoftc_t *isp, void *src, void *dst)
 2036 {
 2037         uint8_t etype = ((isphdr_t *)src)->rqs_entry_type;
 2038 
 2039         switch (etype) {
 2040         case RQSTYPE_NOTIFY_ACK:
 2041                 isp_put_notify_ack_24xx(isp, (na_fcentry_24xx_t *)src,
 2042                     (na_fcentry_24xx_t *)dst);
 2043                 break;
 2044         case RQSTYPE_CTIO7:
 2045                 isp_put_ctio7(isp, (ct7_entry_t *)src, (ct7_entry_t *)dst);
 2046                 break;
 2047         case RQSTYPE_TSK_MGMT:
 2048                 isp_put_24xx_tmf(isp, (isp24xx_tmf_t *)src, (isp24xx_tmf_t *)dst);
 2049                 break;
 2050         case RQSTYPE_CT_PASSTHRU:
 2051                 isp_put_ct_pt(isp, (isp_ct_pt_t *)src, (isp_ct_pt_t *)dst);
 2052                 break;
 2053         case RQSTYPE_VP_CTRL:
 2054                 isp_put_vp_ctrl_info(isp, (vp_ctrl_info_t *)src, (vp_ctrl_info_t *)dst);
 2055                 break;
 2056         case RQSTYPE_VP_MODIFY:
 2057                 isp_put_vp_modify(isp, (vp_modify_t *)src, (vp_modify_t *)dst);
 2058                 break;
 2059         case RQSTYPE_ABORT_IO:
 2060                 isp_put_24xx_abrt(isp, (isp24xx_abrt_t *)src, (isp24xx_abrt_t *)dst);
 2061                 break;
 2062         case RQSTYPE_LOGIN:
 2063                 isp_put_plogx(isp, (isp_plogx_t *)src, (isp_plogx_t *)dst);
 2064                 break;
 2065         case RQSTYPE_ABTS_RSP:
 2066                 isp_put_abts_rsp(isp, (abts_rsp_t *)src, (abts_rsp_t *)dst);
 2067                 break;
 2068         default:
 2069                 panic("%s: Unknown type 0x%x\n", __func__, etype);
 2070         }
 2071 }
 2072 
 2073 void
 2074 isp_get_entry(ispsoftc_t *isp, void *src, void *dst)
 2075 {
 2076         uint8_t etype;
 2077 
 2078         isp_get_hdr(isp, src, (isphdr_t *)dst);
 2079         etype = ((isphdr_t *)dst)->rqs_entry_type;
 2080         switch (etype) {
 2081         case 0: /* After isp_clear_commands() */
 2082                 ISP_MEMZERO(dst, QENTRY_LEN);
 2083                 break;
 2084         case RQSTYPE_RESPONSE:
 2085                 isp_get_24xx_response(isp, (isp24xx_statusreq_t *)src, (isp24xx_statusreq_t *)dst);
 2086                 break;
 2087         case RQSTYPE_CT_PASSTHRU:
 2088                 isp_get_ct_pt(isp, (isp_ct_pt_t *)src, (isp_ct_pt_t *)dst);
 2089                 break;
 2090         case RQSTYPE_VP_CTRL:
 2091                 isp_get_vp_ctrl_info(isp, (vp_ctrl_info_t *)src, (vp_ctrl_info_t *)dst);
 2092                 break;
 2093         case RQSTYPE_VP_MODIFY:
 2094                 isp_get_vp_modify(isp, (vp_modify_t *)src, (vp_modify_t *)dst);
 2095                 break;
 2096         case RQSTYPE_ABORT_IO:
 2097                 isp_get_24xx_abrt(isp, (isp24xx_abrt_t *)src, (isp24xx_abrt_t *)dst);
 2098                 break;
 2099         case RQSTYPE_LOGIN:
 2100                 isp_get_plogx(isp, (isp_plogx_t *)src, (isp_plogx_t *)dst);
 2101                 break;
 2102         default:
 2103                 panic("%s: Unknown type 0x%x\n", __func__, etype);
 2104         }
 2105 }
 2106 
 2107 int
 2108 isp_send_entry(ispsoftc_t *isp, void *src)
 2109 {
 2110         void *outp;
 2111 
 2112         outp = isp_getrqentry(isp);
 2113         if (outp == NULL) {
 2114                 isp_prt(isp, ISP_LOGWARN, "%s: Request Queue Overflow", __func__);
 2115                 return (-1);
 2116         }
 2117         isp_put_entry(isp, src, outp);
 2118         if (isp->isp_dblev & ISP_LOGTDEBUG2)
 2119             isp_print_qentry(isp, __func__, isp->isp_reqidx, outp);
 2120         ISP_SYNC_REQUEST(isp);
 2121         return (0);
 2122 }
 2123 
 2124 int
 2125 isp_exec_entry_mbox(ispsoftc_t *isp, void *src, void *dst, int timeout)
 2126 {
 2127         mbreg_t mbs;
 2128 
 2129         isp_put_entry(isp, src, isp->isp_iocb);
 2130         MEMORYBARRIER(isp, SYNC_IFORDEV, 0, 2 * QENTRY_LEN, 0);
 2131 
 2132         MBSINIT(&mbs, MBOX_EXEC_COMMAND_IOCB_A64, MBLOGALL,
 2133             MBCMD_DEFAULT_TIMEOUT + timeout * 1000000);
 2134         mbs.param[1] = QENTRY_LEN;
 2135         mbs.param[2] = DMA_WD1(isp->isp_iocb_dma);
 2136         mbs.param[3] = DMA_WD0(isp->isp_iocb_dma);
 2137         mbs.param[6] = DMA_WD3(isp->isp_iocb_dma);
 2138         mbs.param[7] = DMA_WD2(isp->isp_iocb_dma);
 2139         isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs);
 2140         if (mbs.param[0] != MBOX_COMMAND_COMPLETE)
 2141                 return (EIO);
 2142 
 2143         MEMORYBARRIER(isp, SYNC_IFORCPU, QENTRY_LEN, QENTRY_LEN, 0);
 2144         isp_get_entry(isp, &((isp24xx_statusreq_t *)isp->isp_iocb)[1], dst);
 2145         return (0);
 2146 }
 2147 
 2148 int
 2149 isp_exec_entry_queue(ispsoftc_t *isp, void *src, void *dst, int timeout)
 2150 {
 2151         uint8_t resp[QENTRY_LEN];
 2152         uint32_t hdl;
 2153 
 2154         timeout *= hz;
 2155 again:
 2156         /* Wait for empty request queue slot. */
 2157         while (!isp_rqentry_avail(isp, QENTRY_MAX) && timeout-- > 0)
 2158                 msleep(resp, &isp->isp_lock, 0, "isprqa", 1);
 2159         if (timeout <= 0)
 2160                 return (ENOMEM);
 2161 
 2162         /* Allocate handle.  Should always be available, but stay safe. */
 2163         hdl = isp_allocate_handle(isp, resp, ISP_HANDLE_CTRL);
 2164         if (hdl == 0) {
 2165                 if (timeout-- > 0) {
 2166                         msleep(resp, &isp->isp_lock, 0, "ispha", 1);
 2167                         goto again;
 2168                 }
 2169                 return (ENOMEM);
 2170         }
 2171         ((uint32_t *)src)[1] = hdl;
 2172 
 2173         /* Execute the request and wait for response. */
 2174         isp_send_entry(isp, src);
 2175         if (msleep(resp, &isp->isp_lock, 0, "ispeeq", timeout) != 0) {
 2176                 isp_destroy_handle(isp, hdl);
 2177                 return (EWOULDBLOCK);
 2178         }
 2179         isp_get_entry(isp, resp, dst);
 2180         return (0);
 2181 }
 2182 
 2183 /*
 2184  * vim:ts=8:sw=8
 2185  */

Cache object: a5908511327d72e64c84c6441a259002


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.