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

Cache object: 903fe52135b54ff021bc9612f59e5876


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