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