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