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_freebsd.h

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 /* $FreeBSD$ */
    2 /*-
    3  * Qlogic ISP SCSI Host Adapter FreeBSD Wrapper Definitions
    4  *
    5  * Copyright (c) 1997-2008 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  * 1. Redistributions of source code must retain the above copyright
   12  *    notice immediately at the beginning of the file, without modification,
   13  *    this list of conditions, and the following disclaimer.
   14  * 2. The name of the author may not be used to endorse or promote products
   15  *    derived from this software without specific prior written permission.
   16  *
   17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   20  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
   21  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   27  * SUCH DAMAGE.
   28  */
   29 #ifndef _ISP_FREEBSD_H
   30 #define _ISP_FREEBSD_H
   31 
   32 #include <sys/param.h>
   33 #include <sys/systm.h>
   34 #include <sys/endian.h>
   35 #include <sys/lock.h>
   36 #include <sys/kernel.h>
   37 #include <sys/queue.h>
   38 #include <sys/malloc.h>
   39 #include <sys/mutex.h>
   40 #include <sys/condvar.h>
   41 #include <sys/sysctl.h>
   42 
   43 #include <sys/proc.h>
   44 #include <sys/bus.h>
   45 #include <sys/taskqueue.h>
   46 
   47 #include <machine/bus.h>
   48 #include <machine/cpu.h>
   49 #include <machine/stdarg.h>
   50 
   51 #include <cam/cam.h>
   52 #include <cam/cam_debug.h>
   53 #include <cam/cam_ccb.h>
   54 #include <cam/cam_sim.h>
   55 #include <cam/cam_xpt.h>
   56 #include <cam/cam_xpt_sim.h>
   57 #include <cam/cam_debug.h>
   58 #include <cam/scsi/scsi_all.h>
   59 #include <cam/scsi/scsi_message.h>
   60 
   61 #include "opt_ddb.h"
   62 #include "opt_isp.h"
   63 
   64 #define ISP_PLATFORM_VERSION_MAJOR      7
   65 #define ISP_PLATFORM_VERSION_MINOR      10
   66 
   67 /*
   68  * Efficiency- get rid of SBus code && tests unless we need them.
   69  */
   70 #ifdef __sparc64__
   71 #define ISP_SBUS_SUPPORTED      1
   72 #else
   73 #define ISP_SBUS_SUPPORTED      0
   74 #endif
   75 
   76 #define ISP_IFLAGS      INTR_TYPE_CAM | INTR_ENTROPY | INTR_MPSAFE
   77 
   78 #define N_XCMDS         64
   79 #define XCMD_SIZE       512
   80 struct ispsoftc;
   81 typedef union isp_ecmd {
   82         union isp_ecmd *        next;
   83         uint8_t                 data[XCMD_SIZE];
   84 } isp_ecmd_t;
   85 isp_ecmd_t *    isp_get_ecmd(struct ispsoftc *);
   86 void            isp_put_ecmd(struct ispsoftc *, isp_ecmd_t *);
   87 
   88 #ifdef  ISP_TARGET_MODE
   89 /* Not quite right, but there was no bump for this change */
   90 #if __FreeBSD_version < 225469
   91 #define SDFIXED(x)      (&x)
   92 #else
   93 #define SDFIXED(x)      ((struct scsi_sense_data_fixed *)(&x))
   94 #endif
   95 
   96 #define ISP_TARGET_FUNCTIONS    1
   97 #define ATPDPSIZE       4096
   98 
   99 #include <dev/isp/isp_target.h>
  100 
  101 typedef struct {
  102         void *          next;
  103         uint32_t        orig_datalen;
  104         uint32_t        bytes_xfered;
  105         uint32_t        bytes_in_transit;
  106         uint32_t        tag;            /* typically f/w RX_ID */
  107         uint32_t        lun;
  108         uint32_t        nphdl;
  109         uint32_t        sid;
  110         uint32_t        portid;
  111         uint16_t        rxid;   /* wire rxid */
  112         uint16_t        oxid;   /* wire oxid */
  113         uint16_t        word3;  /* PRLI word3 params */
  114         uint16_t        ctcnt;  /* number of CTIOs currently active */
  115         uint8_t         seqno;  /* CTIO sequence number */
  116         uint32_t
  117                         srr_notify_rcvd : 1,
  118                         cdb0            : 8,
  119                         sendst          : 1,
  120                         dead            : 1,
  121                         tattr           : 3,
  122                         state           : 3;
  123         void *          ests;
  124         /*
  125          * The current SRR notify copy
  126          */
  127         uint8_t         srr[64];        /*  sb QENTRY_LEN, but order of definitions is wrong */
  128         void *          srr_ccb;
  129         uint32_t        nsrr;
  130 } atio_private_data_t;
  131 #define ATPD_STATE_FREE                 0
  132 #define ATPD_STATE_ATIO                 1
  133 #define ATPD_STATE_CAM                  2
  134 #define ATPD_STATE_CTIO                 3
  135 #define ATPD_STATE_LAST_CTIO            4
  136 #define ATPD_STATE_PDON                 5
  137 
  138 #define ATPD_CCB_OUTSTANDING            16
  139 
  140 #define ATPD_SEQ_MASK                   0x7f
  141 #define ATPD_SEQ_NOTIFY_CAM             0x80
  142 #define ATPD_SET_SEQNO(hdrp, atp)       ((isphdr_t *)hdrp)->rqs_seqno &= ~ATPD_SEQ_MASK, ((isphdr_t *)hdrp)->rqs_seqno |= (atp)->seqno
  143 #define ATPD_GET_SEQNO(hdrp)            (((isphdr_t *)hdrp)->rqs_seqno & ATPD_SEQ_MASK)
  144 #define ATPD_GET_NCAM(hdrp)             ((((isphdr_t *)hdrp)->rqs_seqno & ATPD_SEQ_NOTIFY_CAM) != 0)
  145 
  146 typedef union inot_private_data inot_private_data_t;
  147 union inot_private_data {
  148         inot_private_data_t *next;
  149         struct {
  150                 isp_notify_t nt;        /* must be first! */
  151                 uint8_t data[64];       /* sb QENTRY_LEN, but order of definitions is wrong */
  152                 uint32_t tag_id, seq_id;
  153         } rd;
  154 };
  155 typedef struct isp_timed_notify_ack {
  156         void *isp;
  157         void *not;
  158         uint8_t data[64];        /* sb QENTRY_LEN, but order of definitions is wrong */
  159 } isp_tna_t;
  160 
  161 TAILQ_HEAD(isp_ccbq, ccb_hdr);
  162 typedef struct tstate {
  163         SLIST_ENTRY(tstate) next;
  164         struct cam_path *owner;
  165         struct isp_ccbq waitq;          /* waiting CCBs */
  166         struct ccb_hdr_slist atios;
  167         struct ccb_hdr_slist inots;
  168         uint32_t hold;
  169         uint32_t
  170                 enabled         : 1,
  171                 atio_count      : 15,
  172                 inot_count      : 15;
  173         inot_private_data_t *   restart_queue;
  174         inot_private_data_t *   ntfree;
  175         inot_private_data_t     ntpool[ATPDPSIZE];
  176         atio_private_data_t *   atfree;
  177         atio_private_data_t     atpool[ATPDPSIZE];
  178 } tstate_t;
  179 
  180 #define LUN_HASH_SIZE           32
  181 #define LUN_HASH_FUNC(lun)      ((lun) & (LUN_HASH_SIZE - 1))
  182 
  183 #endif
  184 
  185 /*
  186  * Per command info.
  187  */
  188 struct isp_pcmd {
  189         struct isp_pcmd *       next;
  190         bus_dmamap_t            dmap;           /* dma map for this command */
  191         struct ispsoftc *       isp;            /* containing isp */
  192         struct callout          wdog;           /* watchdog timer */
  193         uint32_t                datalen;        /* data length for this command (target mode only) */
  194         uint8_t                 totslen;        /* sense length on status response */
  195         uint8_t                 cumslen;        /* sense length on status response */
  196         uint8_t                 crn;            /* command reference number */
  197 };
  198 #define ISP_PCMD(ccb)           (ccb)->ccb_h.spriv_ptr1
  199 #define PISP_PCMD(ccb)          ((struct isp_pcmd *)ISP_PCMD(ccb))
  200 
  201 /*
  202  * Per nexus info.
  203  */
  204 struct isp_nexus {
  205         struct isp_nexus *      next;
  206         uint32_t
  207                 crnseed :       8;      /* next command reference number */
  208         uint32_t
  209                 tgt     :       16,     /* TGT for target */
  210                 lun     :       16;     /* LUN for target */
  211 };
  212 #define NEXUS_HASH_WIDTH        32
  213 #define INITIAL_NEXUS_COUNT     MAX_FC_TARG
  214 #define NEXUS_HASH(tgt, lun)    ((tgt + lun) % NEXUS_HASH_WIDTH)
  215 
  216 /*
  217  * Per channel information
  218  */
  219 SLIST_HEAD(tslist, tstate);
  220 
  221 struct isp_fc {
  222         struct cam_sim *sim;
  223         struct cam_path *path;
  224         struct ispsoftc *isp;
  225         struct proc *kproc;
  226         bus_dma_tag_t tdmat;
  227         bus_dmamap_t tdmap;
  228         uint64_t def_wwpn;
  229         uint64_t def_wwnn;
  230         uint32_t loop_down_time;
  231         uint32_t loop_down_limit;
  232         uint32_t gone_device_time;
  233         /*
  234          * Per target/lun info- just to keep a per-ITL nexus crn count
  235          */
  236         struct isp_nexus *nexus_hash[NEXUS_HASH_WIDTH];
  237         struct isp_nexus *nexus_free_list;
  238         uint32_t
  239 #ifdef  ISP_TARGET_MODE
  240 #ifdef  ISP_INTERNAL_TARGET
  241                 proc_active     : 1,
  242 #endif
  243                 tm_luns_enabled : 1,
  244                 tm_enable_defer : 1,
  245                 tm_enabled      : 1,
  246 #endif
  247                 simqfrozen      : 3,
  248                 default_id      : 8,
  249                 hysteresis      : 8,
  250                 def_role        : 2,    /* default role */
  251                 gdt_running     : 1,
  252                 loop_dead       : 1,
  253                 fcbsy           : 1,
  254                 ready           : 1;
  255         struct callout ldt;     /* loop down timer */
  256         struct callout gdt;     /* gone device timer */
  257         struct task ltask;
  258         struct task gtask;
  259 #ifdef  ISP_TARGET_MODE
  260         struct tslist lun_hash[LUN_HASH_SIZE];
  261 #ifdef  ISP_INTERNAL_TARGET
  262         struct proc *           target_proc;
  263 #endif
  264 #if defined(DEBUG)
  265         unsigned int inject_lost_data_frame;
  266 #endif
  267 #endif
  268 };
  269 
  270 struct isp_spi {
  271         struct cam_sim *sim;
  272         struct cam_path *path;
  273         uint32_t
  274 #ifdef  ISP_TARGET_MODE
  275 #ifdef  ISP_INTERNAL_TARGET
  276                 proc_active     : 1,
  277 #endif
  278                 tm_luns_enabled : 1,
  279                 tm_enable_defer : 1,
  280                 tm_enabled      : 1,
  281 #endif
  282                 simqfrozen      : 3,
  283                 def_role        : 2,
  284                 iid             : 4;
  285 #ifdef  ISP_TARGET_MODE
  286         struct tslist lun_hash[LUN_HASH_SIZE];
  287 #ifdef  ISP_INTERNAL_TARGET
  288         struct proc *           target_proc;
  289 #endif
  290 #endif
  291 };
  292 
  293 struct isposinfo {
  294         /*
  295          * Linkage, locking, and identity
  296          */
  297         struct mtx              lock;
  298         device_t                dev;
  299         struct cdev *           cdev;
  300         struct intr_config_hook ehook;
  301         struct cam_devq *       devq;
  302 
  303         /*
  304          * Firmware pointer
  305          */
  306         const struct firmware * fw;
  307 
  308         /*
  309          * DMA related sdtuff
  310          */
  311         bus_space_tag_t         bus_tag;
  312         bus_dma_tag_t           dmat;
  313         bus_space_handle_t      bus_handle;
  314         bus_dma_tag_t           cdmat;
  315         bus_dmamap_t            cdmap;
  316 
  317         /*
  318          * Command and transaction related related stuff
  319          */
  320         struct isp_pcmd *       pcmd_pool;
  321         struct isp_pcmd *       pcmd_free;
  322 
  323         uint32_t
  324 #ifdef  ISP_TARGET_MODE
  325                 tmwanted        : 1,
  326                 tmbusy          : 1,
  327 #else
  328                                 : 2,
  329 #endif
  330                 sixtyfourbit    : 1,    /* sixtyfour bit platform */
  331                 timer_active    : 1,
  332                 autoconf        : 1,
  333                 ehook_active    : 1,
  334                 disabled        : 1,
  335                 mbox_sleeping   : 1,
  336                 mbox_sleep_ok   : 1,
  337                 mboxcmd_done    : 1,
  338                 mboxbsy         : 1;
  339 
  340         struct callout          tmo;    /* general timer */
  341 
  342         /*
  343          * misc- needs to be sorted better XXXXXX
  344          */
  345         int                     framesize;
  346         int                     exec_throttle;
  347         int                     cont_max;
  348 
  349 #ifdef  ISP_TARGET_MODE
  350         cam_status *            rptr;
  351 #endif
  352 
  353         bus_addr_t              ecmd_dma;
  354         isp_ecmd_t *            ecmd_base;
  355         isp_ecmd_t *            ecmd_free;
  356 
  357         /*
  358          * Per-type private storage...
  359          */
  360         union {
  361                 struct isp_fc *fc;
  362                 struct isp_spi *spi;
  363                 void *ptr;
  364         } pc;
  365 };
  366 #define ISP_FC_PC(isp, chan)    (&(isp)->isp_osinfo.pc.fc[(chan)])
  367 #define ISP_SPI_PC(isp, chan)   (&(isp)->isp_osinfo.pc.spi[(chan)])
  368 #define ISP_GET_PC(isp, chan, tag, rslt)                \
  369         if (IS_SCSI(isp)) {                             \
  370                 rslt = ISP_SPI_PC(isp, chan)-> tag;     \
  371         } else {                                        \
  372                 rslt = ISP_FC_PC(isp, chan)-> tag;      \
  373         }
  374 #define ISP_GET_PC_ADDR(isp, chan, tag, rp)             \
  375         if (IS_SCSI(isp)) {                             \
  376                 rp = &ISP_SPI_PC(isp, chan)-> tag;      \
  377         } else {                                        \
  378                 rp = &ISP_FC_PC(isp, chan)-> tag;       \
  379         }
  380 #define ISP_SET_PC(isp, chan, tag, val)                 \
  381         if (IS_SCSI(isp)) {                             \
  382                 ISP_SPI_PC(isp, chan)-> tag = val;      \
  383         } else {                                        \
  384                 ISP_FC_PC(isp, chan)-> tag = val;       \
  385         }
  386 
  387 #define FCP_NEXT_CRN    isp_fcp_next_crn
  388 #define isp_lock        isp_osinfo.lock
  389 #define isp_bus_tag     isp_osinfo.bus_tag
  390 #define isp_bus_handle  isp_osinfo.bus_handle
  391 
  392 /*
  393  * Locking macros...
  394  */
  395 #define ISP_LOCK(isp)   mtx_lock(&isp->isp_osinfo.lock)
  396 #define ISP_UNLOCK(isp) mtx_unlock(&isp->isp_osinfo.lock)
  397 
  398 /*
  399  * Required Macros/Defines
  400  */
  401 #define ISP_FC_SCRLEN           0x1000
  402 
  403 #define ISP_MEMZERO(a, b)       memset(a, 0, b)
  404 #define ISP_MEMCPY              memcpy
  405 #define ISP_SNPRINTF            snprintf
  406 #define ISP_DELAY               DELAY
  407 #define ISP_SLEEP(isp, x)       DELAY(x)
  408 
  409 #define ISP_MIN                 imin
  410 
  411 #ifndef DIAGNOSTIC
  412 #define ISP_INLINE              __inline
  413 #else
  414 #define ISP_INLINE
  415 #endif
  416 
  417 #define NANOTIME_T              struct timespec
  418 #define GET_NANOTIME            nanotime
  419 #define GET_NANOSEC(x)          ((x)->tv_sec * 1000000000 + (x)->tv_nsec)
  420 #define NANOTIME_SUB            isp_nanotime_sub
  421 
  422 #define MAXISPREQUEST(isp)      ((IS_FC(isp) || IS_ULTRA2(isp))? 1024 : 256)
  423 
  424 #define MEMORYBARRIER(isp, type, offset, size, chan)            \
  425 switch (type) {                                                 \
  426 case SYNC_SFORDEV:                                              \
  427 {                                                               \
  428         struct isp_fc *fc = ISP_FC_PC(isp, chan);               \
  429         bus_dmamap_sync(fc->tdmat, fc->tdmap,                   \
  430            BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);         \
  431         break;                                                  \
  432 }                                                               \
  433 case SYNC_REQUEST:                                              \
  434         bus_dmamap_sync(isp->isp_osinfo.cdmat,                  \
  435            isp->isp_osinfo.cdmap,                               \
  436            BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);         \
  437         break;                                                  \
  438 case SYNC_SFORCPU:                                              \
  439 {                                                               \
  440         struct isp_fc *fc = ISP_FC_PC(isp, chan);               \
  441         bus_dmamap_sync(fc->tdmat, fc->tdmap,                   \
  442            BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);       \
  443         break;                                                  \
  444 }                                                               \
  445 case SYNC_RESULT:                                               \
  446         bus_dmamap_sync(isp->isp_osinfo.cdmat,                  \
  447            isp->isp_osinfo.cdmap,                               \
  448            BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);       \
  449         break;                                                  \
  450 case SYNC_REG:                                                  \
  451         bus_space_barrier(isp->isp_osinfo.bus_tag,              \
  452             isp->isp_osinfo.bus_handle, offset, size,           \
  453             BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);  \
  454         break;                                                  \
  455 default:                                                        \
  456         break;                                                  \
  457 }
  458 
  459 #define MBOX_ACQUIRE                    isp_mbox_acquire
  460 #define MBOX_WAIT_COMPLETE              isp_mbox_wait_complete
  461 #define MBOX_NOTIFY_COMPLETE            isp_mbox_notify_done
  462 #define MBOX_RELEASE                    isp_mbox_release
  463 
  464 #define FC_SCRATCH_ACQUIRE              isp_fc_scratch_acquire
  465 #define FC_SCRATCH_RELEASE(isp, chan)   isp->isp_osinfo.pc.fc[chan].fcbsy = 0
  466 
  467 #ifndef SCSI_GOOD
  468 #define SCSI_GOOD       SCSI_STATUS_OK
  469 #endif
  470 #ifndef SCSI_CHECK
  471 #define SCSI_CHECK      SCSI_STATUS_CHECK_COND
  472 #endif
  473 #ifndef SCSI_BUSY
  474 #define SCSI_BUSY       SCSI_STATUS_BUSY
  475 #endif
  476 #ifndef SCSI_QFULL
  477 #define SCSI_QFULL      SCSI_STATUS_QUEUE_FULL
  478 #endif
  479 
  480 #define XS_T                    struct ccb_scsiio
  481 #define XS_DMA_ADDR_T           bus_addr_t
  482 #define XS_GET_DMA64_SEG(a, b, c)               \
  483 {                                               \
  484         ispds64_t *d = a;                       \
  485         bus_dma_segment_t *e = b;               \
  486         uint32_t f = c;                         \
  487         e += f;                                 \
  488         d->ds_base = DMA_LO32(e->ds_addr);      \
  489         d->ds_basehi = DMA_HI32(e->ds_addr);    \
  490         d->ds_count = e->ds_len;                \
  491 }
  492 #define XS_GET_DMA_SEG(a, b, c)                 \
  493 {                                               \
  494         ispds_t *d = a;                         \
  495         bus_dma_segment_t *e = b;               \
  496         uint32_t f = c;                         \
  497         e += f;                                 \
  498         d->ds_base = DMA_LO32(e->ds_addr);      \
  499         d->ds_count = e->ds_len;                \
  500 }
  501 #define XS_ISP(ccb)             cam_sim_softc(xpt_path_sim((ccb)->ccb_h.path))
  502 #define XS_CHANNEL(ccb)         cam_sim_bus(xpt_path_sim((ccb)->ccb_h.path))
  503 #define XS_TGT(ccb)             (ccb)->ccb_h.target_id
  504 #define XS_LUN(ccb)             (ccb)->ccb_h.target_lun
  505 
  506 #define XS_CDBP(ccb)    \
  507         (((ccb)->ccb_h.flags & CAM_CDB_POINTER)? \
  508          (ccb)->cdb_io.cdb_ptr : (ccb)->cdb_io.cdb_bytes)
  509 
  510 #define XS_CDBLEN(ccb)          (ccb)->cdb_len
  511 #define XS_XFRLEN(ccb)          (ccb)->dxfer_len
  512 #define XS_TIME(ccb)            (ccb)->ccb_h.timeout
  513 #define XS_GET_RESID(ccb)       (ccb)->resid
  514 #define XS_SET_RESID(ccb, r)    (ccb)->resid = r
  515 #define XS_STSP(ccb)            (&(ccb)->scsi_status)
  516 #define XS_SNSP(ccb)            (&(ccb)->sense_data)
  517 
  518 #define XS_TOT_SNSLEN(ccb)      ccb->sense_len
  519 #define XS_CUR_SNSLEN(ccb)      (ccb->sense_len - ccb->sense_resid)
  520 
  521 #define XS_SNSKEY(ccb)          (scsi_get_sense_key(&(ccb)->sense_data, \
  522                                  ccb->sense_len - ccb->sense_resid, 1))
  523 
  524 #define XS_SNSASC(ccb)          (scsi_get_asc(&(ccb)->sense_data,       \
  525                                  ccb->sense_len - ccb->sense_resid, 1))
  526 
  527 #define XS_SNSASCQ(ccb)         (scsi_get_ascq(&(ccb)->sense_data,      \
  528                                  ccb->sense_len - ccb->sense_resid, 1))
  529 #define XS_TAG_P(ccb)   \
  530         (((ccb)->ccb_h.flags & CAM_TAG_ACTION_VALID) && \
  531          (ccb)->tag_action != CAM_TAG_ACTION_NONE)
  532 
  533 #define XS_TAG_TYPE(ccb)        \
  534         ((ccb->tag_action == MSG_SIMPLE_Q_TAG)? REQFLAG_STAG : \
  535          ((ccb->tag_action == MSG_HEAD_OF_Q_TAG)? REQFLAG_HTAG : REQFLAG_OTAG))
  536                 
  537 
  538 #define XS_SETERR(ccb, v)       (ccb)->ccb_h.status &= ~CAM_STATUS_MASK, \
  539                                 (ccb)->ccb_h.status |= v
  540 
  541 #       define  HBA_NOERROR             CAM_REQ_INPROG
  542 #       define  HBA_BOTCH               CAM_UNREC_HBA_ERROR
  543 #       define  HBA_CMDTIMEOUT          CAM_CMD_TIMEOUT
  544 #       define  HBA_SELTIMEOUT          CAM_SEL_TIMEOUT
  545 #       define  HBA_TGTBSY              CAM_SCSI_STATUS_ERROR
  546 #       define  HBA_BUSRESET            CAM_SCSI_BUS_RESET
  547 #       define  HBA_ABORTED             CAM_REQ_ABORTED
  548 #       define  HBA_DATAOVR             CAM_DATA_RUN_ERR
  549 #       define  HBA_ARQFAIL             CAM_AUTOSENSE_FAIL
  550 
  551 
  552 #define XS_ERR(ccb)             ((ccb)->ccb_h.status & CAM_STATUS_MASK)
  553 
  554 #define XS_NOERR(ccb)           (((ccb)->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_INPROG)
  555 
  556 #define XS_INITERR(ccb)         XS_SETERR(ccb, CAM_REQ_INPROG), ccb->sense_resid = ccb->sense_len
  557 
  558 #define XS_SAVE_SENSE(xs, sense_ptr, totslen, slen)     do {                    \
  559                 uint32_t tlen = slen;                                           \
  560                 if (tlen > (xs)->sense_len)                                     \
  561                         tlen = (xs)->sense_len;                                 \
  562                 PISP_PCMD(xs)->totslen = imin((xs)->sense_len, totslen);        \
  563                 PISP_PCMD(xs)->cumslen = tlen;                                  \
  564                 memcpy(&(xs)->sense_data, sense_ptr, tlen);                     \
  565                 (xs)->sense_resid = (xs)->sense_len - tlen;                     \
  566                 (xs)->ccb_h.status |= CAM_AUTOSNS_VALID;                        \
  567         } while (0)
  568 
  569 #define XS_SENSE_APPEND(xs, xsnsp, xsnsl)       do {                            \
  570                 uint32_t off = PISP_PCMD(xs)->cumslen;                          \
  571                 uint8_t *ptr = &((uint8_t *)(&(xs)->sense_data))[off];          \
  572                 uint32_t amt = imin(xsnsl, PISP_PCMD(xs)->totslen - off);       \
  573                 if (amt) {                                                      \
  574                         memcpy(ptr, xsnsp, amt);                                \
  575                         (xs)->sense_resid -= amt;                               \
  576                         PISP_PCMD(xs)->cumslen += amt;                          \
  577                 }                                                               \
  578         } while (0)
  579 
  580 #define XS_SENSE_VALID(xs)      (((xs)->ccb_h.status & CAM_AUTOSNS_VALID) != 0)
  581 
  582 #define DEFAULT_FRAMESIZE(isp)          isp->isp_osinfo.framesize
  583 #define DEFAULT_EXEC_THROTTLE(isp)      isp->isp_osinfo.exec_throttle
  584 
  585 #define GET_DEFAULT_ROLE(isp, chan)     \
  586         (IS_FC(isp)? ISP_FC_PC(isp, chan)->def_role : ISP_SPI_PC(isp, chan)->def_role)
  587 #define SET_DEFAULT_ROLE(isp, chan, val)                \
  588         if (IS_FC(isp)) {                               \
  589                 ISP_FC_PC(isp, chan)->def_role = val;   \
  590         } else {                                        \
  591                 ISP_SPI_PC(isp, chan)->def_role = val;  \
  592         }
  593 
  594 #define DEFAULT_IID(isp, chan)          isp->isp_osinfo.pc.spi[chan].iid
  595 
  596 #define DEFAULT_LOOPID(x, chan)         isp->isp_osinfo.pc.fc[chan].default_id
  597 
  598 #define DEFAULT_NODEWWN(isp, chan)      isp_default_wwn(isp, chan, 0, 1)
  599 #define DEFAULT_PORTWWN(isp, chan)      isp_default_wwn(isp, chan, 0, 0)
  600 #define ACTIVE_NODEWWN(isp, chan)       isp_default_wwn(isp, chan, 1, 1)
  601 #define ACTIVE_PORTWWN(isp, chan)       isp_default_wwn(isp, chan, 1, 0)
  602 
  603 
  604 #if     BYTE_ORDER == BIG_ENDIAN
  605 #ifdef  ISP_SBUS_SUPPORTED
  606 #define ISP_IOXPUT_8(isp, s, d)         *(d) = s
  607 #define ISP_IOXPUT_16(isp, s, d)                                \
  608         *(d) = (isp->isp_bustype == ISP_BT_SBUS)? s : bswap16(s)
  609 #define ISP_IOXPUT_32(isp, s, d)                                \
  610         *(d) = (isp->isp_bustype == ISP_BT_SBUS)? s : bswap32(s)
  611 #define ISP_IOXGET_8(isp, s, d)         d = (*((uint8_t *)s))
  612 #define ISP_IOXGET_16(isp, s, d)                                \
  613         d = (isp->isp_bustype == ISP_BT_SBUS)?                  \
  614         *((uint16_t *)s) : bswap16(*((uint16_t *)s))
  615 #define ISP_IOXGET_32(isp, s, d)                                \
  616         d = (isp->isp_bustype == ISP_BT_SBUS)?                  \
  617         *((uint32_t *)s) : bswap32(*((uint32_t *)s))
  618 
  619 #else   /* ISP_SBUS_SUPPORTED */
  620 #define ISP_IOXPUT_8(isp, s, d)         *(d) = s
  621 #define ISP_IOXPUT_16(isp, s, d)        *(d) = bswap16(s)
  622 #define ISP_IOXPUT_32(isp, s, d)        *(d) = bswap32(s)
  623 #define ISP_IOXGET_8(isp, s, d)         d = (*((uint8_t *)s))
  624 #define ISP_IOXGET_16(isp, s, d)        d = bswap16(*((uint16_t *)s))
  625 #define ISP_IOXGET_32(isp, s, d)        d = bswap32(*((uint32_t *)s))
  626 #endif
  627 #define ISP_SWIZZLE_NVRAM_WORD(isp, rp) *rp = bswap16(*rp)
  628 #define ISP_SWIZZLE_NVRAM_LONG(isp, rp) *rp = bswap32(*rp)
  629 
  630 #define ISP_IOZGET_8(isp, s, d)         d = (*((uint8_t *)s))
  631 #define ISP_IOZGET_16(isp, s, d)        d = (*((uint16_t *)s))
  632 #define ISP_IOZGET_32(isp, s, d)        d = (*((uint32_t *)s))
  633 #define ISP_IOZPUT_8(isp, s, d)         *(d) = s
  634 #define ISP_IOZPUT_16(isp, s, d)        *(d) = s
  635 #define ISP_IOZPUT_32(isp, s, d)        *(d) = s
  636 
  637 
  638 #else
  639 #define ISP_IOXPUT_8(isp, s, d)         *(d) = s
  640 #define ISP_IOXPUT_16(isp, s, d)        *(d) = s
  641 #define ISP_IOXPUT_32(isp, s, d)        *(d) = s
  642 #define ISP_IOXGET_8(isp, s, d)         d = *(s)
  643 #define ISP_IOXGET_16(isp, s, d)        d = *(s)
  644 #define ISP_IOXGET_32(isp, s, d)        d = *(s)
  645 #define ISP_SWIZZLE_NVRAM_WORD(isp, rp)
  646 #define ISP_SWIZZLE_NVRAM_LONG(isp, rp)
  647 
  648 #define ISP_IOZPUT_8(isp, s, d)         *(d) = s
  649 #define ISP_IOZPUT_16(isp, s, d)        *(d) = bswap16(s)
  650 #define ISP_IOZPUT_32(isp, s, d)        *(d) = bswap32(s)
  651 
  652 #define ISP_IOZGET_8(isp, s, d)         d = (*((uint8_t *)(s)))
  653 #define ISP_IOZGET_16(isp, s, d)        d = bswap16(*((uint16_t *)(s)))
  654 #define ISP_IOZGET_32(isp, s, d)        d = bswap32(*((uint32_t *)(s)))
  655 
  656 #endif
  657 
  658 #define ISP_SWAP16(isp, s)      bswap16(s)
  659 #define ISP_SWAP32(isp, s)      bswap32(s)
  660 
  661 /*
  662  * Includes of common header files
  663  */
  664 
  665 #include <dev/isp/ispreg.h>
  666 #include <dev/isp/ispvar.h>
  667 #include <dev/isp/ispmbox.h>
  668 
  669 /*
  670  * isp_osinfo definiitions && shorthand
  671  */
  672 #define SIMQFRZ_RESOURCE        0x1
  673 #define SIMQFRZ_LOOPDOWN        0x2
  674 #define SIMQFRZ_TIMED           0x4
  675 
  676 #define isp_dev         isp_osinfo.dev
  677 
  678 /*
  679  * prototypes for isp_pci && isp_freebsd to share
  680  */
  681 extern int isp_attach(ispsoftc_t *);
  682 extern int isp_detach(ispsoftc_t *);
  683 extern void isp_uninit(ispsoftc_t *);
  684 extern uint64_t isp_default_wwn(ispsoftc_t *, int, int, int);
  685 
  686 /*
  687  * driver global data
  688  */
  689 extern int isp_announced;
  690 extern int isp_fabric_hysteresis;
  691 extern int isp_loop_down_limit;
  692 extern int isp_gone_device_time;
  693 extern int isp_quickboot_time;
  694 extern int isp_autoconfig;
  695 
  696 /*
  697  * Platform private flags
  698  */
  699 
  700 /*
  701  * Platform Library Functions
  702  */
  703 void isp_prt(ispsoftc_t *, int level, const char *, ...) __printflike(3, 4);
  704 void isp_xs_prt(ispsoftc_t *, XS_T *, int level, const char *, ...) __printflike(4, 5);
  705 uint64_t isp_nanotime_sub(struct timespec *, struct timespec *);
  706 int isp_mbox_acquire(ispsoftc_t *);
  707 void isp_mbox_wait_complete(ispsoftc_t *, mbreg_t *);
  708 void isp_mbox_notify_done(ispsoftc_t *);
  709 void isp_mbox_release(ispsoftc_t *);
  710 int isp_fc_scratch_acquire(ispsoftc_t *, int);
  711 int isp_mstohz(int);
  712 void isp_platform_intr(void *);
  713 void isp_common_dmateardown(ispsoftc_t *, struct ccb_scsiio *, uint32_t);
  714 int isp_fcp_next_crn(ispsoftc_t *, uint8_t *, XS_T *);
  715 
  716 /*
  717  * Platform Version specific defines
  718  */
  719 #define BUS_DMA_ROOTARG(x)      bus_get_dma_tag(x)
  720 #define isp_dma_tag_create(a, b, c, d, e, f, g, h, i, j, k, z)  \
  721         bus_dma_tag_create(a, b, c, d, e, f, g, h, i, j, k, \
  722         busdma_lock_mutex, &isp->isp_osinfo.lock, z)
  723 
  724 #define isp_setup_intr  bus_setup_intr
  725 
  726 #define isp_sim_alloc(a, b, c, d, e, f, g, h)   \
  727         cam_sim_alloc(a, b, c, d, e, &(d)->isp_osinfo.lock, f, g, h)
  728 
  729 #define ISP_PATH_PRT(i, l, p, ...)                                      \
  730         if ((l) == ISP_LOGALL || ((l)& (i)->isp_dblev) != 0) {          \
  731                 xpt_print(p, __VA_ARGS__);                              \
  732         }
  733 
  734 /*
  735  * Platform specific inline functions
  736  */
  737 
  738 /*
  739  * ISP General Library functions
  740  */
  741 
  742 #include <dev/isp/isp_library.h>
  743 
  744 #endif  /* _ISP_FREEBSD_H */

Cache object: a44c9267f1d966e6246b02605dccd265


[ 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.