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

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

1.1       nbrk        1: /*     $OpenBSD: mpireg.h,v 1.31 2006/09/21 08:35:39 dlg Exp $ */
                      2:
                      3: /*
                      4:  * Copyright (c) 2005 David Gwynne <dlg@openbsd.org>
                      5:  * Copyright (c) 2005 Marco Peereboom <marco@openbsd.org>
                      6:  *
                      7:  * Permission to use, copy, modify, and distribute this software for any
                      8:  * purpose with or without fee is hereby granted, provided that the above
                      9:  * copyright notice and this permission notice appear in all copies.
                     10:  *
                     11:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                     12:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                     13:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                     14:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     15:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
                     16:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
                     17:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     18:  */
                     19:
                     20: /*
                     21:  * System Interface Register Set
                     22:  */
                     23:
                     24: #define MPI_DOORBELL           0x00
                     25: /* doorbell read bits */
                     26: #define  MPI_DOORBELL_STATE            (0xf<<28) /* ioc state */
                     27: #define  MPI_DOORBELL_STATE_RESET      (0x0<<28)
                     28: #define  MPI_DOORBELL_STATE_READY      (0x1<<28)
                     29: #define  MPI_DOORBELL_STATE_OPER       (0x2<<28)
                     30: #define  MPI_DOORBELL_STATE_FAULT      (0x4<<28)
                     31: #define  MPI_DOORBELL_INUSE            (0x1<<27) /* doorbell used */
                     32: #define  MPI_DOORBELL_WHOINIT          (0x7<<24) /* last to reset ioc */
                     33: #define  MPI_DOORBELL_WHOINIT_NOONE    (0x0<<24) /* not initialized */
                     34: #define  MPI_DOORBELL_WHOINIT_SYSBIOS  (0x1<<24) /* system bios */
                     35: #define  MPI_DOORBELL_WHOINIT_ROMBIOS  (0x2<<24) /* rom bios */
                     36: #define  MPI_DOORBELL_WHOINIT_PCIPEER  (0x3<<24) /* pci peer */
                     37: #define  MPI_DOORBELL_WHOINIT_DRIVER   (0x4<<24) /* host driver */
                     38: #define  MPI_DOORBELL_WHOINIT_MANUFACT (0x5<<24) /* manufacturing */
                     39: #define  MPI_DOORBELL_FAULT            (0xffff<<0) /* fault code */
                     40: #define  MPI_DOORBELL_FAULT_REQ_PCIPAR 0x8111 /* req msg pci parity err */
                     41: #define  MPI_DOORBELL_FAULT_REQ_PCIBUS 0x8112 /* req msg pci bus err */
                     42: #define  MPI_DOORBELL_FAULT_REP_PCIPAR 0x8113 /* reply msg pci parity err */
                     43: #define  MPI_DOORBELL_FAULT_REP_PCIBUS 0x8114 /* reply msg pci bus err */
                     44: #define  MPI_DOORBELL_FAULT_SND_PCIPAR 0x8115 /* data send pci parity err */
                     45: #define  MPI_DOORBELL_FAULT_SND_PCIBUS 0x8116 /* data send pci bus err */
                     46: #define  MPI_DOORBELL_FAULT_RCV_PCIPAR 0x8117 /* data recv pci parity err */
                     47: #define  MPI_DOORBELL_FAULT_RCV_PCIBUS 0x8118 /* data recv pci bus err */
                     48: /* doorbell write bits */
                     49: #define  MPI_DOORBELL_FUNCTION_SHIFT   24
                     50: #define  MPI_DOORBELL_FUNCTION_MASK    (0xff << MPI_DOORBELL_FUNCTION_SHIFT)
                     51: #define  MPI_DOORBELL_FUNCTION(x)      \
                     52:     (((x) << MPI_DOORBELL_FUNCTION_SHIFT) & MPI_DOORBELL_FUNCTION_MASK)
                     53: #define  MPI_DOORBELL_DWORDS_SHIFT     16
                     54: #define  MPI_DOORBELL_DWORDS_MASK      (0xff << MPI_DOORBELL_DWORDS_SHIFT)
                     55: #define  MPI_DOORBELL_DWORDS(x)                \
                     56:     (((x) << MPI_DOORBELL_DWORDS_SHIFT) & MPI_DOORBELL_DWORDS_MASK)
                     57: #define  MPI_DOORBELL_DATA_MASK                0xffff
                     58:
                     59: #define MPI_WRITESEQ           0x04
                     60: #define  MPI_WRITESEQ_VALUE            0x0000000f /* key value */
                     61: #define  MPI_WRITESEQ_1                        0x04
                     62: #define  MPI_WRITESEQ_2                        0x0b
                     63: #define  MPI_WRITESEQ_3                        0x02
                     64: #define  MPI_WRITESEQ_4                        0x07
                     65: #define  MPI_WRITESEQ_5                        0x0d
                     66:
                     67: #define MPI_HOSTDIAG           0x08
                     68: #define  MPI_HOSTDIAG_CLEARFBS         (1<<10) /* clear flash bad sig */
                     69: #define  MPI_HOSTDIAG_POICB            (1<<9) /* prevent ioc boot */
                     70: #define  MPI_HOSTDIAG_DWRE             (1<<7) /* diag reg write enabled */
                     71: #define  MPI_HOSTDIAG_FBS              (1<<6) /* flash bad sig */
                     72: #define  MPI_HOSTDIAG_RESET_HIST       (1<<5) /* reset history */
                     73: #define  MPI_HOSTDIAG_DIAGWR_EN                (1<<4) /* diagnostic write enabled */
                     74: #define  MPI_HOSTDIAG_RESET_ADAPTER    (1<<2) /* reset adapter */
                     75: #define  MPI_HOSTDIAG_DISABLE_ARM      (1<<1) /* disable arm */
                     76: #define  MPI_HOSTDIAG_DIAGMEM_EN       (1<<0) /* diag mem enable */
                     77:
                     78: #define MPI_TESTBASE           0x0c
                     79:
                     80: #define MPI_DIAGRWDATA         0x10
                     81:
                     82: #define MPI_DIAGRWADDR         0x18
                     83:
                     84: #define MPI_INTR_STATUS                0x30
                     85: #define  MPI_INTR_STATUS_IOCDOORBELL   (1<<31) /* ioc doorbell status */
                     86: #define  MPI_INTR_STATUS_REPLY         (1<<3) /* reply message interrupt */
                     87: #define  MPI_INTR_STATUS_DOORBELL      (1<<0) /* doorbell interrupt */
                     88:
                     89: #define MPI_INTR_MASK          0x34
                     90: #define  MPI_INTR_MASK_REPLY           (1<<3) /* reply message intr mask */
                     91: #define  MPI_INTR_MASK_DOORBELL                (1<<0) /* doorbell interrupt mask */
                     92:
                     93: #define MPI_REQ_QUEUE          0x40
                     94:
                     95: #define MPI_REPLY_QUEUE                0x44
                     96: #define  MPI_REPLY_QUEUE_ADDRESS       (1<<31) /* address reply */
                     97: #define  MPI_REPLY_QUEUE_ADDRESS_MASK  0x7fffffff
                     98: #define  MPI_REPLY_QUEUE_TYPE_MASK     (3<<29)
                     99: #define  MPI_REPLY_QUEUE_TYPE_INIT     (0<<29) /* scsi initiator reply */
                    100: #define  MPI_REPLY_QUEUE_TYPE_TARGET   (1<<29) /* scsi target reply */
                    101: #define  MPI_REPLY_QUEUE_TYPE_LAN      (2<<29) /* lan reply */
                    102: #define  MPI_REPLY_QUEUE_CONTEXT       0x1fffffff /* not address and type */
                    103:
                    104: #define MPI_PRIREQ_QUEUE       0x48
                    105:
                    106: /*
                    107:  * Scatter Gather Lists
                    108:  */
                    109:
                    110: #define MPI_SGE_FL_LAST                        (0x1<<31) /* last element in segment */
                    111: #define MPI_SGE_FL_EOB                 (0x1<<30) /* last element of buffer */
                    112: #define MPI_SGE_FL_TYPE                        (0x3<<28) /* element type */
                    113: #define  MPI_SGE_FL_TYPE_SIMPLE                (0x1<<28) /* simple element */
                    114: #define  MPI_SGE_FL_TYPE_CHAIN         (0x3<<28) /* chain element */
                    115: #define  MPI_SGE_FL_TYPE_XACTCTX       (0x0<<28) /* transaction context */
                    116: #define MPI_SGE_FL_LOCAL               (0x1<<27) /* local address */
                    117: #define MPI_SGE_FL_DIR                 (0x1<<26) /* direction */
                    118: #define  MPI_SGE_FL_DIR_OUT            (0x1<<26)
                    119: #define  MPI_SGE_FL_DIR_IN             (0x0<<26)
                    120: #define MPI_SGE_FL_SIZE                        (0x1<<25) /* address size */
                    121: #define  MPI_SGE_FL_SIZE_32            (0x0<<25)
                    122: #define  MPI_SGE_FL_SIZE_64            (0x1<<25)
                    123: #define MPI_SGE_FL_EOL                 (0x1<<24) /* end of list */
                    124: #define MPI_SGE_FLAGS_IOC_TO_HOST      (0x00)
                    125: #define MPI_SGE_FLAGS_HOST_TO_IOC      (0x04)
                    126:
                    127: struct mpi_sge {
                    128:        u_int32_t               sg_hdr;
                    129:        u_int32_t               sg_lo_addr;
                    130:        u_int32_t               sg_hi_addr;
                    131: } __packed;
                    132:
                    133: struct mpi_fw_tce {
                    134:        u_int8_t                reserved1;
                    135:        u_int8_t                context_size;
                    136:        u_int8_t                details_length;
                    137:        u_int8_t                flags;
                    138:
                    139:        u_int32_t               reserved2;
                    140:
                    141:        u_int32_t               image_offset;
                    142:
                    143:        u_int32_t               image_size;
                    144: } __packed;
                    145:
                    146: /*
                    147:  * Messages
                    148:  */
                    149:
                    150: /* functions */
                    151: #define MPI_FUNCTION_SCSI_IO_REQUEST                   (0x00)
                    152: #define MPI_FUNCTION_SCSI_TASK_MGMT                    (0x01)
                    153: #define MPI_FUNCTION_IOC_INIT                          (0x02)
                    154: #define MPI_FUNCTION_IOC_FACTS                         (0x03)
                    155: #define MPI_FUNCTION_CONFIG                            (0x04)
                    156: #define MPI_FUNCTION_PORT_FACTS                                (0x05)
                    157: #define MPI_FUNCTION_PORT_ENABLE                       (0x06)
                    158: #define MPI_FUNCTION_EVENT_NOTIFICATION                        (0x07)
                    159: #define MPI_FUNCTION_EVENT_ACK                         (0x08)
                    160: #define MPI_FUNCTION_FW_DOWNLOAD                       (0x09)
                    161: #define MPI_FUNCTION_TARGET_CMD_BUFFER_POST            (0x0A)
                    162: #define MPI_FUNCTION_TARGET_ASSIST                     (0x0B)
                    163: #define MPI_FUNCTION_TARGET_STATUS_SEND                        (0x0C)
                    164: #define MPI_FUNCTION_TARGET_MODE_ABORT                 (0x0D)
                    165: #define MPI_FUNCTION_TARGET_FC_BUF_POST_LINK_SRVC      (0x0E) /* obsolete */
                    166: #define MPI_FUNCTION_TARGET_FC_RSP_LINK_SRVC           (0x0F) /* obsolete */
                    167: #define MPI_FUNCTION_TARGET_FC_EX_SEND_LINK_SRVC       (0x10) /* obsolete */
                    168: #define MPI_FUNCTION_TARGET_FC_ABORT                   (0x11) /* obsolete */
                    169: #define MPI_FUNCTION_FC_LINK_SRVC_BUF_POST             (0x0E)
                    170: #define MPI_FUNCTION_FC_LINK_SRVC_RSP                  (0x0F)
                    171: #define MPI_FUNCTION_FC_EX_LINK_SRVC_SEND              (0x10)
                    172: #define MPI_FUNCTION_FC_ABORT                          (0x11)
                    173: #define MPI_FUNCTION_FW_UPLOAD                         (0x12)
                    174: #define MPI_FUNCTION_FC_COMMON_TRANSPORT_SEND          (0x13)
                    175: #define MPI_FUNCTION_FC_PRIMITIVE_SEND                 (0x14)
                    176:
                    177: #define MPI_FUNCTION_RAID_ACTION                       (0x15)
                    178: #define MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH          (0x16)
                    179:
                    180: #define MPI_FUNCTION_TOOLBOX                           (0x17)
                    181:
                    182: #define MPI_FUNCTION_SCSI_ENCLOSURE_PROCESSOR          (0x18)
                    183:
                    184: #define MPI_FUNCTION_MAILBOX                           (0x19)
                    185:
                    186: #define MPI_FUNCTION_LAN_SEND                          (0x20)
                    187: #define MPI_FUNCTION_LAN_RECEIVE                       (0x21)
                    188: #define MPI_FUNCTION_LAN_RESET                         (0x22)
                    189:
                    190: #define MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET            (0x40)
                    191: #define MPI_FUNCTION_IO_UNIT_RESET                     (0x41)
                    192: #define MPI_FUNCTION_HANDSHAKE                         (0x42)
                    193: #define MPI_FUNCTION_REPLY_FRAME_REMOVAL               (0x43)
                    194:
                    195: /* reply flags */
                    196: #define MPI_REP_FLAGS_CONT             (1<<7) /* continuation reply */
                    197:
                    198: #define MPI_REP_IOCSTATUS_AVAIL                (1<<15) /* logging info available */
                    199: #define MPI_REP_IOCSTATUS              (0x7fff) /* status */
                    200:
                    201: /* Common IOCStatus values for all replies */
                    202: #define  MPI_IOCSTATUS_SUCCESS                         (0x0000)
                    203: #define  MPI_IOCSTATUS_INVALID_FUNCTION                        (0x0001)
                    204: #define  MPI_IOCSTATUS_BUSY                            (0x0002)
                    205: #define  MPI_IOCSTATUS_INVALID_SGL                     (0x0003)
                    206: #define  MPI_IOCSTATUS_INTERNAL_ERROR                  (0x0004)
                    207: #define  MPI_IOCSTATUS_RESERVED                                (0x0005)
                    208: #define  MPI_IOCSTATUS_INSUFFICIENT_RESOURCES          (0x0006)
                    209: #define  MPI_IOCSTATUS_INVALID_FIELD                   (0x0007)
                    210: #define  MPI_IOCSTATUS_INVALID_STATE                   (0x0008)
                    211: #define  MPI_IOCSTATUS_OP_STATE_NOT_SUPPORTED          (0x0009)
                    212: /* Config IOCStatus values */
                    213: #define  MPI_IOCSTATUS_CONFIG_INVALID_ACTION           (0x0020)
                    214: #define  MPI_IOCSTATUS_CONFIG_INVALID_TYPE             (0x0021)
                    215: #define  MPI_IOCSTATUS_CONFIG_INVALID_PAGE             (0x0022)
                    216: #define  MPI_IOCSTATUS_CONFIG_INVALID_DATA             (0x0023)
                    217: #define  MPI_IOCSTATUS_CONFIG_NO_DEFAULTS              (0x0024)
                    218: #define  MPI_IOCSTATUS_CONFIG_CANT_COMMIT              (0x0025)
                    219: /* SCSIIO Reply (SPI & FCP) initiator values */
                    220: #define  MPI_IOCSTATUS_SCSI_RECOVERED_ERROR            (0x0040)
                    221: #define  MPI_IOCSTATUS_SCSI_INVALID_BUS                        (0x0041)
                    222: #define  MPI_IOCSTATUS_SCSI_INVALID_TARGETID           (0x0042)
                    223: #define  MPI_IOCSTATUS_SCSI_DEVICE_NOT_THERE           (0x0043)
                    224: #define  MPI_IOCSTATUS_SCSI_DATA_OVERRUN               (0x0044)
                    225: #define  MPI_IOCSTATUS_SCSI_DATA_UNDERRUN              (0x0045)
                    226: #define  MPI_IOCSTATUS_SCSI_IO_DATA_ERROR              (0x0046)
                    227: #define  MPI_IOCSTATUS_SCSI_PROTOCOL_ERROR             (0x0047)
                    228: #define  MPI_IOCSTATUS_SCSI_TASK_TERMINATED            (0x0048)
                    229: #define  MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH          (0x0049)
                    230: #define  MPI_IOCSTATUS_SCSI_TASK_MGMT_FAILED           (0x004A)
                    231: #define  MPI_IOCSTATUS_SCSI_IOC_TERMINATED             (0x004B)
                    232: #define  MPI_IOCSTATUS_SCSI_EXT_TERMINATED             (0x004C)
                    233: /* For use by SCSI Initiator and SCSI Target end-to-end data protection */
                    234: #define  MPI_IOCSTATUS_EEDP_GUARD_ERROR                        (0x004D)
                    235: #define  MPI_IOCSTATUS_EEDP_REF_TAG_ERROR              (0x004E)
                    236: #define  MPI_IOCSTATUS_EEDP_APP_TAG_ERROR              (0x004F)
                    237: /* SCSI (SPI & FCP) target values */
                    238: #define  MPI_IOCSTATUS_TARGET_PRIORITY_IO              (0x0060)
                    239: #define  MPI_IOCSTATUS_TARGET_INVALID_PORT             (0x0061)
                    240: #define  MPI_IOCSTATUS_TARGET_INVALID_IOCINDEX         (0x0062) /* obsolete */
                    241: #define  MPI_IOCSTATUS_TARGET_INVALID_IO_INDEX         (0x0062)
                    242: #define  MPI_IOCSTATUS_TARGET_ABORTED                  (0x0063)
                    243: #define  MPI_IOCSTATUS_TARGET_NO_CONN_RETRYABLE                (0x0064)
                    244: #define  MPI_IOCSTATUS_TARGET_NO_CONNECTION            (0x0065)
                    245: #define  MPI_IOCSTATUS_TARGET_XFER_COUNT_MISMATCH      (0x006A)
                    246: #define  MPI_IOCSTATUS_TARGET_STS_DATA_NOT_SENT                (0x006B)
                    247: #define  MPI_IOCSTATUS_TARGET_DATA_OFFSET_ERROR                (0x006D)
                    248: #define  MPI_IOCSTATUS_TARGET_TOO_MUCH_WRITE_DATA      (0x006E)
                    249: #define  MPI_IOCSTATUS_TARGET_IU_TOO_SHORT             (0x006F)
                    250: /* Additional FCP target values */
                    251: #define  MPI_IOCSTATUS_TARGET_FC_ABORTED               (0x0066) /* obsolete */
                    252: #define  MPI_IOCSTATUS_TARGET_FC_RX_ID_INVALID         (0x0067) /* obsolete */
                    253: #define  MPI_IOCSTATUS_TARGET_FC_DID_INVALID           (0x0068) /* obsolete */
                    254: #define  MPI_IOCSTATUS_TARGET_FC_NODE_LOGGED_OUT       (0x0069) /* obsolete */
                    255: /* Fibre Channel Direct Access values */
                    256: #define  MPI_IOCSTATUS_FC_ABORTED                      (0x0066)
                    257: #define  MPI_IOCSTATUS_FC_RX_ID_INVALID                        (0x0067)
                    258: #define  MPI_IOCSTATUS_FC_DID_INVALID                  (0x0068)
                    259: #define  MPI_IOCSTATUS_FC_NODE_LOGGED_OUT              (0x0069)
                    260: #define  MPI_IOCSTATUS_FC_EXCHANGE_CANCELED            (0x006C)
                    261: /* LAN values */
                    262: #define  MPI_IOCSTATUS_LAN_DEVICE_NOT_FOUND            (0x0080)
                    263: #define  MPI_IOCSTATUS_LAN_DEVICE_FAILURE              (0x0081)
                    264: #define  MPI_IOCSTATUS_LAN_TRANSMIT_ERROR              (0x0082)
                    265: #define  MPI_IOCSTATUS_LAN_TRANSMIT_ABORTED            (0x0083)
                    266: #define  MPI_IOCSTATUS_LAN_RECEIVE_ERROR               (0x0084)
                    267: #define  MPI_IOCSTATUS_LAN_RECEIVE_ABORTED             (0x0085)
                    268: #define  MPI_IOCSTATUS_LAN_PARTIAL_PACKET              (0x0086)
                    269: #define  MPI_IOCSTATUS_LAN_CANCELED                    (0x0087)
                    270: /* Serial Attached SCSI values */
                    271: #define  MPI_IOCSTATUS_SAS_SMP_REQUEST_FAILED          (0x0090)
                    272: #define  MPI_IOCSTATUS_SAS_SMP_DATA_OVERRUN            (0x0091)
                    273: /* Inband values */
                    274: #define  MPI_IOCSTATUS_INBAND_ABORTED                  (0x0098)
                    275: #define  MPI_IOCSTATUS_INBAND_NO_CONNECTION            (0x0099)
                    276: /* Diagnostic Tools values */
                    277: #define  MPI_IOCSTATUS_DIAGNOSTIC_RELEASED             (0x00A0)
                    278:
                    279: #define MPI_REP_IOCLOGINFO_TYPE                (0xf<<28) /* logging info type */
                    280: #define MPI_REP_IOCLOGINFO_TYPE_NONE   (0x0<<28)
                    281: #define MPI_REP_IOCLOGINFO_TYPE_SCSI   (0x1<<28)
                    282: #define MPI_REP_IOCLOGINFO_TYPE_FC     (0x2<<28)
                    283: #define MPI_REP_IOCLOGINFO_TYPE_SAS    (0x3<<28)
                    284: #define MPI_REP_IOCLOGINFO_TYPE_ISCSI  (0x4<<28)
                    285: #define MPI_REP_IOCLOGINFO_DATA                (0x0fffffff) /* logging info data */
                    286:
                    287: /* event notification types */
                    288: #define MPI_EVENT_NONE                                 0x00
                    289: #define MPI_EVENT_LOG_DATA                             0x01
                    290: #define MPI_EVENT_STATE_CHANGE                         0x02
                    291: #define MPI_EVENT_UNIT_ATTENTION                       0x03
                    292: #define MPI_EVENT_IOC_BUS_RESET                                0x04
                    293: #define MPI_EVENT_EXT_BUS_RESET                                0x05
                    294: #define MPI_EVENT_RESCAN                               0x06
                    295: #define MPI_EVENT_LINK_STATUS_CHANGE                   0x07
                    296: #define MPI_EVENT_LOOP_STATE_CHANGE                    0x08
                    297: #define MPI_EVENT_LOGOUT                               0x09
                    298: #define MPI_EVENT_EVENT_CHANGE                         0x0a
                    299: #define MPI_EVENT_INTEGRATED_RAID                      0x0b
                    300: #define MPI_EVENT_SCSI_DEVICE_STATUS_CHANGE            0x0c
                    301: #define MPI_EVENT_ON_BUS_TIMER_EXPIRED                 0x0d
                    302: #define MPI_EVENT_QUEUE_FULL                           0x0e
                    303: #define MPI_EVENT_SAS_DEVICE_STATUS_CHANGE             0x0f
                    304: #define MPI_EVENT_SAS_SES                              0x10
                    305: #define MPI_EVENT_PERSISTENT_TABLE_FULL                        0x11
                    306: #define MPI_EVENT_SAS_PHY_LINK_STATUS                  0x12
                    307: #define MPI_EVENT_SAS_DISCOVERY_ERROR                  0x13
                    308: #define MPI_EVENT_IR_RESYNC_UPDATE                     0x14
                    309: #define MPI_EVENT_IR2                                  0x15
                    310: #define MPI_EVENT_SAS_DISCOVERY                                0x16
                    311: #define MPI_EVENT_LOG_ENTRY_ADDED                      0x21
                    312:
                    313: /* messages */
                    314:
                    315: #define MPI_WHOINIT_NOONE              0x00
                    316: #define MPI_WHOINIT_SYSTEM_BIOS                0x01
                    317: #define MPI_WHOINIT_ROM_BIOS           0x02
                    318: #define MPI_WHOINIT_PCI_PEER           0x03
                    319: #define MPI_WHOINIT_HOST_DRIVER                0x04
                    320: #define MPI_WHOINIT_MANUFACTURER       0x05
                    321:
                    322: /* page address fields */
                    323: #define MPI_PAGE_ADDRESS_FC_BTID       (1<<24) /* Bus Target ID */
                    324:
                    325: /* default messages */
                    326:
                    327: struct mpi_msg_request {
                    328:        u_int8_t                reserved1;
                    329:        u_int8_t                reserved2;
                    330:        u_int8_t                chain_offset;
                    331:        u_int8_t                function;
                    332:
                    333:        u_int8_t                reserved3;
                    334:        u_int8_t                reserved4;
                    335:        u_int8_t                reserved5;
                    336:        u_int8_t                msg_flags;
                    337:
                    338:        u_int32_t               msg_context;
                    339: } __packed;
                    340:
                    341: struct mpi_msg_reply {
                    342:        u_int8_t                reserved1;
                    343:        u_int8_t                reserved2;
                    344:        u_int8_t                msg_length;
                    345:        u_int8_t                function;
                    346:
                    347:        u_int8_t                reserved3;
                    348:        u_int8_t                reserved4;
                    349:        u_int8_t                reserved5;
                    350:        u_int8_t                msg_flags;
                    351:
                    352:        u_int32_t               msg_context;
                    353:
                    354:        u_int8_t                reserved6;
                    355:        u_int8_t                reserved7;
                    356:        u_int16_t               ioc_status;
                    357:
                    358:        u_int32_t               ioc_loginfo;
                    359: } __packed;
                    360:
                    361: /* ioc init */
                    362:
                    363: struct mpi_msg_iocinit_request {
                    364:        u_int8_t                whoinit;
                    365:        u_int8_t                reserved1;
                    366:        u_int8_t                chain_offset;
                    367:        u_int8_t                function;
                    368:
                    369:        u_int8_t                flags;
                    370: #define MPI_IOCINIT_F_DISCARD_FW                       (1<<0)
                    371: #define MPI_IOCINIT_F_ENABLE_HOST_FIFO                 (1<<1)
                    372: #define MPI_IOCINIT_F_HOST_PG_BUF_PERSIST              (1<<2)
                    373:        u_int8_t                max_devices;
                    374:        u_int8_t                max_buses;
                    375:        u_int8_t                msg_flags;
                    376:
                    377:        u_int32_t               msg_context;
                    378:
                    379:        u_int16_t               reply_frame_size;
                    380:        u_int16_t               reserved2;
                    381:
                    382:        u_int32_t               host_mfa_hi_addr;
                    383:
                    384:        u_int32_t               sense_buffer_hi_addr;
                    385:
                    386:        u_int32_t               reply_fifo_host_signalling_addr;
                    387:
                    388:        struct mpi_sge          host_page_buffer_sge;
                    389:
                    390:        u_int8_t                msg_version_min;
                    391:        u_int8_t                msg_version_maj;
                    392:
                    393:        u_int8_t                hdr_version_unit;
                    394:        u_int8_t                hdr_version_dev;
                    395: } __packed;
                    396:
                    397: struct mpi_msg_iocinit_reply {
                    398:        u_int8_t                whoinit;
                    399:        u_int8_t                reserved1;
                    400:        u_int8_t                msg_length;
                    401:        u_int8_t                function;
                    402:
                    403:        u_int8_t                flags;
                    404:        u_int8_t                max_devices;
                    405:        u_int8_t                max_buses;
                    406:        u_int8_t                msg_flags;
                    407:
                    408:        u_int32_t               msg_context;
                    409:
                    410:        u_int16_t               reserved2;
                    411:        u_int16_t               ioc_status;
                    412:
                    413:        u_int32_t               ioc_loginfo;
                    414: } __packed;
                    415:
                    416:
                    417: /* ioc facts */
                    418: struct mpi_msg_iocfacts_request {
                    419:        u_int8_t                reserved1;
                    420:        u_int8_t                reserved2;
                    421:        u_int8_t                chain_offset;
                    422:        u_int8_t                function;
                    423:
                    424:        u_int8_t                reserved3;
                    425:        u_int8_t                reserved4;
                    426:        u_int8_t                reserved5;
                    427:        u_int8_t                msg_flags;
                    428:
                    429:        u_int32_t               msg_context;
                    430: } __packed;
                    431:
                    432: struct mpi_msg_iocfacts_reply {
                    433:        u_int8_t                msg_version_min;
                    434:        u_int8_t                msg_version_maj;
                    435:        u_int8_t                msg_length;
                    436:        u_int8_t                function;
                    437:
                    438:        u_int8_t                header_version_min;
                    439:        u_int8_t                header_version_maj;
                    440:        u_int8_t                ioc_number;
                    441:        u_int8_t                msg_flags;
                    442:
                    443:        u_int32_t               msg_context;
                    444:
                    445:        u_int16_t               ioc_exceptions;
                    446: #define MPI_IOCFACTS_EXCEPT_CONFIG_CHECKSUM_FAIL       (1<<0)
                    447: #define MPI_IOCFACTS_EXCEPT_RAID_CONFIG_INVALID                (1<<1)
                    448: #define MPI_IOCFACTS_EXCEPT_FW_CHECKSUM_FAIL           (1<<2)
                    449: #define MPI_IOCFACTS_EXCEPT_PERSISTENT_TABLE_FULL      (1<<3)
                    450:        u_int16_t               ioc_status;
                    451:
                    452:        u_int32_t               ioc_loginfo;
                    453:
                    454:        u_int8_t                max_chain_depth;
                    455:        u_int8_t                whoinit;
                    456:        u_int8_t                block_size;
                    457:        u_int8_t                flags;
                    458: #define MPI_IOCFACTS_FLAGS_FW_DOWNLOAD_BOOT            (1<<0)
                    459: #define MPI_IOCFACTS_FLAGS_REPLY_FIFO_HOST_SIGNAL      (1<<1)
                    460: #define MPI_IOCFACTS_FLAGS_HOST_PAGE_BUFFER_PERSISTENT (1<<2)
                    461:
                    462:        u_int16_t               reply_queue_depth;
                    463:        u_int16_t               request_frame_size;
                    464:
                    465:        u_int16_t               reserved1;
                    466:        u_int16_t               product_id;     /* product id */
                    467:
                    468:        u_int32_t               current_host_mfa_hi_addr;
                    469:
                    470:        u_int16_t               global_credits;
                    471:        u_int8_t                number_of_ports;
                    472:        u_int8_t                event_state;
                    473:
                    474:        u_int32_t               current_sense_buffer_hi_addr;
                    475:
                    476:        u_int16_t               current_reply_frame_size;
                    477:        u_int8_t                max_devices;
                    478:        u_int8_t                max_buses;
                    479:
                    480:        u_int32_t               fw_image_size;
                    481:
                    482:        u_int32_t               ioc_capabilities;
                    483: #define MPI_IOCFACTS_CAPABILITY_HIGH_PRI_Q             (1<<0)
                    484: #define MPI_IOCFACTS_CAPABILITY_REPLY_HOST_SIGNAL      (1<<1)
                    485: #define MPI_IOCFACTS_CAPABILITY_QUEUE_FULL_HANDLING    (1<<2)
                    486: #define MPI_IOCFACTS_CAPABILITY_DIAG_TRACE_BUFFER      (1<<3)
                    487: #define MPI_IOCFACTS_CAPABILITY_SNAPSHOT_BUFFER                (1<<4)
                    488: #define MPI_IOCFACTS_CAPABILITY_EXTENDED_BUFFER                (1<<5)
                    489: #define MPI_IOCFACTS_CAPABILITY_EEDP                   (1<<6)
                    490: #define MPI_IOCFACTS_CAPABILITY_BIDIRECTIONAL          (1<<7)
                    491: #define MPI_IOCFACTS_CAPABILITY_MULTICAST              (1<<8)
                    492: #define MPI_IOCFACTS_CAPABILITY_SCSIIO32               (1<<9)
                    493: #define MPI_IOCFACTS_CAPABILITY_NO_SCSIIO16            (1<<10)
                    494:
                    495:        u_int8_t                fw_version_dev;
                    496:        u_int8_t                fw_version_unit;
                    497:        u_int8_t                fw_version_min;
                    498:        u_int8_t                fw_version_maj;
                    499:
                    500:        u_int16_t               hi_priority_queue_depth;
                    501:        u_int16_t               reserved2;
                    502:
                    503:        struct mpi_sge          host_page_buffer_sge;
                    504:
                    505:        u_int32_t               reply_fifo_host_signalling_addr;
                    506: } __packed;
                    507:
                    508: struct mpi_msg_portfacts_request {
                    509:        u_int8_t                reserved1;
                    510:        u_int8_t                reserved2;
                    511:        u_int8_t                chain_offset;
                    512:        u_int8_t                function;
                    513:
                    514:        u_int8_t                reserved3;
                    515:        u_int8_t                reserved4;
                    516:        u_int8_t                port_number;
                    517:        u_int8_t                msg_flags;
                    518:
                    519:        u_int32_t               msg_context;
                    520:
                    521: } __packed;
                    522:
                    523: struct mpi_msg_portfacts_reply {
                    524:        u_int16_t               reserved1;
                    525:        u_int8_t                msg_length;
                    526:        u_int8_t                function;
                    527:
                    528:        u_int16_t               reserved2;
                    529:        u_int8_t                port_number;
                    530:        u_int8_t                msg_flags;
                    531:
                    532:        u_int32_t               msg_context;
                    533:
                    534:        u_int16_t               reserved3;
                    535:        u_int16_t               ioc_status;
                    536:
                    537:        u_int32_t               ioc_loginfo;
                    538:
                    539:        u_int8_t                reserved4;
                    540:        u_int8_t                port_type;
                    541: #define MPI_PORTFACTS_PORTTYPE_INACTIVE                        0x00
                    542: #define MPI_PORTFACTS_PORTTYPE_SCSI                    0x01
                    543: #define MPI_PORTFACTS_PORTTYPE_FC                      0x10
                    544: #define MPI_PORTFACTS_PORTTYPE_ISCSI                   0x20
                    545: #define MPI_PORTFACTS_PORTTYPE_SAS                     0x30
                    546:
                    547:        u_int16_t               max_devices;
                    548:
                    549:        u_int16_t               port_scsi_id;
                    550:        u_int16_t               protocol_flags;
                    551: #define MPI_PORTFACTS_PROTOCOL_LOGBUSADDR              (1<<0)
                    552: #define MPI_PORTFACTS_PROTOCOL_LAN                     (1<<1)
                    553: #define MPI_PORTFACTS_PROTOCOL_TARGET                  (1<<2)
                    554: #define MPI_PORTFACTS_PROTOCOL_INITIATOR               (1<<3)
                    555:
                    556:        u_int16_t               max_posted_cmd_buffers;
                    557:        u_int16_t               max_persistent_ids;
                    558:
                    559:        u_int16_t               max_lan_buckets;
                    560:        u_int16_t               reserved5;
                    561:
                    562:        u_int32_t               reserved6;
                    563: } __packed;
                    564:
                    565: struct mpi_msg_portenable_request {
                    566:        u_int16_t               reserved1;
                    567:        u_int8_t                chain_offset;
                    568:        u_int8_t                function;
                    569:
                    570:        u_int16_t               reserved2;
                    571:        u_int8_t                port_number;
                    572:        u_int8_t                msg_flags;
                    573:
                    574:        u_int32_t               msg_context;
                    575: } __packed;
                    576:
                    577: struct mpi_msg_portenable_reply {
                    578:        u_int16_t               reserved1;
                    579:        u_int8_t                msg_length;
                    580:        u_int8_t                function;
                    581:
                    582:        u_int16_t               reserved2;
                    583:        u_int8_t                port_number;
                    584:        u_int8_t                msg_flags;
                    585:
                    586:        u_int32_t               msg_context;
                    587:
                    588:        u_int16_t               reserved3;
                    589:        u_int16_t               ioc_status;
                    590:
                    591:        u_int32_t               ioc_loginfo;
                    592: } __packed;
                    593:
                    594: struct mpi_msg_event_request {
                    595:        u_int8_t                event_switch;
                    596: #define MPI_EVENT_SWITCH_ON                            (0x01)
                    597: #define MPI_EVENT_SWITCH_OFF                           (0x00)
                    598:        u_int8_t                reserved1;
                    599:        u_int8_t                chain_offset;
                    600:        u_int8_t                function;
                    601:
                    602:        u_int8_t                reserved2[3];
                    603:        u_int8_t                msg_flags;
                    604:
                    605:        u_int32_t               msg_context;
                    606: } __packed;
                    607:
                    608: struct mpi_msg_event_reply {
                    609:        u_int16_t               data_length;
                    610:        u_int8_t                msg_length;
                    611:        u_int8_t                function;
                    612:
                    613:        u_int16_t               reserved1;
                    614:        u_int8_t                ack_required;
                    615: #define MPI_EVENT_ACK_REQUIRED                         (0x01)
                    616:        u_int8_t                msg_flags;
                    617: #define MPI_EVENT_FLAGS_REPLY_KEPT                     (1<<7)
                    618:
                    619:        u_int32_t               msg_context;
                    620:
                    621:        u_int16_t               reserved2;
                    622:        u_int16_t               ioc_status;
                    623:
                    624:        u_int32_t               ioc_loginfo;
                    625:
                    626:        u_int32_t               event;
                    627:
                    628:        u_int32_t               event_context;
                    629:
                    630:        /* event data follows */
                    631: } __packed;
                    632:
                    633: struct mpi_evt_change {
                    634:        u_int8_t                event_state;
                    635:        u_int8_t                reserved[3];
                    636: } __packed;
                    637:
                    638: struct mpi_evt_sas_phy {
                    639:        u_int8_t                phy_num;
                    640:        u_int8_t                link_rates;
                    641: #define MPI_EVT_SASPHY_LINK_CUR(x)                     (((x) & 0xf0) >> 4)
                    642: #define MPI_EVT_SASPHY_LINK_PREV(x)                    ((x) & 0x0f)
                    643: #define MPI_EVT_SASPHY_LINK_ENABLED                    0x0
                    644: #define MPI_EVT_SASPHY_LINK_DISABLED                   0x1
                    645: #define MPI_EVT_SASPHY_LINK_NEGFAIL                    0x2
                    646: #define MPI_EVT_SASPHY_LINK_SATAOOB                    0x3
                    647: #define MPI_EVT_SASPHY_LINK_1_5GBPS                    0x8
                    648: #define MPI_EVT_SASPHY_LINK_3_0GBPS                    0x9
                    649:        u_int16_t               dev_handle;
                    650:
                    651:        u_int64_t               sas_addr;
                    652: } __packed;
                    653:
                    654: struct mpi_evt_sas_change {
                    655:        u_int8_t                target;
                    656:        u_int8_t                bus;
                    657:        u_int8_t                reason;
                    658: #define MPI_EVT_SASCH_REASON_ADDED                     0x03
                    659: #define MPI_EVT_SASCH_REASON_NOT_RESPONDING            0x04
                    660: #define MPI_EVT_SASCH_REASON_SMART_DATA                        0x05
                    661: #define MPI_EVT_SASCH_REASON_NO_PERSIST_ADDED          0x06
                    662: #define MPI_EVT_SASCH_REASON_UNSUPPORTED               0x07
                    663: #define MPI_EVT_SASCH_REASON_INTERNAL_RESET            0x08
                    664:        u_int8_t                reserved1;
                    665:
                    666:        u_int8_t                asc;
                    667:        u_int8_t                ascq;
                    668:        u_int16_t               dev_handle;
                    669:
                    670:        u_int32_t               device_info;
                    671: #define MPI_EVT_SASCH_INFO_ATAPI                       (1<<13)
                    672: #define MPI_EVT_SASCH_INFO_LSI                         (1<<12)
                    673: #define MPI_EVT_SASCH_INFO_DIRECT_ATTACHED             (1<<11)
                    674: #define MPI_EVT_SASCH_INFO_SSP                         (1<<10)
                    675: #define MPI_EVT_SASCH_INFO_STP                         (1<<9)
                    676: #define MPI_EVT_SASCH_INFO_SMP                         (1<<8)
                    677: #define MPI_EVT_SASCH_INFO_SATA                                (1<<7)
                    678: #define MPI_EVT_SASCH_INFO_SSP_INITIATOR               (1<<6)
                    679: #define MPI_EVT_SASCH_INFO_STP_INITIATOR               (1<<5)
                    680: #define MPI_EVT_SASCH_INFO_SMP_INITIATOR               (1<<4)
                    681: #define MPI_EVT_SASCH_INFO_SATA_HOST                   (1<<3)
                    682: #define MPI_EVT_SASCH_INFO_TYPE_MASK                   0x7
                    683: #define MPI_EVT_SASCH_INFO_TYPE_NONE                   0x0
                    684: #define MPI_EVT_SASCH_INFO_TYPE_END                    0x1
                    685: #define MPI_EVT_SASCH_INFO_TYPE_EDGE                   0x2
                    686: #define MPI_EVT_SASCH_INFO_TYPE_FANOUT                 0x3
                    687:
                    688:        u_int16_t               parent_dev_handle;
                    689:        u_int8_t                phy_num;
                    690:        u_int8_t                reserved2;
                    691:
                    692:        u_int64_t               sas_addr;
                    693: } __packed;
                    694:
                    695: struct mpi_msg_eventack_request {
                    696:        u_int16_t               reserved1;
                    697:        u_int8_t                chain_offset;
                    698:        u_int8_t                function;
                    699:
                    700:        u_int8_t                reserved2[3];
                    701:        u_int8_t                msg_flags;
                    702:
                    703:        u_int32_t               msg_context;
                    704:
                    705:        u_int32_t               event;
                    706:
                    707:        u_int32_t               event_context;
                    708: } __packed;
                    709:
                    710: struct mpi_msg_eventack_reply {
                    711:        u_int16_t               reserved1;
                    712:        u_int8_t                msg_length;
                    713:        u_int8_t                function;
                    714:
                    715:        u_int8_t                reserved2[3];
                    716:        u_int8_t                msg_flags;
                    717:
                    718:        u_int32_t               msg_context;
                    719:
                    720:        u_int16_t               reserved3;
                    721:        u_int32_t               ioc_status;
                    722:
                    723:        u_int32_t               ioc_loginfo;
                    724: } __packed;
                    725:
                    726: struct mpi_msg_fwupload_request {
                    727:        u_int8_t                image_type;
                    728: #define MPI_FWUPLOAD_IMAGETYPE_IOC_FW                  (0x00)
                    729: #define MPI_FWUPLOAD_IMAGETYPE_NV_FW                   (0x01)
                    730: #define MPI_FWUPLOAD_IMAGETYPE_MPI_NV_FW               (0x02)
                    731: #define MPI_FWUPLOAD_IMAGETYPE_NV_DATA                 (0x03)
                    732: #define MPI_FWUPLOAD_IMAGETYPE_BOOT                    (0x04)
                    733: #define MPI_FWUPLOAD_IMAGETYPE_NV_BACKUP               (0x05)
                    734:        u_int8_t                reserved1;
                    735:        u_int8_t                chain_offset;
                    736:        u_int8_t                function;
                    737:
                    738:        u_int8_t                reserved2[3];
                    739:        u_int8_t                msg_flags;
                    740:
                    741:        u_int32_t               msg_context;
                    742:
                    743:        struct mpi_fw_tce       tce;
                    744:
                    745:        /* followed by an sgl */
                    746: } __packed;
                    747:
                    748: struct mpi_msg_fwupload_reply {
                    749:        u_int8_t                image_type;
                    750:        u_int8_t                reserved1;
                    751:        u_int8_t                msg_length;
                    752:        u_int8_t                function;
                    753:
                    754:        u_int8_t                reserved2[3];
                    755:        u_int8_t                msg_flags;
                    756:
                    757:        u_int32_t               msg_context;
                    758:
                    759:        u_int16_t               reserved3;
                    760:        u_int16_t               ioc_status;
                    761:
                    762:        u_int32_t               ioc_loginfo;
                    763:
                    764:        u_int32_t               actual_image_size;
                    765: } __packed;
                    766:
                    767: struct mpi_msg_scsi_io {
                    768:        u_int8_t                target_id;
                    769:        u_int8_t                bus;
                    770:        u_int8_t                chain_offset;
                    771:        u_int8_t                function;
                    772:
                    773:        u_int8_t                cdb_length;
                    774:        u_int8_t                sense_buf_len;
                    775:        u_int8_t                reserved1;
                    776:        u_int8_t                msg_flags;
                    777: #define MPI_SCSIIO_EEDP                                        0xf0
                    778: #define MPI_SCSIIO_CMD_DATA_DIR                                (1<<2)
                    779: #define MPI_SCSIIO_SENSE_BUF_LOC                       (1<<1)
                    780: #define MPI_SCSIIO_SENSE_BUF_ADDR_WIDTH                        (1<<0)
                    781: #define  MPI_SCSIIO_SENSE_BUF_ADDR_WIDTH_32            (0<<0)
                    782: #define  MPI_SCSIIO_SENSE_BUF_ADDR_WIDTH_64            (1<<0)
                    783:
                    784:        u_int32_t               msg_context;
                    785:
                    786:        u_int16_t               lun[4];
                    787:
                    788:        u_int8_t                reserved2;
                    789:        u_int8_t                tagging;
                    790: #define MPI_SCSIIO_ATTR_SIMPLE_Q                       (0x0)
                    791: #define MPI_SCSIIO_ATTR_HEAD_OF_Q                      (0x1)
                    792: #define MPI_SCSIIO_ATTR_ORDERED_Q                      (0x2)
                    793: #define MPI_SCSIIO_ATTR_ACA_Q                          (0x4)
                    794: #define MPI_SCSIIO_ATTR_UNTAGGED                       (0x5)
                    795: #define MPI_SCSIIO_ATTR_NO_DISCONNECT                  (0x7)
                    796:        u_int8_t                reserved3;
                    797:        u_int8_t                direction;
                    798: #define MPI_SCSIIO_DIR_NONE                            (0x0)
                    799: #define MPI_SCSIIO_DIR_WRITE                           (0x1)
                    800: #define MPI_SCSIIO_DIR_READ                            (0x2)
                    801:
                    802: #define MPI_CDB_LEN                                    16
                    803:        u_int8_t                cdb[MPI_CDB_LEN];
                    804:
                    805:        u_int32_t               data_length;
                    806:
                    807:        u_int32_t               sense_buf_low_addr;
                    808:
                    809:        /* followed by an sgl */
                    810: } __packed;
                    811:
                    812: struct mpi_msg_scsi_io_error {
                    813:        u_int8_t                target_id;
                    814:        u_int8_t                bus;
                    815:        u_int8_t                msg_length;
                    816:        u_int8_t                function;
                    817:
                    818:        u_int8_t                cdb_length;
                    819:        u_int8_t                sense_buf_len;
                    820:        u_int8_t                reserved1;
                    821:        u_int8_t                msg_flags;
                    822:
                    823:        u_int32_t               msg_context;
                    824:
                    825:        u_int8_t                scsi_status;
                    826: #if notyet
                    827: #define MPI_SCSIIO_ERR_STATUS_SUCCESS
                    828: #define MPI_SCSIIO_ERR_STATUS_CHECK_COND
                    829: #define MPI_SCSIIO_ERR_STATUS_BUSY
                    830: #define MPI_SCSIIO_ERR_STATUS_INTERMEDIATE
                    831: #define MPI_SCSIIO_ERR_STATUS_INTERMEDIATE_CONDMET
                    832: #define MPI_SCSIIO_ERR_STATUS_RESERVATION_CONFLICT
                    833: #define MPI_SCSIIO_ERR_STATUS_CMD_TERM
                    834: #define MPI_SCSIIO_ERR_STATUS_TASK_SET_FULL
                    835: #define MPI_SCSIIO_ERR_STATUS_ACA_ACTIVE
                    836: #endif
                    837:        u_int8_t                scsi_state;
                    838: #define MPI_SCSIIO_ERR_STATE_AUTOSENSE_VALID           (1<<0)
                    839: #define MPI_SCSIIO_ERR_STATE_AUTOSENSE_FAILED          (1<<2)
                    840: #define MPI_SCSIIO_ERR_STATE_NO_SCSI_STATUS            (1<<3)
                    841: #define MPI_SCSIIO_ERR_STATE_TERMINATED                        (1<<4)
                    842: #define MPI_SCSIIO_ERR_STATE_RESPONSE_INFO_VALID       (1<<5)
                    843: #define MPI_SCSIIO_ERR_STATE_QUEUE_TAG_REJECTED                (1<<6)
                    844:        u_int16_t               ioc_status;
                    845:
                    846:        u_int32_t               ioc_loginfo;
                    847:
                    848:        u_int32_t               transfer_count;
                    849:
                    850:        u_int32_t               sense_count;
                    851:
                    852:        u_int32_t               response_info;
                    853:
                    854:        u_int16_t               tag;
                    855:        u_int16_t               reserved2;
                    856: } __packed;
                    857:
                    858: struct mpi_msg_scsi_task_request {
                    859:        u_int8_t                target_id;
                    860:        u_int8_t                bus;
                    861:        u_int8_t                chain_offset;
                    862:        u_int8_t                function;
                    863:
                    864:        u_int8_t                reserved1;
                    865:        u_int8_t                task_type;
                    866: #define MPI_MSG_SCSI_TASK_TYPE_ABORT_TASK              (0x01)
                    867: #define MPI_MSG_SCSI_TASK_TYPE_ABRT_TASK_SET           (0x02)
                    868: #define MPI_MSG_SCSI_TASK_TYPE_TARGET_RESET            (0x03)
                    869: #define MPI_MSG_SCSI_TASK_TYPE_RESET_BUS               (0x04)
                    870: #define MPI_MSG_SCSI_TASK_TYPE_LOGICAL_UNIT_RESET      (0x05)
                    871:        u_int8_t                reserved2;
                    872:        u_int8_t                msg_flags;
                    873:
                    874:        u_int32_t               msg_context;
                    875:
                    876:        u_int16_t               lun[4];
                    877:
                    878:        u_int32_t               reserved3[7]; /* wtf? */
                    879:
                    880:        u_int32_t               target_msg_context;
                    881: } __packed;
                    882:
                    883: struct mpi_msg_scsi_task_reply {
                    884:        u_int8_t                target_id;
                    885:        u_int8_t                bus;
                    886:        u_int8_t                msg_length;
                    887:        u_int8_t                function;
                    888:
                    889:        u_int8_t                response_code;
                    890:        u_int8_t                task_type;
                    891:        u_int8_t                reserved1;
                    892:        u_int8_t                msg_flags;
                    893:
                    894:        u_int32_t               msg_context;
                    895:
                    896:        u_int16_t               reserved2;
                    897:        u_int16_t               ioc_status;
                    898:
                    899:        u_int32_t               ioc_loginfo;
                    900:
                    901:        u_int32_t               termination_count;
                    902: } __packed;
                    903:
                    904: struct mpi_cfg_hdr {
                    905:        u_int8_t                page_version;
                    906:        u_int8_t                page_length;
                    907:        u_int8_t                page_number;
                    908:        u_int8_t                page_type;
                    909: #define MPI_CONFIG_REQ_PAGE_TYPE_ATTRIBUTE             (0xf0)
                    910: #define MPI_CONFIG_REQ_PAGE_TYPE_MASK                  (0x0f)
                    911: #define MPI_CONFIG_REQ_PAGE_TYPE_IO_UNIT               (0x00)
                    912: #define MPI_CONFIG_REQ_PAGE_TYPE_IOC                   (0x01)
                    913: #define MPI_CONFIG_REQ_PAGE_TYPE_BIOS                  (0x02)
                    914: #define MPI_CONFIG_REQ_PAGE_TYPE_SCSI_SPI_PORT         (0x03)
                    915: #define MPI_CONFIG_REQ_PAGE_TYPE_SCSI_SPI_DEV          (0x04)
                    916: #define MPI_CONFIG_REQ_PAGE_TYPE_FC_PORT               (0x05)
                    917: #define MPI_CONFIG_REQ_PAGE_TYPE_FC_DEV                        (0x06)
                    918: #define MPI_CONFIG_REQ_PAGE_TYPE_LAN                   (0x07)
                    919: #define MPI_CONFIG_REQ_PAGE_TYPE_RAID_VOL              (0x08)
                    920: #define MPI_CONFIG_REQ_PAGE_TYPE_MANUFACTURING         (0x09)
                    921: #define MPI_CONFIG_REQ_PAGE_TYPE_RAID_PD               (0x0A)
                    922: #define MPI_CONFIG_REQ_PAGE_TYPE_INBAND                        (0x0B)
                    923: #define MPI_CONFIG_REQ_PAGE_TYPE_EXTENDED              (0x0F)
                    924: } __packed;
                    925:
                    926: struct mpi_msg_config_request {
                    927:        u_int8_t                action;
                    928: #define MPI_CONFIG_REQ_ACTION_PAGE_HEADER              (0x00)
                    929: #define MPI_CONFIG_REQ_ACTION_PAGE_READ_CURRENT                (0x01)
                    930: #define MPI_CONFIG_REQ_ACTION_PAGE_WRITE_CURRENT       (0x02)
                    931: #define MPI_CONFIG_REQ_ACTION_PAGE_DEFAULT             (0x03)
                    932: #define MPI_CONFIG_REQ_ACTION_PAGE_WRITE_NVRAM         (0x04)
                    933: #define MPI_CONFIG_REQ_ACTION_PAGE_READ_DEFAULT                (0x05)
                    934: #define MPI_CONFIG_REQ_ACTION_PAGE_READ_NVRAM          (0x06)
                    935:        u_int8_t                reserved1;
                    936:        u_int8_t                chain_offset;
                    937:        u_int8_t                function;
                    938:
                    939:        u_int16_t               ext_page_len;
                    940:        u_int8_t                ext_page_type;
                    941: #define MPI_CONFIG_REQ_EXTPAGE_TYPE_SAS_IO_UNIT                (0x10)
                    942: #define MPI_CONFIG_REQ_EXTPAGE_TYPE_SAS_EXPANDER       (0x11)
                    943: #define MPI_CONFIG_REQ_EXTPAGE_TYPE_SAS_DEVICE         (0x12)
                    944: #define MPI_CONFIG_REQ_EXTPAGE_TYPE_SAS_PHY            (0x13)
                    945: #define MPI_CONFIG_REQ_EXTPAGE_TYPE_LOG                        (0x14)
                    946:        u_int8_t                msg_flags;
                    947:
                    948:        u_int32_t               msg_context;
                    949:
                    950:        u_int32_t               reserved2[2];
                    951:
                    952:        struct mpi_cfg_hdr      config_header;
                    953:
                    954:        u_int32_t               page_address;
                    955: /* XXX lots of defns here */
                    956:
                    957:        struct mpi_sge          page_buffer;
                    958: } __packed;
                    959:
                    960: struct mpi_msg_config_reply {
                    961:        u_int8_t                action;
                    962:        u_int8_t                reserved1;
                    963:        u_int8_t                msg_length;
                    964:        u_int8_t                function;
                    965:
                    966:        u_int16_t               ext_page_length;
                    967:        u_int8_t                ext_page_type;
                    968:        u_int8_t                msg_flags;
                    969:
                    970:        u_int32_t               msg_context;
                    971:
                    972:        u_int16_t               reserved2;
                    973:        u_int16_t               ioc_status;
                    974:
                    975:        u_int32_t               ioc_loginfo;
                    976:
                    977:        struct mpi_cfg_hdr      config_header;
                    978: } __packed;
                    979:
                    980: struct mpi_cfg_spi_port_pg0 {
                    981:        struct mpi_cfg_hdr      config_header;
                    982:
                    983:        u_int8_t                capabilities1;
                    984: #define MPI_CFG_SPI_PORT_0_CAPABILITIES_PACKETIZED     (1<<0)
                    985: #define MPI_CFG_SPI_PORT_0_CAPABILITIES_DT             (1<<1)
                    986: #define MPI_CFG_SPI_PORT_0_CAPABILITIES_QAS            (1<<2)
                    987:        u_int8_t                min_period;
                    988:        u_int8_t                max_offset;
                    989:        u_int8_t                capabilities2;
                    990: #define MPI_CFG_SPI_PORT_0_CAPABILITIES_IDP            (1<<3)
                    991: #define MPI_CFG_SPI_PORT_0_CAPABILITIES_WIDTH          (1<<5)
                    992: #define  MPI_CFG_SPI_PORT_0_CAPABILITIES_WIDTH_NARROW  (0<<5)
                    993: #define  MPI_CFG_SPI_PORT_0_CAPABILITIES_WIDTH_WIDE    (1<<5)
                    994: #define MPI_CFG_SPI_PORT_0_CAPABILITIES_AIP            (1<<7)
                    995:
                    996:        u_int8_t                signalling_type;
                    997: #define MPI_CFG_SPI_PORT_0_SIGNAL_HVD                  (0x1)
                    998: #define MPI_CFG_SPI_PORT_0_SIGNAL_SE                   (0x2)
                    999: #define MPI_CFG_SPI_PORT_0_SIGNAL_LVD                  (0x3)
                   1000:        u_int16_t               reserved;
                   1001:        u_int8_t                connected_id;
                   1002: #define  MPI_CFG_SPI_PORT_0_CONNECTEDID_BUSFREE                (0xfe)
                   1003: #define  MPI_CFG_SPI_PORT_0_CONNECTEDID_UNKNOWN                (0xff)
                   1004: } __packed;
                   1005:
                   1006: struct mpi_cfg_spi_port_pg1 {
                   1007:        struct mpi_cfg_hdr      config_header;
                   1008:
                   1009:        /* configuration */
                   1010:        u_int8_t                port_scsi_id;
                   1011:        u_int8_t                reserved1;
                   1012:        u_int16_t               port_resp_ids;
                   1013:
                   1014:        u_int32_t               on_bus_timer_value;
                   1015:
                   1016:        u_int8_t                target_config;
                   1017: #define MPI_CFG_SPI_PORT_1_TARGCFG_TARGET_ONLY         (0x01)
                   1018: #define MPI_CFG_SPI_PORT_1_TARGCFG_INIT_TARGET         (0x02)
                   1019:        u_int8_t                reserved2;
                   1020:        u_int16_t               id_config;
                   1021: } __packed;
                   1022:
                   1023: struct mpi_cfg_spi_port_pg2 {
                   1024:        struct mpi_cfg_hdr      config_header;
                   1025:
                   1026:        u_int32_t               port_flags;
                   1027: #define MPI_CFG_SPI_PORT_2_PORT_FLAGS_SCAN_HI2LOW      (1<<0)
                   1028: #define MPI_CFG_SPI_PORT_2_PORT_FLAGS_AVOID_RESET      (1<<2)
                   1029: #define MPI_CFG_SPI_PORT_2_PORT_FLAGS_ALT_CHS          (1<<3)
                   1030: #define MPI_CFG_SPI_PORT_2_PORT_FLAGS_TERM_DISABLED    (1<<4)
                   1031: #define MPI_CFG_SPI_PORT_2_PORT_FLAGS_DV_CTL           (0x3<<5)
                   1032: #define  MPI_CFG_SPI_PORT_2_PORT_FLAGS_DV_HOST_BE      (0x0<<5)
                   1033: #define  MPI_CFG_SPI_PORT_2_PORT_FLAGS_DV_HOST_B       (0x1<<5)
                   1034: #define  MPI_CFG_SPI_PORT_2_PORT_FLAGS_DV_HOST_NONE    (0x3<<5)
                   1035:
                   1036:        u_int32_t               port_settings;
                   1037: #define MPI_CFG_SPI_PORT_2_PORT_SET_HOST_ID            (0x7<<0)
                   1038: #define MPI_CFG_SPI_PORT_2_PORT_SET_INIT_HBA           (0x3<<4)
                   1039: #define  MPI_CFG_SPI_PORT_2_PORT_SET_INIT_HBA_DISABLED (0x0<<4)
                   1040: #define  MPI_CFG_SPI_PORT_2_PORT_SET_INIT_HBA_BIOS     (0x1<<4)
                   1041: #define  MPI_CFG_SPI_PORT_2_PORT_SET_INIT_HBA_OS       (0x2<<4)
                   1042: #define  MPI_CFG_SPI_PORT_2_PORT_SET_INIT_HBA_BIOS_OS  (0x3<<4)
                   1043: #define MPI_CFG_SPI_PORT_2_PORT_SET_REMOVABLE          (0x3<<6)
                   1044: #define MPI_CFG_SPI_PORT_2_PORT_SET_SPINUP_DELAY       (0xf<<8)
                   1045: #define MPI_CFG_SPI_PORT_2_PORT_SET_SYNC               (0x3<<12)
                   1046: #define  MPI_CFG_SPI_PORT_2_PORT_SET_NEG_SUPPORTED     (0x0<<12)
                   1047: #define  MPI_CFG_SPI_PORT_2_PORT_SET_NEG_NONE          (0x1<<12)
                   1048: #define  MPI_CFG_SPI_PORT_2_PORT_SET_NEG_ALL           (0x3<<12)
                   1049:
                   1050:        struct {
                   1051:                u_int8_t                timeout;
                   1052:                u_int8_t                sync_factor;
                   1053:                u_int16_t               device_flags;
                   1054: #define MPI_CFG_SPI_PORT_2_DEV_FLAG_DISCONNECT_EN      (1<<0)
                   1055: #define MPI_CFG_SPI_PORT_2_DEV_FLAG_SCAN_ID_EN         (1<<1)
                   1056: #define MPI_CFG_SPI_PORT_2_DEV_FLAG_SCAN_LUN_EN                (1<<2)
                   1057: #define MPI_CFG_SPI_PORT_2_DEV_FLAG_TAQ_Q_EN           (1<<3)
                   1058: #define MPI_CFG_SPI_PORT_2_DEV_FLAG_WIDE_DIS           (1<<4)
                   1059: #define MPI_CFG_SPI_PORT_2_DEV_FLAG_BOOT_CHOICE                (1<<5)
                   1060:        } __packed              device_settings[16];
                   1061: };
                   1062:
                   1063: struct mpi_cfg_spi_dev_pg0 {
                   1064:        struct mpi_cfg_hdr      config_header;
                   1065:
                   1066:        u_int8_t                neg_params1;
                   1067: #define MPI_CFG_SPI_DEV_0_NEGPARAMS_PACKETIZED         (1<<0)
                   1068: #define MPI_CFG_SPI_DEV_0_NEGPARAMS_DUALXFERS          (1<<1)
                   1069: #define MPI_CFG_SPI_DEV_0_NEGPARAMS_QAS                        (1<<2)
                   1070: #define MPI_CFG_SPI_DEV_0_NEGPARAMS_HOLD_MCS           (1<<3)
                   1071: #define MPI_CFG_SPI_DEV_0_NEGPARAMS_WR_FLOW            (1<<4)
                   1072: #define MPI_CFG_SPI_DEV_0_NEGPARAMS_RD_STRM            (1<<5)
                   1073: #define MPI_CFG_SPI_DEV_0_NEGPARAMS_RTI                        (1<<6)
                   1074: #define MPI_CFG_SPI_DEV_0_NEGPARAMS_PCOMP_EN           (1<<7)
                   1075:        u_int8_t                neg_period;
                   1076:        u_int8_t                neg_offset;
                   1077:        u_int8_t                neg_params2;
                   1078: #define MPI_CFG_SPI_DEV_0_NEGPARAMS_IDP_EN             (1<<3)
                   1079: #define MPI_CFG_SPI_DEV_0_NEGPARAMS_WIDTH              (1<<5)
                   1080: #define  MPI_CFG_SPI_DEV_0_NEGPARAMS_WIDTH_NARROW      (0<<5)
                   1081: #define  MPI_CFG_SPI_DEV_0_NEGPARAMS_WIDTH_WIDE                (1<<5)
                   1082: #define MPI_CFG_SPI_DEV_0_NEGPARAMS_AIP                        (1<<7)
                   1083:
                   1084:        u_int32_t               information;
                   1085: #define MPI_CFG_SPI_DEV_0_INFO_NEG_OCCURRED            (1<<0)
                   1086: #define MPI_CFG_SPI_DEV_0_INFO_SDTR_REJECTED           (1<<1)
                   1087: #define MPI_CFG_SPI_DEV_0_INFO_WDTR_REJECTED           (1<<2)
                   1088: #define MPI_CFG_SPI_DEV_0_INFO_PPR_REJECTED            (1<<3)
                   1089: } __packed;
                   1090:
                   1091: struct mpi_cfg_spi_dev_pg1 {
                   1092:        struct mpi_cfg_hdr      config_header;
                   1093:
                   1094:        u_int8_t                req_params1;
                   1095: #define MPI_CFG_SPI_DEV_1_REQPARAMS_PACKETIZED         (1<<0)
                   1096: #define MPI_CFG_SPI_DEV_1_REQPARAMS_DUALXFERS          (1<<1)
                   1097: #define MPI_CFG_SPI_DEV_1_REQPARAMS_QAS                        (1<<2)
                   1098: #define MPI_CFG_SPI_DEV_1_REQPARAMS_HOLD_MCS           (1<<3)
                   1099: #define MPI_CFG_SPI_DEV_1_REQPARAMS_WR_FLOW            (1<<4)
                   1100: #define MPI_CFG_SPI_DEV_1_REQPARAMS_RD_STRM            (1<<5)
                   1101: #define MPI_CFG_SPI_DEV_1_REQPARAMS_RTI                        (1<<6)
                   1102: #define MPI_CFG_SPI_DEV_1_REQPARAMS_PCOMP_EN           (1<<7)
                   1103:        u_int8_t                req_period;
                   1104:        u_int8_t                req_offset;
                   1105:        u_int8_t                req_params2;
                   1106: #define MPI_CFG_SPI_DEV_1_REQPARAMS_IDP_EN             (1<<3)
                   1107: #define MPI_CFG_SPI_DEV_1_REQPARAMS_WIDTH              (1<<5)
                   1108: #define  MPI_CFG_SPI_DEV_1_REQPARAMS_WIDTH_NARROW      (0<<5)
                   1109: #define  MPI_CFG_SPI_DEV_1_REQPARAMS_WIDTH_WIDE                (1<<5)
                   1110: #define MPI_CFG_SPI_DEV_1_REQPARAMS_AIP                        (1<<7)
                   1111:
                   1112:        u_int32_t               reserved;
                   1113:
                   1114:        u_int32_t               configuration;
                   1115: #define MPI_CFG_SPI_DEV_1_CONF_WDTR_DISALLOWED         (1<<1)
                   1116: #define MPI_CFG_SPI_DEV_1_CONF_SDTR_DISALLOWED         (1<<2)
                   1117: #define MPI_CFG_SPI_DEV_1_CONF_EXTPARAMS               (1<<3)
                   1118: #define MPI_CFG_SPI_DEV_1_CONF_FORCE_PPR               (1<<4)
                   1119: } __packed;
                   1120:
                   1121: struct mpi_cfg_spi_dev_pg2 {
                   1122:        struct mpi_cfg_hdr      config_header;
                   1123:
                   1124:        u_int32_t               domain_validation;
                   1125: #define MPI_CFG_SPI_DEV_2_DV_ISI_ENABLED               (1<<4)
                   1126: #define MPI_CFG_SPI_DEV_2_DV_SECONDARY_DRV_EN          (1<<5)
                   1127: #define MPI_CFG_SPI_DEV_2_DV_SLEW_RATE_CTL             (0x7<<7)
                   1128: #define MPI_CFG_SPI_DEV_2_DV_PRIMARY_DRV_STRENGTH      (0x7<<10)
                   1129: #define MPI_CFG_SPI_DEV_2_DV_XCLKH_ST                  (1<<28)
                   1130: #define MPI_CFG_SPI_DEV_2_DV_XCLKS_ST                  (1<<29)
                   1131: #define MPI_CFG_SPI_DEV_2_DV_XCLKH_DT                  (1<<30)
                   1132: #define MPI_CFG_SPI_DEV_2_DV_XCLKS_DT                  (1<<31)
                   1133:
                   1134:        u_int32_t               parity_pipe_select;
                   1135: #define MPI_CFG_SPI_DEV_2_PARITY_PIPE_SELECT           (0x3)
                   1136:
                   1137:        u_int32_t               data_pipe_select;
                   1138: #define MPI_CFG_SPI_DEV_2_DATA_PIPE_SELECT(x)          (0x3<<((x)*2))
                   1139:
                   1140: } __packed;
                   1141:
                   1142: struct mpi_cfg_spi_dev_pg3 {
                   1143:        struct mpi_cfg_hdr      config_header;
                   1144:
                   1145:        u_int16_t               msg_reject_count;
                   1146:        u_int16_t               phase_error_count;
                   1147:
                   1148:        u_int16_t               parity_error_count;
                   1149:        u_int16_t               reserved;
                   1150: } __packed;
                   1151:
                   1152: struct mpi_cfg_manufacturing_pg0 {
                   1153:        struct mpi_cfg_hdr      config_header;
                   1154:
                   1155:        char                    chip_name[16];
                   1156:        char                    chip_revision[8];
                   1157:        char                    board_name[16];
                   1158:        char                    board_assembly[16];
                   1159:        char                    board_tracer_number[16];
                   1160: } __packed;
                   1161:
                   1162: struct mpi_cfg_ioc_pg2 {
                   1163:        struct mpi_cfg_hdr      config_header;
                   1164:
                   1165:        u_int32_t               capabilities;
                   1166: #define MPI_CFG_IOC_2_CAPABILITIES_IS                  (1<<0)
                   1167: #define MPI_CFG_IOC_2_CAPABILITIES_IME                 (1<<1)
                   1168: #define MPI_CFG_IOC_2_CAPABILITIES_IM                  (1<<2)
                   1169: #define  MPI_CFG_IOC_2_CAPABILITIES_RAID               ( \
                   1170:     MPI_CFG_IOC_2_CAPABILITIES_IS | MPI_CFG_IOC_2_CAPABILITIES_IME | \
                   1171:     MPI_CFG_IOC_2_CAPABILITIES_IM)
                   1172: #define MPI_CFG_IOC_2_CAPABILITIES_SES                 (1<<29)
                   1173: #define MPI_CFG_IOC_2_CAPABILITIES_SAFTE               (1<<30)
                   1174: #define MPI_CFG_IOC_2_CAPABILITIES_XCHANNEL            (1<<31)
                   1175:
                   1176:        u_int8_t                active_vols;
                   1177:        u_int8_t                max_vols;
                   1178:        u_int8_t                active_physdisks;
                   1179:        u_int8_t                max_physdisks;
                   1180:
                   1181:        /* followed by a list of mpi_cf_raid_vol structs */
                   1182: } __packed;
                   1183:
                   1184: struct mpi_cfg_raid_vol {
                   1185:        u_int8_t                vol_id;
                   1186:        u_int8_t                vol_bus;
                   1187:        u_int8_t                vol_ioc;
                   1188:        u_int8_t                vol_page;
                   1189:
                   1190:        u_int8_t                vol_type;
                   1191: #define MPI_CFG_RAID_TYPE_RAID_IS                      (0x00)
                   1192: #define MPI_CFG_RAID_TYPE_RAID_IME                     (0x01)
                   1193: #define MPI_CFG_RAID_TYPE_RAID_IM                      (0x02)
                   1194:        u_int8_t                flags;
                   1195: #define MPI_CFG_RAID_VOL_INACTIVE      (1<<3)
                   1196:        u_int16_t               reserved;
                   1197: } __packed;
                   1198:
                   1199: struct mpi_cfg_ioc_pg3 {
                   1200:        struct mpi_cfg_hdr      config_header;
                   1201:
                   1202:        u_int8_t                no_phys_disks;
                   1203:        u_int8_t                reserved[3];
                   1204:
                   1205:        /* followed by a list of mpi_cf_raid_physdisk structs */
                   1206: } __packed;
                   1207:
                   1208: struct mpi_cfg_raid_physdisk {
                   1209:        u_int8_t                phys_disk_id;
                   1210:        u_int8_t                phys_disk_bus;
                   1211:        u_int8_t                phys_disk_ioc;
                   1212:        u_int8_t                phys_disk_num;
                   1213: } __packed;
                   1214:
                   1215: struct mpi_cfg_fc_port_pg0 {
                   1216:        struct mpi_cfg_hdr      config_header;
                   1217:
                   1218:        u_int32_t               flags;
                   1219:
                   1220:        u_int8_t                mpi_port_nr;
                   1221:        u_int8_t                link_type;
                   1222:        u_int8_t                port_state;
                   1223:        u_int8_t                reserved1;
                   1224:
                   1225:        u_int32_t               port_id;
                   1226:
                   1227:        u_int64_t               wwnn;
                   1228:
                   1229:        u_int64_t               wwpn;
                   1230:
                   1231:        u_int32_t               supported_service_class;
                   1232:
                   1233:        u_int32_t               supported_speeds;
                   1234:
                   1235:        u_int32_t               current_speed;
                   1236:
                   1237:        u_int32_t               max_frame_size;
                   1238:
                   1239:        u_int64_t               fabric_wwnn;
                   1240:
                   1241:        u_int64_t               fabric_wwpn;
                   1242:
                   1243:        u_int32_t               discovered_port_count;
                   1244:
                   1245:        u_int32_t               max_initiators;
                   1246:
                   1247:        u_int8_t                max_aliases_supported;
                   1248:        u_int8_t                max_hard_aliases_supported;
                   1249:        u_int8_t                num_current_aliases;
                   1250:        u_int8_t                reserved2;
                   1251: } __packed;
                   1252:
                   1253: struct mpi_cfg_fc_device_pg0 {
                   1254:        struct mpi_cfg_hdr      config_header;
                   1255:
                   1256:        u_int64_t               wwnn;
                   1257:
                   1258:        u_int64_t               wwpn;
                   1259:
                   1260:        u_int32_t               port_id;
                   1261:
                   1262:        u_int8_t                protocol;
                   1263:        u_int8_t                flags;
                   1264:        u_int16_t               bb_credit;
                   1265:
                   1266:        u_int16_t               max_rx_frame_size;
                   1267:        u_int8_t                adisc_hard_alpa;
                   1268:        u_int8_t                port_nr;
                   1269:
                   1270:        u_int8_t                fc_ph_low_version;
                   1271:        u_int8_t                fc_ph_high_version;
                   1272:        u_int8_t                current_target_id;
                   1273:        u_int8_t                current_bus;
                   1274: } __packed;
                   1275:
                   1276: struct mpi_cfg_raid_vol_pg0 {
                   1277:        struct mpi_cfg_hdr      config_header;
                   1278:
                   1279:        u_int8_t                volume_id;
                   1280:        u_int8_t                volume_bus;
                   1281:        u_int8_t                volume_ioc;
                   1282:        u_int8_t                volume_type;
                   1283:
                   1284:        u_int8_t                volume_status;
                   1285: #define MPI_CFG_RAID_VOL_0_STATUS_ENABLED              (1<<0)
                   1286: #define MPI_CFG_RAID_VOL_0_STATUS_QUIESCED             (1<<1)
                   1287: #define MPI_CFG_RAID_VOL_0_STATUS_RESYNCING            (1<<2)
                   1288: #define MPI_CFG_RAID_VOL_0_STATUS_ACTIVE               (1<<3)
                   1289:        u_int8_t                volume_state;
                   1290: #define MPI_CFG_RAID_VOL_0_STATE_OPTIMAL               (0x00)
                   1291: #define MPI_CFG_RAID_VOL_0_STATE_DEGRADED              (0x01)
                   1292: #define MPI_CFG_RAID_VOL_0_STATE_FAILED                        (0x02)
                   1293:        u_int16_t               reserved1;
                   1294:
                   1295:        u_int16_t               volume_settings;
                   1296: #define MPI_CFG_RAID_VOL_0_SETTINGS_WRITE_CACHE_EN     (1<<0)
                   1297: #define MPI_CFG_RAID_VOL_0_SETTINGS_OFFLINE_SMART_ERR  (1<<1)
                   1298: #define MPI_CFG_RAID_VOL_0_SETTINGS_OFFLINE_SMART      (1<<2)
                   1299: #define MPI_CFG_RAID_VOL_0_SETTINGS_AUTO_SWAP          (1<<3)
                   1300: #define MPI_CFG_RAID_VOL_0_SETTINGS_HI_PRI_RESYNC      (1<<4)
                   1301: #define MPI_CFG_RAID_VOL_0_SETTINGS_PROD_SUFFIX                (1<<5)
                   1302: #define MPI_CFG_RAID_VOL_0_SETTINGS_FAST_SCRUB         (1<<6) /* obsolete */
                   1303: #define MPI_CFG_RAID_VOL_0_SETTINGS_DEFAULTS           (1<<15)
                   1304:        u_int8_t                hot_spare_pool;
                   1305:        u_int8_t                reserved2;
                   1306:
                   1307:        u_int32_t               max_lba;
                   1308:
                   1309:        u_int32_t               reserved3;
                   1310:
                   1311:        u_int32_t               stripe_size;
                   1312:
                   1313:        u_int32_t               reserved4;
                   1314:
                   1315:        u_int32_t               reserved5;
                   1316:
                   1317:        u_int8_t                num_phys_disks;
                   1318:        u_int8_t                data_scrub_rate;
                   1319:        u_int8_t                resync_rate;
                   1320:        u_int8_t                inactive_status;
                   1321: #define MPI_CFG_RAID_VOL_0_INACTIVE_UNKNOWN            (0x00)
                   1322: #define MPI_CFG_RAID_VOL_0_INACTIVE_STALE_META         (0x01)
                   1323: #define MPI_CFG_RAID_VOL_0_INACTIVE_FOREIGN_VOL                (0x02)
                   1324: #define MPI_CFG_RAID_VOL_0_INACTIVE_NO_RESOURCES       (0x03)
                   1325: #define MPI_CFG_RAID_VOL_0_INACTIVE_CLONED_VOL         (0x04)
                   1326: #define MPI_CFG_RAID_VOL_0_INACTIVE_INSUF_META         (0x05)
                   1327:
                   1328:        /* followed by a list of mpi_cfg_raid_vol_pg0_physdisk structs */
                   1329: } __packed;
                   1330:
                   1331: struct mpi_cfg_raid_vol_pg0_physdisk {
                   1332:        u_int16_t               reserved;
                   1333:        u_int8_t                phys_disk_map;
                   1334:        u_int8_t                phys_disk_num;
                   1335: } __packed;
                   1336:
                   1337: struct mpi_cfg_raid_vol_pg1 {
                   1338:        struct mpi_cfg_hdr      config_header;
                   1339:
                   1340:        u_int8_t                volume_id;
                   1341:        u_int8_t                volume_bus;
                   1342:        u_int8_t                volume_ioc;
                   1343:        u_int8_t                reserved1;
                   1344:
                   1345:        u_int8_t                guid[24];
                   1346:
                   1347:        u_int8_t                name[32];
                   1348:
                   1349:        u_int64_t               wwid;
                   1350:
                   1351:        u_int32_t               reserved2;
                   1352:
                   1353:        u_int32_t               reserved3;
                   1354: } __packed;
                   1355:
                   1356: struct mpi_cfg_raid_physdisk_pg0 {
                   1357:        struct mpi_cfg_hdr      config_header;
                   1358:
                   1359:        u_int8_t                phys_disk_id;
                   1360:        u_int8_t                phys_disk_bus;
                   1361:        u_int8_t                phys_disk_ioc;
                   1362:        u_int8_t                phys_disk_num;
                   1363:
                   1364:        u_int8_t                enc_id;
                   1365:        u_int8_t                enc_bus;
                   1366:        u_int8_t                hot_spare_pool;
                   1367:        u_int8_t                enc_type;
                   1368: #define MPI_CFG_RAID_PHYDISK_0_ENCTYPE_NONE            (0x0)
                   1369: #define MPI_CFG_RAID_PHYDISK_0_ENCTYPE_SAFTE           (0x1)
                   1370: #define MPI_CFG_RAID_PHYDISK_0_ENCTYPE_SES             (0x2)
                   1371:
                   1372:        u_int32_t               reserved1;
                   1373:
                   1374:        u_int8_t                ext_disk_id[8];
                   1375:
                   1376:        u_int8_t                disk_id[16];
                   1377:
                   1378:        u_int8_t                vendor_id[8];
                   1379:
                   1380:        u_int8_t                product_id[16];
                   1381:
                   1382:        u_int8_t                product_rev[4];
                   1383:
                   1384:        u_int8_t                info[32];
                   1385:
                   1386:        u_int8_t                phys_disk_status;
                   1387: #define MPI_CFG_RAID_PHYDISK_0_STATUS_OUTOFSYNC                (1<<0)
                   1388: #define MPI_CFG_RAID_PHYDISK_0_STATUS_QUIESCED         (1<<1)
                   1389:        u_int8_t                phys_disk_state;
                   1390: #define MPI_CFG_RAID_PHYDISK_0_STATE_ONLINE            (0x00)
                   1391: #define MPI_CFG_RAID_PHYDISK_0_STATE_MISSING           (0x01)
                   1392: #define MPI_CFG_RAID_PHYDISK_0_STATE_INCOMPAT          (0x02)
                   1393: #define MPI_CFG_RAID_PHYDISK_0_STATE_FAILED            (0x03)
                   1394: #define MPI_CFG_RAID_PHYDISK_0_STATE_INIT              (0x04)
                   1395: #define MPI_CFG_RAID_PHYDISK_0_STATE_OFFLINE           (0x05)
                   1396: #define MPI_CFG_RAID_PHYDISK_0_STATE_HOSTFAIL          (0x06)
                   1397: #define MPI_CFG_RAID_PHYDISK_0_STATE_OTHER             (0xff)
                   1398:        u_int16_t               reserved2;
                   1399:
                   1400:        u_int32_t               max_lba;
                   1401:
                   1402:        u_int8_t                error_cdb_byte;
                   1403:        u_int8_t                error_sense_key;
                   1404:        u_int16_t               reserved3;
                   1405:
                   1406:        u_int16_t               error_count;
                   1407:        u_int8_t                error_asc;
                   1408:        u_int8_t                error_ascq;
                   1409:
                   1410:        u_int16_t               smart_count;
                   1411:        u_int8_t                smart_asc;
                   1412:        u_int8_t                smart_ascq;
                   1413: } __packed;
                   1414:
                   1415: struct mpi_cfg_raid_physdisk_pg1 {
                   1416:        struct mpi_cfg_hdr      config_header;
                   1417:
                   1418:        u_int8_t                num_phys_disk_paths;
                   1419:        u_int8_t                phys_disk_num;
                   1420:        u_int16_t               reserved1;
                   1421:
                   1422:        u_int32_t               reserved2;
                   1423:
                   1424:        /* followed by mpi_cfg_raid_physdisk_path structs */
                   1425: } __packed;
                   1426:
                   1427: struct mpi_cfg_raid_physdisk_path {
                   1428:        u_int8_t                phys_disk_id;
                   1429:        u_int8_t                phys_disk_bus;
                   1430:        u_int16_t               reserved1;
                   1431:
                   1432:        u_int64_t               wwwid;
                   1433:
                   1434:        u_int64_t               owner_wwid;
                   1435:
                   1436:        u_int8_t                ownder_id;
                   1437:        u_int8_t                reserved2;
                   1438:        u_int16_t               flags;
                   1439: #define MPI_CFG_RAID_PHYDISK_PATH_INVALID              (1<<0)
                   1440: #define MPI_CFG_RAID_PHYDISK_PATH_BROKEN               (1<<1)
                   1441: } __packed;

CVSweb