1 /* $OpenBSD: mpireg.h,v 1.45 2014/03/25 05:41:44 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_addr_lo; 130 u_int32_t sg_addr_hi; 131 } __packed __aligned(4); 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 __aligned(4); 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 __aligned(4); 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 __aligned(4); 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 __aligned(4); 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 __aligned(4); 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 __aligned(4); 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 __aligned(4); 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 __aligned(4); 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 __aligned(4); 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 __aligned(4); 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 __aligned(4); 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 __aligned(4); 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 __aligned(4); 632 633 struct mpi_evt_change { 634 u_int8_t event_state; 635 u_int8_t reserved[3]; 636 } __packed __aligned(4); 637 638 struct mpi_evt_link_status_change { 639 u_int8_t state; 640 #define MPI_EVT_LINK_STATUS_CHANGE_OFFLINE 0x00 641 #define MPI_EVT_LINK_STATUS_CHANGE_ACTIVE 0x01 642 u_int8_t _reserved1[3]; 643 644 u_int8_t _reserved2[1]; 645 u_int8_t port; 646 u_int8_t _reserved3[2]; 647 } __packed __aligned(4); 648 649 struct mpi_evt_loop_status_change { 650 u_int8_t character4; 651 u_int8_t character3; 652 u_int8_t type; 653 #define MPI_EVT_LOOP_STATUS_CHANGE_TYPE_LIP 0x01 654 #define MPI_EVT_LOOP_STATUS_CHANGE_TYPE_LPE 0x02 655 #define MPI_EVT_LOOP_STATUS_CHANGE_TYPE_LPB 0x03 656 u_int8_t _reserved1[1]; 657 658 u_int8_t _reserved2[1]; 659 u_int8_t port; 660 u_int8_t _reserved3[2]; 661 } __packed __aligned(4); 662 663 struct mpi_evt_logout { 664 u_int32_t n_portid; 665 666 u_int8_t alias_index; 667 u_int8_t port; 668 u_int8_t _reserved[2]; 669 } __packed __aligned(4); 670 671 struct mpi_evt_sas_phy { 672 u_int8_t phy_num; 673 u_int8_t link_rates; 674 #define MPI_EVT_SASPHY_LINK_CUR(x) (((x) & 0xf0) >> 4) 675 #define MPI_EVT_SASPHY_LINK_PREV(x) ((x) & 0x0f) 676 #define MPI_EVT_SASPHY_LINK_ENABLED 0x0 677 #define MPI_EVT_SASPHY_LINK_DISABLED 0x1 678 #define MPI_EVT_SASPHY_LINK_NEGFAIL 0x2 679 #define MPI_EVT_SASPHY_LINK_SATAOOB 0x3 680 #define MPI_EVT_SASPHY_LINK_1_5GBPS 0x8 681 #define MPI_EVT_SASPHY_LINK_3_0GBPS 0x9 682 u_int16_t dev_handle; 683 684 u_int64_t sas_addr; 685 } __packed __aligned(4); 686 687 struct mpi_evt_sas_change { 688 u_int8_t target; 689 u_int8_t bus; 690 u_int8_t reason; 691 #define MPI_EVT_SASCH_REASON_ADDED 0x03 692 #define MPI_EVT_SASCH_REASON_NOT_RESPONDING 0x04 693 #define MPI_EVT_SASCH_REASON_SMART_DATA 0x05 694 #define MPI_EVT_SASCH_REASON_NO_PERSIST_ADDED 0x06 695 #define MPI_EVT_SASCH_REASON_UNSUPPORTED 0x07 696 #define MPI_EVT_SASCH_REASON_INTERNAL_RESET 0x08 697 u_int8_t reserved1; 698 699 u_int8_t asc; 700 u_int8_t ascq; 701 u_int16_t dev_handle; 702 703 u_int32_t device_info; 704 #define MPI_EVT_SASCH_INFO_ATAPI (1<<13) 705 #define MPI_EVT_SASCH_INFO_LSI (1<<12) 706 #define MPI_EVT_SASCH_INFO_DIRECT_ATTACHED (1<<11) 707 #define MPI_EVT_SASCH_INFO_SSP (1<<10) 708 #define MPI_EVT_SASCH_INFO_STP (1<<9) 709 #define MPI_EVT_SASCH_INFO_SMP (1<<8) 710 #define MPI_EVT_SASCH_INFO_SATA (1<<7) 711 #define MPI_EVT_SASCH_INFO_SSP_INITIATOR (1<<6) 712 #define MPI_EVT_SASCH_INFO_STP_INITIATOR (1<<5) 713 #define MPI_EVT_SASCH_INFO_SMP_INITIATOR (1<<4) 714 #define MPI_EVT_SASCH_INFO_SATA_HOST (1<<3) 715 #define MPI_EVT_SASCH_INFO_TYPE_MASK 0x7 716 #define MPI_EVT_SASCH_INFO_TYPE_NONE 0x0 717 #define MPI_EVT_SASCH_INFO_TYPE_END 0x1 718 #define MPI_EVT_SASCH_INFO_TYPE_EDGE 0x2 719 #define MPI_EVT_SASCH_INFO_TYPE_FANOUT 0x3 720 721 u_int16_t parent_dev_handle; 722 u_int8_t phy_num; 723 u_int8_t reserved2; 724 725 u_int64_t sas_addr; 726 } __packed __aligned(4); 727 728 struct mpi_msg_eventack_request { 729 u_int16_t reserved1; 730 u_int8_t chain_offset; 731 u_int8_t function; 732 733 u_int8_t reserved2[3]; 734 u_int8_t msg_flags; 735 736 u_int32_t msg_context; 737 738 u_int32_t event; 739 740 u_int32_t event_context; 741 } __packed __aligned(4); 742 743 struct mpi_msg_eventack_reply { 744 u_int16_t reserved1; 745 u_int8_t msg_length; 746 u_int8_t function; 747 748 u_int8_t reserved2[3]; 749 u_int8_t msg_flags; 750 751 u_int32_t msg_context; 752 753 u_int16_t reserved3; 754 u_int32_t ioc_status; 755 756 u_int32_t ioc_loginfo; 757 } __packed __aligned(4); 758 759 struct mpi_msg_fwupload_request { 760 u_int8_t image_type; 761 #define MPI_FWUPLOAD_IMAGETYPE_IOC_FW (0x00) 762 #define MPI_FWUPLOAD_IMAGETYPE_NV_FW (0x01) 763 #define MPI_FWUPLOAD_IMAGETYPE_MPI_NV_FW (0x02) 764 #define MPI_FWUPLOAD_IMAGETYPE_NV_DATA (0x03) 765 #define MPI_FWUPLOAD_IMAGETYPE_BOOT (0x04) 766 #define MPI_FWUPLOAD_IMAGETYPE_NV_BACKUP (0x05) 767 u_int8_t reserved1; 768 u_int8_t chain_offset; 769 u_int8_t function; 770 771 u_int8_t reserved2[3]; 772 u_int8_t msg_flags; 773 774 u_int32_t msg_context; 775 776 struct mpi_fw_tce tce; 777 778 /* followed by an sgl */ 779 } __packed __aligned(4); 780 781 struct mpi_msg_fwupload_reply { 782 u_int8_t image_type; 783 u_int8_t reserved1; 784 u_int8_t msg_length; 785 u_int8_t function; 786 787 u_int8_t reserved2[3]; 788 u_int8_t msg_flags; 789 790 u_int32_t msg_context; 791 792 u_int16_t reserved3; 793 u_int16_t ioc_status; 794 795 u_int32_t ioc_loginfo; 796 797 u_int32_t actual_image_size; 798 } __packed __aligned(4); 799 800 struct mpi_msg_scsi_io { 801 u_int8_t target_id; 802 u_int8_t bus; 803 u_int8_t chain_offset; 804 u_int8_t function; 805 806 u_int8_t cdb_length; 807 u_int8_t sense_buf_len; 808 u_int8_t reserved1; 809 u_int8_t msg_flags; 810 #define MPI_SCSIIO_EEDP 0xf0 811 #define MPI_SCSIIO_CMD_DATA_DIR (1<<2) 812 #define MPI_SCSIIO_SENSE_BUF_LOC (1<<1) 813 #define MPI_SCSIIO_SENSE_BUF_ADDR_WIDTH (1<<0) 814 #define MPI_SCSIIO_SENSE_BUF_ADDR_WIDTH_32 (0<<0) 815 #define MPI_SCSIIO_SENSE_BUF_ADDR_WIDTH_64 (1<<0) 816 817 u_int32_t msg_context; 818 819 u_int16_t lun[4]; 820 821 u_int8_t reserved2; 822 u_int8_t tagging; 823 #define MPI_SCSIIO_ATTR_SIMPLE_Q (0x0) 824 #define MPI_SCSIIO_ATTR_HEAD_OF_Q (0x1) 825 #define MPI_SCSIIO_ATTR_ORDERED_Q (0x2) 826 #define MPI_SCSIIO_ATTR_ACA_Q (0x4) 827 #define MPI_SCSIIO_ATTR_UNTAGGED (0x5) 828 #define MPI_SCSIIO_ATTR_NO_DISCONNECT (0x7) 829 u_int8_t reserved3; 830 u_int8_t direction; 831 #define MPI_SCSIIO_DIR_NONE (0x0) 832 #define MPI_SCSIIO_DIR_WRITE (0x1) 833 #define MPI_SCSIIO_DIR_READ (0x2) 834 835 #define MPI_CDB_LEN 16 836 u_int8_t cdb[MPI_CDB_LEN]; 837 838 u_int32_t data_length; 839 840 u_int32_t sense_buf_low_addr; 841 842 /* followed by an sgl */ 843 } __packed __aligned(4); 844 845 struct mpi_msg_scsi_io_error { 846 u_int8_t target_id; 847 u_int8_t bus; 848 u_int8_t msg_length; 849 u_int8_t function; 850 851 u_int8_t cdb_length; 852 u_int8_t sense_buf_len; 853 u_int8_t reserved1; 854 u_int8_t msg_flags; 855 856 u_int32_t msg_context; 857 858 u_int8_t scsi_status; 859 #if notyet 860 #define MPI_SCSIIO_ERR_STATUS_SUCCESS 861 #define MPI_SCSIIO_ERR_STATUS_CHECK_COND 862 #define MPI_SCSIIO_ERR_STATUS_BUSY 863 #define MPI_SCSIIO_ERR_STATUS_INTERMEDIATE 864 #define MPI_SCSIIO_ERR_STATUS_INTERMEDIATE_CONDMET 865 #define MPI_SCSIIO_ERR_STATUS_RESERVATION_CONFLICT 866 #define MPI_SCSIIO_ERR_STATUS_CMD_TERM 867 #define MPI_SCSIIO_ERR_STATUS_TASK_SET_FULL 868 #define MPI_SCSIIO_ERR_STATUS_ACA_ACTIVE 869 #endif 870 u_int8_t scsi_state; 871 #define MPI_SCSIIO_ERR_STATE_AUTOSENSE_VALID (1<<0) 872 #define MPI_SCSIIO_ERR_STATE_AUTOSENSE_FAILED (1<<2) 873 #define MPI_SCSIIO_ERR_STATE_NO_SCSI_STATUS (1<<3) 874 #define MPI_SCSIIO_ERR_STATE_TERMINATED (1<<4) 875 #define MPI_SCSIIO_ERR_STATE_RESPONSE_INFO_VALID (1<<5) 876 #define MPI_SCSIIO_ERR_STATE_QUEUE_TAG_REJECTED (1<<6) 877 u_int16_t ioc_status; 878 879 u_int32_t ioc_loginfo; 880 881 u_int32_t transfer_count; 882 883 u_int32_t sense_count; 884 885 u_int32_t response_info; 886 887 u_int16_t tag; 888 u_int16_t reserved2; 889 } __packed __aligned(4); 890 891 struct mpi_msg_scsi_task_request { 892 u_int8_t target_id; 893 u_int8_t bus; 894 u_int8_t chain_offset; 895 u_int8_t function; 896 897 u_int8_t reserved1; 898 u_int8_t task_type; 899 #define MPI_MSG_SCSI_TASK_TYPE_ABORT_TASK (0x01) 900 #define MPI_MSG_SCSI_TASK_TYPE_ABRT_TASK_SET (0x02) 901 #define MPI_MSG_SCSI_TASK_TYPE_TARGET_RESET (0x03) 902 #define MPI_MSG_SCSI_TASK_TYPE_RESET_BUS (0x04) 903 #define MPI_MSG_SCSI_TASK_TYPE_LOGICAL_UNIT_RESET (0x05) 904 u_int8_t reserved2; 905 u_int8_t msg_flags; 906 907 u_int32_t msg_context; 908 909 u_int16_t lun[4]; 910 911 u_int32_t reserved3[7]; /* wtf? */ 912 913 u_int32_t target_msg_context; 914 } __packed __aligned(4); 915 916 struct mpi_msg_scsi_task_reply { 917 u_int8_t target_id; 918 u_int8_t bus; 919 u_int8_t msg_length; 920 u_int8_t function; 921 922 u_int8_t response_code; 923 u_int8_t task_type; 924 u_int8_t reserved1; 925 u_int8_t msg_flags; 926 927 u_int32_t msg_context; 928 929 u_int16_t reserved2; 930 u_int16_t ioc_status; 931 932 u_int32_t ioc_loginfo; 933 934 u_int32_t termination_count; 935 } __packed __aligned(4); 936 937 struct mpi_msg_raid_action_request { 938 u_int8_t action; 939 #define MPI_MSG_RAID_ACTION_STATUS (0x00) 940 #define MPI_MSG_RAID_ACTION_INDICATOR_STRUCT (0x01) 941 #define MPI_MSG_RAID_ACTION_CREATE_VOLUME (0x02) 942 #define MPI_MSG_RAID_ACTION_DELETE_VOLUME (0x03) 943 #define MPI_MSG_RAID_ACTION_DISABLE_VOLUME (0x04) 944 #define MPI_MSG_RAID_ACTION_ENABLE_VOLUME (0x05) 945 #define MPI_MSG_RAID_ACTION_QUIESCE_PHYSIO (0x06) 946 #define MPI_MSG_RAID_ACTION_ENABLE_PHYSIO (0x07) 947 #define MPI_MSG_RAID_ACTION_CH_VOL_SETTINGS (0x08) 948 #define MPI_MSG_RAID_ACTION_PHYSDISK_OFFLINE (0x0a) 949 #define MPI_MSG_RAID_ACTION_PHYSDISK_ONLINE (0x0b) 950 #define MPI_MSG_RAID_ACTION_CH_PHYSDISK_SETTINGS (0x0c) 951 #define MPI_MSG_RAID_ACTION_CREATE_PHYSDISK (0x0d) 952 #define MPI_MSG_RAID_ACTION_DELETE_PHYSDISK (0x0e) 953 #define MPI_MSG_RAID_ACTION_PHYSDISK_FAIL (0x0f) 954 #define MPI_MSG_RAID_ACTION_ACTIVATE_VOLUME (0x11) 955 #define MPI_MSG_RAID_ACTION_DEACTIVATE_VOLUME (0x12) 956 #define MPI_MSG_RAID_ACTION_SET_RESYNC_RATE (0x13) 957 #define MPI_MSG_RAID_ACTION_SET_SCRUB_RATE (0x14) 958 #define MPI_MSG_RAID_ACTION_DEVICE_FW_UPDATE_MODE (0x15) 959 #define MPI_MSG_RAID_ACTION_SET_VOL_NAME (0x16) 960 u_int8_t _reserved1; 961 u_int8_t chain_offset; 962 u_int8_t function; 963 964 u_int8_t vol_id; 965 u_int8_t vol_bus; 966 u_int8_t phys_disk_num; 967 u_int8_t message_flags; 968 969 u_int32_t msg_context; 970 971 u_int32_t _reserved2; 972 973 u_int32_t data_word; 974 u_int32_t data_sge; 975 } __packed __aligned(4); 976 977 struct mpi_msg_raid_action_reply { 978 u_int8_t action; 979 u_int8_t _reserved1; 980 u_int8_t message_length; 981 u_int8_t function; 982 983 u_int8_t vol_id; 984 u_int8_t vol_bus; 985 u_int8_t phys_disk_num; 986 u_int8_t message_flags; 987 988 u_int32_t message_context; 989 990 u_int16_t action_status; 991 #define MPI_RAID_ACTION_STATUS_OK (0x0000) 992 #define MPI_RAID_ACTION_STATUS_INVALID (0x0001) 993 #define MPI_RAID_ACTION_STATUS_FAILURE (0x0002) 994 #define MPI_RAID_ACTION_STATUS_IN_PROGRESS (0x0004) 995 u_int16_t ioc_status; 996 997 u_int32_t ioc_log_info; 998 999 u_int32_t volume_status; 1000 1001 u_int32_t action_data; 1002 } __packed __aligned(4); 1003 1004 struct mpi_cfg_hdr { 1005 u_int8_t page_version; 1006 u_int8_t page_length; 1007 u_int8_t page_number; 1008 u_int8_t page_type; 1009 #define MPI_CONFIG_REQ_PAGE_TYPE_ATTRIBUTE (0xf0) 1010 #define MPI_CONFIG_REQ_PAGE_TYPE_MASK (0x0f) 1011 #define MPI_CONFIG_REQ_PAGE_TYPE_IO_UNIT (0x00) 1012 #define MPI_CONFIG_REQ_PAGE_TYPE_IOC (0x01) 1013 #define MPI_CONFIG_REQ_PAGE_TYPE_BIOS (0x02) 1014 #define MPI_CONFIG_REQ_PAGE_TYPE_SCSI_SPI_PORT (0x03) 1015 #define MPI_CONFIG_REQ_PAGE_TYPE_SCSI_SPI_DEV (0x04) 1016 #define MPI_CONFIG_REQ_PAGE_TYPE_FC_PORT (0x05) 1017 #define MPI_CONFIG_REQ_PAGE_TYPE_FC_DEV (0x06) 1018 #define MPI_CONFIG_REQ_PAGE_TYPE_LAN (0x07) 1019 #define MPI_CONFIG_REQ_PAGE_TYPE_RAID_VOL (0x08) 1020 #define MPI_CONFIG_REQ_PAGE_TYPE_MANUFACTURING (0x09) 1021 #define MPI_CONFIG_REQ_PAGE_TYPE_RAID_PD (0x0A) 1022 #define MPI_CONFIG_REQ_PAGE_TYPE_INBAND (0x0B) 1023 #define MPI_CONFIG_REQ_PAGE_TYPE_EXTENDED (0x0F) 1024 } __packed __aligned(4); 1025 1026 struct mpi_ecfg_hdr { 1027 u_int8_t page_version; 1028 u_int8_t reserved1; 1029 u_int8_t page_number; 1030 u_int8_t page_type; 1031 1032 u_int16_t ext_page_length; 1033 u_int8_t ext_page_type; 1034 u_int8_t reserved2; 1035 } __packed __aligned(4); 1036 1037 struct mpi_msg_config_request { 1038 u_int8_t action; 1039 #define MPI_CONFIG_REQ_ACTION_PAGE_HEADER (0x00) 1040 #define MPI_CONFIG_REQ_ACTION_PAGE_READ_CURRENT (0x01) 1041 #define MPI_CONFIG_REQ_ACTION_PAGE_WRITE_CURRENT (0x02) 1042 #define MPI_CONFIG_REQ_ACTION_PAGE_DEFAULT (0x03) 1043 #define MPI_CONFIG_REQ_ACTION_PAGE_WRITE_NVRAM (0x04) 1044 #define MPI_CONFIG_REQ_ACTION_PAGE_READ_DEFAULT (0x05) 1045 #define MPI_CONFIG_REQ_ACTION_PAGE_READ_NVRAM (0x06) 1046 u_int8_t reserved1; 1047 u_int8_t chain_offset; 1048 u_int8_t function; 1049 1050 u_int16_t ext_page_len; 1051 u_int8_t ext_page_type; 1052 #define MPI_CONFIG_REQ_EXTPAGE_TYPE_SAS_IO_UNIT (0x10) 1053 #define MPI_CONFIG_REQ_EXTPAGE_TYPE_SAS_EXPANDER (0x11) 1054 #define MPI_CONFIG_REQ_EXTPAGE_TYPE_SAS_DEVICE (0x12) 1055 #define MPI_CONFIG_REQ_EXTPAGE_TYPE_SAS_PHY (0x13) 1056 #define MPI_CONFIG_REQ_EXTPAGE_TYPE_LOG (0x14) 1057 u_int8_t msg_flags; 1058 1059 u_int32_t msg_context; 1060 1061 u_int32_t reserved2[2]; 1062 1063 struct mpi_cfg_hdr config_header; 1064 1065 u_int32_t page_address; 1066 /* XXX lots of defns here */ 1067 1068 struct mpi_sge page_buffer; 1069 } __packed __aligned(4); 1070 1071 struct mpi_msg_config_reply { 1072 u_int8_t action; 1073 u_int8_t reserved1; 1074 u_int8_t msg_length; 1075 u_int8_t function; 1076 1077 u_int16_t ext_page_length; 1078 u_int8_t ext_page_type; 1079 u_int8_t msg_flags; 1080 1081 u_int32_t msg_context; 1082 1083 u_int16_t reserved2; 1084 u_int16_t ioc_status; 1085 1086 u_int32_t ioc_loginfo; 1087 1088 struct mpi_cfg_hdr config_header; 1089 } __packed __aligned(4); 1090 1091 struct mpi_cfg_spi_port_pg0 { 1092 struct mpi_cfg_hdr config_header; 1093 1094 u_int8_t capabilities1; 1095 #define MPI_CFG_SPI_PORT_0_CAPABILITIES_PACKETIZED (1<<0) 1096 #define MPI_CFG_SPI_PORT_0_CAPABILITIES_DT (1<<1) 1097 #define MPI_CFG_SPI_PORT_0_CAPABILITIES_QAS (1<<2) 1098 u_int8_t min_period; 1099 u_int8_t max_offset; 1100 u_int8_t capabilities2; 1101 #define MPI_CFG_SPI_PORT_0_CAPABILITIES_IDP (1<<3) 1102 #define MPI_CFG_SPI_PORT_0_CAPABILITIES_WIDTH (1<<5) 1103 #define MPI_CFG_SPI_PORT_0_CAPABILITIES_WIDTH_NARROW (0<<5) 1104 #define MPI_CFG_SPI_PORT_0_CAPABILITIES_WIDTH_WIDE (1<<5) 1105 #define MPI_CFG_SPI_PORT_0_CAPABILITIES_AIP (1<<7) 1106 1107 u_int8_t signalling_type; 1108 #define MPI_CFG_SPI_PORT_0_SIGNAL_HVD (0x1) 1109 #define MPI_CFG_SPI_PORT_0_SIGNAL_SE (0x2) 1110 #define MPI_CFG_SPI_PORT_0_SIGNAL_LVD (0x3) 1111 u_int16_t reserved; 1112 u_int8_t connected_id; 1113 #define MPI_CFG_SPI_PORT_0_CONNECTEDID_BUSFREE (0xfe) 1114 #define MPI_CFG_SPI_PORT_0_CONNECTEDID_UNKNOWN (0xff) 1115 } __packed __aligned(4); 1116 1117 struct mpi_cfg_spi_port_pg1 { 1118 struct mpi_cfg_hdr config_header; 1119 1120 /* configuration */ 1121 u_int8_t port_scsi_id; 1122 u_int8_t reserved1; 1123 u_int16_t port_resp_ids; 1124 1125 u_int32_t on_bus_timer_value; 1126 1127 u_int8_t target_config; 1128 #define MPI_CFG_SPI_PORT_1_TARGCFG_TARGET_ONLY (0x01) 1129 #define MPI_CFG_SPI_PORT_1_TARGCFG_INIT_TARGET (0x02) 1130 u_int8_t reserved2; 1131 u_int16_t id_config; 1132 } __packed __aligned(4); 1133 1134 struct mpi_cfg_spi_port_pg2 { 1135 struct mpi_cfg_hdr config_header; 1136 1137 u_int32_t port_flags; 1138 #define MPI_CFG_SPI_PORT_2_PORT_FLAGS_SCAN_HI2LOW (1<<0) 1139 #define MPI_CFG_SPI_PORT_2_PORT_FLAGS_AVOID_RESET (1<<2) 1140 #define MPI_CFG_SPI_PORT_2_PORT_FLAGS_ALT_CHS (1<<3) 1141 #define MPI_CFG_SPI_PORT_2_PORT_FLAGS_TERM_DISABLED (1<<4) 1142 #define MPI_CFG_SPI_PORT_2_PORT_FLAGS_DV_CTL (0x3<<5) 1143 #define MPI_CFG_SPI_PORT_2_PORT_FLAGS_DV_HOST_BE (0x0<<5) 1144 #define MPI_CFG_SPI_PORT_2_PORT_FLAGS_DV_HOST_B (0x1<<5) 1145 #define MPI_CFG_SPI_PORT_2_PORT_FLAGS_DV_HOST_NONE (0x3<<5) 1146 1147 u_int32_t port_settings; 1148 #define MPI_CFG_SPI_PORT_2_PORT_SET_HOST_ID (0x7<<0) 1149 #define MPI_CFG_SPI_PORT_2_PORT_SET_INIT_HBA (0x3<<4) 1150 #define MPI_CFG_SPI_PORT_2_PORT_SET_INIT_HBA_DISABLED (0x0<<4) 1151 #define MPI_CFG_SPI_PORT_2_PORT_SET_INIT_HBA_BIOS (0x1<<4) 1152 #define MPI_CFG_SPI_PORT_2_PORT_SET_INIT_HBA_OS (0x2<<4) 1153 #define MPI_CFG_SPI_PORT_2_PORT_SET_INIT_HBA_BIOS_OS (0x3<<4) 1154 #define MPI_CFG_SPI_PORT_2_PORT_SET_REMOVABLE (0x3<<6) 1155 #define MPI_CFG_SPI_PORT_2_PORT_SET_SPINUP_DELAY (0xf<<8) 1156 #define MPI_CFG_SPI_PORT_2_PORT_SET_SYNC (0x3<<12) 1157 #define MPI_CFG_SPI_PORT_2_PORT_SET_NEG_SUPPORTED (0x0<<12) 1158 #define MPI_CFG_SPI_PORT_2_PORT_SET_NEG_NONE (0x1<<12) 1159 #define MPI_CFG_SPI_PORT_2_PORT_SET_NEG_ALL (0x3<<12) 1160 1161 struct { 1162 u_int8_t timeout; 1163 u_int8_t sync_factor; 1164 u_int16_t device_flags; 1165 #define MPI_CFG_SPI_PORT_2_DEV_FLAG_DISCONNECT_EN (1<<0) 1166 #define MPI_CFG_SPI_PORT_2_DEV_FLAG_SCAN_ID_EN (1<<1) 1167 #define MPI_CFG_SPI_PORT_2_DEV_FLAG_SCAN_LUN_EN (1<<2) 1168 #define MPI_CFG_SPI_PORT_2_DEV_FLAG_TAQ_Q_EN (1<<3) 1169 #define MPI_CFG_SPI_PORT_2_DEV_FLAG_WIDE_DIS (1<<4) 1170 #define MPI_CFG_SPI_PORT_2_DEV_FLAG_BOOT_CHOICE (1<<5) 1171 } __packed device_settings[16]; 1172 }; 1173 1174 struct mpi_cfg_spi_dev_pg0 { 1175 struct mpi_cfg_hdr config_header; 1176 1177 u_int8_t neg_params1; 1178 #define MPI_CFG_SPI_DEV_0_NEGPARAMS_PACKETIZED (1<<0) 1179 #define MPI_CFG_SPI_DEV_0_NEGPARAMS_DUALXFERS (1<<1) 1180 #define MPI_CFG_SPI_DEV_0_NEGPARAMS_QAS (1<<2) 1181 #define MPI_CFG_SPI_DEV_0_NEGPARAMS_HOLD_MCS (1<<3) 1182 #define MPI_CFG_SPI_DEV_0_NEGPARAMS_WR_FLOW (1<<4) 1183 #define MPI_CFG_SPI_DEV_0_NEGPARAMS_RD_STRM (1<<5) 1184 #define MPI_CFG_SPI_DEV_0_NEGPARAMS_RTI (1<<6) 1185 #define MPI_CFG_SPI_DEV_0_NEGPARAMS_PCOMP_EN (1<<7) 1186 u_int8_t neg_period; 1187 u_int8_t neg_offset; 1188 u_int8_t neg_params2; 1189 #define MPI_CFG_SPI_DEV_0_NEGPARAMS_IDP_EN (1<<3) 1190 #define MPI_CFG_SPI_DEV_0_NEGPARAMS_WIDTH (1<<5) 1191 #define MPI_CFG_SPI_DEV_0_NEGPARAMS_WIDTH_NARROW (0<<5) 1192 #define MPI_CFG_SPI_DEV_0_NEGPARAMS_WIDTH_WIDE (1<<5) 1193 #define MPI_CFG_SPI_DEV_0_NEGPARAMS_AIP (1<<7) 1194 1195 u_int32_t information; 1196 #define MPI_CFG_SPI_DEV_0_INFO_NEG_OCCURRED (1<<0) 1197 #define MPI_CFG_SPI_DEV_0_INFO_SDTR_REJECTED (1<<1) 1198 #define MPI_CFG_SPI_DEV_0_INFO_WDTR_REJECTED (1<<2) 1199 #define MPI_CFG_SPI_DEV_0_INFO_PPR_REJECTED (1<<3) 1200 } __packed __aligned(4); 1201 1202 struct mpi_cfg_spi_dev_pg1 { 1203 struct mpi_cfg_hdr config_header; 1204 1205 u_int8_t req_params1; 1206 #define MPI_CFG_SPI_DEV_1_REQPARAMS_PACKETIZED (1<<0) 1207 #define MPI_CFG_SPI_DEV_1_REQPARAMS_DUALXFERS (1<<1) 1208 #define MPI_CFG_SPI_DEV_1_REQPARAMS_QAS (1<<2) 1209 #define MPI_CFG_SPI_DEV_1_REQPARAMS_HOLD_MCS (1<<3) 1210 #define MPI_CFG_SPI_DEV_1_REQPARAMS_WR_FLOW (1<<4) 1211 #define MPI_CFG_SPI_DEV_1_REQPARAMS_RD_STRM (1<<5) 1212 #define MPI_CFG_SPI_DEV_1_REQPARAMS_RTI (1<<6) 1213 #define MPI_CFG_SPI_DEV_1_REQPARAMS_PCOMP_EN (1<<7) 1214 u_int8_t req_period; 1215 u_int8_t req_offset; 1216 u_int8_t req_params2; 1217 #define MPI_CFG_SPI_DEV_1_REQPARAMS_IDP_EN (1<<3) 1218 #define MPI_CFG_SPI_DEV_1_REQPARAMS_WIDTH (1<<5) 1219 #define MPI_CFG_SPI_DEV_1_REQPARAMS_WIDTH_NARROW (0<<5) 1220 #define MPI_CFG_SPI_DEV_1_REQPARAMS_WIDTH_WIDE (1<<5) 1221 #define MPI_CFG_SPI_DEV_1_REQPARAMS_AIP (1<<7) 1222 1223 u_int32_t reserved; 1224 1225 u_int32_t configuration; 1226 #define MPI_CFG_SPI_DEV_1_CONF_WDTR_DISALLOWED (1<<1) 1227 #define MPI_CFG_SPI_DEV_1_CONF_SDTR_DISALLOWED (1<<2) 1228 #define MPI_CFG_SPI_DEV_1_CONF_EXTPARAMS (1<<3) 1229 #define MPI_CFG_SPI_DEV_1_CONF_FORCE_PPR (1<<4) 1230 } __packed __aligned(4); 1231 1232 struct mpi_cfg_spi_dev_pg2 { 1233 struct mpi_cfg_hdr config_header; 1234 1235 u_int32_t domain_validation; 1236 #define MPI_CFG_SPI_DEV_2_DV_ISI_ENABLED (1<<4) 1237 #define MPI_CFG_SPI_DEV_2_DV_SECONDARY_DRV_EN (1<<5) 1238 #define MPI_CFG_SPI_DEV_2_DV_SLEW_RATE_CTL (0x7<<7) 1239 #define MPI_CFG_SPI_DEV_2_DV_PRIMARY_DRV_STRENGTH (0x7<<10) 1240 #define MPI_CFG_SPI_DEV_2_DV_XCLKH_ST (1<<28) 1241 #define MPI_CFG_SPI_DEV_2_DV_XCLKS_ST (1<<29) 1242 #define MPI_CFG_SPI_DEV_2_DV_XCLKH_DT (1<<30) 1243 #define MPI_CFG_SPI_DEV_2_DV_XCLKS_DT (1<<31) 1244 1245 u_int32_t parity_pipe_select; 1246 #define MPI_CFG_SPI_DEV_2_PARITY_PIPE_SELECT (0x3) 1247 1248 u_int32_t data_pipe_select; 1249 #define MPI_CFG_SPI_DEV_2_DATA_PIPE_SELECT(x) (0x3<<((x)*2)) 1250 1251 } __packed __aligned(4); 1252 1253 struct mpi_cfg_spi_dev_pg3 { 1254 struct mpi_cfg_hdr config_header; 1255 1256 u_int16_t msg_reject_count; 1257 u_int16_t phase_error_count; 1258 1259 u_int16_t parity_error_count; 1260 u_int16_t reserved; 1261 } __packed __aligned(4); 1262 1263 struct mpi_cfg_manufacturing_pg0 { 1264 struct mpi_cfg_hdr config_header; 1265 1266 char chip_name[16]; 1267 char chip_revision[8]; 1268 char board_name[16]; 1269 char board_assembly[16]; 1270 char board_tracer_number[16]; 1271 } __packed __aligned(4); 1272 1273 struct mpi_cfg_ioc_pg1 { 1274 struct mpi_cfg_hdr config_header; 1275 1276 u_int32_t flags; 1277 #define MPI_CFG_IOC_1_REPLY_COALESCING (1<<0) 1278 #define MPI_CFG_IOC_1_CTX_REPLY_DISABLE (1<<4) 1279 1280 u_int32_t coalescing_timeout; 1281 1282 u_int8_t coalescing_depth; 1283 u_int8_t pci_slot_num; 1284 u_int8_t _reserved[2]; 1285 } __packed __aligned(4); 1286 1287 struct mpi_cfg_ioc_pg2 { 1288 struct mpi_cfg_hdr config_header; 1289 1290 u_int32_t capabilities; 1291 #define MPI_CFG_IOC_2_CAPABILITIES_IS (1<<0) 1292 #define MPI_CFG_IOC_2_CAPABILITIES_IME (1<<1) 1293 #define MPI_CFG_IOC_2_CAPABILITIES_IM (1<<2) 1294 #define MPI_CFG_IOC_2_CAPABILITIES_RAID ( \ 1295 MPI_CFG_IOC_2_CAPABILITIES_IS | MPI_CFG_IOC_2_CAPABILITIES_IME | \ 1296 MPI_CFG_IOC_2_CAPABILITIES_IM) 1297 #define MPI_CFG_IOC_2_CAPABILITIES_SES (1<<29) 1298 #define MPI_CFG_IOC_2_CAPABILITIES_SAFTE (1<<30) 1299 #define MPI_CFG_IOC_2_CAPABILITIES_XCHANNEL (1<<31) 1300 1301 u_int8_t active_vols; 1302 u_int8_t max_vols; 1303 u_int8_t active_physdisks; 1304 u_int8_t max_physdisks; 1305 1306 /* followed by a list of mpi_cfg_raid_vol structs */ 1307 } __packed __aligned(4); 1308 1309 struct mpi_cfg_raid_vol { 1310 u_int8_t vol_id; 1311 u_int8_t vol_bus; 1312 u_int8_t vol_ioc; 1313 u_int8_t vol_page; 1314 1315 u_int8_t vol_type; 1316 #define MPI_CFG_RAID_TYPE_RAID_IS (0x00) 1317 #define MPI_CFG_RAID_TYPE_RAID_IME (0x01) 1318 #define MPI_CFG_RAID_TYPE_RAID_IM (0x02) 1319 #define MPI_CFG_RAID_TYPE_RAID_5 (0x03) 1320 #define MPI_CFG_RAID_TYPE_RAID_6 (0x04) 1321 #define MPI_CFG_RAID_TYPE_RAID_10 (0x05) 1322 #define MPI_CFG_RAID_TYPE_RAID_50 (0x06) 1323 u_int8_t flags; 1324 #define MPI_CFG_RAID_VOL_INACTIVE (1<<3) 1325 u_int16_t reserved; 1326 } __packed __aligned(4); 1327 1328 struct mpi_cfg_ioc_pg3 { 1329 struct mpi_cfg_hdr config_header; 1330 1331 u_int8_t no_phys_disks; 1332 u_int8_t reserved[3]; 1333 1334 /* followed by a list of mpi_cfg_raid_physdisk structs */ 1335 } __packed __aligned(4); 1336 1337 struct mpi_cfg_raid_physdisk { 1338 u_int8_t phys_disk_id; 1339 u_int8_t phys_disk_bus; 1340 u_int8_t phys_disk_ioc; 1341 u_int8_t phys_disk_num; 1342 } __packed __aligned(4); 1343 1344 struct mpi_cfg_fc_port_pg0 { 1345 struct mpi_cfg_hdr config_header; 1346 1347 u_int32_t flags; 1348 1349 u_int8_t mpi_port_nr; 1350 u_int8_t link_type; 1351 u_int8_t port_state; 1352 u_int8_t reserved1; 1353 1354 u_int32_t port_id; 1355 1356 u_int64_t wwnn; 1357 1358 u_int64_t wwpn; 1359 1360 u_int32_t supported_service_class; 1361 1362 u_int32_t supported_speeds; 1363 1364 u_int32_t current_speed; 1365 1366 u_int32_t max_frame_size; 1367 1368 u_int64_t fabric_wwnn; 1369 1370 u_int64_t fabric_wwpn; 1371 1372 u_int32_t discovered_port_count; 1373 1374 u_int32_t max_initiators; 1375 1376 u_int8_t max_aliases_supported; 1377 u_int8_t max_hard_aliases_supported; 1378 u_int8_t num_current_aliases; 1379 u_int8_t reserved2; 1380 } __packed __aligned(4); 1381 1382 struct mpi_cfg_fc_port_pg1 { 1383 struct mpi_cfg_hdr config_header; 1384 1385 u_int32_t flags; 1386 #define MPI_CFG_FC_PORT_0_FLAGS_MAP_BY_D_ID (1<<0) 1387 #define MPI_CFG_FC_PORT_0_FLAGS_MAINTAIN_LOGINS (1<<1) 1388 #define MPI_CFG_FC_PORT_0_FLAGS_PLOGI_AFTER_LOGO (1<<2) 1389 #define MPI_CFG_FC_PORT_0_FLAGS_SUPPRESS_PROT_REG (1<<3) 1390 #define MPI_CFG_FC_PORT_0_FLAGS_MASK_RR_TOV_UNITS (0x7<<4) 1391 #define MPI_CFG_FC_PORT_0_FLAGS_MASK_RR_TOV_UNIT_NONE (0x0<<4) 1392 #define MPI_CFG_FC_PORT_0_FLAGS_MASK_RR_TOV_UNIT_0_001_SEC (0x1<<4) 1393 #define MPI_CFG_FC_PORT_0_FLAGS_MASK_RR_TOV_UNIT_0_1_SEC (0x3<<4) 1394 #define MPI_CFG_FC_PORT_0_FLAGS_MASK_RR_TOV_UNIT_10_SEC (0x5<<4) 1395 #define MPI_CFG_FC_PORT_0_FLAGS_TGT_LARGE_CDB_EN (1<<7) 1396 #define MPI_CFG_FC_PORT_0_FLAGS_SOFT_ALPA_FALLBACK (1<<21) 1397 #define MPI_CFG_FC_PORT_0_FLAGS_PORT_OFFLINE (1<<22) 1398 #define MPI_CFG_FC_PORT_0_FLAGS_TGT_MODE_OXID (1<<23) 1399 #define MPI_CFG_FC_PORT_0_FLAGS_VERBOSE_RESCAN (1<<24) 1400 #define MPI_CFG_FC_PORT_0_FLAGS_FORCE_NOSEEPROM_WWNS (1<<25) 1401 #define MPI_CFG_FC_PORT_0_FLAGS_IMMEDIATE_ERROR (1<<26) 1402 #define MPI_CFG_FC_PORT_0_FLAGS_EXT_FCP_STATUS_EN (1<<27) 1403 #define MPI_CFG_FC_PORT_0_FLAGS_REQ_PROT_LOG_BUS_ADDR (1<<28) 1404 #define MPI_CFG_FC_PORT_0_FLAGS_REQ_PROT_LAN (1<<29) 1405 #define MPI_CFG_FC_PORT_0_FLAGS_REQ_PROT_TARGET (1<<30) 1406 #define MPI_CFG_FC_PORT_0_FLAGS_REQ_PROT_INITIATOR (1<<31) 1407 1408 u_int64_t noseepromwwnn; 1409 1410 u_int64_t noseepromwwpn; 1411 1412 u_int8_t hard_alpa; 1413 u_int8_t link_config; 1414 u_int8_t topology_config; 1415 u_int8_t alt_connector; 1416 1417 u_int8_t num_req_aliases; 1418 u_int8_t rr_tov; 1419 u_int8_t initiator_dev_to; 1420 u_int8_t initiator_lo_pend_to; 1421 } __packed __aligned(4); 1422 1423 struct mpi_cfg_fc_device_pg0 { 1424 struct mpi_cfg_hdr config_header; 1425 1426 u_int64_t wwnn; 1427 1428 u_int64_t wwpn; 1429 1430 u_int32_t port_id; 1431 1432 u_int8_t protocol; 1433 u_int8_t flags; 1434 #define MPI_CFG_FC_DEV_0_FLAGS_BUSADDR_VALID (1<<0) 1435 #define MPI_CFG_FC_DEV_0_FLAGS_PLOGI_INVALID (1<<1) 1436 #define MPI_CFG_FC_DEV_0_FLAGS_PRLI_INVALID (1<<2) 1437 u_int16_t bb_credit; 1438 1439 u_int16_t max_rx_frame_size; 1440 u_int8_t adisc_hard_alpa; 1441 u_int8_t port_nr; 1442 1443 u_int8_t fc_ph_low_version; 1444 u_int8_t fc_ph_high_version; 1445 u_int8_t current_target_id; 1446 u_int8_t current_bus; 1447 } __packed __aligned(4); 1448 1449 struct mpi_raid_settings { 1450 u_int16_t volume_settings; 1451 #define MPI_CFG_RAID_VOL_0_SETTINGS_WRITE_CACHE_EN (1<<0) 1452 #define MPI_CFG_RAID_VOL_0_SETTINGS_OFFLINE_SMART_ERR (1<<1) 1453 #define MPI_CFG_RAID_VOL_0_SETTINGS_OFFLINE_SMART (1<<2) 1454 #define MPI_CFG_RAID_VOL_0_SETTINGS_AUTO_SWAP (1<<3) 1455 #define MPI_CFG_RAID_VOL_0_SETTINGS_HI_PRI_RESYNC (1<<4) 1456 #define MPI_CFG_RAID_VOL_0_SETTINGS_PROD_SUFFIX (1<<5) 1457 #define MPI_CFG_RAID_VOL_0_SETTINGS_FAST_SCRUB (1<<6) /* obsolete */ 1458 #define MPI_CFG_RAID_VOL_0_SETTINGS_DEFAULTS (1<<15) 1459 u_int8_t hot_spare_pool; 1460 u_int8_t reserved2; 1461 } __packed __aligned(4); 1462 1463 struct mpi_cfg_raid_vol_pg0 { 1464 struct mpi_cfg_hdr config_header; 1465 1466 u_int8_t volume_id; 1467 u_int8_t volume_bus; 1468 u_int8_t volume_ioc; 1469 u_int8_t volume_type; 1470 1471 u_int8_t volume_status; 1472 #define MPI_CFG_RAID_VOL_0_STATUS_ENABLED (1<<0) 1473 #define MPI_CFG_RAID_VOL_0_STATUS_QUIESCED (1<<1) 1474 #define MPI_CFG_RAID_VOL_0_STATUS_RESYNCING (1<<2) 1475 #define MPI_CFG_RAID_VOL_0_STATUS_ACTIVE (1<<3) 1476 #define MPI_CFG_RAID_VOL_0_STATUS_BADBLOCK_FULL (1<<4) 1477 u_int8_t volume_state; 1478 #define MPI_CFG_RAID_VOL_0_STATE_OPTIMAL (0x00) 1479 #define MPI_CFG_RAID_VOL_0_STATE_DEGRADED (0x01) 1480 #define MPI_CFG_RAID_VOL_0_STATE_FAILED (0x02) 1481 #define MPI_CFG_RAID_VOL_0_STATE_MISSING (0x03) 1482 u_int16_t _reserved1; 1483 1484 struct mpi_raid_settings settings; 1485 1486 u_int32_t max_lba; 1487 1488 u_int32_t _reserved2; 1489 1490 u_int32_t stripe_size; 1491 1492 u_int32_t _reserved3; 1493 1494 u_int32_t _reserved4; 1495 1496 u_int8_t num_phys_disks; 1497 u_int8_t data_scrub_rate; 1498 u_int8_t resync_rate; 1499 u_int8_t inactive_status; 1500 #define MPI_CFG_RAID_VOL_0_INACTIVE_UNKNOWN (0x00) 1501 #define MPI_CFG_RAID_VOL_0_INACTIVE_STALE_META (0x01) 1502 #define MPI_CFG_RAID_VOL_0_INACTIVE_FOREIGN_VOL (0x02) 1503 #define MPI_CFG_RAID_VOL_0_INACTIVE_NO_RESOURCES (0x03) 1504 #define MPI_CFG_RAID_VOL_0_INACTIVE_CLONED_VOL (0x04) 1505 #define MPI_CFG_RAID_VOL_0_INACTIVE_INSUF_META (0x05) 1506 1507 /* followed by a list of mpi_cfg_raid_vol_pg0_physdisk structs */ 1508 } __packed __aligned(4); 1509 1510 struct mpi_cfg_raid_vol_pg0_physdisk { 1511 u_int16_t reserved; 1512 u_int8_t phys_disk_map; 1513 u_int8_t phys_disk_num; 1514 } __packed __aligned(4); 1515 1516 struct mpi_cfg_raid_vol_pg1 { 1517 struct mpi_cfg_hdr config_header; 1518 1519 u_int8_t volume_id; 1520 u_int8_t volume_bus; 1521 u_int8_t volume_ioc; 1522 u_int8_t reserved1; 1523 1524 u_int8_t guid[24]; 1525 1526 u_int8_t name[32]; 1527 1528 u_int64_t wwid; 1529 1530 u_int32_t reserved2; 1531 1532 u_int32_t reserved3; 1533 } __packed __aligned(4); 1534 1535 struct mpi_cfg_raid_physdisk_pg0 { 1536 struct mpi_cfg_hdr config_header; 1537 1538 u_int8_t phys_disk_id; 1539 u_int8_t phys_disk_bus; 1540 u_int8_t phys_disk_ioc; 1541 u_int8_t phys_disk_num; 1542 1543 u_int8_t enc_id; 1544 u_int8_t enc_bus; 1545 u_int8_t hot_spare_pool; 1546 u_int8_t enc_type; 1547 #define MPI_CFG_RAID_PHYDISK_0_ENCTYPE_NONE (0x0) 1548 #define MPI_CFG_RAID_PHYDISK_0_ENCTYPE_SAFTE (0x1) 1549 #define MPI_CFG_RAID_PHYDISK_0_ENCTYPE_SES (0x2) 1550 1551 u_int32_t reserved1; 1552 1553 u_int8_t ext_disk_id[8]; 1554 1555 u_int8_t disk_id[16]; 1556 1557 u_int8_t vendor_id[8]; 1558 1559 u_int8_t product_id[16]; 1560 1561 u_int8_t product_rev[4]; 1562 1563 u_int8_t info[32]; 1564 1565 u_int8_t phys_disk_status; 1566 #define MPI_CFG_RAID_PHYDISK_0_STATUS_OUTOFSYNC (1<<0) 1567 #define MPI_CFG_RAID_PHYDISK_0_STATUS_QUIESCED (1<<1) 1568 u_int8_t phys_disk_state; 1569 #define MPI_CFG_RAID_PHYDISK_0_STATE_ONLINE (0x00) 1570 #define MPI_CFG_RAID_PHYDISK_0_STATE_MISSING (0x01) 1571 #define MPI_CFG_RAID_PHYDISK_0_STATE_INCOMPAT (0x02) 1572 #define MPI_CFG_RAID_PHYDISK_0_STATE_FAILED (0x03) 1573 #define MPI_CFG_RAID_PHYDISK_0_STATE_INIT (0x04) 1574 #define MPI_CFG_RAID_PHYDISK_0_STATE_OFFLINE (0x05) 1575 #define MPI_CFG_RAID_PHYDISK_0_STATE_HOSTFAIL (0x06) 1576 #define MPI_CFG_RAID_PHYDISK_0_STATE_OTHER (0xff) 1577 u_int16_t reserved2; 1578 1579 u_int32_t max_lba; 1580 1581 u_int8_t error_cdb_byte; 1582 u_int8_t error_sense_key; 1583 u_int16_t reserved3; 1584 1585 u_int16_t error_count; 1586 u_int8_t error_asc; 1587 u_int8_t error_ascq; 1588 1589 u_int16_t smart_count; 1590 u_int8_t smart_asc; 1591 u_int8_t smart_ascq; 1592 } __packed __aligned(4); 1593 1594 struct mpi_cfg_raid_physdisk_pg1 { 1595 struct mpi_cfg_hdr config_header; 1596 1597 u_int8_t num_phys_disk_paths; 1598 u_int8_t phys_disk_num; 1599 u_int16_t reserved1; 1600 1601 u_int32_t reserved2; 1602 1603 /* followed by mpi_cfg_raid_physdisk_path structs */ 1604 } __packed __aligned(4); 1605 1606 struct mpi_cfg_raid_physdisk_path { 1607 u_int8_t phys_disk_id; 1608 u_int8_t phys_disk_bus; 1609 u_int16_t reserved1; 1610 1611 u_int64_t wwwid; 1612 1613 u_int64_t owner_wwid; 1614 1615 u_int8_t ownder_id; 1616 u_int8_t reserved2; 1617 u_int16_t flags; 1618 #define MPI_CFG_RAID_PHYDISK_PATH_INVALID (1<<0) 1619 #define MPI_CFG_RAID_PHYDISK_PATH_BROKEN (1<<1) 1620 } __packed __aligned(4); 1621 1622 struct mpi_cfg_sas_iou_pg0 { 1623 struct mpi_ecfg_hdr config_header; 1624 1625 u_int16_t nvdata_version_default; 1626 u_int16_t nvdata_version_persistent; 1627 1628 u_int8_t num_phys; 1629 u_int8_t _reserved1[3]; 1630 1631 /* followed by mpi_cfg_sas_iou_pg0_phy structs */ 1632 } __packed __aligned(4); 1633 1634 struct mpi_cfg_sas_iou_pg0_phy { 1635 u_int8_t port; 1636 u_int8_t port_flags; 1637 u_int8_t phy_flags; 1638 u_int8_t negotiated_link_rate; 1639 1640 u_int32_t controller_phy_dev_info; 1641 1642 u_int16_t attached_dev_handle; 1643 u_int16_t controller_dev_handle; 1644 1645 u_int32_t discovery_status; 1646 } __packed __aligned(4); 1647 1648 struct mpi_cfg_sas_iou_pg1 { 1649 struct mpi_ecfg_hdr config_header; 1650 1651 u_int16_t control_flags; 1652 u_int16_t max_sata_targets; 1653 1654 u_int16_t additional_control_flags; 1655 u_int16_t _reserved1; 1656 1657 u_int8_t num_phys; 1658 u_int8_t max_sata_q_depth; 1659 u_int8_t report_dev_missing_delay; 1660 u_int8_t io_dev_missing_delay; 1661 1662 /* followed by mpi_cfg_sas_iou_pg1_phy structs */ 1663 } __packed __aligned(4); 1664 1665 struct mpi_cfg_sas_iou_pg1_phy { 1666 u_int8_t port; 1667 u_int8_t port_flags; 1668 u_int8_t phy_flags; 1669 u_int8_t max_min_link_rate; 1670 1671 u_int32_t controller_phy_dev_info; 1672 1673 u_int16_t max_target_port_connect_time; 1674 u_int16_t _reserved1; 1675 } __packed __aligned(4); 1676 1677 #define MPI_CFG_SAS_DEV_ADDR_NEXT (0<<28) 1678 #define MPI_CFG_SAS_DEV_ADDR_BUS (1<<28) 1679 #define MPI_CFG_SAS_DEV_ADDR_HANDLE (2<<28) 1680 1681 struct mpi_cfg_sas_dev_pg0 { 1682 struct mpi_ecfg_hdr config_header; 1683 1684 u_int16_t slot; 1685 u_int16_t enc_handle; 1686 1687 u_int64_t sas_addr; 1688 1689 u_int16_t parent_dev_handle; 1690 u_int8_t phy_num; 1691 u_int8_t access_status; 1692 1693 u_int16_t dev_handle; 1694 u_int8_t target; 1695 u_int8_t bus; 1696 1697 u_int32_t device_info; 1698 #define MPI_CFG_SAS_DEV_0_DEVINFO_TYPE (0x7) 1699 #define MPI_CFG_SAS_DEV_0_DEVINFO_TYPE_NONE (0x0) 1700 #define MPI_CFG_SAS_DEV_0_DEVINFO_TYPE_END (0x1) 1701 #define MPI_CFG_SAS_DEV_0_DEVINFO_TYPE_EDGE_EXPANDER (0x2) 1702 #define MPI_CFG_SAS_DEV_0_DEVINFO_TYPE_FANOUT_EXPANDER (0x3) 1703 #define MPI_CFG_SAS_DEV_0_DEVINFO_SATA_HOST (1<<3) 1704 #define MPI_CFG_SAS_DEV_0_DEVINFO_SMP_INITIATOR (1<<4) 1705 #define MPI_CFG_SAS_DEV_0_DEVINFO_STP_INITIATOR (1<<5) 1706 #define MPI_CFG_SAS_DEV_0_DEVINFO_SSP_INITIATOR (1<<6) 1707 #define MPI_CFG_SAS_DEV_0_DEVINFO_SATA_DEVICE (1<<7) 1708 #define MPI_CFG_SAS_DEV_0_DEVINFO_SMP_TARGET (1<<8) 1709 #define MPI_CFG_SAS_DEV_0_DEVINFO_STP_TARGET (1<<9) 1710 #define MPI_CFG_SAS_DEV_0_DEVINFO_SSP_TARGET (1<<10) 1711 #define MPI_CFG_SAS_DEV_0_DEVINFO_DIRECT_ATTACHED (1<<11) 1712 #define MPI_CFG_SAS_DEV_0_DEVINFO_LSI_DEVICE (1<<12) 1713 #define MPI_CFG_SAS_DEV_0_DEVINFO_ATAPI_DEVICE (1<<13) 1714 #define MPI_CFG_SAS_DEV_0_DEVINFO_SEP_DEVICE (1<<14) 1715 1716 u_int16_t flags; 1717 #define MPI_CFG_SAS_DEV_0_FLAGS_DEV_PRESENT (1<<0) 1718 #define MPI_CFG_SAS_DEV_0_FLAGS_DEV_MAPPED (1<<1) 1719 #define MPI_CFG_SAS_DEV_0_FLAGS_DEV_MAPPED_PERSISTENT (1<<2) 1720 #define MPI_CFG_SAS_DEV_0_FLAGS_SATA_PORT_SELECTOR (1<<3) 1721 #define MPI_CFG_SAS_DEV_0_FLAGS_SATA_FUA (1<<4) 1722 #define MPI_CFG_SAS_DEV_0_FLAGS_SATA_NCQ (1<<5) 1723 #define MPI_CFG_SAS_DEV_0_FLAGS_SATA_SMART (1<<6) 1724 #define MPI_CFG_SAS_DEV_0_FLAGS_SATA_LBA48 (1<<7) 1725 #define MPI_CFG_SAS_DEV_0_FLAGS_UNSUPPORTED (1<<8) 1726 #define MPI_CFG_SAS_DEV_0_FLAGS_SATA_SETTINGS (1<<9) 1727 u_int8_t physical_port; 1728 u_int8_t reserved; 1729 } __packed __aligned(4); 1730