root/dev/ic/ispmbox.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. mbreg_t
  2. ispds_t
  3. ispds64_t
  4. ispdslist_t
  5. isphdr_t
  6. ispreq_t
  7. ispreqt2_t
  8. ispreqt3_t
  9. ispextreq_t
  10. ispcontreq_t
  11. ispcontreq64_t
  12. ispstatusreq_t
  13. ispstatus_cont_t
  14. isp_rio1_t
  15. isp_rio2_t
  16. isp_icb_t
  17. fcpos_map_t
  18. isp_pdb_t
  19. ct_hdr_t
  20. sns_screq_t
  21. sns_ga_nxt_req_t
  22. sns_gxn_id_req_t
  23. sns_gid_ft_req_t
  24. sns_rft_id_req_t
  25. sns_scrsp_t
  26. sns_ga_nxt_rsp_t
  27. sns_gxn_id_rsp_t
  28. sns_gff_id_rsp_t
  29. sns_gid_ft_rsp_t

    1 /*     $OpenBSD: ispmbox.h,v 1.19 2003/03/03 18:38:10 mjacob Exp $ */
    2 /*
    3  * Mailbox and Queue Entry Definitions for for Qlogic ISP SCSI adapters.
    4  *
    5  * Copyright (c) 1997, 1998, 1999, 2000 by Matthew Jacob
    6  * All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice immediately at the beginning of the file, without modification,
   13  *    this list of conditions, and the following disclaimer.
   14  * 2. The name of the author may not be used to endorse or promote products
   15  *    derived from this software without specific prior written permission.
   16  *
   17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   20  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
   21  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   27  * SUCH DAMAGE.
   28  *
   29  */
   30 #ifndef _ISPMBOX_H
   31 #define _ISPMBOX_H
   32 
   33 /*
   34  * Mailbox Command Opcodes
   35  */
   36 #define MBOX_NO_OP                      0x0000
   37 #define MBOX_LOAD_RAM                   0x0001
   38 #define MBOX_EXEC_FIRMWARE              0x0002
   39 #define MBOX_DUMP_RAM                   0x0003
   40 #define MBOX_WRITE_RAM_WORD             0x0004
   41 #define MBOX_READ_RAM_WORD              0x0005
   42 #define MBOX_MAILBOX_REG_TEST           0x0006
   43 #define MBOX_VERIFY_CHECKSUM            0x0007
   44 #define MBOX_ABOUT_FIRMWARE             0x0008
   45                                         /*   9 */
   46                                         /*   a */
   47                                         /*   b */
   48                                         /*   c */
   49                                         /*   d */
   50 #define MBOX_CHECK_FIRMWARE             0x000e
   51 #define MBOX_READ_RAM_WORD_EXTENDED     0x000f
   52 #define MBOX_INIT_REQ_QUEUE             0x0010
   53 #define MBOX_INIT_RES_QUEUE             0x0011
   54 #define MBOX_EXECUTE_IOCB               0x0012
   55 #define MBOX_WAKE_UP                    0x0013
   56 #define MBOX_STOP_FIRMWARE              0x0014
   57 #define MBOX_ABORT                      0x0015
   58 #define MBOX_ABORT_DEVICE               0x0016
   59 #define MBOX_ABORT_TARGET               0x0017
   60 #define MBOX_BUS_RESET                  0x0018
   61 #define MBOX_STOP_QUEUE                 0x0019
   62 #define MBOX_START_QUEUE                0x001a
   63 #define MBOX_SINGLE_STEP_QUEUE          0x001b
   64 #define MBOX_ABORT_QUEUE                0x001c
   65 #define MBOX_GET_DEV_QUEUE_STATUS       0x001d
   66                                         /*  1e */
   67 #define MBOX_GET_FIRMWARE_STATUS        0x001f
   68 #define MBOX_GET_INIT_SCSI_ID           0x0020
   69 #define MBOX_GET_SELECT_TIMEOUT         0x0021
   70 #define MBOX_GET_RETRY_COUNT            0x0022
   71 #define MBOX_GET_TAG_AGE_LIMIT          0x0023
   72 #define MBOX_GET_CLOCK_RATE             0x0024
   73 #define MBOX_GET_ACT_NEG_STATE          0x0025
   74 #define MBOX_GET_ASYNC_DATA_SETUP_TIME  0x0026
   75 #define MBOX_GET_SBUS_PARAMS            0x0027
   76 #define         MBOX_GET_PCI_PARAMS     MBOX_GET_SBUS_PARAMS
   77 #define MBOX_GET_TARGET_PARAMS          0x0028
   78 #define MBOX_GET_DEV_QUEUE_PARAMS       0x0029
   79 #define MBOX_GET_RESET_DELAY_PARAMS     0x002a
   80                                         /*  2b */
   81                                         /*  2c */
   82                                         /*  2d */
   83                                         /*  2e */
   84                                         /*  2f */
   85 #define MBOX_SET_INIT_SCSI_ID           0x0030
   86 #define MBOX_SET_SELECT_TIMEOUT         0x0031
   87 #define MBOX_SET_RETRY_COUNT            0x0032
   88 #define MBOX_SET_TAG_AGE_LIMIT          0x0033
   89 #define MBOX_SET_CLOCK_RATE             0x0034
   90 #define MBOX_SET_ACT_NEG_STATE          0x0035
   91 #define MBOX_SET_ASYNC_DATA_SETUP_TIME  0x0036
   92 #define MBOX_SET_SBUS_CONTROL_PARAMS    0x0037
   93 #define         MBOX_SET_PCI_PARAMETERS 0x0037
   94 #define MBOX_SET_TARGET_PARAMS          0x0038
   95 #define MBOX_SET_DEV_QUEUE_PARAMS       0x0039
   96 #define MBOX_SET_RESET_DELAY_PARAMS     0x003a
   97                                         /*  3b */
   98                                         /*  3c */
   99                                         /*  3d */
  100                                         /*  3e */
  101                                         /*  3f */
  102 #define MBOX_RETURN_BIOS_BLOCK_ADDR     0x0040
  103 #define MBOX_WRITE_FOUR_RAM_WORDS       0x0041
  104 #define MBOX_EXEC_BIOS_IOCB             0x0042
  105 #define MBOX_SET_FW_FEATURES            0x004a
  106 #define MBOX_GET_FW_FEATURES            0x004b
  107 #define         FW_FEATURE_FAST_POST    0x1
  108 #define         FW_FEATURE_LVD_NOTIFY   0x2
  109 #define         FW_FEATURE_RIO_32BIT    0x4
  110 #define         FW_FEATURE_RIO_16BIT    0x8
  111 
  112 #define MBOX_INIT_REQ_QUEUE_A64         0x0052
  113 #define MBOX_INIT_RES_QUEUE_A64         0x0053
  114 
  115 #define MBOX_ENABLE_TARGET_MODE         0x0055
  116 #define         ENABLE_TARGET_FLAG      0x8000
  117 #define         ENABLE_TQING_FLAG       0x0004
  118 #define         ENABLE_MANDATORY_DISC   0x0002
  119 #define MBOX_GET_TARGET_STATUS          0x0056
  120 
  121 /* These are for the ISP2X00 FC cards */
  122 #define MBOX_GET_LOOP_ID                0x0020
  123 #define MBOX_GET_FIRMWARE_OPTIONS       0x0028
  124 #define MBOX_SET_FIRMWARE_OPTIONS       0x0038
  125 #define MBOX_GET_RESOURCE_COUNT         0x0042
  126 #define MBOX_ENHANCED_GET_PDB           0x0047
  127 #define MBOX_EXEC_COMMAND_IOCB_A64      0x0054
  128 #define MBOX_INIT_FIRMWARE              0x0060
  129 #define MBOX_GET_INIT_CONTROL_BLOCK     0x0061
  130 #define MBOX_INIT_LIP                   0x0062
  131 #define MBOX_GET_FC_AL_POSITION_MAP     0x0063
  132 #define MBOX_GET_PORT_DB                0x0064
  133 #define MBOX_CLEAR_ACA                  0x0065
  134 #define MBOX_TARGET_RESET               0x0066
  135 #define MBOX_CLEAR_TASK_SET             0x0067
  136 #define MBOX_ABORT_TASK_SET             0x0068
  137 #define MBOX_GET_FW_STATE               0x0069
  138 #define MBOX_GET_PORT_NAME              0x006A
  139 #define MBOX_GET_LINK_STATUS            0x006B
  140 #define MBOX_INIT_LIP_RESET             0x006C
  141 #define MBOX_SEND_SNS                   0x006E
  142 #define MBOX_FABRIC_LOGIN               0x006F
  143 #define MBOX_SEND_CHANGE_REQUEST        0x0070
  144 #define MBOX_FABRIC_LOGOUT              0x0071
  145 #define MBOX_INIT_LIP_LOGIN             0x0072
  146 
  147 #define MBOX_DRIVER_HEARTBEAT           0x005B
  148 #define MBOX_FW_HEARTBEAT               0x005C
  149 
  150 #define MBOX_GET_SET_DATA_RATE          0x005D  /* 23XX only */
  151 #define         MBGSD_GET_RATE  0
  152 #define         MBGSD_SET_RATE  1
  153 #define         MBGSD_ONEGB     0
  154 #define         MBGSD_TWOGB     1
  155 #define         MBGSD_AUTO      2
  156 
  157 
  158 #define ISP2100_SET_PCI_PARAM           0x00ff
  159 
  160 #define MBOX_BUSY                       0x04
  161 
  162 typedef struct {
  163         u_int16_t param[8];
  164 } mbreg_t;
  165 
  166 /*
  167  * Mailbox Command Complete Status Codes
  168  */
  169 #define MBOX_COMMAND_COMPLETE           0x4000
  170 #define MBOX_INVALID_COMMAND            0x4001
  171 #define MBOX_HOST_INTERFACE_ERROR       0x4002
  172 #define MBOX_TEST_FAILED                0x4003
  173 #define MBOX_COMMAND_ERROR              0x4005
  174 #define MBOX_COMMAND_PARAM_ERROR        0x4006
  175 #define MBOX_PORT_ID_USED               0x4007
  176 #define MBOX_LOOP_ID_USED               0x4008
  177 #define MBOX_ALL_IDS_USED               0x4009
  178 #define MBOX_NOT_LOGGED_IN              0x400A
  179 #define MBLOGALL                        0x000f
  180 #define MBLOGNONE                       0x0000
  181 #define MBLOGMASK(x)                    ((x) & 0xf)
  182 
  183 /*
  184  * Asynchronous event status codes
  185  */
  186 #define ASYNC_BUS_RESET                 0x8001
  187 #define ASYNC_SYSTEM_ERROR              0x8002
  188 #define ASYNC_RQS_XFER_ERR              0x8003
  189 #define ASYNC_RSP_XFER_ERR              0x8004
  190 #define ASYNC_QWAKEUP                   0x8005
  191 #define ASYNC_TIMEOUT_RESET             0x8006
  192 #define ASYNC_DEVICE_RESET              0x8007
  193 #define ASYNC_EXTMSG_UNDERRUN           0x800A
  194 #define ASYNC_SCAM_INT                  0x800B
  195 #define ASYNC_HUNG_SCSI                 0x800C
  196 #define ASYNC_KILLED_BUS                0x800D
  197 #define ASYNC_BUS_TRANSIT               0x800E  /* LVD -> HVD, eg. */
  198 #define ASYNC_LIP_OCCURRED              0x8010
  199 #define ASYNC_LOOP_UP                   0x8011
  200 #define ASYNC_LOOP_DOWN                 0x8012
  201 #define ASYNC_LOOP_RESET                0x8013
  202 #define ASYNC_PDB_CHANGED               0x8014
  203 #define ASYNC_CHANGE_NOTIFY             0x8015
  204 #define ASYNC_LIP_F8                    0x8016
  205 #define ASYNC_CMD_CMPLT                 0x8020
  206 #define ASYNC_CTIO_DONE                 0x8021
  207 #define ASYNC_IP_XMIT_DONE              0x8022
  208 #define ASYNC_IP_RECV_DONE              0x8023
  209 #define ASYNC_IP_BROADCAST              0x8024
  210 #define ASYNC_IP_RCVQ_LOW               0x8025
  211 #define ASYNC_IP_RCVQ_EMPTY             0x8026
  212 #define ASYNC_IP_RECV_DONE_ALIGNED      0x8027
  213 #define ASYNC_PTPMODE                   0x8030
  214 #define ASYNC_RIO1                      0x8031
  215 #define ASYNC_RIO2                      0x8032
  216 #define ASYNC_RIO3                      0x8033
  217 #define ASYNC_RIO4                      0x8034
  218 #define ASYNC_RIO5                      0x8035
  219 #define ASYNC_CONNMODE                  0x8036
  220 #define         ISP_CONN_LOOP           1
  221 #define         ISP_CONN_PTP            2
  222 #define         ISP_CONN_BADLIP         3
  223 #define         ISP_CONN_FATAL          4
  224 #define         ISP_CONN_LOOPBACK       5
  225 #define ASYNC_RIO_RESP                  0x8040
  226 #define ASYNC_RIO_COMP                  0x8042
  227 /*
  228  * 2.01.31 2200 Only. Need Bit 13 in Mailbox 1 for Set Firmware Options
  229  * mailbox command to enable this.
  230  */
  231 #define ASYNC_QFULL_SENT                0x8049
  232 
  233 /*
  234  * Mailbox Usages
  235  */
  236 
  237 #define WRITE_REQUEST_QUEUE_IN_POINTER(isp, value)      \
  238         ISP_WRITE(isp, isp->isp_rqstinrp, value)
  239 
  240 #define READ_REQUEST_QUEUE_OUT_POINTER(isp)             \
  241         ISP_READ(isp, isp->isp_rqstoutrp)
  242 
  243 #define READ_RESPONSE_QUEUE_IN_POINTER(isp)             \
  244         ISP_READ(isp, isp->isp_respinrp)
  245 
  246 #define WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, value)    \
  247         ISP_WRITE(isp, isp->isp_respoutrp, value)
  248 
  249 /*
  250  * Command Structure Definitions
  251  */
  252 
  253 typedef struct {
  254         u_int32_t       ds_base;
  255         u_int32_t       ds_count;
  256 } ispds_t;
  257 
  258 typedef struct {
  259         u_int32_t       ds_base;
  260         u_int32_t       ds_basehi;
  261         u_int32_t       ds_count;
  262 } ispds64_t;
  263 
  264 #define DSTYPE_32BIT    0
  265 #define DSTYPE_64BIT    1
  266 typedef struct {
  267         u_int16_t       ds_type;        /* 0-> ispds_t, 1-> ispds64_t */
  268         u_int32_t       ds_segment;     /* unused */
  269         u_int32_t       ds_base;        /* 32 bit address of DSD list */
  270 } ispdslist_t;
  271 
  272 
  273 /*
  274  * These elements get swizzled around for SBus instances.
  275  */
  276 #define ISP_SWAP8(a, b) {               \
  277         u_int8_t tmp;                   \
  278         tmp = a;                        \
  279         a = b;                          \
  280         b = tmp;                        \
  281 }
  282 typedef struct {
  283         u_int8_t        rqs_entry_type;
  284         u_int8_t        rqs_entry_count;
  285         u_int8_t        rqs_seqno;
  286         u_int8_t        rqs_flags;
  287 } isphdr_t;
  288 
  289 /* RQS Flag definitions */
  290 #define RQSFLAG_CONTINUATION    0x01
  291 #define RQSFLAG_FULL            0x02
  292 #define RQSFLAG_BADHEADER       0x04
  293 #define RQSFLAG_BADPACKET       0x08
  294 
  295 /* RQS entry_type definitions */
  296 #define RQSTYPE_REQUEST         0x01
  297 #define RQSTYPE_DATASEG         0x02
  298 #define RQSTYPE_RESPONSE        0x03
  299 #define RQSTYPE_MARKER          0x04
  300 #define RQSTYPE_CMDONLY         0x05
  301 #define RQSTYPE_ATIO            0x06    /* Target Mode */
  302 #define RQSTYPE_CTIO            0x07    /* Target Mode */
  303 #define RQSTYPE_SCAM            0x08
  304 #define RQSTYPE_A64             0x09
  305 #define RQSTYPE_A64_CONT        0x0a
  306 #define RQSTYPE_ENABLE_LUN      0x0b    /* Target Mode */
  307 #define RQSTYPE_MODIFY_LUN      0x0c    /* Target Mode */
  308 #define RQSTYPE_NOTIFY          0x0d    /* Target Mode */
  309 #define RQSTYPE_NOTIFY_ACK      0x0e    /* Target Mode */
  310 #define RQSTYPE_CTIO1           0x0f    /* Target Mode */
  311 #define RQSTYPE_STATUS_CONT     0x10
  312 #define RQSTYPE_T2RQS           0x11
  313 #define RQSTYPE_IP_XMIT         0x13
  314 #define RQSTYPE_T4RQS           0x15
  315 #define RQSTYPE_ATIO2           0x16    /* Target Mode */
  316 #define RQSTYPE_CTIO2           0x17    /* Target Mode */
  317 #define RQSTYPE_CSET0           0x18
  318 #define RQSTYPE_T3RQS           0x19
  319 #define RQSTYPE_IP_XMIT_64      0x1b
  320 #define RQSTYPE_CTIO4           0x1e    /* Target Mode */
  321 #define RQSTYPE_CTIO3           0x1f    /* Target Mode */
  322 #define RQSTYPE_RIO1            0x21
  323 #define RQSTYPE_RIO2            0x22
  324 #define RQSTYPE_IP_RECV         0x23
  325 #define RQSTYPE_IP_RECV_CONT    0x24
  326 
  327 
  328 #define ISP_RQDSEG      4
  329 typedef struct {
  330         isphdr_t        req_header;
  331         u_int32_t       req_handle;
  332         u_int8_t        req_lun_trn;
  333         u_int8_t        req_target;
  334         u_int16_t       req_cdblen;
  335 #define req_modifier    req_cdblen      /* marker packet */
  336         u_int16_t       req_flags;
  337         u_int16_t       req_reserved;
  338         u_int16_t       req_time;
  339         u_int16_t       req_seg_count;
  340         u_int8_t        req_cdb[12];
  341         ispds_t         req_dataseg[ISP_RQDSEG];
  342 } ispreq_t;
  343 
  344 #define ispreq64_t      ispreqt3_t      /* same as.... */
  345 #define ISP_RQDSEG_A64  2
  346 
  347 /*
  348  * A request packet can also be a marker packet.
  349  */
  350 #define SYNC_DEVICE     0
  351 #define SYNC_TARGET     1
  352 #define SYNC_ALL        2
  353 
  354 #define ISP_RQDSEG_T2           3
  355 typedef struct {
  356         isphdr_t        req_header;
  357         u_int32_t       req_handle;
  358         u_int8_t        req_lun_trn;
  359         u_int8_t        req_target;
  360         u_int16_t       req_scclun;
  361         u_int16_t       req_flags;
  362         u_int16_t       _res2;
  363         u_int16_t       req_time;
  364         u_int16_t       req_seg_count;
  365         u_int8_t        req_cdb[16];
  366         u_int32_t       req_totalcnt;
  367         ispds_t         req_dataseg[ISP_RQDSEG_T2];
  368 } ispreqt2_t;
  369 
  370 #define ISP_RQDSEG_T3           2
  371 typedef struct {
  372         isphdr_t        req_header;
  373         u_int32_t       req_handle;
  374         u_int8_t        req_lun_trn;
  375         u_int8_t        req_target;
  376         u_int16_t       req_scclun;
  377         u_int16_t       req_flags;
  378         u_int16_t       _res2;
  379         u_int16_t       req_time;
  380         u_int16_t       req_seg_count;
  381         u_int8_t        req_cdb[16];
  382         u_int32_t       req_totalcnt;
  383         ispds64_t       req_dataseg[ISP_RQDSEG_T3];
  384 } ispreqt3_t;
  385 
  386 /* req_flag values */
  387 #define REQFLAG_NODISCON        0x0001
  388 #define REQFLAG_HTAG            0x0002
  389 #define REQFLAG_OTAG            0x0004
  390 #define REQFLAG_STAG            0x0008
  391 #define REQFLAG_TARGET_RTN      0x0010
  392 
  393 #define REQFLAG_NODATA          0x0000
  394 #define REQFLAG_DATA_IN         0x0020
  395 #define REQFLAG_DATA_OUT        0x0040
  396 #define REQFLAG_DATA_UNKNOWN    0x0060
  397 
  398 #define REQFLAG_DISARQ          0x0100
  399 #define REQFLAG_FRC_ASYNC       0x0200
  400 #define REQFLAG_FRC_SYNC        0x0400
  401 #define REQFLAG_FRC_WIDE        0x0800
  402 #define REQFLAG_NOPARITY        0x1000
  403 #define REQFLAG_STOPQ           0x2000
  404 #define REQFLAG_XTRASNS         0x4000
  405 #define REQFLAG_PRIORITY        0x8000
  406 
  407 typedef struct {
  408         isphdr_t        req_header;
  409         u_int32_t       req_handle;
  410         u_int8_t        req_lun_trn;
  411         u_int8_t        req_target;
  412         u_int16_t       req_cdblen;
  413         u_int16_t       req_flags;
  414         u_int16_t       _res1;
  415         u_int16_t       req_time;
  416         u_int16_t       req_seg_count;
  417         u_int8_t        req_cdb[44];
  418 } ispextreq_t;
  419 
  420 #define ISP_CDSEG       7
  421 typedef struct {
  422         isphdr_t        req_header;
  423         u_int32_t       _res1;
  424         ispds_t         req_dataseg[ISP_CDSEG];
  425 } ispcontreq_t;
  426 
  427 #define ISP_CDSEG64     5
  428 typedef struct {
  429         isphdr_t        req_header;
  430         ispds64_t       req_dataseg[ISP_CDSEG64];
  431 } ispcontreq64_t;
  432 
  433 typedef struct {
  434         isphdr_t        req_header;
  435         u_int32_t       req_handle;
  436         u_int16_t       req_scsi_status;
  437         u_int16_t       req_completion_status;
  438         u_int16_t       req_state_flags;
  439         u_int16_t       req_status_flags;
  440         u_int16_t       req_time;
  441 #define req_response_len        req_time        /* FC only */
  442         u_int16_t       req_sense_len;
  443         u_int32_t       req_resid;
  444         u_int8_t        req_response[8];        /* FC only */
  445         u_int8_t        req_sense_data[32];
  446 } ispstatusreq_t;
  447 
  448 typedef struct {
  449         isphdr_t        req_header;
  450         u_int8_t        req_sense_data[60];
  451 } ispstatus_cont_t;
  452 
  453 /* 
  454  * For Qlogic 2X00, the high order byte of SCSI status has
  455  * additional meaning.
  456  */
  457 #define RQCS_RU 0x800   /* Residual Under */
  458 #define RQCS_RO 0x400   /* Residual Over */
  459 #define RQCS_RESID      (RQCS_RU|RQCS_RO)
  460 #define RQCS_SV 0x200   /* Sense Length Valid */
  461 #define RQCS_RV 0x100   /* FCP Response Length Valid */
  462 
  463 /* 
  464  * Completion Status Codes.
  465  */
  466 #define RQCS_COMPLETE                   0x0000
  467 #define RQCS_DMA_ERROR                  0x0002
  468 #define RQCS_RESET_OCCURRED             0x0004
  469 #define RQCS_ABORTED                    0x0005
  470 #define RQCS_TIMEOUT                    0x0006
  471 #define RQCS_DATA_OVERRUN               0x0007
  472 #define RQCS_DATA_UNDERRUN              0x0015
  473 #define RQCS_QUEUE_FULL                 0x001C
  474 
  475 /* 1X00 Only Completion Codes */
  476 #define RQCS_INCOMPLETE                 0x0001
  477 #define RQCS_TRANSPORT_ERROR            0x0003
  478 #define RQCS_COMMAND_OVERRUN            0x0008
  479 #define RQCS_STATUS_OVERRUN             0x0009
  480 #define RQCS_BAD_MESSAGE                0x000a
  481 #define RQCS_NO_MESSAGE_OUT             0x000b
  482 #define RQCS_EXT_ID_FAILED              0x000c
  483 #define RQCS_IDE_MSG_FAILED             0x000d
  484 #define RQCS_ABORT_MSG_FAILED           0x000e
  485 #define RQCS_REJECT_MSG_FAILED          0x000f
  486 #define RQCS_NOP_MSG_FAILED             0x0010
  487 #define RQCS_PARITY_ERROR_MSG_FAILED    0x0011
  488 #define RQCS_DEVICE_RESET_MSG_FAILED    0x0012
  489 #define RQCS_ID_MSG_FAILED              0x0013
  490 #define RQCS_UNEXP_BUS_FREE             0x0014
  491 #define RQCS_XACT_ERR1                  0x0018
  492 #define RQCS_XACT_ERR2                  0x0019
  493 #define RQCS_XACT_ERR3                  0x001A
  494 #define RQCS_BAD_ENTRY                  0x001B
  495 #define RQCS_PHASE_SKIPPED              0x001D
  496 #define RQCS_ARQS_FAILED                0x001E
  497 #define RQCS_WIDE_FAILED                0x001F
  498 #define RQCS_SYNCXFER_FAILED            0x0020
  499 #define RQCS_LVD_BUSERR                 0x0021
  500 
  501 /* 2X00 Only Completion Codes */
  502 #define RQCS_PORT_UNAVAILABLE           0x0028
  503 #define RQCS_PORT_LOGGED_OUT            0x0029
  504 #define RQCS_PORT_CHANGED               0x002A
  505 #define RQCS_PORT_BUSY                  0x002B
  506 
  507 /*
  508  * 1X00 specific State Flags 
  509  */
  510 #define RQSF_GOT_BUS                    0x0100
  511 #define RQSF_GOT_TARGET                 0x0200
  512 #define RQSF_SENT_CDB                   0x0400
  513 #define RQSF_XFRD_DATA                  0x0800
  514 #define RQSF_GOT_STATUS                 0x1000
  515 #define RQSF_GOT_SENSE                  0x2000
  516 #define RQSF_XFER_COMPLETE              0x4000
  517 
  518 /*
  519  * 2X00 specific State Flags
  520  * (same as 1X00 except RQSF_GOT_BUS/RQSF_GOT_TARGET are not available)
  521  */
  522 #define RQSF_DATA_IN                    0x0020
  523 #define RQSF_DATA_OUT                   0x0040
  524 #define RQSF_STAG                       0x0008
  525 #define RQSF_OTAG                       0x0004
  526 #define RQSF_HTAG                       0x0002
  527 /*
  528  * 1X00 Status Flags
  529  */
  530 #define RQSTF_DISCONNECT                0x0001
  531 #define RQSTF_SYNCHRONOUS               0x0002
  532 #define RQSTF_PARITY_ERROR              0x0004
  533 #define RQSTF_BUS_RESET                 0x0008
  534 #define RQSTF_DEVICE_RESET              0x0010
  535 #define RQSTF_ABORTED                   0x0020
  536 #define RQSTF_TIMEOUT                   0x0040
  537 #define RQSTF_NEGOTIATION               0x0080
  538 
  539 /*
  540  * 2X00 specific state flags
  541  */
  542 /* RQSF_SENT_CDB        */
  543 /* RQSF_XFRD_DATA       */
  544 /* RQSF_GOT_STATUS      */
  545 /* RQSF_XFER_COMPLETE   */
  546 
  547 /*
  548  * 2X00 specific status flags
  549  */
  550 /* RQSTF_ABORTED */
  551 /* RQSTF_TIMEOUT */
  552 #define RQSTF_DMA_ERROR                 0x0080
  553 #define RQSTF_LOGOUT                    0x2000
  554 
  555 /*
  556  * Miscellaneous
  557  */
  558 #ifndef ISP_EXEC_THROTTLE
  559 #define ISP_EXEC_THROTTLE       16
  560 #endif
  561 
  562 /*
  563  * About Firmware returns an 'attribute' word in mailbox 6.
  564  */
  565 #define ISP_FW_ATTR_TMODE       0x01
  566 #define ISP_FW_ATTR_SCCLUN      0x02
  567 #define ISP_FW_ATTR_FABRIC      0x04
  568 #define ISP_FW_ATTR_CLASS2      0x08
  569 #define ISP_FW_ATTR_FCTAPE      0x10
  570 #define ISP_FW_ATTR_IP          0x20
  571 
  572 /*
  573  * Reduced Interrupt Operation Response Queue Entreis
  574  */
  575 
  576 typedef struct {
  577         isphdr_t        req_header;
  578         u_int32_t       req_handles[15];
  579 } isp_rio1_t;
  580 
  581 typedef struct {
  582         isphdr_t        req_header;
  583         u_int16_t       req_handles[30];
  584 } isp_rio2_t;
  585 
  586 /*
  587  * FC (ISP2100) specific data structures
  588  */
  589 
  590 /*
  591  * Initialization Control Block
  592  *
  593  * Version One (prime) format.
  594  */
  595 typedef struct isp_icb {
  596         u_int8_t        icb_version;
  597         u_int8_t        _reserved0;
  598         u_int16_t       icb_fwoptions;
  599         u_int16_t       icb_maxfrmlen;
  600         u_int16_t       icb_maxalloc;
  601         u_int16_t       icb_execthrottle;
  602         u_int8_t        icb_retry_count;
  603         u_int8_t        icb_retry_delay;
  604         u_int8_t        icb_portname[8];
  605         u_int16_t       icb_hardaddr;
  606         u_int8_t        icb_iqdevtype;
  607         u_int8_t        icb_logintime;
  608         u_int8_t        icb_nodename[8];
  609         u_int16_t       icb_rqstout;
  610         u_int16_t       icb_rspnsin;
  611         u_int16_t       icb_rqstqlen;
  612         u_int16_t       icb_rsltqlen;
  613         u_int16_t       icb_rqstaddr[4];
  614         u_int16_t       icb_respaddr[4];
  615         u_int16_t       icb_lunenables;
  616         u_int8_t        icb_ccnt;
  617         u_int8_t        icb_icnt;
  618         u_int16_t       icb_lunetimeout;
  619         u_int16_t       _reserved1;
  620         u_int16_t       icb_xfwoptions;
  621         u_int8_t        icb_racctimer;
  622         u_int8_t        icb_idelaytimer;
  623         u_int16_t       icb_zfwoptions;
  624         u_int16_t       _reserved2[13];
  625 } isp_icb_t;
  626 #define ICB_VERSION1    1
  627 
  628 #define ICBOPT_HARD_ADDRESS     0x0001
  629 #define ICBOPT_FAIRNESS         0x0002
  630 #define ICBOPT_FULL_DUPLEX      0x0004
  631 #define ICBOPT_FAST_POST        0x0008
  632 #define ICBOPT_TGT_ENABLE       0x0010
  633 #define ICBOPT_INI_DISABLE      0x0020
  634 #define ICBOPT_INI_ADISC        0x0040
  635 #define ICBOPT_INI_TGTTYPE      0x0080
  636 #define ICBOPT_PDBCHANGE_AE     0x0100
  637 #define ICBOPT_NOLIP            0x0200
  638 #define ICBOPT_SRCHDOWN         0x0400
  639 #define ICBOPT_PREVLOOP         0x0800
  640 #define ICBOPT_STOP_ON_QFULL    0x1000
  641 #define ICBOPT_FULL_LOGIN       0x2000
  642 #define ICBOPT_BOTH_WWNS        0x4000
  643 #define ICBOPT_EXTENDED         0x8000
  644 
  645 #define ICBXOPT_CLASS2_ACK0     0x0200
  646 #define ICBXOPT_CLASS2          0x0100
  647 #define ICBXOPT_LOOP_ONLY       (0 << 4)
  648 #define ICBXOPT_PTP_ONLY        (1 << 4)
  649 #define ICBXOPT_LOOP_2_PTP      (2 << 4)
  650 #define ICBXOPT_PTP_2_LOOP      (3 << 4)
  651 
  652 #define ICBXOPT_RIO_OFF         0
  653 #define ICBXOPT_RIO_16BIT       1
  654 #define ICBXOPT_RIO_32BIT       2
  655 #define ICBXOPT_RIO_16BIT_IOCB  3
  656 #define ICBXOPT_RIO_32BIT_IOCB  4
  657 #define ICBXOPT_ZIO             (1 << 5)
  658 
  659 #define ICBZOPT_ENA_RDXFR_RDY   0x01
  660 #define ICBZOPT_ENA_OOF         (1 << 6) /* out of order frame handling */
  661 /* These 3 only apply to the 2300 */
  662 #define ICBZOPT_RATE_ONEGB      (MBGSD_ONEGB << 14)
  663 #define ICBZOPT_RATE_TWOGB      (MBGSD_TWOGB << 14)
  664 #define ICBZOPT_RATE_AUTO       (MBGSD_AUTO << 14)
  665 
  666 
  667 #define ICB_MIN_FRMLEN          256
  668 #define ICB_MAX_FRMLEN          2112
  669 #define ICB_DFLT_FRMLEN         1024
  670 #define ICB_DFLT_ALLOC          256
  671 #define ICB_DFLT_THROTTLE       16
  672 #define ICB_DFLT_RDELAY         5
  673 #define ICB_DFLT_RCOUNT         3
  674 
  675 
  676 #define RQRSP_ADDR0015  0
  677 #define RQRSP_ADDR1631  1
  678 #define RQRSP_ADDR3247  2
  679 #define RQRSP_ADDR4863  3
  680 
  681 
  682 #define ICB_NNM0        7
  683 #define ICB_NNM1        6
  684 #define ICB_NNM2        5
  685 #define ICB_NNM3        4
  686 #define ICB_NNM4        3
  687 #define ICB_NNM5        2
  688 #define ICB_NNM6        1
  689 #define ICB_NNM7        0
  690 
  691 #define MAKE_NODE_NAME_FROM_WWN(array, wwn)     \
  692         array[ICB_NNM0] = (u_int8_t) ((wwn >>  0) & 0xff), \
  693         array[ICB_NNM1] = (u_int8_t) ((wwn >>  8) & 0xff), \
  694         array[ICB_NNM2] = (u_int8_t) ((wwn >> 16) & 0xff), \
  695         array[ICB_NNM3] = (u_int8_t) ((wwn >> 24) & 0xff), \
  696         array[ICB_NNM4] = (u_int8_t) ((wwn >> 32) & 0xff), \
  697         array[ICB_NNM5] = (u_int8_t) ((wwn >> 40) & 0xff), \
  698         array[ICB_NNM6] = (u_int8_t) ((wwn >> 48) & 0xff), \
  699         array[ICB_NNM7] = (u_int8_t) ((wwn >> 56) & 0xff)
  700 
  701 /*
  702  * FC-AL Position Map
  703  *
  704  * This is an at most 128 byte map that returns either
  705  * the LILP or Firmware generated list of ports.
  706  *
  707  * We deviate a bit from the returned qlogic format to
  708  * use an extra bit to say whether this was a LILP or
  709  * f/w generated map.
  710  */
  711 typedef struct {
  712         u_int8_t        fwmap   : 1,
  713                         count   : 7;
  714         u_int8_t        map[127];
  715 } fcpos_map_t;
  716 
  717 /*
  718  * Port Data Base Element
  719  */
  720 
  721 typedef struct {
  722         u_int16_t       pdb_options;
  723         u_int8_t        pdb_mstate;
  724         u_int8_t        pdb_sstate;
  725 #define BITS2WORD(x)    ((x)[0] << 16 | (x)[3] << 8 | (x)[2])
  726         u_int8_t        pdb_hardaddr_bits[4];
  727         u_int8_t        pdb_portid_bits[4];
  728         u_int8_t        pdb_nodename[8];
  729         u_int8_t        pdb_portname[8];
  730         u_int16_t       pdb_execthrottle;
  731         u_int16_t       pdb_exec_count;
  732         u_int8_t        pdb_retry_count;
  733         u_int8_t        pdb_retry_delay;
  734         u_int16_t       pdb_resalloc;
  735         u_int16_t       pdb_curalloc;
  736         u_int16_t       pdb_qhead;
  737         u_int16_t       pdb_qtail;
  738         u_int16_t       pdb_tl_next;
  739         u_int16_t       pdb_tl_last;
  740         u_int16_t       pdb_features;   /* PLOGI, Common Service */
  741         u_int16_t       pdb_pconcurrnt; /* PLOGI, Common Service */
  742         u_int16_t       pdb_roi;        /* PLOGI, Common Service */
  743         u_int8_t        pdb_target;
  744         u_int8_t        pdb_initiator;  /* PLOGI, Class 3 Control Flags */
  745         u_int16_t       pdb_rdsiz;      /* PLOGI, Class 3 */
  746         u_int16_t       pdb_ncseq;      /* PLOGI, Class 3 */
  747         u_int16_t       pdb_noseq;      /* PLOGI, Class 3 */
  748         u_int16_t       pdb_labrtflg;
  749         u_int16_t       pdb_lstopflg;
  750         u_int16_t       pdb_sqhead;
  751         u_int16_t       pdb_sqtail;
  752         u_int16_t       pdb_ptimer;
  753         u_int16_t       pdb_nxt_seqid;
  754         u_int16_t       pdb_fcount;
  755         u_int16_t       pdb_prli_len;
  756         u_int16_t       pdb_prli_svc0;
  757         u_int16_t       pdb_prli_svc3;
  758         u_int16_t       pdb_loopid;
  759         u_int16_t       pdb_il_ptr;
  760         u_int16_t       pdb_sl_ptr;
  761 } isp_pdb_t;
  762 
  763 #define PDB_OPTIONS_XMITTING    (1<<11)
  764 #define PDB_OPTIONS_LNKXMIT     (1<<10)
  765 #define PDB_OPTIONS_ABORTED     (1<<9)
  766 #define PDB_OPTIONS_ADISC       (1<<1)
  767 
  768 #define PDB_STATE_DISCOVERY     0
  769 #define PDB_STATE_WDISC_ACK     1
  770 #define PDB_STATE_PLOGI         2
  771 #define PDB_STATE_PLOGI_ACK     3
  772 #define PDB_STATE_PRLI          4
  773 #define PDB_STATE_PRLI_ACK      5
  774 #define PDB_STATE_LOGGED_IN     6
  775 #define PDB_STATE_PORT_UNAVAIL  7
  776 #define PDB_STATE_PRLO          8
  777 #define PDB_STATE_PRLO_ACK      9
  778 #define PDB_STATE_PLOGO         10
  779 #define PDB_STATE_PLOG_ACK      11
  780 
  781 #define         SVC3_TGT_ROLE           0x10
  782 #define         SVC3_INI_ROLE           0x20
  783 #define                 SVC3_ROLE_MASK  0x30
  784 #define                 SVC3_ROLE_SHIFT 4
  785 
  786 /*
  787  * CT definition
  788  *
  789  * This is as the QLogic f/w documentations defines it- which is just opposite,
  790  * bit wise, from what the specification defines it as. Additionally, the
  791  * ct_response and ct_resid (really from FC-GS-2) need to be byte swapped.
  792  */
  793 
  794 typedef struct {
  795         u_int8_t        ct_revision;
  796         u_int8_t        ct_portid[3];
  797         u_int8_t        ct_fcs_type;
  798         u_int8_t        ct_fcs_subtype;
  799         u_int8_t        ct_options;
  800         u_int8_t        ct_res0;
  801         u_int16_t       ct_response;
  802         u_int16_t       ct_resid;
  803         u_int8_t        ct_res1;
  804         u_int8_t        ct_reason;
  805         u_int8_t        ct_explanation;
  806         u_int8_t        ct_vunique;
  807 } ct_hdr_t;
  808 #define FS_ACC  0x8002
  809 #define FS_RJT  0x8001
  810 
  811 #define FC4_IP          5 /* ISO/EEC 8802-2 LLC/SNAP "Out of Order Delivery" */
  812 #define FC4_SCSI        8 /* SCSI-3 via Fivre Channel Protocol (FCP) */
  813 #define FC4_FC_SVC      0x20    /* Fibre Channel Services */
  814 
  815 #define SNS_GA_NXT      0x100
  816 #define SNS_GPN_ID      0x112
  817 #define SNS_GNN_ID      0x113
  818 #define SNS_GFF_ID      0x11F
  819 #define SNS_GID_FT      0x171
  820 #define SNS_RFT_ID      0x217
  821 typedef struct {
  822         u_int16_t       snscb_rblen;    /* response buffer length (words) */
  823         u_int16_t       snscb_res0;
  824         u_int16_t       snscb_addr[4];  /* response buffer address */
  825         u_int16_t       snscb_sblen;    /* subcommand buffer length (words) */
  826         u_int16_t       snscb_res1;
  827         u_int16_t       snscb_data[1];  /* variable data */
  828 } sns_screq_t;  /* Subcommand Request Structure */
  829 
  830 typedef struct {
  831         u_int16_t       snscb_rblen;    /* response buffer length (words) */
  832         u_int16_t       snscb_res0;
  833         u_int16_t       snscb_addr[4];  /* response buffer address */
  834         u_int16_t       snscb_sblen;    /* subcommand buffer length (words) */
  835         u_int16_t       snscb_res1;
  836         u_int16_t       snscb_cmd;
  837         u_int16_t       snscb_res2;
  838         u_int32_t       snscb_res3;
  839         u_int32_t       snscb_port;
  840 } sns_ga_nxt_req_t;
  841 #define SNS_GA_NXT_REQ_SIZE     (sizeof (sns_ga_nxt_req_t))
  842 
  843 typedef struct {
  844         u_int16_t       snscb_rblen;    /* response buffer length (words) */
  845         u_int16_t       snscb_res0;
  846         u_int16_t       snscb_addr[4];  /* response buffer address */
  847         u_int16_t       snscb_sblen;    /* subcommand buffer length (words) */
  848         u_int16_t       snscb_res1;
  849         u_int16_t       snscb_cmd;
  850         u_int16_t       snscb_res2;
  851         u_int32_t       snscb_res3;
  852         u_int32_t       snscb_portid;
  853 } sns_gxn_id_req_t;
  854 #define SNS_GXN_ID_REQ_SIZE     (sizeof (sns_gxn_id_req_t))
  855 
  856 typedef struct {
  857         u_int16_t       snscb_rblen;    /* response buffer length (words) */
  858         u_int16_t       snscb_res0;
  859         u_int16_t       snscb_addr[4];  /* response buffer address */
  860         u_int16_t       snscb_sblen;    /* subcommand buffer length (words) */
  861         u_int16_t       snscb_res1;
  862         u_int16_t       snscb_cmd;
  863         u_int16_t       snscb_mword_div_2;
  864         u_int32_t       snscb_res3;
  865         u_int32_t       snscb_fc4_type;
  866 } sns_gid_ft_req_t;
  867 #define SNS_GID_FT_REQ_SIZE     (sizeof (sns_gid_ft_req_t))
  868 
  869 typedef struct {
  870         u_int16_t       snscb_rblen;    /* response buffer length (words) */
  871         u_int16_t       snscb_res0;
  872         u_int16_t       snscb_addr[4];  /* response buffer address */
  873         u_int16_t       snscb_sblen;    /* subcommand buffer length (words) */
  874         u_int16_t       snscb_res1;
  875         u_int16_t       snscb_cmd;
  876         u_int16_t       snscb_res2;
  877         u_int32_t       snscb_res3;
  878         u_int32_t       snscb_port;
  879         u_int32_t       snscb_fc4_types[8];
  880 } sns_rft_id_req_t;
  881 #define SNS_RFT_ID_REQ_SIZE     (sizeof (sns_rft_id_req_t))
  882 
  883 typedef struct {
  884         ct_hdr_t        snscb_cthdr;
  885         u_int8_t        snscb_port_type;
  886         u_int8_t        snscb_port_id[3];
  887         u_int8_t        snscb_portname[8];
  888         u_int16_t       snscb_data[1];  /* variable data */
  889 } sns_scrsp_t;  /* Subcommand Response Structure */
  890 
  891 typedef struct {
  892         ct_hdr_t        snscb_cthdr;
  893         u_int8_t        snscb_port_type;
  894         u_int8_t        snscb_port_id[3];
  895         u_int8_t        snscb_portname[8];
  896         u_int8_t        snscb_pnlen;            /* symbolic port name length */
  897         u_int8_t        snscb_pname[255];       /* symbolic port name */
  898         u_int8_t        snscb_nodename[8];
  899         u_int8_t        snscb_nnlen;            /* symbolic node name length */
  900         u_int8_t        snscb_nname[255];       /* symbolic node name */
  901         u_int8_t        snscb_ipassoc[8];
  902         u_int8_t        snscb_ipaddr[16];
  903         u_int8_t        snscb_svc_class[4];
  904         u_int8_t        snscb_fc4_types[32];
  905         u_int8_t        snscb_fpname[8];
  906         u_int8_t        snscb_reserved;
  907         u_int8_t        snscb_hardaddr[3];
  908 } sns_ga_nxt_rsp_t;     /* Subcommand Response Structure */
  909 #define SNS_GA_NXT_RESP_SIZE    (sizeof (sns_ga_nxt_rsp_t))
  910 
  911 typedef struct {
  912         ct_hdr_t        snscb_cthdr;
  913         u_int8_t        snscb_wwn[8];
  914 } sns_gxn_id_rsp_t;
  915 #define SNS_GXN_ID_RESP_SIZE    (sizeof (sns_gxn_id_rsp_t))
  916 
  917 typedef struct {
  918         ct_hdr_t        snscb_cthdr;
  919         u_int32_t       snscb_fc4_features[32];
  920 } sns_gff_id_rsp_t;
  921 #define SNS_GFF_ID_RESP_SIZE    (sizeof (sns_gff_id_rsp_t))
  922 
  923 typedef struct {
  924         ct_hdr_t        snscb_cthdr;
  925         struct {
  926                 u_int8_t        control;
  927                 u_int8_t        portid[3];
  928         } snscb_ports[1];
  929 } sns_gid_ft_rsp_t;
  930 #define SNS_GID_FT_RESP_SIZE(x) ((sizeof (sns_gid_ft_rsp_t)) + ((x - 1) << 2))
  931 
  932 #define SNS_RFT_ID_RESP_SIZE    (sizeof (ct_hdr_t))
  933 
  934 #endif  /* _ISPMBOX_H */

/* [<][>][^][v][top][bottom][index][help] */