[BACK]Return to ispvar.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / dev / ic

Annotation of src/sys/dev/ic/ispvar.h, Revision 1.64

1.64    ! christos    1: /* $NetBSD: ispvar.h,v 1.60.2.5 2005/11/10 14:04:15 skrll Exp $ */
1.34      mjacob      2: /*
                      3:  * This driver, which is contained in NetBSD in the files:
                      4:  *
                      5:  *     sys/dev/ic/isp.c
1.37      wiz         6:  *     sys/dev/ic/isp_inline.h
                      7:  *     sys/dev/ic/isp_netbsd.c
                      8:  *     sys/dev/ic/isp_netbsd.h
                      9:  *     sys/dev/ic/isp_target.c
                     10:  *     sys/dev/ic/isp_target.h
                     11:  *     sys/dev/ic/isp_tpublic.h
                     12:  *     sys/dev/ic/ispmbox.h
                     13:  *     sys/dev/ic/ispreg.h
                     14:  *     sys/dev/ic/ispvar.h
1.34      mjacob     15:  *     sys/microcode/isp/asm_sbus.h
                     16:  *     sys/microcode/isp/asm_1040.h
                     17:  *     sys/microcode/isp/asm_1080.h
                     18:  *     sys/microcode/isp/asm_12160.h
                     19:  *     sys/microcode/isp/asm_2100.h
                     20:  *     sys/microcode/isp/asm_2200.h
                     21:  *     sys/pci/isp_pci.c
                     22:  *     sys/sbus/isp_sbus.c
                     23:  *
1.61      keihan     24:  * Is being actively maintained by Matthew Jacob (mjacob@NetBSD.org).
1.34      mjacob     25:  * This driver also is shared source with FreeBSD, OpenBSD, Linux, Solaris,
                     26:  * Linux versions. This tends to be an interesting maintenance problem.
                     27:  *
                     28:  * Please coordinate with Matthew Jacob on changes you wish to make here.
                     29:  */
1.1       cgd        30: /*
1.24      mjacob     31:  * Copyright (C) 1999 National Aeronautics & Space Administration
1.23      mjacob     32:  * All rights reserved.
1.1       cgd        33:  *
                     34:  * Redistribution and use in source and binary forms, with or without
                     35:  * modification, are permitted provided that the following conditions
                     36:  * are met:
                     37:  * 1. Redistributions of source code must retain the above copyright
1.23      mjacob     38:  *    notice, this list of conditions and the following disclaimer.
1.1       cgd        39:  * 2. Redistributions in binary form must reproduce the above copyright
                     40:  *    notice, this list of conditions and the following disclaimer in the
                     41:  *    documentation and/or other materials provided with the distribution.
                     42:  * 3. The name of the author may not be used to endorse or promote products
1.23      mjacob     43:  *    derived from this software without specific prior written permission
1.9       mjacob     44:  *
1.23      mjacob     45:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     46:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     47:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     48:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     49:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     50:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     51:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     52:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     53:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     54:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1.1       cgd        55:  */
1.2       cgd        56:
1.23      mjacob     57: /*
                     58:  * Soft Definitions for for Qlogic ISP SCSI adapters.
                     59:  * Matthew Jacob <mjacob@nas.nasa.gov>
                     60:  */
1.1       cgd        61: #ifndef        _ISPVAR_H
                     62: #define        _ISPVAR_H
                     63:
1.19      mjacob     64: #if defined(__NetBSD__) || defined(__OpenBSD__)
1.1       cgd        65: #include <dev/ic/ispmbox.h>
1.26      mjacob     66: #ifdef ISP_TARGET_MODE
                     67: #include <dev/ic/isp_target.h>
1.29      mjacob     68: #include <dev/ic/isp_tpublic.h>
1.26      mjacob     69: #endif
1.9       mjacob     70: #endif
                     71: #ifdef __FreeBSD__
                     72: #include <dev/isp/ispmbox.h>
1.26      mjacob     73: #ifdef ISP_TARGET_MODE
                     74: #include <dev/isp/isp_target.h>
1.29      mjacob     75: #include <dev/isp/isp_tpublic.h>
1.26      mjacob     76: #endif
1.9       mjacob     77: #endif
                     78: #ifdef __linux__
1.15      mjacob     79: #include "ispmbox.h"
1.26      mjacob     80: #ifdef ISP_TARGET_MODE
                     81: #include "isp_target.h"
1.29      mjacob     82: #include "isp_tpublic.h"
1.26      mjacob     83: #endif
1.9       mjacob     84: #endif
1.1       cgd        85:
1.32      mjacob     86: #define        ISP_CORE_VERSION_MAJOR  2
1.56      mjacob     87: #define        ISP_CORE_VERSION_MINOR  7
1.10      mjacob     88:
1.1       cgd        89: /*
1.17      mjacob     90:  * Vector for bus specific code to provide specific services.
1.1       cgd        91:  */
                     92: struct ispsoftc;
                     93: struct ispmdvec {
1.48      mjacob     94:        int             (*dv_rd_isr)
                     95:            (struct ispsoftc *, u_int16_t *, u_int16_t *, u_int16_t *);
1.43      mjacob     96:        u_int16_t       (*dv_rd_reg) (struct ispsoftc *, int);
                     97:        void            (*dv_wr_reg) (struct ispsoftc *, int, u_int16_t);
                     98:        int             (*dv_mbxdma) (struct ispsoftc *);
                     99:        int             (*dv_dmaset) (struct ispsoftc *,
1.48      mjacob    100:            XS_T *, ispreq_t *, u_int16_t *, u_int16_t);
1.1       cgd       101:        void            (*dv_dmaclr)
1.48      mjacob    102:            (struct ispsoftc *, XS_T *, u_int16_t);
1.43      mjacob    103:        void            (*dv_reset0) (struct ispsoftc *);
                    104:        void            (*dv_reset1) (struct ispsoftc *);
                    105:        void            (*dv_dregs) (struct ispsoftc *, const char *);
1.63      christos  106:        const u_int16_t *dv_ispfw;      /* ptr to f/w */
1.1       cgd       107:        u_int16_t       dv_conf1;
1.4       mjacob    108:        u_int16_t       dv_clock;       /* clock frequency */
1.1       cgd       109: };
                    110:
1.32      mjacob    111: /*
                    112:  * Overall parameters
                    113:  */
1.48      mjacob    114: #define        MAX_TARGETS             16
                    115: #define        MAX_FC_TARG             256
1.24      mjacob    116: #define        ISP_MAX_TARGETS(isp)    (IS_FC(isp)? MAX_FC_TARG : MAX_TARGETS)
1.31      mjacob    117: #define        ISP_MAX_LUNS(isp)       (isp)->isp_maxluns
1.24      mjacob    118:
1.48      mjacob    119: /*
                    120:  * 'Types'
                    121:  */
1.59      mjacob    122: #ifdef ISP_DAC_SUPPORTED
                    123: typedef        u_int64_t       isp_dma_addr_t;
                    124: #else
                    125: typedef        u_int32_t       isp_dma_addr_t;
1.48      mjacob    126: #endif
1.26      mjacob    127:
                    128: /*
1.32      mjacob    129:  * Macros to access ISP registers through bus specific layers-
                    130:  * mostly wrappers to vector through the mdvec structure.
1.26      mjacob    131:  */
1.48      mjacob    132: #define        ISP_READ_ISR(isp, isrp, semap, mbox0p)  \
                    133:        (*(isp)->isp_mdvec->dv_rd_isr)(isp, isrp, semap, mbox0p)
1.26      mjacob    134:
                    135: #define        ISP_READ(isp, reg)      \
                    136:        (*(isp)->isp_mdvec->dv_rd_reg)((isp), (reg))
                    137:
                    138: #define        ISP_WRITE(isp, reg, val)        \
                    139:        (*(isp)->isp_mdvec->dv_wr_reg)((isp), (reg), (val))
                    140:
                    141: #define        ISP_MBOXDMASETUP(isp)   \
                    142:        (*(isp)->isp_mdvec->dv_mbxdma)((isp))
                    143:
                    144: #define        ISP_DMASETUP(isp, xs, req, iptrp, optr) \
                    145:        (*(isp)->isp_mdvec->dv_dmaset)((isp), (xs), (req), (iptrp), (optr))
                    146:
                    147: #define        ISP_DMAFREE(isp, xs, hndl)      \
                    148:        if ((isp)->isp_mdvec->dv_dmaclr) \
                    149:            (*(isp)->isp_mdvec->dv_dmaclr)((isp), (xs), (hndl))
                    150:
                    151: #define        ISP_RESET0(isp) \
                    152:        if ((isp)->isp_mdvec->dv_reset0) (*(isp)->isp_mdvec->dv_reset0)((isp))
                    153: #define        ISP_RESET1(isp) \
                    154:        if ((isp)->isp_mdvec->dv_reset1) (*(isp)->isp_mdvec->dv_reset1)((isp))
1.32      mjacob    155: #define        ISP_DUMPREGS(isp, m)    \
                    156:        if ((isp)->isp_mdvec->dv_dregs) (*(isp)->isp_mdvec->dv_dregs)((isp),(m))
1.26      mjacob    157:
                    158: #define        ISP_SETBITS(isp, reg, val)      \
                    159:  (*(isp)->isp_mdvec->dv_wr_reg)((isp), (reg), ISP_READ((isp), (reg)) | (val))
                    160:
                    161: #define        ISP_CLRBITS(isp, reg, val)      \
                    162:  (*(isp)->isp_mdvec->dv_wr_reg)((isp), (reg), ISP_READ((isp), (reg)) & ~(val))
                    163:
1.32      mjacob    164: /*
                    165:  * The MEMORYBARRIER macro is defined per platform (to provide synchronization
                    166:  * on Request and Response Queues, Scratch DMA areas, and Registers)
                    167:  *
                    168:  * Defined Memory Barrier Synchronization Types
                    169:  */
                    170: #define        SYNC_REQUEST    0       /* request queue synchronization */
                    171: #define        SYNC_RESULT     1       /* result queue synchronization */
                    172: #define        SYNC_SFORDEV    2       /* scratch, sync for ISP */
                    173: #define        SYNC_SFORCPU    3       /* scratch, sync for CPU */
                    174: #define        SYNC_REG        4       /* for registers */
                    175:
                    176: /*
                    177:  * Request/Response Queue defines and macros.
                    178:  * The maximum is defined per platform (and can be based on board type).
                    179:  */
                    180: /* This is the size of a queue entry (request and response) */
1.11      mjacob    181: #define        QENTRY_LEN                      64
1.32      mjacob    182: /* Both request and result queue length must be a power of two */
                    183: #define        RQUEST_QUEUE_LEN(x)             MAXISPREQUEST(x)
1.55      mjacob    184: #ifdef ISP_TARGET_MODE
                    185: #define        RESULT_QUEUE_LEN(x)             MAXISPREQUEST(x)
                    186: #else
1.32      mjacob    187: #define        RESULT_QUEUE_LEN(x)             \
                    188:        (((MAXISPREQUEST(x) >> 2) < 64)? 64 : MAXISPREQUEST(x) >> 2)
1.55      mjacob    189: #endif
1.11      mjacob    190: #define        ISP_QUEUE_ENTRY(q, idx)         ((q) + ((idx) * QENTRY_LEN))
                    191: #define        ISP_QUEUE_SIZE(n)               ((n) * QENTRY_LEN)
                    192: #define        ISP_NXT_QENTRY(idx, qlen)       (((idx) + 1) & ((qlen)-1))
1.34      mjacob    193: #define        ISP_QFREE(in, out, qlen)        \
1.13      mjacob    194:        ((in == out)? (qlen - 1) : ((in > out)? \
1.25      mjacob    195:        ((qlen - 1) - (in - out)) : (out - in - 1)))
1.34      mjacob    196: #define        ISP_QAVAIL(isp) \
                    197:        ISP_QFREE(isp->isp_reqidx, isp->isp_reqodx, RQUEST_QUEUE_LEN(isp))
1.26      mjacob    198:
1.51      mjacob    199: #define        ISP_ADD_REQUEST(isp, nxti)                                      \
                    200:        MEMORYBARRIER(isp, SYNC_REQUEST, isp->isp_reqidx, QENTRY_LEN);  \
                    201:        WRITE_REQUEST_QUEUE_IN_POINTER(isp, nxti);                      \
                    202:        isp->isp_reqidx = nxti
1.26      mjacob    203:
1.1       cgd       204: /*
1.22      mjacob    205:  * SCSI Specific Host Adapter Parameters- per bus, per target
1.6       mjacob    206:  */
                    207:
                    208: typedef struct {
1.22      mjacob    209:        u_int           isp_gotdparms           : 1,
1.25      mjacob    210:                        isp_req_ack_active_neg  : 1,
                    211:                        isp_data_line_active_neg: 1,
1.6       mjacob    212:                        isp_cmd_dma_burst_enable: 1,
                    213:                        isp_data_dma_burst_enabl: 1,
1.16      mjacob    214:                        isp_fifo_threshold      : 3,
1.17      mjacob    215:                        isp_ultramode           : 1,
1.6       mjacob    216:                        isp_diffmode            : 1,
1.20      mjacob    217:                        isp_lvdmode             : 1,
1.33      mjacob    218:                        isp_fast_mttr           : 1,    /* fast sram */
1.6       mjacob    219:                        isp_initiator_id        : 4,
1.25      mjacob    220:                        isp_async_data_setup    : 4;
                    221:        u_int16_t       isp_selection_timeout;
                    222:        u_int16_t       isp_max_queue_depth;
1.6       mjacob    223:        u_int8_t        isp_tag_aging;
1.25      mjacob    224:        u_int8_t        isp_bus_reset_delay;
                    225:        u_int8_t        isp_retry_count;
                    226:        u_int8_t        isp_retry_delay;
1.6       mjacob    227:        struct {
1.62      perry     228:                u_int32_t
1.48      mjacob    229:                        exc_throttle    :       8,
1.22      mjacob    230:                                        :       1,
1.48      mjacob    231:                        dev_enable      :       1,      /* ignored */
1.17      mjacob    232:                        dev_update      :       1,
                    233:                        dev_refresh     :       1,
1.48      mjacob    234:                        actv_offset     :       4,
                    235:                        goal_offset     :       4,
                    236:                        nvrm_offset     :       4;
                    237:                u_int8_t        actv_period;    /* current sync period */
                    238:                u_int8_t        goal_period;    /* goal sync period */
                    239:                u_int8_t        nvrm_period;    /* nvram sync period */
                    240:                u_int16_t       actv_flags;     /* current device flags */
                    241:                u_int16_t       goal_flags;     /* goal device flags */
                    242:                u_int16_t       nvrm_flags;     /* nvram device flags */
1.6       mjacob    243:        } isp_devparam[MAX_TARGETS];
1.22      mjacob    244: } sdparam;
1.6       mjacob    245:
                    246: /*
                    247:  * Device Flags
                    248:  */
1.11      mjacob    249: #define        DPARM_DISC      0x8000
                    250: #define        DPARM_PARITY    0x4000
                    251: #define        DPARM_WIDE      0x2000
                    252: #define        DPARM_SYNC      0x1000
                    253: #define        DPARM_TQING     0x0800
                    254: #define        DPARM_ARQ       0x0400
                    255: #define        DPARM_QFRZ      0x0200
                    256: #define        DPARM_RENEG     0x0100
1.33      mjacob    257: #define        DPARM_NARROW    0x0080
                    258: #define        DPARM_ASYNC     0x0040
                    259: #define        DPARM_PPR       0x0020
1.18      mjacob    260: #define        DPARM_DEFAULT   (0xFF00 & ~DPARM_QFRZ)
1.11      mjacob    261: #define        DPARM_SAFE_DFLT (DPARM_DEFAULT & ~(DPARM_WIDE|DPARM_SYNC|DPARM_TQING))
                    262:
1.6       mjacob    263:
1.20      mjacob    264: /* technically, not really correct, as they need to be rated based upon clock */
1.33      mjacob    265: #define        ISP_80M_SYNCPARMS       0x0c09
                    266: #define        ISP_40M_SYNCPARMS       0x0c0a
                    267: #define        ISP_20M_SYNCPARMS       0x0c0c
                    268: #define        ISP_20M_SYNCPARMS_1040  0x080c
1.25      mjacob    269: #define        ISP_10M_SYNCPARMS       0x0c19
                    270: #define        ISP_08M_SYNCPARMS       0x0c25
                    271: #define        ISP_05M_SYNCPARMS       0x0c32
                    272: #define        ISP_04M_SYNCPARMS       0x0c41
1.6       mjacob    273:
                    274: /*
                    275:  * Fibre Channel Specifics
                    276:  */
1.24      mjacob    277: #define        FL_PORT_ID              0x7e    /* FL_Port Special ID */
                    278: #define        FC_PORT_ID              0x7f    /* Fabric Controller Special ID */
                    279: #define        FC_SNS_ID               0x80    /* SNS Server Special ID */
                    280:
1.55      mjacob    281: /* #define     ISP_USE_GA_NXT  1 */    /* Use GA_NXT with switches */
                    282: #ifndef        GA_NXT_MAX
                    283: #define        GA_NXT_MAX      256
                    284: #endif
                    285:
1.6       mjacob    286: typedef struct {
1.25      mjacob    287:        u_int32_t               isp_fwoptions   : 16,
1.50      mjacob    288:                                isp_gbspeed     : 2,
1.41      mjacob    289:                                isp_iid_set     : 1,
1.23      mjacob    290:                                loop_seen_once  : 1,
1.46      mjacob    291:                                isp_loopstate   : 4,    /* Current Loop State */
1.23      mjacob    292:                                isp_fwstate     : 3,    /* ISP F/W state */
                    293:                                isp_gotdparms   : 1,
1.30      he        294:                                isp_topo        : 3,
1.23      mjacob    295:                                isp_onfabric    : 1;
1.41      mjacob    296:        u_int8_t                isp_iid;        /* 'initiator' id */
1.11      mjacob    297:        u_int8_t                isp_loopid;     /* hard loop id */
                    298:        u_int8_t                isp_alpa;       /* ALPA */
1.41      mjacob    299:        u_int32_t               isp_portid;
1.25      mjacob    300:        volatile u_int16_t      isp_lipseq;     /* LIP sequence # */
1.49      mjacob    301:        u_int16_t               isp_fwattr;     /* firmware attributes */
1.11      mjacob    302:        u_int8_t                isp_execthrottle;
1.25      mjacob    303:        u_int8_t                isp_retry_delay;
                    304:        u_int8_t                isp_retry_count;
                    305:        u_int8_t                isp_reserved;
1.11      mjacob    306:        u_int16_t               isp_maxalloc;
                    307:        u_int16_t               isp_maxfrmlen;
1.23      mjacob    308:        u_int64_t               isp_nodewwn;
                    309:        u_int64_t               isp_portwwn;
1.6       mjacob    310:        /*
1.23      mjacob    311:         * Port Data Base. This is indexed by 'target', which is invariate.
                    312:         * However, elements within can move around due to loop changes,
                    313:         * so the actual loop ID passed to the F/W is in this structure.
                    314:         * The first time the loop is seen up, loopid will match the index
                    315:         * (except for fabric nodes which are above mapped above FC_SNS_ID
                    316:         * and are completely virtual), but subsequent LIPs can cause things
                    317:         * to move around.
                    318:         */
                    319:        struct lportdb {
1.55      mjacob    320:                u_int32_t
                    321:                                        port_type       : 8,
1.56      mjacob    322:                                        loopid          : 8,
1.55      mjacob    323:                                        fc4_type        : 4,
                    324:                                        last_fabric_dev : 1,
1.56      mjacob    325:                                                        : 2,
                    326:                                        relogin         : 1,
1.46      mjacob    327:                                        force_logout    : 1,
1.41      mjacob    328:                                        was_fabric_dev  : 1,
                    329:                                        fabric_dev      : 1,
1.30      he        330:                                        loggedin        : 1,
                    331:                                        roles           : 2,
                    332:                                        valid           : 1;
1.25      mjacob    333:                u_int32_t               portid;
1.23      mjacob    334:                u_int64_t               node_wwn;
                    335:                u_int64_t               port_wwn;
1.41      mjacob    336:        } portdb[MAX_FC_TARG], tport[FC_PORT_ID];
1.19      mjacob    337:
                    338:        /*
1.6       mjacob    339:         * Scratch DMA mapped in area to fetch Port Database stuff, etc.
                    340:         */
1.23      mjacob    341:        caddr_t                 isp_scratch;
1.59      mjacob    342:        isp_dma_addr_t          isp_scdma;
1.53      mjacob    343: #ifdef ISP_FW_CRASH_DUMP
                    344:        u_int16_t               *isp_dump_data;
                    345: #endif
1.6       mjacob    346: } fcparam;
                    347:
1.23      mjacob    348: #define        FW_CONFIG_WAIT          0
                    349: #define        FW_WAIT_AL_PA           1
                    350: #define        FW_WAIT_LOGIN           2
                    351: #define        FW_READY                3
                    352: #define        FW_LOSS_OF_SYNC         4
                    353: #define        FW_ERROR                5
                    354: #define        FW_REINIT               6
                    355: #define        FW_NON_PART             7
                    356:
                    357: #define        LOOP_NIL                0
                    358: #define        LOOP_LIP_RCVD           1
                    359: #define        LOOP_PDB_RCVD           2
1.41      mjacob    360: #define        LOOP_SCANNING_FABRIC    3
                    361: #define        LOOP_FSCAN_DONE         4
                    362: #define        LOOP_SCANNING_LOOP      5
1.46      mjacob    363: #define        LOOP_LSCAN_DONE         6
                    364: #define        LOOP_SYNCING_PDB        7
                    365: #define        LOOP_READY              8
1.30      he        366:
                    367: #define        TOPO_NL_PORT            0
                    368: #define        TOPO_FL_PORT            1
                    369: #define        TOPO_N_PORT             2
                    370: #define        TOPO_F_PORT             3
                    371: #define        TOPO_PTP_STUB           4
1.23      mjacob    372:
1.6       mjacob    373: /*
1.1       cgd       374:  * Soft Structure per host adapter
                    375:  */
1.33      mjacob    376: typedef struct ispsoftc {
1.9       mjacob    377:        /*
                    378:         * Platform (OS) specific data
                    379:         */
                    380:        struct isposinfo        isp_osinfo;
                    381:
                    382:        /*
1.26      mjacob    383:         * Pointer to bus specific functions and data
1.9       mjacob    384:         */
1.1       cgd       385:        struct ispmdvec *       isp_mdvec;
1.9       mjacob    386:
                    387:        /*
1.26      mjacob    388:         * (Mostly) nonvolatile state. Board specific parameters
                    389:         * may contain some volatile state (e.g., current loop state).
1.9       mjacob    390:         */
                    391:
1.26      mjacob    392:        void *                  isp_param;      /* type specific */
                    393:        u_int16_t               isp_fwrev[3];   /* Loaded F/W revision */
                    394:        u_int16_t               isp_romfw_rev[3]; /* PROM F/W revision */
                    395:        u_int16_t               isp_maxcmds;    /* max possible I/O cmds */
                    396:        u_int8_t                isp_type;       /* HBA Chip Type */
                    397:        u_int8_t                isp_revision;   /* HBA Chip H/W Revision */
1.31      mjacob    398:        u_int32_t               isp_maxluns;    /* maximum luns supported */
1.26      mjacob    399:
1.41      mjacob    400:        u_int32_t               isp_clock       : 8,    /* input clock */
1.53      mjacob    401:                                                : 4,
                    402:                                isp_port        : 1,    /* 23XX only */
1.51      mjacob    403:                                isp_failed      : 1,    /* board failed */
                    404:                                isp_open        : 1,    /* opened (ioctl) */
1.26      mjacob    405:                                isp_touched     : 1,    /* board ever seen? */
                    406:                                isp_bustype     : 1,    /* SBus or PCI */
1.33      mjacob    407:                                isp_loaded_fw   : 1,    /* loaded firmware */
1.51      mjacob    408:                                isp_role        : 2,    /* roles supported */
1.41      mjacob    409:                                isp_dblev       : 12;   /* debug log mask */
                    410:
                    411:        u_int32_t               isp_confopts;           /* config options */
                    412:
1.48      mjacob    413:        u_int16_t               isp_rqstinrp;   /* register for REQINP */
                    414:        u_int16_t               isp_rqstoutrp;  /* register for REQOUTP */
                    415:        u_int16_t               isp_respinrp;   /* register for RESINP */
                    416:        u_int16_t               isp_respoutrp;  /* register for RESOUTP */
                    417:
1.36      mjacob    418:        /*
                    419:         * Instrumentation
                    420:         */
                    421:        u_int64_t               isp_intcnt;             /* total int count */
                    422:        u_int64_t               isp_intbogus;           /* spurious int count */
1.52      mjacob    423:        u_int64_t               isp_intmboxc;           /* mbox completions */
                    424:        u_int64_t               isp_intoasync;          /* other async */
                    425:        u_int64_t               isp_rsltccmplt;         /* CMDs on result q */
                    426:        u_int64_t               isp_fphccmplt;          /* CMDs via fastpost */
                    427:        u_int16_t               isp_rscchiwater;
                    428:        u_int16_t               isp_fpcchiwater;
1.6       mjacob    429:
1.1       cgd       430:        /*
1.11      mjacob    431:         * Volatile state
1.1       cgd       432:         */
1.11      mjacob    433:
1.31      mjacob    434:        volatile u_int32_t
1.51      mjacob    435:                isp_obits       :       8,      /* mailbox command output */
                    436:                isp_mboxbsy     :       1,      /* mailbox command active */
1.11      mjacob    437:                isp_state       :       3,
1.22      mjacob    438:                isp_sendmarker  :       2,      /* send a marker entry */
                    439:                isp_update      :       2,      /* update parameters */
1.24      mjacob    440:                isp_nactive     :       16;     /* how many commands active */
                    441:        volatile u_int16_t      isp_reqodx;     /* index of last ISP pickup */
                    442:        volatile u_int16_t      isp_reqidx;     /* index of next request */
                    443:        volatile u_int16_t      isp_residx;     /* index of next result */
1.54      mjacob    444:        volatile u_int16_t      isp_resodx;     /* index of next result */
                    445:        volatile u_int16_t      isp_rspbsy;
1.24      mjacob    446:        volatile u_int16_t      isp_lasthdls;   /* last handle seed */
1.31      mjacob    447:        volatile u_int16_t      isp_mboxtmp[MAX_MAILBOX];
1.41      mjacob    448:        volatile u_int16_t      isp_lastmbxcmd; /* last mbox command sent */
1.53      mjacob    449:        volatile u_int16_t      isp_mbxwrk0;
                    450:        volatile u_int16_t      isp_mbxwrk1;
                    451:        volatile u_int16_t      isp_mbxwrk2;
1.63      christos  452:        void *                  isp_mbxworkp;
1.6       mjacob    453:
1.1       cgd       454:        /*
1.26      mjacob    455:         * Active commands are stored here, indexed by handle functions.
1.1       cgd       456:         */
1.32      mjacob    457:        XS_T **isp_xflist;
1.6       mjacob    458:
1.1       cgd       459:        /*
1.60      wiz       460:         * request/result queue pointers and DMA handles for them.
1.1       cgd       461:         */
1.23      mjacob    462:        caddr_t                 isp_rquest;
                    463:        caddr_t                 isp_result;
1.59      mjacob    464:        isp_dma_addr_t          isp_rquest_dma;
                    465:        isp_dma_addr_t          isp_result_dma;
1.33      mjacob    466: } ispsoftc_t;
1.14      mjacob    467:
1.24      mjacob    468: #define        SDPARAM(isp)    ((sdparam *) (isp)->isp_param)
                    469: #define        FCPARAM(isp)    ((fcparam *) (isp)->isp_param)
1.1       cgd       470:
                    471: /*
1.32      mjacob    472:  * ISP Driver Run States
1.9       mjacob    473:  */
                    474: #define        ISP_NILSTATE    0
                    475: #define        ISP_RESETSTATE  1
                    476: #define        ISP_INITSTATE   2
                    477: #define        ISP_RUNSTATE    3
                    478:
                    479: /*
                    480:  * ISP Configuration Options
                    481:  */
                    482: #define        ISP_CFG_NORELOAD        0x80    /* don't download f/w */
1.18      mjacob    483: #define        ISP_CFG_NONVRAM         0x40    /* ignore NVRAM */
1.50      mjacob    484: #define        ISP_CFG_TWOGB           0x20    /* force 2GB connection (23XX only) */
                    485: #define        ISP_CFG_ONEGB           0x10    /* force 1GB connection (23XX only) */
1.26      mjacob    486: #define        ISP_CFG_FULL_DUPLEX     0x01    /* Full Duplex (Fibre Channel only) */
1.36      mjacob    487: #define        ISP_CFG_PORT_PREF       0x0C    /* Mask for Port Prefs (2200 only) */
                    488: #define        ISP_CFG_LPORT           0x00    /* prefer {N/F}L-Port connection */
                    489: #define        ISP_CFG_NPORT           0x04    /* prefer {N/F}-Port connection */
                    490: #define        ISP_CFG_NPORT_ONLY      0x08    /* insist on {N/F}-Port connection */
                    491: #define        ISP_CFG_LPORT_ONLY      0x0C    /* insist on {N/F}L-Port connection */
1.53      mjacob    492: #define        ISP_CFG_OWNWWPN         0x100   /* override NVRAM wwpn */
                    493: #define        ISP_CFG_OWNWWNN         0x200   /* override NVRAM wwnn */
1.56      mjacob    494: #define        ISP_CFG_OWNFSZ          0x400   /* override NVRAM frame size */
                    495: #define        ISP_CFG_OWNLOOPID       0x800   /* override NVRAM loopid */
                    496: #define        ISP_CFG_OWNEXCTHROTTLE  0x1000  /* override NVRAM execution throttle */
1.9       mjacob    497:
1.32      mjacob    498: /*
1.41      mjacob    499:  * Prior to calling isp_reset for the first time, the outer layer
                    500:  * should set isp_role to one of NONE, INITIATOR, TARGET, BOTH.
                    501:  *
                    502:  * If you set ISP_ROLE_NONE, the cards will be reset, new firmware loaded,
                    503:  * NVRAM read, and defaults set, but any further initialization (e.g.
                    504:  * INITIALIZE CONTROL BLOCK commands for 2X00 cards) won't be done.
                    505:  *
                    506:  * If INITIATOR MODE isn't set, attempts to run commands will be stopped
                    507:  * at isp_start and completed with the moral equivalent of SELECTION TIMEOUT.
                    508:  *
                    509:  * If TARGET MODE is set, it doesn't mean that the rest of target mode support
                    510:  * needs to be enabled, or will even work. What happens with the 2X00 cards
                    511:  * here is that if you have enabled it with TARGET MODE as part of the ICB
                    512:  * options, but you haven't given the f/w any ram resources for ATIOs or
                    513:  * Immediate Notifies, the f/w just handles what it can and you never see
                    514:  * anything. Basically, it sends a single byte of data (the first byte,
                    515:  * which you can set as part of the INITIALIZE CONTROL BLOCK command) for
                    516:  * INQUIRY, and sends back QUEUE FULL status for any other command.
1.46      mjacob    517:  *
1.41      mjacob    518:  */
                    519: #define        ISP_ROLE_NONE           0x0
                    520: #define        ISP_ROLE_INITIATOR      0x1
                    521: #define        ISP_ROLE_TARGET         0x2
                    522: #define        ISP_ROLE_BOTH           (ISP_ROLE_TARGET|ISP_ROLE_INITIATOR)
                    523: #define        ISP_ROLE_EITHER         ISP_ROLE_BOTH
                    524: #ifndef        ISP_DEFAULT_ROLES
                    525: #define        ISP_DEFAULT_ROLES       ISP_ROLE_INITIATOR
                    526: #endif
                    527:
                    528:
                    529: /*
1.32      mjacob    530:  * Firmware related defines
                    531:  */
1.41      mjacob    532: #define        ISP_CODE_ORG                    0x1000  /* default f/w code start */
1.48      mjacob    533: #define        ISP_CODE_ORG_2300               0x0800  /* ..except for 2300s */
1.21      mjacob    534: #define        ISP_FW_REV(maj, min, mic)       ((maj << 24) | (min << 16) | mic)
1.49      mjacob    535: #define        ISP_FW_MAJOR(code)              ((code >> 24) & 0xff)
                    536: #define        ISP_FW_MINOR(code)              ((code >> 16) & 0xff)
                    537: #define        ISP_FW_MICRO(code)              ((code >>  8) & 0xff)
1.41      mjacob    538: #define        ISP_FW_REVX(xp)                 ((xp[0]<<24) | (xp[1] << 16) | xp[2])
1.49      mjacob    539: #define        ISP_FW_MAJORX(xp)               (xp[0])
                    540: #define        ISP_FW_MINORX(xp)               (xp[1])
                    541: #define        ISP_FW_MICROX(xp)               (xp[2])
1.58      mjacob    542: #define        ISP_FW_NEWER_THAN(i, major, minor, micro)               \
                    543:  (ISP_FW_REVX((i)->isp_fwrev) > ISP_FW_REV(major, minor, micro))
1.11      mjacob    544:
1.9       mjacob    545: /*
1.11      mjacob    546:  * Bus (implementation) types
                    547:  */
                    548: #define        ISP_BT_PCI              0       /* PCI Implementations */
                    549: #define        ISP_BT_SBUS             1       /* SBus Implementations */
                    550:
                    551: /*
1.51      mjacob    552:  * If we have not otherwise defined SBus support away make sure
                    553:  * it is defined here such that the code is included as default
                    554:  */
                    555: #ifndef        ISP_SBUS_SUPPORTED
                    556: #define        ISP_SBUS_SUPPORTED      1
                    557: #endif
                    558:
                    559: /*
1.11      mjacob    560:  * Chip Types
1.6       mjacob    561:  */
                    562: #define        ISP_HA_SCSI             0xf
1.11      mjacob    563: #define        ISP_HA_SCSI_UNKNOWN     0x1
                    564: #define        ISP_HA_SCSI_1020        0x2
                    565: #define        ISP_HA_SCSI_1020A       0x3
                    566: #define        ISP_HA_SCSI_1040        0x4
                    567: #define        ISP_HA_SCSI_1040A       0x5
                    568: #define        ISP_HA_SCSI_1040B       0x6
1.21      mjacob    569: #define        ISP_HA_SCSI_1040C       0x7
1.27      mjacob    570: #define        ISP_HA_SCSI_1240        0x8
                    571: #define        ISP_HA_SCSI_1080        0x9
                    572: #define        ISP_HA_SCSI_1280        0xa
1.59      mjacob    573: #define        ISP_HA_SCSI_10160       0xb
                    574: #define        ISP_HA_SCSI_12160       0xc
1.6       mjacob    575: #define        ISP_HA_FC               0xf0
                    576: #define        ISP_HA_FC_2100          0x10
1.23      mjacob    577: #define        ISP_HA_FC_2200          0x20
1.44      mjacob    578: #define        ISP_HA_FC_2300          0x30
1.52      mjacob    579: #define        ISP_HA_FC_2312          0x40
1.6       mjacob    580:
1.19      mjacob    581: #define        IS_SCSI(isp)    (isp->isp_type & ISP_HA_SCSI)
1.27      mjacob    582: #define        IS_1240(isp)    (isp->isp_type == ISP_HA_SCSI_1240)
1.19      mjacob    583: #define        IS_1080(isp)    (isp->isp_type == ISP_HA_SCSI_1080)
1.27      mjacob    584: #define        IS_1280(isp)    (isp->isp_type == ISP_HA_SCSI_1280)
1.59      mjacob    585: #define        IS_10160(isp)   (isp->isp_type == ISP_HA_SCSI_10160)
1.29      mjacob    586: #define        IS_12160(isp)   (isp->isp_type == ISP_HA_SCSI_12160)
                    587:
                    588: #define        IS_12X0(isp)    (IS_1240(isp) || IS_1280(isp))
1.59      mjacob    589: #define        IS_1X160(isp)   (IS_10160(isp) || IS_12160(isp))
1.29      mjacob    590: #define        IS_DUALBUS(isp) (IS_12X0(isp) || IS_12160(isp))
1.59      mjacob    591: #define        IS_ULTRA2(isp)  (IS_1080(isp) || IS_1280(isp) || IS_1X160(isp))
                    592: #define        IS_ULTRA3(isp)  (IS_1X160(isp))
1.29      mjacob    593:
1.44      mjacob    594: #define        IS_FC(isp)      ((isp)->isp_type & ISP_HA_FC)
                    595: #define        IS_2100(isp)    ((isp)->isp_type == ISP_HA_FC_2100)
                    596: #define        IS_2200(isp)    ((isp)->isp_type == ISP_HA_FC_2200)
1.52      mjacob    597: #define        IS_23XX(isp)    ((isp)->isp_type >= ISP_HA_FC_2300)
                    598: #define        IS_2300(isp)    ((isp)->isp_type == ISP_HA_FC_2300)
                    599: #define        IS_2312(isp)    ((isp)->isp_type == ISP_HA_FC_2312)
1.29      mjacob    600:
1.32      mjacob    601: /*
                    602:  * DMA cookie macros
                    603:  */
1.59      mjacob    604: #ifdef ISP_DAC_SUPPORTRED
                    605: #define        DMA_WD3(x)      (((x) >> 48) & 0xffff)
                    606: #define        DMA_WD2(x)      (((x) >> 32) & 0xffff)
                    607: #else
1.48      mjacob    608: #define        DMA_WD3(x)      0
                    609: #define        DMA_WD2(x)      0
1.59      mjacob    610: #endif
1.48      mjacob    611: #define        DMA_WD1(x)      (((x) >> 16) & 0xffff)
                    612: #define        DMA_WD0(x)      (((x) & 0xffff))
1.19      mjacob    613:
1.6       mjacob    614: /*
1.32      mjacob    615:  * Core System Function Prototypes
1.1       cgd       616:  */
1.9       mjacob    617:
1.1       cgd       618: /*
1.9       mjacob    619:  * Reset Hardware. Totally. Assumes that you'll follow this with
                    620:  * a call to isp_init.
1.1       cgd       621:  */
1.43      mjacob    622: void isp_reset(struct ispsoftc *);
1.1       cgd       623:
                    624: /*
                    625:  * Initialize Hardware to known state
                    626:  */
1.43      mjacob    627: void isp_init(struct ispsoftc *);
1.1       cgd       628:
                    629: /*
1.10      mjacob    630:  * Reset the ISP and call completion for any orphaned commands.
                    631:  */
1.43      mjacob    632: void isp_reinit(struct ispsoftc *);
1.1       cgd       633:
1.53      mjacob    634: #ifdef ISP_FW_CRASH_DUMP
                    635: /*
                    636:  * Dump firmware entry point.
                    637:  */
                    638: void isp_fw_dump(struct ispsoftc *isp);
                    639: #endif
                    640:
1.1       cgd       641: /*
1.48      mjacob    642:  * Internal Interrupt Service Routine
                    643:  *
                    644:  * The outer layers do the spade work to get the appropriate status register,
                    645:  * semaphore register and first mailbox register (if appropriate). This also
                    646:  * means that most spurious/bogus interrupts not for us can be filtered first.
1.1       cgd       647:  */
1.48      mjacob    648: void isp_intr(struct ispsoftc *, u_int16_t, u_int16_t, u_int16_t);
                    649:
1.9       mjacob    650:
                    651: /*
1.32      mjacob    652:  * Command Entry Point- Platform Dependent layers call into this
                    653:  */
1.43      mjacob    654: int isp_start(XS_T *);
1.32      mjacob    655: /* these values are what isp_start returns */
                    656: #define        CMD_COMPLETE    101     /* command completed */
                    657: #define        CMD_EAGAIN      102     /* busy- maybe retry later */
                    658: #define        CMD_QUEUED      103     /* command has been queued for execution */
                    659: #define        CMD_RQLATER     104     /* requeue this command later */
                    660:
                    661: /*
                    662:  * Command Completion Point- Core layers call out from this with completed cmds
1.9       mjacob    663:  */
1.43      mjacob    664: void isp_done(XS_T *);
1.1       cgd       665:
1.9       mjacob    666: /*
1.17      mjacob    667:  * Platform Dependent to External to Internal Control Function
1.9       mjacob    668:  *
1.41      mjacob    669:  * Assumes locks are held on entry. You should note that with many of
                    670:  * these commands and locks may be released while this is occurring.
                    671:  *
                    672:  * A few notes about some of these functions:
1.9       mjacob    673:  *
1.41      mjacob    674:  * ISPCTL_FCLINK_TEST tests to make sure we have good fibre channel link.
                    675:  * The argument is a pointer to an integer which is the time, in microseconds,
                    676:  * we should wait to see whether we have good link. This test, if successful,
                    677:  * lets us know our connection topology and our Loop ID/AL_PA and so on.
                    678:  * You can't get anywhere without this.
                    679:  *
                    680:  * ISPCTL_SCAN_FABRIC queries the name server (if we're on a fabric) for
                    681:  * all entities using the FC Generic Services subcommand GET ALL NEXT.
                    682:  * For each found entity, an ISPASYNC_FABRICDEV event is generated (see
                    683:  * below).
                    684:  *
                    685:  * ISPCTL_SCAN_LOOP does a local loop scan. This is only done if the connection
                    686:  * topology is NL or FL port (private or public loop). Since the Qlogic f/w
                    687:  * 'automatically' manages local loop connections, this function essentially
                    688:  * notes the arrival, departure, and possible shuffling around of local loop
                    689:  * entities. Thus for each arrival and departure this generates an isp_async
                    690:  * event of ISPASYNC_PROMENADE (see below).
                    691:  *
                    692:  * ISPCTL_PDB_SYNC is somewhat misnamed. It actually is the final step, in
                    693:  * order, of ISPCTL_FCLINK_TEST, ISPCTL_SCAN_FABRIC, and ISPCTL_SCAN_LOOP.
                    694:  * The main purpose of ISPCTL_PDB_SYNC is to complete management of logging
                    695:  * and logging out of fabric devices (if one is on a fabric) and then marking
                    696:  * the 'loop state' as being ready to now be used for sending commands to
                    697:  * devices. Originally fabric name server and local loop scanning were
1.47      wiz       698:  * part of this function. It's now been separated to allow for finer control.
1.9       mjacob    699:  */
                    700: typedef enum {
1.23      mjacob    701:        ISPCTL_RESET_BUS,               /* Reset Bus */
                    702:        ISPCTL_RESET_DEV,               /* Reset Device */
                    703:        ISPCTL_ABORT_CMD,               /* Abort Command */
1.41      mjacob    704:        ISPCTL_UPDATE_PARAMS,           /* Update Operating Parameters (SCSI) */
1.28      mjacob    705:        ISPCTL_FCLINK_TEST,             /* Test FC Link Status */
1.41      mjacob    706:        ISPCTL_SCAN_FABRIC,             /* (Re)scan Fabric Name Server */
                    707:        ISPCTL_SCAN_LOOP,               /* (Re)scan Local Loop */
1.28      mjacob    708:        ISPCTL_PDB_SYNC,                /* Synchronize Port Database */
1.41      mjacob    709:        ISPCTL_SEND_LIP,                /* Send a LIP */
                    710:        ISPCTL_GET_POSMAP,              /* Get FC-AL position map */
1.42      mjacob    711:        ISPCTL_RUN_MBOXCMD,             /* run a mailbox command */
1.28      mjacob    712:        ISPCTL_TOGGLE_TMODE             /* toggle target mode */
1.9       mjacob    713: } ispctl_t;
1.43      mjacob    714: int isp_control(struct ispsoftc *, ispctl_t, void *);
1.17      mjacob    715:
                    716:
                    717: /*
                    718:  * Platform Dependent to Internal to External Control Function
                    719:  * (each platform must provide such a function)
                    720:  *
1.41      mjacob    721:  * Assumes locks are held.
                    722:  *
                    723:  * A few notes about some of these functions:
                    724:  *
                    725:  * ISPASYNC_CHANGE_NOTIFY notifies the outer layer that a change has
                    726:  * occurred that invalidates the list of fabric devices known and/or
                    727:  * the list of known loop devices. The argument passed is a pointer
                    728:  * whose values are defined below  (local loop change, name server
                    729:  * change, other). 'Other' may simply be a LIP, or a change in
                    730:  * connection topology.
                    731:  *
                    732:  * ISPASYNC_FABRIC_DEV announces the next element in a list of
                    733:  * fabric device names we're getting out of the name server. The
                    734:  * argument points to a GET ALL NEXT response structure. The list
                    735:  * is known to terminate with an entry that refers to ourselves.
                    736:  * One of the main purposes of this function is to allow outer
                    737:  * layers, which are OS dependent, to set policy as to which fabric
                    738:  * devices might actually be logged into (and made visible) later
                    739:  * at ISPCTL_PDB_SYNC time. Since there's a finite number of fabric
                    740:  * devices that we can log into (256 less 3 'reserved' for F-port
                    741:  * topologies), and fabrics can grow up to 8 million or so entries
                    742:  * (24 bits of Port Address, less a wad of reserved spaces), clearly
                    743:  * we had better let the OS determine login policy.
                    744:  *
                    745:  * ISPASYNC_PROMENADE has an argument that is a pointer to an integer which
1.59      mjacob    746:  * is an index into the portdb in the softc ('target'). Whether that entry's
1.41      mjacob    747:  * valid tag is set or not says whether something has arrived or departed.
                    748:  * The name refers to a favorite pastime of many city dwellers- watching
                    749:  * people come and go, talking of Michaelangelo, and so on..
1.42      mjacob    750:  *
                    751:  * ISPASYNC_UNHANDLED_RESPONSE gives outer layers a chance to parse a
                    752:  * response queue entry not otherwise handled. The outer layer should
1.51      mjacob    753:  * return non-zero if it handled it. The 'arg' points to an unmassaged
                    754:  * response queue entry.
1.17      mjacob    755:  */
                    756:
                    757: typedef enum {
1.41      mjacob    758:        ISPASYNC_NEW_TGT_PARAMS,        /* New Target Parameters Negotiated */
1.23      mjacob    759:        ISPASYNC_BUS_RESET,             /* Bus Was Reset */
                    760:        ISPASYNC_LOOP_DOWN,             /* FC Loop Down */
                    761:        ISPASYNC_LOOP_UP,               /* FC Loop Up */
1.45      mjacob    762:        ISPASYNC_LIP,                   /* LIP Received */
                    763:        ISPASYNC_LOOP_RESET,            /* Loop Reset Received */
1.41      mjacob    764:        ISPASYNC_CHANGE_NOTIFY,         /* FC Change Notification */
                    765:        ISPASYNC_FABRIC_DEV,            /* FC Fabric Device Arrival */
                    766:        ISPASYNC_PROMENADE,             /* FC Objects coming && going */
1.28      mjacob    767:        ISPASYNC_TARGET_MESSAGE,        /* target message */
                    768:        ISPASYNC_TARGET_EVENT,          /* target asynchronous event */
1.41      mjacob    769:        ISPASYNC_TARGET_ACTION,         /* other target command action */
1.42      mjacob    770:        ISPASYNC_CONF_CHANGE,           /* Platform Configuration Change */
1.46      mjacob    771:        ISPASYNC_UNHANDLED_RESPONSE,    /* Unhandled Response Entry */
1.56      mjacob    772:        ISPASYNC_FW_CRASH,              /* Firmware has crashed */
1.57      mjacob    773:        ISPASYNC_FW_DUMPED,             /* Firmware crashdump taken */
1.56      mjacob    774:        ISPASYNC_FW_RESTARTED           /* Firmware has been restarted */
1.17      mjacob    775: } ispasync_t;
1.43      mjacob    776: int isp_async(struct ispsoftc *, ispasync_t, void *);
1.1       cgd       777:
1.41      mjacob    778: #define        ISPASYNC_CHANGE_PDB     ((void *) 0)
                    779: #define        ISPASYNC_CHANGE_SNS     ((void *) 1)
                    780: #define        ISPASYNC_CHANGE_OTHER   ((void *) 2)
                    781:
1.9       mjacob    782: /*
1.32      mjacob    783:  * Platform Dependent Error and Debug Printout
1.9       mjacob    784:  */
1.39      mjacob    785: #ifdef __GNUC__
1.43      mjacob    786: void isp_prt(struct ispsoftc *, int level, const char *, ...)
1.39      mjacob    787:        __attribute__((__format__(__printf__,3,4)));
                    788: #else
1.43      mjacob    789: void isp_prt(struct ispsoftc *, int level, const char *, ...);
1.39      mjacob    790: #endif
                    791:
1.32      mjacob    792: #define        ISP_LOGALL      0x0     /* log always */
                    793: #define        ISP_LOGCONFIG   0x1     /* log configuration messages */
                    794: #define        ISP_LOGINFO     0x2     /* log informational messages */
                    795: #define        ISP_LOGWARN     0x4     /* log warning messages */
                    796: #define        ISP_LOGERR      0x8     /* log error messages */
                    797: #define        ISP_LOGDEBUG0   0x10    /* log simple debug messages */
                    798: #define        ISP_LOGDEBUG1   0x20    /* log intermediate debug messages */
                    799: #define        ISP_LOGDEBUG2   0x40    /* log most debug messages */
1.46      mjacob    800: #define        ISP_LOGDEBUG3   0x80    /* log high frequency debug messages */
                    801: #define        ISP_LOGDEBUG4   0x100   /* log high frequency debug messages */
1.32      mjacob    802: #define        ISP_LOGTDEBUG0  0x200   /* log simple debug messages (target mode) */
                    803: #define        ISP_LOGTDEBUG1  0x400   /* log intermediate debug messages (target) */
                    804: #define        ISP_LOGTDEBUG2  0x800   /* log all debug messages (target) */
1.1       cgd       805:
1.32      mjacob    806: /*
                    807:  * Each Platform provides it's own isposinfo substructure of the ispsoftc
                    808:  * defined above.
                    809:  *
                    810:  * Each platform must also provide the following macros/defines:
                    811:  *
                    812:  *
                    813:  *     INLINE          -       platform specific define for 'inline' functions
1.48      mjacob    814:  *
1.59      mjacob    815:  *     ISP_DAC_SUPPORTED -     Is DAC (Dual Address Cycle) is supported?
                    816:  *                             Basically means whether or not DMA for PCI
                    817:  *                             PCI cards (Ultra2 or better or FC) works
                    818:  *                             above 4GB.
1.32      mjacob    819:  *
                    820:  *     ISP2100_SCRLEN  -       length for the Fibre Channel scratch DMA area
                    821:  *
                    822:  *     MEMZERO(dst, src)                       platform zeroing function
                    823:  *     MEMCPY(dst, src, count)                 platform copying function
                    824:  *     SNPRINTF(buf, bufsize, fmt, ...)        snprintf
                    825:  *     USEC_DELAY(usecs)                       microsecond spindelay function
1.36      mjacob    826:  *     USEC_SLEEP(isp, usecs)                  microsecond sleep function
1.32      mjacob    827:  *
                    828:  *     NANOTIME_T                              nanosecond time type
                    829:  *
                    830:  *     GET_NANOTIME(NANOTIME_T *)              get current nanotime.
                    831:  *
                    832:  *     GET_NANOSEC(NANOTIME_T *)               get u_int64_t from NANOTIME_T
                    833:  *
                    834:  *     NANOTIME_SUB(NANOTIME_T *, NANOTIME_T *)
                    835:  *                                             subtract two NANOTIME_T values
                    836:  *
                    837:  *
                    838:  *     MAXISPREQUEST(struct ispsoftc *)        maximum request queue size
                    839:  *                                             for this particular board type
                    840:  *
                    841:  *     MEMORYBARRIER(struct ispsoftc *, barrier_type, offset, size)
                    842:  *
                    843:  *             Function/Macro the provides memory synchronization on
                    844:  *             various objects so that the ISP's and the system's view
                    845:  *             of the same object is consistent.
                    846:  *
                    847:  *     MBOX_ACQUIRE(struct ispsoftc *)         acquire lock on mailbox regs
                    848:  *     MBOX_WAIT_COMPLETE(struct ispsoftc *)   wait for mailbox cmd to be done
                    849:  *     MBOX_NOTIFY_COMPLETE(struct ispsoftc *) notification of mbox cmd donee
                    850:  *     MBOX_RELEASE(struct ispsoftc *)         release lock on mailbox regs
1.41      mjacob    851:  *
1.53      mjacob    852:  *     FC_SCRATCH_ACQUIRE(struct ispsoftc *)   acquire lock on FC scratch area
                    853:  *     FC_SCRATCH_RELEASE(struct ispsoftc *)   acquire lock on FC scratch area
1.32      mjacob    854:  *
                    855:  *     SCSI_GOOD       SCSI 'Good' Status
                    856:  *     SCSI_CHECK      SCSI 'Check Condition' Status
                    857:  *     SCSI_BUSY       SCSI 'Busy' Status
                    858:  *     SCSI_QFULL      SCSI 'Queue Full' Status
                    859:  *
                    860:  *     XS_T            Platform SCSI transaction type (i.e., command for HBA)
                    861:  *     XS_ISP(xs)      gets an instance out of an XS_T
                    862:  *     XS_CHANNEL(xs)  gets the channel (bus # for DUALBUS cards) ""
                    863:  *     XS_TGT(xs)      gets the target ""
                    864:  *     XS_LUN(xs)      gets the lun ""
                    865:  *     XS_CDBP(xs)     gets a pointer to the scsi CDB ""
                    866:  *     XS_CDBLEN(xs)   gets the CDB's length ""
                    867:  *     XS_XFRLEN(xs)   gets the associated data transfer length ""
                    868:  *     XS_TIME(xs)     gets the time (in milliseconds) for this command
                    869:  *     XS_RESID(xs)    gets the current residual count
                    870:  *     XS_STSP(xs)     gets a pointer to the SCSI status byte ""
                    871:  *     XS_SNSP(xs)     gets a pointer to the associate sense data
                    872:  *     XS_SNSLEN(xs)   gets the length of sense data storage
                    873:  *     XS_SNSKEY(xs)   dereferences XS_SNSP to get the current stored Sense Key
                    874:  *     XS_TAG_P(xs)    predicate of whether this command should be tagged
                    875:  *     XS_TAG_TYPE(xs) which type of tag to use
                    876:  *     XS_SETERR(xs)   set error state
                    877:  *
                    878:  *             HBA_NOERROR     command has no erros
                    879:  *             HBA_BOTCH       hba botched something
                    880:  *             HBA_CMDTIMEOUT  command timed out
                    881:  *             HBA_SELTIMEOUT  selection timed out (also port logouts for FC)
                    882:  *             HBA_TGTBSY      target returned a BUSY status
                    883:  *             HBA_BUSRESET    bus reset destroyed command
                    884:  *             HBA_ABORTED     command was aborted (by request)
                    885:  *             HBA_DATAOVR     a data overrun was detected
                    886:  *             HBA_ARQFAIL     Automatic Request Sense failed
                    887:  *
                    888:  *     XS_ERR(xs)      return current error state
                    889:  *     XS_NOERR(xs)    there is no error currently set
                    890:  *     XS_INITERR(xs)  initialize error state
                    891:  *
                    892:  *     XS_SAVE_SENSE(xs, sp)           save sense data
                    893:  *
                    894:  *     XS_SET_STATE_STAT(isp, sp, xs)  platform dependent interpreter of
                    895:  *                                     response queue entry status bits
                    896:  *
                    897:  *
                    898:  *     DEFAULT_IID(struct ispsoftc *)          Default SCSI initiator ID
                    899:  *     DEFAULT_LOOPID(struct ispsoftc *)       Default FC Loop ID
1.35      mjacob    900:  *     DEFAULT_NODEWWN(struct ispsoftc *)      Default Node WWN
                    901:  *     DEFAULT_PORTWWN(struct ispsoftc *)      Default Port WWN
1.56      mjacob    902:  *     DEFAULT_FRAMESIZE(struct ispsoftc *)    Default Frame Size
                    903:  *     DEFAULT_EXEC_THROTTLE(struct ispsoftc *) Default Execution Throttle
1.35      mjacob    904:  *             These establish reasonable defaults for each platform.
                    905:  *             These must be available independent of card NVRAM and are
                    906:  *             to be used should NVRAM not be readable.
                    907:  *
                    908:  *     ISP_NODEWWN(struct ispsoftc *)  FC Node WWN to use
                    909:  *     ISP_PORTWWN(struct ispsoftc *)  FC Port WWN to use
                    910:  *
                    911:  *             These are to be used after NVRAM is read. The tags
                    912:  *             in fcparam.isp_{node,port}wwn reflect the values
                    913:  *             read from NVRAM (possibly corrected for card botches).
                    914:  *             Each platform can take that information and override
                    915:  *             it or ignore and return the Node and Port WWNs to be
                    916:  *             used when sending the Qlogic f/w the Initialization Control
                    917:  *             Block.
1.32      mjacob    918:  *
                    919:  *     (XXX these do endian specific transformations- in transition XXX)
1.51      mjacob    920:  *
                    921:  *     ISP_IOXPUT_8(struct ispsoftc *, u_int8_t srcval, u_int8_t *dstptr)
                    922:  *     ISP_IOXPUT_16(struct ispsoftc *, u_int16_t srcval, u_int16_t *dstptr)
                    923:  *     ISP_IOXPUT_32(struct ispsoftc *, u_int32_t srcval, u_int32_t *dstptr)
                    924:  *
                    925:  *     ISP_IOXGET_8(struct ispsoftc *, u_int8_t *srcptr, u_int8_t dstrval)
                    926:  *     ISP_IOXGET_16(struct ispsoftc *, u_int16_t *srcptr, u_int16_t dstrval)
                    927:  *     ISP_IOXGET_32(struct ispsoftc *, u_int32_t *srcptr, u_int32_t dstrval)
                    928:  *
                    929:  *     ISP_SWIZZLE_NVRAM_WORD(struct ispsoftc *, u_int16_t *)
1.32      mjacob    930:  */
1.44      mjacob    931:
1.1       cgd       932: #endif /* _ISPVAR_H */

CVSweb <webmaster@jp.NetBSD.org>