[BACK]Return to isp_target.h CVS log [TXT][DIR] Up to [local] / sys / dev / ic

Annotation of sys/dev/ic/isp_target.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: isp_target.h,v 1.11 2002/08/17 17:42:04 mjacob Exp $  */
                      2:
                      3: /* @(#)isp_target.h 1.3 */
                      4: /*
                      5:  * Qlogic Target Mode Structure and Flag Definitions
                      6:  *
                      7:  * Copyright (c) 1997, 1998
                      8:  * Patrick Stirling
                      9:  * pms@psconsult.com
                     10:  * All rights reserved.
                     11:  *
                     12:  * Additional Copyright (c) 1999, 2000, 2001
                     13:  * Matthew Jacob
                     14:  * mjacob@feral.com
                     15:  * All rights reserved.
                     16:  *
                     17:  *
                     18:  * Redistribution and use in source and binary forms, with or without
                     19:  * modification, are permitted provided that the following conditions
                     20:  * are met:
                     21:  * 1. Redistributions of source code must retain the above copyright
                     22:  *    notice immediately at the beginning of the file, without modification,
                     23:  *    this list of conditions, and the following disclaimer.
                     24:  * 2. The name of the author may not be used to endorse or promote products
                     25:  *    derived from this software without specific prior written permission.
                     26:  *
                     27:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
                     28:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     29:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     30:  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
                     31:  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     32:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     33:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     34:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     35:  * SUCH DAMAGE.
                     36:  *
                     37:  */
                     38: #ifndef        _ISP_TARGET_H
                     39: #define        _ISP_TARGET_H
                     40:
                     41: /*
                     42:  * Defines for all entry types
                     43:  */
                     44: #define QLTM_SVALID    0x80
                     45: #define        QLTM_SENSELEN   18
                     46:
                     47: /*
                     48:  * Structure for Enable Lun and Modify Lun queue entries
                     49:  */
                     50: typedef struct {
                     51:        isphdr_t        le_header;
                     52:        u_int32_t       le_reserved;
                     53:        u_int8_t        le_lun;
                     54:        u_int8_t        le_rsvd;
                     55:        u_int8_t        le_ops;         /* Modify LUN only */
                     56:        u_int8_t        le_tgt;         /* Not for FC */
                     57:        u_int32_t       le_flags;       /* Not for FC */
                     58:        u_int8_t        le_status;
                     59:        u_int8_t        le_reserved2;
                     60:        u_int8_t        le_cmd_count;
                     61:        u_int8_t        le_in_count;
                     62:        u_int8_t        le_cdb6len;     /* Not for FC */
                     63:        u_int8_t        le_cdb7len;     /* Not for FC */
                     64:        u_int16_t       le_timeout;
                     65:        u_int16_t       le_reserved3[20];
                     66: } lun_entry_t;
                     67:
                     68: /*
                     69:  * le_flags values
                     70:  */
                     71: #define LUN_TQAE       0x00000002      /* bit1  Tagged Queue Action Enable */
                     72: #define LUN_DSSM       0x01000000      /* bit24 Disable Sending SDP Message */
                     73: #define        LUN_DISAD       0x02000000      /* bit25 Disable autodisconnect */
                     74: #define LUN_DM         0x40000000      /* bit30 Disconnects Mandatory */
                     75:
                     76: /*
                     77:  * le_ops values
                     78:  */
                     79: #define LUN_CCINCR     0x01    /* increment command count */
                     80: #define LUN_CCDECR     0x02    /* decrement command count */
                     81: #define LUN_ININCR     0x40    /* increment immed. notify count */
                     82: #define LUN_INDECR     0x80    /* decrement immed. notify count */
                     83:
                     84: /*
                     85:  * le_status values
                     86:  */
                     87: #define        LUN_OK          0x01    /* we be rockin' */
                     88: #define LUN_ERR                0x04    /* request completed with error */
                     89: #define LUN_INVAL      0x06    /* invalid request */
                     90: #define LUN_NOCAP      0x16    /* can't provide requested capability */
                     91: #define LUN_ENABLED    0x3E    /* LUN already enabled */
                     92:
                     93: /*
                     94:  * Immediate Notify Entry structure
                     95:  */
                     96: #define IN_MSGLEN      8       /* 8 bytes */
                     97: #define IN_RSVDLEN     8       /* 8 words */
                     98: typedef struct {
                     99:        isphdr_t        in_header;
                    100:        u_int32_t       in_reserved;
                    101:        u_int8_t        in_lun;         /* lun */
                    102:        u_int8_t        in_iid;         /* initiator */
                    103:        u_int8_t        in_reserved2;
                    104:        u_int8_t        in_tgt;         /* target */
                    105:        u_int32_t       in_flags;
                    106:        u_int8_t        in_status;
                    107:        u_int8_t        in_rsvd2;
                    108:        u_int8_t        in_tag_val;     /* tag value */
                    109:        u_int8_t        in_tag_type;    /* tag type */
                    110:        u_int16_t       in_seqid;       /* sequence id */
                    111:        u_int8_t        in_msg[IN_MSGLEN];      /* SCSI message bytes */
                    112:        u_int16_t       in_reserved3[IN_RSVDLEN];
                    113:        u_int8_t        in_sense[QLTM_SENSELEN];/* suggested sense data */
                    114: } in_entry_t;
                    115:
                    116: typedef struct {
                    117:        isphdr_t        in_header;
                    118:        u_int32_t       in_reserved;
                    119:        u_int8_t        in_lun;         /* lun */
                    120:        u_int8_t        in_iid;         /* initiator */
                    121:        u_int16_t       in_scclun;
                    122:        u_int32_t       in_reserved2;
                    123:        u_int16_t       in_status;
                    124:        u_int16_t       in_task_flags;
                    125:        u_int16_t       in_seqid;       /* sequence id */
                    126: } in_fcentry_t;
                    127:
                    128: /*
                    129:  * Values for the in_status field
                    130:  */
                    131: #define        IN_REJECT       0x0D    /* Message Reject message received */
                    132: #define IN_RESET       0x0E    /* Bus Reset occurred */
                    133: #define IN_NO_RCAP     0x16    /* requested capability not available */
                    134: #define IN_IDE_RECEIVED        0x33    /* Initiator Detected Error msg received */
                    135: #define IN_RSRC_UNAVAIL        0x34    /* resource unavailable */
                    136: #define IN_MSG_RECEIVED        0x36    /* SCSI message received */
                    137: #define        IN_ABORT_TASK   0x20    /* task named in RX_ID is being aborted (FC) */
                    138: #define        IN_PORT_LOGOUT  0x29    /* port has logged out (FC) */
                    139: #define        IN_PORT_CHANGED 0x2A    /* port changed */
                    140: #define        IN_GLOBAL_LOGO  0x2E    /* all ports logged out */
                    141: #define        IN_NO_NEXUS     0x3B    /* Nexus not established */
                    142:
                    143: /*
                    144:  * Values for the in_task_flags field- should only get one at a time!
                    145:  */
                    146: #define        TASK_FLAGS_ABORT_TASK           (1<<9)
                    147: #define        TASK_FLAGS_CLEAR_TASK_SET       (1<<10)
                    148: #define        TASK_FLAGS_TARGET_RESET         (1<<13)
                    149: #define        TASK_FLAGS_CLEAR_ACA            (1<<14)
                    150: #define        TASK_FLAGS_TERMINATE_TASK       (1<<15)
                    151:
                    152: #ifndef        MSG_ABORT_TAG
                    153: #define        MSG_ABORT_TAG           0x06
                    154: #endif
                    155: #ifndef        MSG_CLEAR_QUEUE
                    156: #define        MSG_CLEAR_QUEUE         0x0e
                    157: #endif
                    158: #ifndef        MSG_BUS_DEV_RESET
                    159: #define        MSG_BUS_DEV_RESET       0x0b
                    160: #endif
                    161: #ifndef        MSG_REL_RECOVERY
                    162: #define        MSG_REL_RECOVERY        0x10
                    163: #endif
                    164: #ifndef        MSG_TERM_IO_PROC
                    165: #define        MSG_TERM_IO_PROC        0x11
                    166: #endif
                    167:
                    168:
                    169: /*
                    170:  * Notify Acknowledge Entry structure
                    171:  */
                    172: #define NA_RSVDLEN     22
                    173: typedef struct {
                    174:        isphdr_t        na_header;
                    175:        u_int32_t       na_reserved;
                    176:        u_int8_t        na_lun;         /* lun */
                    177:        u_int8_t        na_iid;         /* initiator */
                    178:        u_int8_t        na_reserved2;
                    179:        u_int8_t        na_tgt;         /* target */
                    180:        u_int32_t       na_flags;
                    181:        u_int8_t        na_status;
                    182:        u_int8_t        na_event;
                    183:        u_int16_t       na_seqid;       /* sequence id */
                    184:        u_int16_t       na_reserved3[NA_RSVDLEN];
                    185: } na_entry_t;
                    186:
                    187: /*
                    188:  * Value for the na_event field
                    189:  */
                    190: #define NA_RST_CLRD    0x80    /* Clear an async event notification */
                    191: #define        NA_OK           0x01    /* Notify Acknowledge Succeeded */
                    192: #define        NA_INVALID      0x06    /* Invalid Notify Acknowledge */
                    193:
                    194: #define        NA2_RSVDLEN     21
                    195: typedef struct {
                    196:        isphdr_t        na_header;
                    197:        u_int32_t       na_reserved;
                    198:        u_int8_t        na_lun;         /* lun */
                    199:        u_int8_t        na_iid;         /* initiator */
                    200:        u_int16_t       na_scclun;
                    201:        u_int16_t       na_flags;
                    202:        u_int16_t       na_reserved2;
                    203:        u_int16_t       na_status;
                    204:        u_int16_t       na_task_flags;
                    205:        u_int16_t       na_seqid;       /* sequence id */
                    206:        u_int16_t       na_reserved3[NA2_RSVDLEN];
                    207: } na_fcentry_t;
                    208: #define        NAFC_RCOUNT     0x80    /* increment resource count */
                    209: #define NAFC_RST_CLRD  0x20    /* Clear LIP Reset */
                    210: /*
                    211:  * Accept Target I/O Entry structure
                    212:  */
                    213: #define ATIO_CDBLEN    26
                    214:
                    215: typedef struct {
                    216:        isphdr_t        at_header;
                    217:        u_int16_t       at_reserved;
                    218:        u_int16_t       at_handle;
                    219:        u_int8_t        at_lun;         /* lun */
                    220:        u_int8_t        at_iid;         /* initiator */
                    221:        u_int8_t        at_cdblen;      /* cdb length */
                    222:        u_int8_t        at_tgt;         /* target */
                    223:        u_int32_t       at_flags;
                    224:        u_int8_t        at_status;      /* firmware status */
                    225:        u_int8_t        at_scsi_status; /* scsi status */
                    226:        u_int8_t        at_tag_val;     /* tag value */
                    227:        u_int8_t        at_tag_type;    /* tag type */
                    228:        u_int8_t        at_cdb[ATIO_CDBLEN];    /* received CDB */
                    229:        u_int8_t        at_sense[QLTM_SENSELEN];/* suggested sense data */
                    230: } at_entry_t;
                    231:
                    232: /*
                    233:  * at_flags values
                    234:  */
                    235: #define AT_NODISC      0x00008000      /* disconnect disabled */
                    236: #define AT_TQAE                0x00000002      /* Tagged Queue Action enabled */
                    237:
                    238: /*
                    239:  * at_status values
                    240:  */
                    241: #define AT_PATH_INVALID        0x07    /* ATIO sent to firmware for disabled lun */
                    242: #define        AT_RESET        0x0E    /* SCSI Bus Reset Occurred */
                    243: #define AT_PHASE_ERROR 0x14    /* Bus phase sequence error */
                    244: #define AT_NOCAP       0x16    /* Requested capability not available */
                    245: #define AT_BDR_MSG     0x17    /* Bus Device Reset msg received */
                    246: #define AT_CDB         0x3D    /* CDB received */
                    247:
                    248: /*
                    249:  * Macros to create and fetch and test concatenated handle and tag value macros
                    250:  */
                    251:
                    252: #define        AT_MAKE_TAGID(tid, aep)                                         \
                    253:        tid = ((aep)->at_handle << 16);                                 \
                    254:        if ((aep)->at_flags & AT_TQAE)                                  \
                    255:                (tid) |= ((aep)->at_tag_val + 1)
                    256:
                    257: #define        CT_MAKE_TAGID(tid, ct)                                          \
                    258:        tid = ((ct)->ct_fwhandle << 16);                                \
                    259:        if ((ct)->ct_flags & CT_TQAE)                                   \
                    260:                (tid) |= ((ct)->ct_tag_val + 1)
                    261:
                    262: #define        AT_HAS_TAG(val)         ((val) & 0xffff)
                    263: #define        AT_GET_TAG(val)         AT_HAS_TAG(val) - 1
                    264: #define        AT_GET_HANDLE(val)      ((val) >> 16)
                    265:
                    266: /*
                    267:  * Accept Target I/O Entry structure, Type 2
                    268:  */
                    269: #define ATIO2_CDBLEN   16
                    270:
                    271: typedef struct {
                    272:        isphdr_t        at_header;
                    273:        u_int32_t       at_reserved;
                    274:        u_int8_t        at_lun;         /* lun or reserved */
                    275:        u_int8_t        at_iid;         /* initiator */
                    276:        u_int16_t       at_rxid;        /* response ID */
                    277:        u_int16_t       at_flags;
                    278:        u_int16_t       at_status;      /* firmware status */
                    279:        u_int8_t        at_reserved1;
                    280:        u_int8_t        at_taskcodes;
                    281:        u_int8_t        at_taskflags;
                    282:        u_int8_t        at_execodes;
                    283:        u_int8_t        at_cdb[ATIO2_CDBLEN];   /* received CDB */
                    284:        u_int32_t       at_datalen;             /* allocated data len */
                    285:        u_int16_t       at_scclun;              /* SCC Lun or reserved */
                    286:        u_int16_t       at_wwpn[4];             /* WWPN of initiator */
                    287:        u_int16_t       at_reserved2[6];
                    288:        u_int16_t       at_oxid;
                    289: } at2_entry_t;
                    290:
                    291: #define        ATIO2_WWPN_OFFSET       0x2A
                    292: #define        ATIO2_OXID_OFFSET       0x3E
                    293:
                    294: #define        ATIO2_TC_ATTR_MASK      0x7
                    295: #define        ATIO2_TC_ATTR_SIMPLEQ   0
                    296: #define        ATIO2_TC_ATTR_HEADOFQ   1
                    297: #define        ATIO2_TC_ATTR_ORDERED   2
                    298: #define        ATIO2_TC_ATTR_ACAQ      4
                    299: #define        ATIO2_TC_ATTR_UNTAGGED  5
                    300:
                    301: /*
                    302:  * Continue Target I/O Entry structure
                    303:  * Request from driver. The response from the
                    304:  * ISP firmware is the same except that the last 18
                    305:  * bytes are overwritten by suggested sense data if
                    306:  * the 'autosense valid' bit is set in the status byte.
                    307:  */
                    308: typedef struct {
                    309:        isphdr_t        ct_header;
                    310:        u_int16_t       ct_reserved;
                    311: #define        ct_syshandle    ct_reserved     /* we use this */
                    312:        u_int16_t       ct_fwhandle;    /* required by f/w */
                    313:        u_int8_t        ct_lun; /* lun */
                    314:        u_int8_t        ct_iid; /* initiator id */
                    315:        u_int8_t        ct_reserved2;
                    316:        u_int8_t        ct_tgt; /* our target id */
                    317:        u_int32_t       ct_flags;
                    318:        u_int8_t        ct_status;      /* isp status */
                    319:        u_int8_t        ct_scsi_status; /* scsi status */
                    320:        u_int8_t        ct_tag_val;     /* tag value */
                    321:        u_int8_t        ct_tag_type;    /* tag type */
                    322:        u_int32_t       ct_xfrlen;      /* transfer length */
                    323:        u_int32_t       ct_resid;       /* residual length */
                    324:        u_int16_t       ct_timeout;
                    325:        u_int16_t       ct_seg_count;
                    326:        /*
                    327:         * This is so we can share tag name space with
                    328:         * CTIO{2,3,4} with the minimum of pain.
                    329:         */
                    330:        union {
                    331:                ispds_t         ct_a[ISP_RQDSEG];
                    332:        } _u;
                    333: #define        ct_dataseg      _u.ct_a
                    334: } ct_entry_t;
                    335:
                    336: /*
                    337:  * For some of the dual port SCSI adapters, port (bus #) is reported
                    338:  * in the MSbit of ct_iid. Bit fields are a bit too awkward here.
                    339:  *
                    340:  * Note that this does not apply to FC adapters at all which can and
                    341:  * do report IIDs between 129 && 255 (these represent devices that have
                    342:  * logged in across a SCSI fabric).
                    343:  */
                    344: #define        GET_IID_VAL(x)          (x & 0x3f)
                    345: #define        GET_BUS_VAL(x)          ((x >> 7) & 0x1)
                    346: #define        SET_IID_VAL(y, x)       y = ((y & ~0x3f) | (x & 0x3f))
                    347: #define        SET_BUS_VAL(y, x)       y = ((y & 0x3f) | ((x & 0x1) << 7))
                    348:
                    349: /*
                    350:  * ct_flags values
                    351:  */
                    352: #define CT_TQAE                0x00000002      /* bit  1, Tagged Queue Action enable */
                    353: #define CT_DATA_IN     0x00000040      /* bits 6&7, Data direction */
                    354: #define CT_DATA_OUT    0x00000080      /* bits 6&7, Data direction */
                    355: #define CT_NO_DATA     0x000000C0      /* bits 6&7, Data direction */
                    356: #define        CT_CCINCR       0x00000100      /* bit 8, autoincrement atio count */
                    357: #define CT_DATAMASK    0x000000C0      /* bits 6&7, Data direction */
                    358: #define        CT_INISYNCWIDE  0x00004000      /* bit 14, Do Sync/Wide Negotiation */
                    359: #define CT_NODISC      0x00008000      /* bit 15, Disconnects disabled */
                    360: #define CT_DSDP                0x01000000      /* bit 24, Disable Save Data Pointers */
                    361: #define CT_SENDRDP     0x04000000      /* bit 26, Send Restore Pointers msg */
                    362: #define CT_SENDSTATUS  0x80000000      /* bit 31, Send SCSI status byte */
                    363:
                    364: /*
                    365:  * ct_status values
                    366:  * - set by the firmware when it returns the CTIO
                    367:  */
                    368: #define CT_OK          0x01    /* completed without error */
                    369: #define CT_ABORTED     0x02    /* aborted by host */
                    370: #define CT_ERR         0x04    /* see sense data for error */
                    371: #define CT_INVAL       0x06    /* request for disabled lun */
                    372: #define CT_NOPATH      0x07    /* invalid ITL nexus */
                    373: #define        CT_INVRXID      0x08    /* (FC only) Invalid RX_ID */
                    374: #define        CT_DATA_OVER    0x09    /* (FC only) Data Overrun */
                    375: #define CT_RSELTMO     0x0A    /* reselection timeout after 2 tries */
                    376: #define CT_TIMEOUT     0x0B    /* timed out */
                    377: #define CT_RESET       0x0E    /* SCSI Bus Reset occurred */
                    378: #define        CT_PARITY       0x0F    /* Uncorrectable Parity Error */
                    379: #define        CT_BUS_ERROR    0x10    /* (FC Only) DMA PCI Error */
                    380: #define        CT_PANIC        0x13    /* Unrecoverable Error */
                    381: #define CT_PHASE_ERROR 0x14    /* Bus phase sequence error */
                    382: #define CT_BDR_MSG     0x17    /* Bus Device Reset msg received */
                    383: #define        CT_DATA_UNDER   0x15    /* (FC only) Data Underrun */
                    384: #define CT_TERMINATED  0x19    /* due to Terminate Transfer mbox cmd */
                    385: #define        CT_PORTNOTAVAIL 0x28    /* port not available */
                    386: #define        CT_LOGOUT       0x29    /* port logout */
                    387: #define        CT_PORTCHANGED  0x2A    /* port changed */
                    388: #define        CT_IDE          0x33    /* Initiator Detected Error */
                    389: #define CT_NOACK       0x35    /* Outstanding Immed. Notify. entry */
                    390:
                    391: /*
                    392:  * When the firmware returns a CTIO entry, it may overwrite the last
                    393:  * part of the structure with sense data. This starts at offset 0x2E
                    394:  * into the entry, which is in the middle of ct_dataseg[1]. Rather
                    395:  * than define a new struct for this, I'm just using the sense data
                    396:  * offset.
                    397:  */
                    398: #define CTIO_SENSE_OFFSET      0x2E
                    399:
                    400: /*
                    401:  * Entry length in u_longs. All entries are the same size so
                    402:  * any one will do as the numerator.
                    403:  */
                    404: #define UINT32_ENTRY_SIZE      (sizeof(at_entry_t)/sizeof(u_int32_t))
                    405:
                    406: /*
                    407:  * QLA2100 CTIO (type 2) entry
                    408:  */
                    409: #define        MAXRESPLEN      26
                    410: typedef struct {
                    411:        isphdr_t        ct_header;
                    412:        u_int16_t       ct_reserved;
                    413:        u_int16_t       ct_fwhandle;    /* just to match CTIO */
                    414:        u_int8_t        ct_lun;         /* lun */
                    415:        u_int8_t        ct_iid;         /* initiator id */
                    416:        u_int16_t       ct_rxid;        /* response ID */
                    417:        u_int16_t       ct_flags;
                    418:        u_int16_t       ct_status;      /* isp status */
                    419:        u_int16_t       ct_timeout;
                    420:        u_int16_t       ct_seg_count;
                    421:        u_int32_t       ct_reloff;      /* relative offset */
                    422:        int32_t         ct_resid;       /* residual length */
                    423:        union {
                    424:                /*
                    425:                 * The three different modes that the target driver
                    426:                 * can set the CTIO{2,3,4} up as.
                    427:                 *
                    428:                 * The first is for sending FCP_DATA_IUs as well as
                    429:                 * (optionally) sending a terminal SCSI status FCP_RSP_IU.
                    430:                 *
                    431:                 * The second is for sending SCSI sense data in an FCP_RSP_IU.
                    432:                 * Note that no FCP_DATA_IUs will be sent.
                    433:                 *
                    434:                 * The third is for sending FCP_RSP_IUs as built specifically
                    435:                 * in system memory as located by the isp_dataseg.
                    436:                 */
                    437:                struct {
                    438:                        u_int32_t _reserved;
                    439:                        u_int16_t _reserved2;
                    440:                        u_int16_t ct_scsi_status;
                    441:                        u_int32_t ct_xfrlen;
                    442:                        union {
                    443:                                ispds_t ct_a[ISP_RQDSEG_T2];    /* CTIO2 */
                    444:                                ispds64_t ct_b[ISP_RQDSEG_T3];  /* CTIO3 */
                    445:                                ispdslist_t ct_c;               /* CTIO4 */
                    446:                        } _u;
                    447: #define        ct_dataseg      _u.ct_a
                    448: #define        ct_dataseg64    _u.ct_b
                    449: #define        ct_dslist       _u.ct_c
                    450:                } m0;
                    451:                struct {
                    452:                        u_int16_t _reserved;
                    453:                        u_int16_t _reserved2;
                    454:                        u_int16_t ct_senselen;
                    455:                        u_int16_t ct_scsi_status;
                    456:                        u_int16_t ct_resplen;
                    457:                        u_int8_t  ct_resp[MAXRESPLEN];
                    458:                } m1;
                    459:                struct {
                    460:                        u_int32_t _reserved;
                    461:                        u_int16_t _reserved2;
                    462:                        u_int16_t _reserved3;
                    463:                        u_int32_t ct_datalen;
                    464:                        ispds_t ct_fcp_rsp_iudata;
                    465:                } m2;
                    466:                /*
                    467:                 * CTIO2 returned from F/W...
                    468:                 */
                    469:                struct {
                    470:                        u_int32_t _reserved[4];
                    471:                        u_int16_t ct_scsi_status;
                    472:                        u_int8_t  ct_sense[QLTM_SENSELEN];
                    473:                } fw;
                    474:        } rsp;
                    475: } ct2_entry_t;
                    476:
                    477: /*
                    478:  * ct_flags values for CTIO2
                    479:  */
                    480: #define        CT2_FLAG_MMASK  0x0003
                    481: #define        CT2_FLAG_MODE0  0x0000
                    482: #define        CT2_FLAG_MODE1  0x0001
                    483: #define        CT2_FLAG_MODE2  0x0002
                    484: #define CT2_DATA_IN    CT_DATA_IN
                    485: #define CT2_DATA_OUT   CT_DATA_OUT
                    486: #define CT2_NO_DATA    CT_NO_DATA
                    487: #define CT2_DATAMASK   CT_DATAMASK
                    488: #define        CT2_CCINCR      0x0100
                    489: #define        CT2_FASTPOST    0x0200
                    490: #define CT2_SENDSTATUS 0x8000
                    491:
                    492: /*
                    493:  * ct_status values are (mostly) the same as that for ct_entry.
                    494:  */
                    495:
                    496: /*
                    497:  * ct_scsi_status values- the low 8 bits are the normal SCSI status
                    498:  * we know and love. The upper 8 bits are validity markers for FCP_RSP_IU
                    499:  * fields.
                    500:  */
                    501: #define        CT2_RSPLEN_VALID        0x0100
                    502: #define        CT2_SNSLEN_VALID        0x0200
                    503: #define        CT2_DATA_OVER           0x0400
                    504: #define        CT2_DATA_UNDER          0x0800
                    505:
                    506: /*
                    507:  * Debug macros
                    508:  */
                    509:
                    510: #define        ISP_TDQE(isp, msg, idx, arg)    \
                    511:     if (isp->isp_dblev & ISP_LOGTDEBUG2) isp_print_qentry(isp, msg, idx, arg)
                    512:
                    513: #ifdef ISP_TARGET_FUNCTIONS
                    514: /*
                    515:  * The functions below are for the publicly available
                    516:  * target mode functions that are internal to the Qlogic driver.
                    517:  */
                    518:
                    519: /*
                    520:  * This function handles new response queue entry appropriate for target mode.
                    521:  */
                    522: int isp_target_notify(struct ispsoftc *, void *, u_int16_t *);
                    523:
                    524: /*
                    525:  * Enable/Disable/Modify a logical unit.
                    526:  * (softc, cmd, bus, tgt, lun, cmd_cnt, inotify_cnt, opaque)
                    527:  */
                    528: #define        DFLT_CMND_CNT   0xfe    /* unmonitored */
                    529: #define        DFLT_INOT_CNT   16
                    530: int isp_lun_cmd(struct ispsoftc *, int, int, int, int, int, int, u_int32_t);
                    531:
                    532: /*
                    533:  * General request queue 'put' routine for target mode entries.
                    534:  */
                    535: int isp_target_put_entry(struct ispsoftc *isp, void *);
                    536:
                    537: /*
                    538:  * General routine to put back an ATIO entry-
                    539:  * used for replenishing f/w resource counts.
                    540:  * The argument is a pointer to a source ATIO
                    541:  * or ATIO2.
                    542:  */
                    543: int isp_target_put_atio(struct ispsoftc *, void *);
                    544:
                    545: /*
                    546:  * General routine to send a final CTIO for a command- used mostly for
                    547:  * local responses.
                    548:  */
                    549: int isp_endcmd(struct ispsoftc *, void *, u_int32_t, u_int16_t);
                    550: #define        ECMD_SVALID     0x100
                    551:
                    552: /*
                    553:  * Handle an asynchronous event
                    554:  *
                    555:  * Return nonzero if the interrupt that generated this event has been dismissed.
                    556:  */
                    557:
                    558: int isp_target_async(struct ispsoftc *, int, int);
                    559: #endif
                    560: #endif /* _ISP_TARGET_H */

CVSweb