FreeBSD/Linux Kernel Cross Reference
sys/dev/ic/mpireg.h
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);
Cache object: d88e3c47506792b28323f8ac3072b8ed
|