xref: /netbsd/sys/dev/pci/mpiireg.h (revision 4b48710d)
1 /* $NetBSD: mpiireg.h,v 1.2 2018/12/03 22:34:36 bouyer Exp $ */
2 /*	$OpenBSD: mpiireg.h,v 1.13 2018/06/19 10:32:41 jmatthew Exp $	*/
3 /*
4  * Copyright (c) 2010 Mike Belopuhov
5  * Copyright (c) 2009 James Giannoules
6  * Copyright (c) 2005 - 2010 David Gwynne <dlg@openbsd.org>
7  * Copyright (c) 2005 - 2010 Marco Peereboom <marco@openbsd.org>
8  *
9  * Permission to use, copy, modify, and distribute this software for any
10  * purpose with or without fee is hereby granted, provided that the above
11  * copyright notice and this permission notice appear in all copies.
12  *
13  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
14  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
15  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
16  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
17  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
18  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
19  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20  */
21 
22 #define MPII_DOORBELL			(0x00)
23 /* doorbell read bits */
24 #define MPII_DOORBELL_STATE		(0xf<<28) /* ioc state */
25 #define  MPII_DOORBELL_STATE_RESET	(0x0<<28)
26 #define  MPII_DOORBELL_STATE_READY	(0x1<<28)
27 #define  MPII_DOORBELL_STATE_OPER	(0x2<<28)
28 #define  MPII_DOORBELL_STATE_FAULT	(0x4<<28)
29 #define  MPII_DOORBELL_INUSE		(0x1<<27) /* doorbell used */
30 #define MPII_DOORBELL_WHOINIT		(0x7<<24) /* last to reset ioc */
31 #define  MPII_DOORBELL_WHOINIT_NOONE	(0x0<<24) /* not initialized */
32 #define  MPII_DOORBELL_WHOINIT_SYSBIOS	(0x1<<24) /* system bios */
33 #define  MPII_DOORBELL_WHOINIT_ROMBIOS	(0x2<<24) /* rom bios */
34 #define  MPII_DOORBELL_WHOINIT_PCIPEER	(0x3<<24) /* pci peer */
35 #define  MPII_DOORBELL_WHOINIT_DRIVER	(0x4<<24) /* host driver */
36 #define  MPII_DOORBELL_WHOINIT_MANUFACT	(0x5<<24) /* manufacturing */
37 #define MPII_DOORBELL_FAULT		(0xffff<<0) /* fault code */
38 /* doorbell write bits */
39 #define MPII_DOORBELL_FUNCTION_SHIFT	(24)
40 #define MPII_DOORBELL_FUNCTION_MASK	(0xff << MPII_DOORBELL_FUNCTION_SHIFT)
41 #define MPII_DOORBELL_FUNCTION(x)	\
42     (((x) << MPII_DOORBELL_FUNCTION_SHIFT) & MPII_DOORBELL_FUNCTION_MASK)
43 #define MPII_DOORBELL_DWORDS_SHIFT	16
44 #define MPII_DOORBELL_DWORDS_MASK	(0xff << MPII_DOORBELL_DWORDS_SHIFT)
45 #define MPII_DOORBELL_DWORDS(x)		\
46     (((x) << MPII_DOORBELL_DWORDS_SHIFT) & MPII_DOORBELL_DWORDS_MASK)
47 #define MPII_DOORBELL_DATA_MASK		(0xffff)
48 
49 #define MPII_WRITESEQ			(0x04)
50 #define  MPII_WRITESEQ_KEY_VALUE_MASK	(0x0000000f) /* key value */
51 #define  MPII_WRITESEQ_FLUSH		(0x00)
52 #define  MPII_WRITESEQ_1		(0x0f)
53 #define  MPII_WRITESEQ_2		(0x04)
54 #define  MPII_WRITESEQ_3		(0x0b)
55 #define  MPII_WRITESEQ_4		(0x02)
56 #define  MPII_WRITESEQ_5		(0x07)
57 #define  MPII_WRITESEQ_6		(0x0d)
58 
59 #define MPII_HOSTDIAG			(0x08)
60 #define  MPII_HOSTDIAG_BDS_MASK		(0x00001800) /* boot device select */
61 #define   MPII_HOSTDIAG_BDS_DEFAULT	(0<<11)	/* default address map, flash */
62 #define   MPII_HOSTDIAG_BDS_HCDW	(1<<11)	/* host code and data window */
63 #define  MPII_HOSTDIAG_CLEARFBS		(1<<10) /* clear flash bad sig */
64 #define  MPII_HOSTDIAG_FORCE_HCB_ONBOOT (1<<9)	/* force host controlled boot */
65 #define  MPII_HOSTDIAG_HCB_MODE		(1<<8)	/* host controlled boot mode */
66 #define  MPII_HOSTDIAG_DWRE		(1<<7)	/* diag reg write enabled */
67 #define  MPII_HOSTDIAG_FBS		(1<<6)	/* flash bad sig */
68 #define  MPII_HOSTDIAG_RESET_HIST	(1<<5)	/* reset history */
69 #define  MPII_HOSTDIAG_DIAGWR_EN	(1<<4)	/* diagnostic write enabled */
70 #define  MPII_HOSTDIAG_RESET_ADAPTER	(1<<2)	/* reset adapter */
71 #define  MPII_HOSTDIAG_HOLD_IOC_RESET	(1<<1)	/* hold ioc in reset */
72 #define  MPII_HOSTDIAG_DIAGMEM_EN	(1<<0)	/* diag mem enable */
73 
74 #define MPII_DIAGRWDATA			(0x10)
75 
76 #define MPII_DIAGRWADDRLOW		(0x14)
77 
78 #define MPII_DIAGRWADDRHIGH		(0x18)
79 
80 #define MPII_INTR_STATUS		(0x30)
81 #define  MPII_INTR_STATUS_SYS2IOCDB	(1<<31) /* ioc written to by host */
82 #define  MPII_INTR_STATUS_RESET		(1<<30) /* physical ioc reset */
83 #define  MPII_INTR_STATUS_REPLY		(1<<3)	/* reply message interrupt */
84 #define  MPII_INTR_STATUS_IOC2SYSDB	(1<<0)	/* ioc write to doorbell */
85 
86 #define MPII_INTR_MASK			(0x34)
87 #define  MPII_INTR_MASK_RESET		(1<<30) /* ioc reset intr mask */
88 #define  MPII_INTR_MASK_REPLY		(1<<3)	/* reply message intr mask */
89 #define  MPII_INTR_MASK_DOORBELL	(1<<0)	/* doorbell interrupt mask */
90 
91 #define MPII_DCR_DATA			(0x38)
92 
93 #define MPII_DCR_ADDRESS		(0x3c)
94 
95 #define MPII_REPLY_FREE_HOST_INDEX	(0x48)
96 
97 #define MPII_REPLY_POST_HOST_INDEX	(0x6c)
98 
99 #define MPII_HCB_SIZE			(0x74)
100 
101 #define MPII_HCB_ADDRESS_LOW		(0x78)
102 #define MPII_HCB_ADDRESS_HIGH		(0x7c)
103 
104 #define MPII_REQ_DESCR_POST_LOW		(0xc0)
105 #define MPII_REQ_DESCR_POST_HIGH	(0xc4)
106 
107 /*
108  * Scatter Gather Lists
109  */
110 
111 #define MPII_SGE_FL_LAST		(0x1<<31) /* last element in segment */
112 #define MPII_SGE_FL_EOB			(0x1<<30) /* last element of buffer */
113 #define MPII_SGE_FL_TYPE		(0x3<<28) /* element type */
114  #define MPII_SGE_FL_TYPE_SIMPLE	(0x1<<28) /* simple element */
115  #define MPII_SGE_FL_TYPE_CHAIN		(0x3<<28) /* chain element */
116  #define MPII_SGE_FL_TYPE_XACTCTX	(0x0<<28) /* transaction context */
117 #define MPII_SGE_FL_LOCAL		(0x1<<27) /* local address */
118 #define MPII_SGE_FL_DIR			(0x1<<26) /* direction */
119  #define MPII_SGE_FL_DIR_OUT		(0x1<<26)
120  #define MPII_SGE_FL_DIR_IN		(0x0<<26)
121 #define MPII_SGE_FL_SIZE		(0x1<<25) /* address size */
122  #define MPII_SGE_FL_SIZE_32		(0x0<<25)
123  #define MPII_SGE_FL_SIZE_64		(0x1<<25)
124 #define MPII_SGE_FL_EOL			(0x1<<24) /* end of list */
125 
126 struct mpii_sge {
127 	u_int32_t		sg_hdr;
128 	u_int32_t		sg_addr_lo;
129 	u_int32_t		sg_addr_hi;
130 } __packed __aligned(4);
131 
132 /*
133  * SAS3 (IEEE) Scatter Gather Lists
134  */
135 
136 #define MPII_IEEE_SGE_ADDR_MASK		(0x03)
137 #define MPII_IEEE_SGE_ADDR_SYSTEM	(0x00)
138 #define MPII_IEEE_SGE_ADDR_IOCDDR	(0x01)
139 #define MPII_IEEE_SGE_ADDR_IOCPLB	(0x02)
140 #define MPII_IEEE_SGE_ADDR_IOCPLBNTA	(0x03)
141 #define MPII_IEEE_SGE_END_OF_LIST	(0x40)
142 #define MPII_IEEE_SGE_CHAIN_ELEMENT	(0x80)
143 
144 struct mpii_ieee_sge {
145 	u_int64_t		sg_addr;
146 	u_int32_t		sg_len;
147 	u_int16_t		_reserved;
148 	u_int8_t		sg_next_chain_offset;
149 	u_int8_t		sg_flags;
150 } __packed __aligned(8);
151 
152 struct mpii_fw_tce {
153 	u_int8_t		reserved1;
154 	u_int8_t		context_size;
155 	u_int8_t		details_length;
156 	u_int8_t		flags;
157 
158 	u_int32_t		reserved2;
159 
160 	u_int32_t		image_offset;
161 
162 	u_int32_t		image_size;
163 } __packed __aligned(4);
164 
165 /*
166  * Messages
167  */
168 
169 /* functions */
170 #define MPII_FUNCTION_SCSI_IO_REQUEST			(0x00)
171 #define MPII_FUNCTION_SCSI_TASK_MGMT			(0x01)
172 #define MPII_FUNCTION_IOC_INIT				(0x02)
173 #define MPII_FUNCTION_IOC_FACTS				(0x03)
174 #define MPII_FUNCTION_CONFIG				(0x04)
175 #define MPII_FUNCTION_PORT_FACTS			(0x05)
176 #define MPII_FUNCTION_PORT_ENABLE			(0x06)
177 #define MPII_FUNCTION_EVENT_NOTIFICATION		(0x07)
178 #define MPII_FUNCTION_EVENT_ACK				(0x08)
179 #define MPII_FUNCTION_FW_DOWNLOAD			(0x09)
180 #define MPII_FUNCTION_TARGET_CMD_BUFFER_POST		(0x0a)
181 #define MPII_FUNCTION_TARGET_ASSIST			(0x0b)
182 #define MPII_FUNCTION_TARGET_STATUS_SEND		(0x0c)
183 #define MPII_FUNCTION_TARGET_MODE_ABORT			(0x0d)
184 #define MPII_FUNCTION_FW_UPLOAD				(0x12)
185 
186 #define MPII_FUNCTION_RAID_ACTION			(0x15)
187 #define MPII_FUNCTION_RAID_SCSI_IO_PASSTHROUGH		(0x16)
188 
189 #define MPII_FUNCTION_TOOLBOX				(0x17)
190 
191 #define MPII_FUNCTION_SCSI_ENCLOSURE_PROCESSOR		(0x18)
192 
193 #define MPII_FUNCTION_SMP_PASSTHROUGH			(0x1a)
194 #define MPII_FUNCTION_SAS_IO_UNIT_CONTROL		(0x1b)
195 #define MPII_FUNCTION_SATA_PASSTHROUGH			(0x1c)
196 
197 #define MPII_FUNCTION_DIAG_BUFFER_POST			(0x1d)
198 #define MPII_FUNCTION_DIAG_RELEASE			(0x1e)
199 
200 #define MPII_FUNCTION_TARGET_CMD_BUF_BASE_POST		(0x24)
201 #define MPII_FUNCTION_TARGET_CMD_BUF_LIST_POST		(0x25)
202 
203 #define MPII_FUNCTION_IOC_MESSAGE_UNIT_RESET		(0x40)
204 #define MPII_FUNCTION_IO_UNIT_RESET			(0x41)
205 #define MPII_FUNCTION_HANDSHAKE				(0x42)
206 
207 /* Common IOCStatus values for all replies */
208 #define MPII_IOCSTATUS_MASK				(0x7fff)
209 #define  MPII_IOCSTATUS_SUCCESS				(0x0000)
210 #define  MPII_IOCSTATUS_INVALID_FUNCTION		(0x0001)
211 #define  MPII_IOCSTATUS_BUSY				(0x0002)
212 #define  MPII_IOCSTATUS_INVALID_SGL			(0x0003)
213 #define  MPII_IOCSTATUS_INTERNAL_ERROR			(0x0004)
214 #define  MPII_IOCSTATUS_INVALID_VPID			(0x0005)
215 #define  MPII_IOCSTATUS_INSUFFICIENT_RESOURCES		(0x0006)
216 #define  MPII_IOCSTATUS_INVALID_FIELD			(0x0007)
217 #define  MPII_IOCSTATUS_INVALID_STATE			(0x0008)
218 #define  MPII_IOCSTATUS_OP_STATE_NOT_SUPPORTED		(0x0009)
219 /* Config IOCStatus values */
220 #define  MPII_IOCSTATUS_CONFIG_INVALID_ACTION		(0x0020)
221 #define  MPII_IOCSTATUS_CONFIG_INVALID_TYPE		(0x0021)
222 #define  MPII_IOCSTATUS_CONFIG_INVALID_PAGE		(0x0022)
223 #define  MPII_IOCSTATUS_CONFIG_INVALID_DATA		(0x0023)
224 #define  MPII_IOCSTATUS_CONFIG_NO_DEFAULTS		(0x0024)
225 #define  MPII_IOCSTATUS_CONFIG_CANT_COMMIT		(0x0025)
226 /* SCSIIO Reply initiator values */
227 #define  MPII_IOCSTATUS_SCSI_RECOVERED_ERROR		(0x0040)
228 #define  MPII_IOCSTATUS_SCSI_INVALID_DEVHANDLE		(0x0042)
229 #define  MPII_IOCSTATUS_SCSI_DEVICE_NOT_THERE		(0x0043)
230 #define  MPII_IOCSTATUS_SCSI_DATA_OVERRUN		(0x0044)
231 #define  MPII_IOCSTATUS_SCSI_DATA_UNDERRUN		(0x0045)
232 #define  MPII_IOCSTATUS_SCSI_IO_DATA_ERROR		(0x0046)
233 #define  MPII_IOCSTATUS_SCSI_PROTOCOL_ERROR		(0x0047)
234 #define  MPII_IOCSTATUS_SCSI_TASK_TERMINATED		(0x0048)
235 #define  MPII_IOCSTATUS_SCSI_RESIDUAL_MISMATCH		(0x0049)
236 #define  MPII_IOCSTATUS_SCSI_TASK_MGMT_FAILED		(0x004a)
237 #define  MPII_IOCSTATUS_SCSI_IOC_TERMINATED		(0x004b)
238 #define  MPII_IOCSTATUS_SCSI_EXT_TERMINATED		(0x004c)
239 /* For use by SCSI Initiator and SCSI Target end-to-end data protection */
240 #define  MPII_IOCSTATUS_EEDP_GUARD_ERROR		(0x004d)
241 #define  MPII_IOCSTATUS_EEDP_REF_TAG_ERROR		(0x004e)
242 #define  MPII_IOCSTATUS_EEDP_APP_TAG_ERROR		(0x004f)
243 /* SCSI (SPI & FCP) target values */
244 #define  MPII_IOCSTATUS_TARGET_INVALID_IO_INDEX		(0x0062)
245 #define  MPII_IOCSTATUS_TARGET_ABORTED			(0x0063)
246 #define  MPII_IOCSTATUS_TARGET_NO_CONN_RETRYABLE	(0x0064)
247 #define  MPII_IOCSTATUS_TARGET_NO_CONNECTION		(0x0065)
248 #define  MPII_IOCSTATUS_TARGET_XFER_COUNT_MISMATCH	(0x006a)
249 #define  MPII_IOCSTATUS_TARGET_DATA_OFFSET_ERROR	(0x006d)
250 #define  MPII_IOCSTATUS_TARGET_TOO_MUCH_WRITE_DATA	(0x006e)
251 #define  MPII_IOCSTATUS_TARGET_IU_TOO_SHORT		(0x006f)
252 #define  MPII_IOCSTATUS_TARGET_ACK_NAK_TIMEOUT		(0x0070)
253 #define  MPII_IOCSTATUS_TARGET_NAK_RECEIVED		(0x0071)
254 /* Serial Attached SCSI values */
255 #define  MPII_IOCSTATUS_SAS_SMP_REQUEST_FAILED		(0x0090)
256 #define  MPII_IOCSTATUS_SAS_SMP_DATA_OVERRUN		(0x0091)
257 /* Diagnostic Tools values */
258 #define  MPII_IOCSTATUS_DIAGNOSTIC_RELEASED		(0x00a0)
259 
260 #define MPII_REP_IOCLOGINFO_TYPE			(0xf<<28)
261 #define MPII_REP_IOCLOGINFO_TYPE_NONE			(0x0<<28)
262 #define MPII_REP_IOCLOGINFO_TYPE_SCSI			(0x1<<28)
263 #define MPII_REP_IOCLOGINFO_TYPE_FC			(0x2<<28)
264 #define MPII_REP_IOCLOGINFO_TYPE_SAS			(0x3<<28)
265 #define MPII_REP_IOCLOGINFO_TYPE_ISCSI			(0x4<<28)
266 #define MPII_REP_IOCLOGINFO_DATA			(0x0fffffff)
267 
268 /* event notification types */
269 #define MPII_EVENT_NONE					(0x00)
270 #define MPII_EVENT_LOG_DATA				(0x01)
271 #define MPII_EVENT_STATE_CHANGE				(0x02)
272 #define MPII_EVENT_HARD_RESET_RECEIVED			(0x05)
273 #define MPII_EVENT_EVENT_CHANGE				(0x0a)
274 #define MPII_EVENT_TASK_SET_FULL			(0x0e)
275 #define MPII_EVENT_SAS_DEVICE_STATUS_CHANGE		(0x0f)
276 #define MPII_EVENT_IR_OPERATION_STATUS			(0x14)
277 #define MPII_EVENT_SAS_DISCOVERY			(0x16)
278 #define MPII_EVENT_SAS_BROADCAST_PRIMITIVE		(0x17)
279 #define MPII_EVENT_SAS_INIT_DEVICE_STATUS_CHANGE	(0x18)
280 #define MPII_EVENT_SAS_INIT_TABLE_OVERFLOW		(0x19)
281 #define MPII_EVENT_SAS_TOPOLOGY_CHANGE_LIST		(0x1c)
282 #define MPII_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE	(0x1d)
283 #define MPII_EVENT_IR_VOLUME				(0x1e)
284 #define MPII_EVENT_IR_PHYSICAL_DISK			(0x1f)
285 #define MPII_EVENT_IR_CONFIGURATION_CHANGE_LIST		(0x20)
286 #define MPII_EVENT_LOG_ENTRY_ADDED			(0x21)
287 
288 /* messages */
289 
290 #define MPII_WHOINIT_NOONE				(0x00)
291 #define MPII_WHOINIT_SYSTEM_BIOS			(0x01)
292 #define MPII_WHOINIT_ROM_BIOS				(0x02)
293 #define MPII_WHOINIT_PCI_PEER				(0x03)
294 #define MPII_WHOINIT_HOST_DRIVER			(0x04)
295 #define MPII_WHOINIT_MANUFACTURER			(0x05)
296 
297 /* default messages */
298 
299 struct mpii_msg_request {
300 	u_int8_t		reserved1;
301 	u_int8_t		reserved2;
302 	u_int8_t		chain_offset;
303 	u_int8_t		function;
304 
305 	u_int8_t		reserved3;
306 	u_int8_t		reserved4;
307 	u_int8_t		reserved5;
308 	u_int8_t		msg_flags;
309 
310 	u_int8_t		vp_id;
311 	u_int8_t		vf_id;
312 	u_int16_t		reserved6;
313 } __packed __aligned(4);
314 
315 struct mpii_msg_reply {
316 	u_int16_t		reserved1;
317 	u_int8_t		msg_length;
318 	u_int8_t		function;
319 
320 	u_int16_t		reserved2;
321 	u_int8_t		reserved3;
322 	u_int8_t		msg_flags;
323 
324 	u_int8_t		vp_id;
325 	u_int8_t		vf_if;
326 	u_int16_t		reserved4;
327 
328 	u_int16_t		reserved5;
329 	u_int16_t		ioc_status;
330 
331 	u_int32_t		ioc_loginfo;
332 } __packed __aligned(4);
333 
334 /* ioc init */
335 
336 struct mpii_msg_iocinit_request {
337 	u_int8_t		whoinit;
338 	u_int8_t		reserved1;
339 	u_int8_t		chain_offset;
340 	u_int8_t		function;
341 
342 	u_int16_t		reserved2;
343 	u_int8_t		reserved3;
344 	u_int8_t		msg_flags;
345 
346 	u_int8_t		vp_id;
347 	u_int8_t		vf_id;
348 	u_int16_t		reserved4;
349 
350 	u_int8_t		msg_version_min;
351 	u_int8_t		msg_version_maj;
352 	u_int8_t		hdr_version_unit;
353 	u_int8_t		hdr_version_dev;
354 
355 	u_int32_t		reserved5;
356 
357 	u_int32_t		reserved6;
358 
359 	u_int16_t		reserved7;
360 	u_int16_t		system_request_frame_size;
361 
362 	u_int16_t		reply_descriptor_post_queue_depth;
363 	u_int16_t		reply_free_queue_depth;
364 
365 	u_int32_t		sense_buffer_address_high;
366 
367 	u_int32_t		system_reply_address_high;
368 
369 	u_int32_t		system_request_frame_base_address_lo;
370 	u_int32_t		system_request_frame_base_address_hi;
371 
372 	u_int32_t		reply_descriptor_post_queue_address_lo;
373 	u_int32_t		reply_descriptor_post_queue_address_hi;
374 
375 	u_int32_t		reply_free_queue_address_lo;
376 	u_int32_t		reply_free_queue_address_hi;
377 
378 	u_int64_t		timestamp;
379 } __packed __aligned(4);
380 
381 struct mpii_msg_iocinit_reply {
382 	u_int8_t		whoinit;
383 	u_int8_t		reserved1;
384 	u_int8_t		msg_length;
385 	u_int8_t		function;
386 
387 	u_int16_t		reserved2;
388 	u_int8_t		reserved3;
389 	u_int8_t		msg_flags;
390 
391 	u_int8_t		vp_id;
392 	u_int8_t		vf_id;
393 	u_int16_t		reserved4;
394 
395 	u_int16_t		reserved5;
396 	u_int16_t		ioc_status;
397 
398 	u_int32_t		ioc_loginfo;
399 } __packed __aligned(4);
400 
401 struct mpii_msg_iocfacts_request {
402 	u_int16_t		reserved1;
403 	u_int8_t		chain_offset;
404 	u_int8_t		function;
405 
406 	u_int16_t		reserved2;
407 	u_int8_t		reserved3;
408 	u_int8_t		msg_flags;
409 
410 	u_int8_t		vp_id;
411 	u_int8_t		vf_id;
412 	u_int16_t		reserved4;
413 } __packed __aligned(4);
414 
415 struct mpii_msg_iocfacts_reply {
416 	u_int8_t		msg_version_min;
417 	u_int8_t		msg_version_maj;
418 	u_int8_t		msg_length;
419 	u_int8_t		function;
420 
421 	u_int8_t		header_version_dev;
422 	u_int8_t		header_version_unit;
423 	u_int8_t		ioc_number;
424 	u_int8_t		msg_flags;
425 
426 	u_int8_t		vp_id;
427 	u_int8_t		vf_id;
428 	u_int16_t		reserved1;
429 
430 	u_int16_t		ioc_exceptions;
431 #define MPII_IOCFACTS_EXCEPT_CONFIG_CHECKSUM_FAIL	(1<<0)
432 #define MPII_IOCFACTS_EXCEPT_RAID_CONFIG_INVALID	(1<<1)
433 #define MPII_IOCFACTS_EXCEPT_FW_CHECKSUM_FAIL		(1<<2)
434 #define MPII_IOCFACTS_EXCEPT_MANUFACT_CHECKSUM_FAIL	(1<<3)
435 #define MPII_IOCFACTS_EXCEPT_METADATA_UNSUPPORTED	(1<<4)
436 #define MPII_IOCFACTS_EXCEPT_IR_FOREIGN_CONFIG_MAC	(1<<8)
437 	/* XXX JPG BOOT_STATUS in bits[7:5] */
438 	/* XXX JPG all these #defines need to be fixed up */
439 	u_int16_t		ioc_status;
440 
441 	u_int32_t		ioc_loginfo;
442 
443 	u_int8_t		max_chain_depth;
444 	u_int8_t		whoinit;
445 	u_int8_t		number_of_ports;
446 	u_int8_t		reserved2;
447 
448 	u_int16_t		request_credit;
449 	u_int16_t		product_id;
450 
451 	u_int32_t		ioc_capabilities;
452 #define MPII_IOCFACTS_CAPABILITY_EVENT_REPLAY           (1<<13)
453 #define MPII_IOCFACTS_CAPABILITY_INTEGRATED_RAID        (1<<12)
454 #define MPII_IOCFACTS_CAPABILITY_TLR                    (1<<11)
455 #define MPII_IOCFACTS_CAPABILITY_MULTICAST              (1<<8)
456 #define MPII_IOCFACTS_CAPABILITY_BIDIRECTIONAL_TARGET   (1<<7)
457 #define MPII_IOCFACTS_CAPABILITY_EEDP                   (1<<6)
458 #define MPII_IOCFACTS_CAPABILITY_SNAPSHOT_BUFFER        (1<<4)
459 #define MPII_IOCFACTS_CAPABILITY_DIAG_TRACE_BUFFER      (1<<3)
460 #define MPII_IOCFACTS_CAPABILITY_TASK_SET_FULL_HANDLING (1<<2)
461 
462 	u_int8_t		fw_version_dev;
463 	u_int8_t		fw_version_unit;
464 	u_int8_t		fw_version_min;
465 	u_int8_t		fw_version_maj;
466 
467 	u_int16_t		ioc_request_frame_size;
468 	u_int16_t		reserved3;
469 
470 	u_int16_t		max_initiators;
471 	u_int16_t		max_targets;
472 
473 	u_int16_t		max_sas_expanders;
474 	u_int16_t		max_enclosures;
475 
476 	u_int16_t		protocol_flags;
477 	u_int16_t		high_priority_credit;
478 
479 	u_int16_t		max_reply_descriptor_post_queue_depth;
480 	u_int8_t		reply_frame_size;
481 	u_int8_t		max_volumes;
482 
483 	u_int16_t		max_dev_handle;
484 	u_int16_t		max_persistent_entries;
485 
486 	u_int32_t		reserved4;
487 } __packed __aligned(4);
488 
489 struct mpii_msg_portfacts_request {
490 	u_int16_t		reserved1;
491 	u_int8_t		chain_offset;
492 	u_int8_t		function;
493 
494 	u_int16_t		reserved2;
495 	u_int8_t		port_number;
496 	u_int8_t		msg_flags;
497 
498 	u_int8_t		vp_id;
499 	u_int8_t		vf_id;
500 	u_int16_t		reserved3;
501 } __packed __aligned(4);
502 
503 struct mpii_msg_portfacts_reply {
504 	u_int16_t		reserved1;
505 	u_int8_t		msg_length;
506 	u_int8_t		function;
507 
508 	u_int16_t		reserved2;
509 	u_int8_t		port_number;
510 	u_int8_t		msg_flags;
511 
512 	u_int8_t		vp_id;
513 	u_int8_t		vf_id;
514 	u_int16_t		reserved3;
515 
516 	u_int16_t		reserved4;
517 	u_int16_t		ioc_status;
518 
519 	u_int32_t		ioc_loginfo;
520 
521 	u_int8_t		reserved5;
522 	u_int8_t		port_type;
523 #define MPII_PORTFACTS_PORTTYPE_INACTIVE		(0x00)
524 #define MPII_PORTFACTS_PORTTYPE_FC			(0x10)
525 #define MPII_PORTFACTS_PORTTYPE_ISCSI			(0x20)
526 #define MPII_PORTFACTS_PORTTYPE_SAS_PHYSICAL		(0x30)
527 #define MPII_PORTFACTS_PORTTYPE_SAS_VIRTUAL		(0x31)
528 #define MPII_PORTFACTS_PORTTYPE_TRI_MODE		(0x40)
529 	u_int16_t		reserved6;
530 
531 	u_int16_t		max_posted_cmd_buffers;
532 	u_int16_t		reserved7;
533 } __packed __aligned(4);
534 
535 struct mpii_msg_portenable_request {
536 	u_int16_t		reserved1;
537 	u_int8_t		chain_offset;
538 	u_int8_t		function;
539 
540 	u_int8_t		reserved2;
541 	u_int8_t		port_flags;
542 	u_int8_t		reserved3;
543 	u_int8_t		msg_flags;
544 
545 	u_int8_t		vp_id;
546 	u_int8_t		vf_id;
547 	u_int16_t		reserved4;
548 } __packed __aligned(4);
549 
550 struct mpii_msg_portenable_reply {
551 	u_int16_t		reserved1;
552 	u_int8_t		msg_length;
553 	u_int8_t		function;
554 
555 	u_int8_t		reserved2;
556 	u_int8_t		port_flags;
557 	u_int8_t		reserved3;
558 	u_int8_t		msg_flags;
559 
560 	u_int8_t		vp_id;
561 	u_int8_t		vf_id;
562 	u_int16_t		reserved4;
563 
564 	u_int16_t		reserved5;
565 	u_int16_t		ioc_status;
566 
567 	u_int32_t		ioc_loginfo;
568 } __packed __aligned(4);
569 
570 struct mpii_msg_event_request {
571 	u_int16_t		reserved1;
572 	u_int8_t		chain_offset;
573 	u_int8_t		function;
574 
575 	u_int16_t		reserved2;
576 	u_int8_t		reserved3;
577 	u_int8_t		msg_flags;
578 
579 	u_int8_t		vp_id;
580 	u_int8_t		vf_id;
581 	u_int16_t		reserved4;
582 
583 	u_int32_t		reserved5;
584 
585 	u_int32_t		reserved6;
586 
587 	u_int32_t		event_masks[4];
588 
589 	u_int16_t		sas_broadcase_primitive_masks;
590 	u_int16_t		reserved7;
591 
592 	u_int32_t		reserved8;
593 } __packed __aligned(4);
594 
595 struct mpii_msg_event_reply {
596 	u_int16_t		event_data_length;
597 	u_int8_t		msg_length;
598 	u_int8_t		function;
599 
600 	u_int16_t		reserved1;
601 	u_int8_t		ack_required;
602 #define MPII_EVENT_ACK_REQUIRED				(0x01)
603 	u_int8_t		msg_flags;
604 #define MPII_EVENT_FLAGS_REPLY_KEPT			(1<<7)
605 
606 	u_int8_t		vp_id;
607 	u_int8_t		vf_id;
608 	u_int16_t		reserved2;
609 
610 	u_int16_t		reserved3;
611 	u_int16_t		ioc_status;
612 
613 	u_int32_t		ioc_loginfo;
614 
615 	u_int16_t		event;
616 	u_int16_t		reserved4;
617 
618 	u_int32_t		event_context;
619 
620 	/* event data follows */
621 } __packed __aligned(4);
622 
623 struct mpii_msg_eventack_request {
624 	u_int16_t		reserved1;
625 	u_int8_t		chain_offset;
626 	u_int8_t		function;
627 
628 	u_int8_t		reserved2[3];
629 	u_int8_t		msg_flags;
630 
631 	u_int8_t		vp_id;
632 	u_int8_t		vf_id;
633 	u_int16_t		reserved3;
634 
635 	u_int16_t		event;
636 	u_int16_t		reserved4;
637 
638 	u_int32_t		event_context;
639 } __packed __aligned(4);
640 
641 struct mpii_msg_eventack_reply {
642 	u_int16_t		reserved1;
643 	u_int8_t		msg_length;
644 	u_int8_t		function;
645 
646 	u_int8_t		reserved2[3];
647 	u_int8_t		msg_flags;
648 
649 	u_int8_t		vp_id;
650 	u_int8_t		vf_id;
651 	u_int16_t		reserved3;
652 
653 	u_int16_t		reserved4;
654 	u_int16_t		ioc_status;
655 
656 	u_int32_t		ioc_loginfo;
657 } __packed __aligned(4);
658 
659 struct mpii_msg_fwupload_request {
660 	u_int8_t		image_type;
661 #define MPII_FWUPLOAD_IMAGETYPE_IOC_FW			(0x00)
662 #define MPII_FWUPLOAD_IMAGETYPE_NV_FW			(0x01)
663 #define MPII_FWUPLOAD_IMAGETYPE_NV_BACKUP		(0x05)
664 #define MPII_FWUPLOAD_IMAGETYPE_NV_MANUFACTURING	(0x06)
665 #define MPII_FWUPLOAD_IMAGETYPE_NV_CONFIG_1		(0x07)
666 #define MPII_FWUPLOAD_IMAGETYPE_NV_CONFIG_2		(0x08)
667 #define MPII_FWUPLOAD_IMAGETYPE_NV_MEGARAID		(0x09)
668 #define MPII_FWUPLOAD_IMAGETYPE_NV_COMPLETE		(0x0a)
669 #define MPII_FWUPLOAD_IMAGETYPE_COMMON_BOOT_BLOCK	(0x0b)
670 	u_int8_t		reserved1;
671 	u_int8_t		chain_offset;
672 	u_int8_t		function;
673 
674 	u_int8_t		reserved2[3];
675 	u_int8_t		msg_flags;
676 
677 	u_int8_t		vp_id;
678 	u_int8_t		vf_id;
679 	u_int16_t		reserved3;
680 
681 	u_int32_t		reserved4;
682 
683 	u_int32_t		reserved5;
684 
685 	struct mpii_fw_tce	tce;
686 
687 	/* followed by an sgl */
688 } __packed __aligned(4);
689 
690 struct mpii_msg_fwupload_reply {
691 	u_int8_t		image_type;
692 	u_int8_t		reserved1;
693 	u_int8_t		msg_length;
694 	u_int8_t		function;
695 
696 	u_int8_t		reserved2[3];
697 	u_int8_t		msg_flags;
698 
699 	u_int8_t		vp_id;
700 	u_int8_t		vf_id;
701 	u_int16_t		reserved3;
702 
703 	u_int16_t		reserved4;
704 	u_int16_t		ioc_status;
705 
706 	u_int32_t		ioc_loginfo;
707 
708 	u_int32_t		actual_image_size;
709 } __packed __aligned(4);
710 
711 struct mpii_msg_scsi_io {
712 	u_int16_t		dev_handle;
713 	u_int8_t		chain_offset;
714 	u_int8_t		function;
715 
716 	u_int16_t		reserved1;
717 	u_int8_t		reserved2;
718 	u_int8_t		msg_flags;
719 
720 	u_int8_t		vp_id;
721 	u_int8_t		vf_id;
722 	u_int16_t		reserved3;
723 
724 	u_int32_t		sense_buffer_low_address;
725 
726 	u_int16_t		sgl_flags;
727 	u_int8_t		sense_buffer_length;
728 	u_int8_t		reserved4;
729 
730 	u_int8_t		sgl_offset0;
731 	u_int8_t		sgl_offset1;
732 	u_int8_t		sgl_offset2;
733 	u_int8_t		sgl_offset3;
734 
735 	u_int32_t		skip_count;
736 
737 	u_int32_t		data_length;
738 
739 	u_int32_t		bidirectional_data_length;
740 
741 	u_int16_t		io_flags;
742 	u_int16_t		eedp_flags;
743 
744 	u_int32_t		eedp_block_size;
745 
746 	u_int32_t		secondary_reference_tag;
747 
748 	u_int16_t		secondary_application_tag;
749 	u_int16_t		application_tag_translation_mask;
750 
751 	u_int16_t		lun[4];
752 
753 /* the following 16 bits are defined in MPI2 as the control field */
754 	u_int8_t		reserved5;
755 	u_int8_t		tagging;
756 #define MPII_SCSIIO_ATTR_SIMPLE_Q			(0x0)
757 #define MPII_SCSIIO_ATTR_HEAD_OF_Q			(0x1)
758 #define MPII_SCSIIO_ATTR_ORDERED_Q			(0x2)
759 #define MPII_SCSIIO_ATTR_ACA_Q				(0x4)
760 #define MPII_SCSIIO_ATTR_UNTAGGED			(0x5)
761 #define MPII_SCSIIO_ATTR_NO_DISCONNECT			(0x7)
762 	u_int8_t		reserved6;
763 	u_int8_t		direction;
764 #define MPII_SCSIIO_DIR_NONE				(0x0)
765 #define MPII_SCSIIO_DIR_WRITE				(0x1)
766 #define MPII_SCSIIO_DIR_READ				(0x2)
767 
768 #define	MPII_CDB_LEN					(32)
769 	u_int8_t		cdb[MPII_CDB_LEN];
770 
771 	/* followed by an sgl */
772 } __packed __aligned(4);
773 
774 struct mpii_msg_scsi_io_error {
775 	u_int16_t		dev_handle;
776 	u_int8_t		msg_length;
777 	u_int8_t		function;
778 
779 	u_int16_t		reserved1;
780 	u_int8_t		reserved2;
781 	u_int8_t		msg_flags;
782 
783 	u_int8_t		vp_id;
784 	u_int8_t		vf_id;
785 	u_int16_t		reserved3;
786 
787 	u_int8_t		scsi_status;
788 #define MPII_SCSIIO_STATUS_GOOD				(0x00)
789 #define MPII_SCSIIO_STATUS_CHECK_COND			(0x02)
790 #define MPII_SCSIIO_STATUS_COND_MET			(0x04)
791 #define MPII_SCSIIO_STATUS_BUSY				(0x08)
792 #define MPII_SCSIIO_STATUS_INTERMEDIATE			(0x10)
793 #define MPII_SCSIIO_STATUS_INTERMEDIATE_CONDMET		(0x14)
794 #define MPII_SCSIIO_STATUS_RESERVATION_CONFLICT		(0x18)
795 #define MPII_SCSIIO_STATUS_CMD_TERM			(0x22)
796 #define MPII_SCSIIO_STATUS_TASK_SET_FULL		(0x28)
797 #define MPII_SCSIIO_STATUS_ACA_ACTIVE			(0x30)
798 #define MPII_SCSIIO_STATUS_TASK_ABORTED			(0x40)
799 	u_int8_t		scsi_state;
800 #define MPII_SCSIIO_STATE_AUTOSENSE_VALID		(1<<0)
801 #define MPII_SCSIIO_STATE_AUTOSENSE_FAILED		(1<<1)
802 #define MPII_SCSIIO_STATE_NO_SCSI_STATUS		(1<<2)
803 #define MPII_SCSIIO_STATE_TERMINATED			(1<<3)
804 #define MPII_SCSIIO_STATE_RESPONSE_INFO_VALID		(1<<4)
805 	u_int16_t		ioc_status;
806 
807 	u_int32_t		ioc_loginfo;
808 
809 	u_int32_t		transfer_count;
810 
811 	u_int32_t		sense_count;
812 
813 	u_int32_t		response_info;
814 
815 	u_int16_t		task_tag;
816 	u_int16_t		reserved4;
817 
818 	u_int32_t		bidirectional_transfer_count;
819 
820 	u_int32_t		reserved5;
821 
822 	u_int32_t		reserved6;
823 } __packed __aligned(4);
824 
825 struct mpii_request_descr {
826 	u_int8_t		request_flags;
827 #define MPII_REQ_DESCR_TYPE_MASK			(0x0e)
828 #define MPII_REQ_DESCR_SCSI_IO				(0x00)
829 #define MPII_REQ_DESCR_SCSI_TARGET			(0x02)
830 #define MPII_REQ_DESCR_HIGH_PRIORITY			(0x06)
831 #define MPII_REQ_DESCR_DEFAULT				(0x08)
832 	u_int8_t		vf_id;
833 	u_int16_t		smid;
834 
835 	u_int16_t		lmid;
836 	u_int16_t		dev_handle;
837 } __packed __aligned(8);
838 
839 struct mpii_reply_descr {
840 	u_int8_t		reply_flags;
841 #define MPII_REPLY_DESCR_TYPE_MASK			(0x0f)
842 #define MPII_REPLY_DESCR_SCSI_IO_SUCCESS		(0x00)
843 #define MPII_REPLY_DESCR_ADDRESS_REPLY			(0x01)
844 #define MPII_REPLY_DESCR_TARGET_ASSIST_SUCCESS		(0x02)
845 #define MPII_REPLY_DESCR_TARGET_COMMAND_BUFFER		(0x03)
846 #define MPII_REPLY_DESCR_UNUSED				(0x0f)
847 	u_int8_t		vf_id;
848 	u_int16_t		smid;
849 
850 	union {
851 		u_int32_t	data;
852 		u_int32_t	frame_addr;	/* Address Reply */
853 	};
854 } __packed __aligned(8);
855 
856 struct mpii_request_header {
857 	u_int16_t		function_dependent1;
858 	u_int8_t		chain_offset;
859 	u_int8_t		function;
860 
861 	u_int16_t		function_dependent2;
862 	u_int8_t		function_dependent3;
863 	u_int8_t		message_flags;
864 
865 	u_int8_t		vp_id;
866 	u_int8_t		vf_id;
867 	u_int16_t		reserved;
868 } __packed __aligned(4);
869 
870 struct mpii_msg_scsi_task_request {
871 	u_int16_t		dev_handle;
872 	u_int8_t		chain_offset;
873 	u_int8_t		function;
874 
875 	u_int8_t		reserved1;
876 	u_int8_t		task_type;
877 #define MPII_SCSI_TASK_ABORT_TASK			(0x01)
878 #define MPII_SCSI_TASK_ABRT_TASK_SET			(0x02)
879 #define MPII_SCSI_TASK_TARGET_RESET			(0x03)
880 #define MPII_SCSI_TASK_RESET_BUS			(0x04)
881 #define MPII_SCSI_TASK_LOGICAL_UNIT_RESET		(0x05)
882 	u_int8_t		reserved2;
883 	u_int8_t		msg_flags;
884 
885 	u_int8_t		vp_id;
886 	u_int8_t		vf_id;
887 	u_int16_t		reserved3;
888 
889 	u_int16_t		lun[4];
890 
891 	u_int32_t		reserved4[7];
892 
893 	u_int16_t		task_mid;
894 	u_int16_t		reserved5;
895 } __packed __aligned(4);
896 
897 struct mpii_msg_scsi_task_reply {
898 	u_int16_t		dev_handle;
899 	u_int8_t		msg_length;
900 	u_int8_t		function;
901 
902 	u_int8_t		response_code;
903 	u_int8_t		task_type;
904 	u_int8_t		reserved1;
905 	u_int8_t		msg_flags;
906 
907 	u_int8_t		vp_id;
908 	u_int8_t		vf_id;
909 	u_int16_t		reserved2;
910 
911 	u_int16_t		reserved3;
912 	u_int16_t		ioc_status;
913 
914 	u_int32_t		ioc_loginfo;
915 
916 	u_int32_t		termination_count;
917 } __packed __aligned(4);
918 
919 struct mpii_msg_sas_oper_request {
920 	u_int8_t		operation;
921 #define MPII_SAS_OP_CLEAR_PERSISTENT		(0x02)
922 #define MPII_SAS_OP_PHY_LINK_RESET		(0x06)
923 #define MPII_SAS_OP_PHY_HARD_RESET		(0x07)
924 #define MPII_SAS_OP_PHY_CLEAR_ERROR_LOG		(0x08)
925 #define MPII_SAS_OP_SEND_PRIMITIVE		(0x0a)
926 #define MPII_SAS_OP_FORCE_FULL_DISCOVERY	(0x0b)
927 #define MPII_SAS_OP_TRANSMIT_PORT_SELECT	(0x0c)
928 #define MPII_SAS_OP_REMOVE_DEVICE		(0x0d)
929 #define MPII_SAS_OP_LOOKUP_MAPPING		(0x0e)
930 #define MPII_SAS_OP_SET_IOC_PARAM		(0x0f)
931 	u_int8_t		reserved1;
932 	u_int8_t		chain_offset;
933 	u_int8_t		function;
934 
935 	u_int16_t		dev_handle;
936 	u_int8_t		ioc_param;
937 	u_int8_t		msg_flags;
938 
939 	u_int8_t		vp_id;
940 	u_int8_t		vf_id;
941 	u_int16_t		reserved2;
942 
943 	u_int16_t		reserved3;
944 	u_int8_t		phy_num;
945 	u_int8_t		prim_flags;
946 
947 	u_int32_t		primitive;
948 
949 	u_int8_t		lookup_method;
950 #define MPII_SAS_LOOKUP_METHOD_SAS_ADDR		(0x01)
951 #define MPII_SAS_LOOKUP_METHOD_SAS_ENCL		(0x02)
952 #define MPII_SAS_LOOKUP_METHOD_SAS_DEVNAME	(0x03)
953 	u_int8_t		reserved4;
954 	u_int16_t		slot_num;
955 
956 	u_int64_t		lookup_addr;
957 
958 	u_int32_t		ioc_param_value;
959 
960 	u_int64_t		reserved5;
961 } __packed __aligned(4);
962 
963 struct mpii_msg_sas_oper_reply {
964 	u_int8_t		operation;
965 	u_int8_t		reserved1;
966 	u_int8_t		chain_offset;
967 	u_int8_t		function;
968 
969 	u_int16_t		dev_handle;
970 	u_int8_t		ioc_param;
971 	u_int8_t		msg_flags;
972 
973 	u_int8_t		vp_id;
974 	u_int8_t		vf_id;
975 	u_int16_t		reserved2;
976 
977 	u_int16_t		reserved3;
978 	u_int16_t		ioc_status;
979 
980 	u_int32_t		ioc_loginfo;
981 } __packed __aligned(4);
982 
983 struct mpii_msg_raid_action_request {
984 	u_int8_t	action;
985 #define MPII_RAID_ACTION_CHANGE_VOL_WRITE_CACHE	(0x17)
986 	u_int8_t	reserved1;
987 	u_int8_t	chain_offset;
988 	u_int8_t	function;
989 
990 	u_int16_t	vol_dev_handle;
991 	u_int8_t	phys_disk_num;
992 	u_int8_t	msg_flags;
993 
994 	u_int8_t	vp_id;
995 	u_int8_t	vf_if;
996 	u_int16_t	reserved2;
997 
998 	u_int32_t	reserved3;
999 
1000 	u_int32_t	action_data;
1001 #define MPII_RAID_VOL_WRITE_CACHE_MASK			(0x03)
1002 #define MPII_RAID_VOL_WRITE_CACHE_DISABLE		(0x01)
1003 #define MPII_RAID_VOL_WRITE_CACHE_ENABLE		(0x02)
1004 
1005 	struct mpii_sge	action_sge;
1006 } __packed __aligned(4);
1007 
1008 struct mpii_msg_raid_action_reply {
1009 	u_int8_t	action;
1010 	u_int8_t	reserved1;
1011 	u_int8_t	chain_offset;
1012 	u_int8_t	function;
1013 
1014 	u_int16_t	vol_dev_handle;
1015 	u_int8_t	phys_disk_num;
1016 	u_int8_t	msg_flags;
1017 
1018 	u_int8_t	vp_id;
1019 	u_int8_t	vf_if;
1020 	u_int16_t	reserved2;
1021 
1022 	u_int16_t	reserved3;
1023 	u_int16_t	ioc_status;
1024 
1025 	u_int32_t	action_data[5];
1026 } __packed __aligned(4);
1027 
1028 struct mpii_cfg_hdr {
1029 	u_int8_t		page_version;
1030 	u_int8_t		page_length;
1031 	u_int8_t		page_number;
1032 	u_int8_t		page_type;
1033 #define MPII_CONFIG_REQ_PAGE_TYPE_ATTRIBUTE		(0xf0)
1034 #define MPI2_CONFIG_PAGEATTR_READ_ONLY			(0x00)
1035 #define MPI2_CONFIG_PAGEATTR_CHANGEABLE			(0x10)
1036 #define MPI2_CONFIG_PAGEATTR_PERSISTENT			(0x20)
1037 
1038 #define MPII_CONFIG_REQ_PAGE_TYPE_MASK			(0x0f)
1039 #define MPII_CONFIG_REQ_PAGE_TYPE_IO_UNIT		(0x00)
1040 #define MPII_CONFIG_REQ_PAGE_TYPE_IOC			(0x01)
1041 #define MPII_CONFIG_REQ_PAGE_TYPE_BIOS			(0x02)
1042 #define MPII_CONFIG_REQ_PAGE_TYPE_RAID_VOL		(0x08)
1043 #define MPII_CONFIG_REQ_PAGE_TYPE_MANUFACTURING		(0x09)
1044 #define MPII_CONFIG_REQ_PAGE_TYPE_RAID_PD		(0x0a)
1045 #define MPII_CONFIG_REQ_PAGE_TYPE_EXTENDED		(0x0f)
1046 } __packed __aligned(4);
1047 
1048 struct mpii_ecfg_hdr {
1049 	u_int8_t		page_version;
1050 	u_int8_t		reserved1;
1051 	u_int8_t		page_number;
1052 	u_int8_t		page_type;
1053 
1054 	u_int16_t		ext_page_length;
1055 	u_int8_t		ext_page_type;
1056 #define MPII_CONFIG_REQ_PAGE_TYPE_SAS_DEVICE		(0x12)
1057 #define MPII_CONFIG_REQ_PAGE_TYPE_RAID_CONFIG		(0x16)
1058 #define MPII_CONFIG_REQ_PAGE_TYPE_DRIVER_MAPPING	(0x17)
1059 	u_int8_t		reserved2;
1060 } __packed __aligned(4);
1061 
1062 /* config page address formats */
1063 #define MPII_PGAD_SAS_DEVICE_FORM_MASK			(0xf0000000)
1064 #define MPII_PGAD_SAS_DEVICE_FORM_GET_NEXT_HANDLE	(0x00000000)
1065 #define MPII_PGAD_SAS_DEVICE_FORM_HANDLE		(0x20000000)
1066 
1067 #define MPII_PGAD_SAS_DEVICE_HANDLE_MASK		(0x0000ffff)
1068 
1069 struct mpii_msg_config_request {
1070 	u_int8_t		action;
1071 #define MPII_CONFIG_REQ_ACTION_PAGE_HEADER		(0x00)
1072 #define MPII_CONFIG_REQ_ACTION_PAGE_READ_CURRENT	(0x01)
1073 #define MPII_CONFIG_REQ_ACTION_PAGE_WRITE_CURRENT	(0x02)
1074 #define MPII_CONFIG_REQ_ACTION_PAGE_DEFAULT		(0x03)
1075 #define MPII_CONFIG_REQ_ACTION_PAGE_WRITE_NVRAM		(0x04)
1076 #define MPII_CONFIG_REQ_ACTION_PAGE_READ_DEFAULT	(0x05)
1077 #define MPII_CONFIG_REQ_ACTION_PAGE_READ_NVRAM		(0x06)
1078 	u_int8_t		sgl_flags;
1079 	u_int8_t		chain_offset;
1080 	u_int8_t		function;
1081 
1082 	u_int16_t		ext_page_len;
1083 	u_int8_t		ext_page_type;
1084 #define MPII_CONFIG_REQ_EXTPAGE_TYPE_SAS_IO_UNIT	(0x10)
1085 #define MPII_CONFIG_REQ_EXTPAGE_TYPE_SAS_EXPANDER	(0x11)
1086 #define MPII_CONFIG_REQ_EXTPAGE_TYPE_SAS_DEVICE		(0x12)
1087 #define MPII_CONFIG_REQ_EXTPAGE_TYPE_SAS_PHY		(0x13)
1088 #define MPII_CONFIG_REQ_EXTPAGE_TYPE_LOG		(0x14)
1089 #define MPI2_CONFIG_EXTPAGETYPE_ENCLOSURE		(0x15)
1090 #define MPI2_CONFIG_EXTPAGETYPE_RAID_CONFIG		(0x16)
1091 #define MPI2_CONFIG_EXTPAGETYPE_DRIVER_MAPPING		(0x17)
1092 #define MPI2_CONFIG_EXTPAGETYPE_SAS_PORT		(0x18)
1093 	u_int8_t		msg_flags;
1094 
1095 	u_int8_t		vp_id;
1096 	u_int8_t		vf_id;
1097 	u_int16_t		reserved1;
1098 
1099 	u_int32_t		reserved2[2];
1100 
1101 	struct mpii_cfg_hdr	config_header;
1102 
1103 	u_int32_t		page_address;
1104 /* XXX lots of defns here */
1105 
1106 	struct mpii_sge		page_buffer;
1107 } __packed __aligned(4);
1108 
1109 struct mpii_msg_config_reply {
1110 	u_int8_t		action;
1111 	u_int8_t		sgl_flags;
1112 	u_int8_t		msg_length;
1113 	u_int8_t		function;
1114 
1115 	u_int16_t		ext_page_length;
1116 	u_int8_t		ext_page_type;
1117 	u_int8_t		msg_flags;
1118 
1119 	u_int8_t		vp_id;
1120 	u_int8_t		vf_id;
1121 	u_int16_t		reserved1;
1122 
1123 	u_int16_t		reserved2;
1124 	u_int16_t		ioc_status;
1125 
1126 	u_int32_t		ioc_loginfo;
1127 
1128 	struct mpii_cfg_hdr	config_header;
1129 } __packed __aligned(4);
1130 
1131 struct mpii_cfg_manufacturing_pg0 {
1132 	struct mpii_cfg_hdr	config_header;
1133 
1134 	char			chip_name[16];
1135 	char			chip_revision[8];
1136 	char			board_name[16];
1137 	char			board_assembly[16];
1138 	char			board_tracer_number[16];
1139 } __packed __aligned(4);
1140 
1141 struct mpii_cfg_ioc_pg1 {
1142 	struct mpii_cfg_hdr     config_header;
1143 
1144 	u_int32_t       flags;
1145 
1146 	u_int32_t       coalescing_timeout;
1147 #define	MPII_CFG_IOC_1_REPLY_COALESCING			(1<<0)
1148 
1149 	u_int8_t        coalescing_depth;
1150 	u_int8_t        pci_slot_num;
1151 	u_int8_t        pci_bus_num;
1152 	u_int8_t        pci_domain_segment;
1153 
1154 	u_int32_t       reserved1;
1155 
1156 	u_int32_t       reserved2;
1157 } __packed __aligned(4);
1158 
1159 struct mpii_cfg_ioc_pg3 {
1160 	struct mpii_cfg_hdr	config_header;
1161 
1162 	u_int8_t		no_phys_disks;
1163 	u_int8_t		reserved[3];
1164 
1165 	/* followed by a list of mpii_cfg_raid_physdisk structs */
1166 } __packed __aligned(4);
1167 
1168 struct mpii_cfg_ioc_pg8 {
1169 	struct mpii_cfg_hdr	config_header;
1170 
1171 	u_int8_t		num_devs_per_enclosure;
1172 	u_int8_t		reserved1;
1173 	u_int16_t		reserved2;
1174 
1175 	u_int16_t		max_persistent_entries;
1176 	u_int16_t		max_num_physical_mapped_ids;
1177 
1178 	u_int16_t		flags;
1179 #define	MPII_IOC_PG8_FLAGS_DA_START_SLOT_1		(1<<5)
1180 #define MPII_IOC_PG8_FLAGS_RESERVED_TARGETID_0		(1<<4)
1181 #define MPII_IOC_PG8_FLAGS_MAPPING_MODE_MASK		(0x0000000e)
1182 #define MPII_IOC_PG8_FLAGS_DEVICE_PERSISTENCE_MAPPING	(0<<1)
1183 #define MPII_IOC_PG8_FLAGS_ENCLOSURE_SLOT_MAPPING	(1<<1)
1184 #define MPII_IOC_PG8_FLAGS_DISABLE_PERSISTENT_MAPPING	(1<<0)
1185 #define	MPII_IOC_PG8_FLAGS_ENABLE_PERSISTENT_MAPPING	(0<<0)
1186 	u_int16_t		reserved3;
1187 
1188 	u_int16_t		ir_volume_mapping_flags;
1189 #define	MPII_IOC_PG8_IRFLAGS_VOLUME_MAPPING_MODE_MASK	(0x00000003)
1190 #define	MPII_IOC_PG8_IRFLAGS_LOW_VOLUME_MAPPING		(0<<0)
1191 #define	MPII_IOC_PG8_IRFLAGS_HIGH_VOLUME_MAPPING	(1<<0)
1192 	u_int16_t		reserved4;
1193 
1194 	u_int32_t		reserved5;
1195 } __packed __aligned(4);
1196 
1197 struct mpii_cfg_raid_physdisk {
1198 	u_int8_t		phys_disk_id;
1199 	u_int8_t		phys_disk_bus;
1200 	u_int8_t		phys_disk_ioc;
1201 	u_int8_t		phys_disk_num;
1202 } __packed __aligned(4);
1203 
1204 struct mpii_cfg_fc_port_pg0 {
1205 	struct mpii_cfg_hdr	config_header;
1206 
1207 	u_int32_t		flags;
1208 
1209 	u_int8_t		mpii_port_nr;
1210 	u_int8_t		link_type;
1211 	u_int8_t		port_state;
1212 	u_int8_t		reserved1;
1213 
1214 	u_int32_t		port_id;
1215 
1216 	u_int64_t		wwnn;
1217 
1218 	u_int64_t		wwpn;
1219 
1220 	u_int32_t		supported_service_class;
1221 
1222 	u_int32_t		supported_speeds;
1223 
1224 	u_int32_t		current_speed;
1225 
1226 	u_int32_t		max_frame_size;
1227 
1228 	u_int64_t		fabric_wwnn;
1229 
1230 	u_int64_t		fabric_wwpn;
1231 
1232 	u_int32_t		discovered_port_count;
1233 
1234 	u_int32_t		max_initiators;
1235 
1236 	u_int8_t		max_aliases_supported;
1237 	u_int8_t		max_hard_aliases_supported;
1238 	u_int8_t		num_current_aliases;
1239 	u_int8_t		reserved2;
1240 } __packed __aligned(4);
1241 
1242 struct mpii_cfg_fc_port_pg1 {
1243 	struct mpii_cfg_hdr	config_header;
1244 
1245 	u_int32_t		flags;
1246 
1247 	u_int64_t		noseepromwwnn;
1248 
1249 	u_int64_t		noseepromwwpn;
1250 
1251 	u_int8_t		hard_alpa;
1252 	u_int8_t		link_config;
1253 	u_int8_t		topology_config;
1254 	u_int8_t		alt_connector;
1255 
1256 	u_int8_t		num_req_aliases;
1257 	u_int8_t		rr_tov;
1258 	u_int8_t		initiator_dev_to;
1259 	u_int8_t		initiator_lo_pend_to;
1260 } __packed __aligned(4);
1261 
1262 struct mpii_cfg_fc_device_pg0 {
1263 	struct mpii_cfg_hdr	config_header;
1264 
1265 	u_int64_t		wwnn;
1266 
1267 	u_int64_t		wwpn;
1268 
1269 	u_int32_t		port_id;
1270 
1271 	u_int8_t		protocol;
1272 	u_int8_t		flags;
1273 	u_int16_t		bb_credit;
1274 
1275 	u_int16_t		max_rx_frame_size;
1276 	u_int8_t		adisc_hard_alpa;
1277 	u_int8_t		port_nr;
1278 
1279 	u_int8_t		fc_ph_low_version;
1280 	u_int8_t		fc_ph_high_version;
1281 	u_int8_t		current_target_id;
1282 	u_int8_t		current_bus;
1283 } __packed __aligned(4);
1284 
1285 #define MPII_CFG_RAID_VOL_ADDR_HANDLE		(1<<28)
1286 
1287 struct mpii_cfg_raid_vol_pg0 {
1288 	struct mpii_cfg_hdr	config_header;
1289 
1290 	u_int16_t		volume_handle;
1291 	u_int8_t		volume_state;
1292 #define MPII_CFG_RAID_VOL_0_STATE_MISSING		(0x00)
1293 #define MPII_CFG_RAID_VOL_0_STATE_FAILED		(0x01)
1294 #define MPII_CFG_RAID_VOL_0_STATE_INITIALIZING		(0x02)
1295 #define MPII_CFG_RAID_VOL_0_STATE_ONLINE		(0x03)
1296 #define MPII_CFG_RAID_VOL_0_STATE_DEGRADED		(0x04)
1297 #define MPII_CFG_RAID_VOL_0_STATE_OPTIMAL		(0x05)
1298 	u_int8_t		volume_type;
1299 #define MPII_CFG_RAID_VOL_0_TYPE_RAID0			(0x00)
1300 #define MPII_CFG_RAID_VOL_0_TYPE_RAID1E			(0x01)
1301 #define MPII_CFG_RAID_VOL_0_TYPE_RAID1			(0x02)
1302 #define MPII_CFG_RAID_VOL_0_TYPE_RAID10			(0x05)
1303 #define MPII_CFG_RAID_VOL_0_TYPE_UNKNOWN		(0xff)
1304 
1305 	u_int32_t		volume_status;
1306 #define MPII_CFG_RAID_VOL_0_STATUS_SCRUB		(1<<20)
1307 #define MPII_CFG_RAID_VOL_0_STATUS_RESYNC		(1<<16)
1308 
1309 	u_int16_t		volume_settings;
1310 #define MPII_CFG_RAID_VOL_0_SETTINGS_CACHE_MASK		(0x3<<0)
1311 #define MPII_CFG_RAID_VOL_0_SETTINGS_CACHE_UNCHANGED	(0x0<<0)
1312 #define MPII_CFG_RAID_VOL_0_SETTINGS_CACHE_DISABLED	(0x1<<0)
1313 #define MPII_CFG_RAID_VOL_0_SETTINGS_CACHE_ENABLED	(0x2<<0)
1314 
1315 	u_int8_t		hot_spare_pool;
1316 	u_int8_t		reserved1;
1317 
1318 	u_int64_t		max_lba;
1319 
1320 	u_int32_t		stripe_size;
1321 
1322 	u_int16_t		block_size;
1323 	u_int16_t		reserved2;
1324 
1325 	u_int8_t		phys_disk_types;
1326 	u_int8_t		resync_rate;
1327 	u_int16_t		data_scrub_rate;
1328 
1329 	u_int8_t		num_phys_disks;
1330 	u_int16_t		reserved3;
1331 	u_int8_t		inactive_status;
1332 #define MPII_CFG_RAID_VOL_0_INACTIVE_UNKNOWN		(0x00)
1333 #define MPII_CFG_RAID_VOL_0_INACTIVE_STALE_META		(0x01)
1334 #define MPII_CFG_RAID_VOL_0_INACTIVE_FOREIGN_VOL	(0x02)
1335 #define MPII_CFG_RAID_VOL_0_INACTIVE_NO_RESOURCES	(0x03)
1336 #define MPII_CFG_RAID_VOL_0_INACTIVE_CLONED_VOL		(0x04)
1337 #define MPII_CFG_RAID_VOL_0_INACTIVE_INSUF_META		(0x05)
1338 
1339 	/* followed by a list of mpii_cfg_raid_vol_pg0_physdisk structs */
1340 } __packed __aligned(4);
1341 
1342 struct mpii_cfg_raid_vol_pg0_physdisk {
1343 	u_int8_t		raid_set_num;
1344 	u_int8_t		phys_disk_map;
1345 	u_int8_t		phys_disk_num;
1346 	u_int8_t		reserved;
1347 } __packed __aligned(4);
1348 
1349 struct mpii_cfg_raid_vol_pg1 {
1350 	struct mpii_cfg_hdr	config_header;
1351 
1352 	u_int8_t		volume_id;
1353 	u_int8_t		volume_bus;
1354 	u_int8_t		volume_ioc;
1355 	u_int8_t		reserved1;
1356 
1357 	u_int8_t		guid[24];
1358 
1359 	u_int8_t		name[32];
1360 
1361 	u_int64_t		wwid;
1362 
1363 	u_int32_t		reserved2;
1364 
1365 	u_int32_t		reserved3;
1366 } __packed __aligned(4);
1367 
1368 #define MPII_CFG_RAID_PHYS_DISK_ADDR_NUMBER		(1<<28)
1369 
1370 struct mpii_cfg_raid_physdisk_pg0 {
1371 	struct mpii_cfg_hdr	config_header;
1372 
1373 	u_int16_t		dev_handle;
1374 	u_int8_t		reserved1;
1375 	u_int8_t		phys_disk_num;
1376 
1377 	u_int8_t		enc_id;
1378 	u_int8_t		enc_bus;
1379 	u_int8_t		hot_spare_pool;
1380 	u_int8_t		enc_type;
1381 #define MPII_CFG_RAID_PHYDISK_0_ENCTYPE_NONE		(0x0)
1382 #define MPII_CFG_RAID_PHYDISK_0_ENCTYPE_SAFTE		(0x1)
1383 #define MPII_CFG_RAID_PHYDISK_0_ENCTYPE_SES		(0x2)
1384 
1385 	u_int32_t		reserved2;
1386 
1387 	u_int8_t		vendor_id[8];
1388 
1389 	u_int8_t		product_id[16];
1390 
1391 	u_int8_t		product_rev[4];
1392 
1393 	u_int8_t		serial[32];
1394 
1395 	u_int32_t		reserved3;
1396 
1397 	u_int8_t		phys_disk_state;
1398 #define MPII_CFG_RAID_PHYDISK_0_STATE_NOTCONFIGURED	(0x00)
1399 #define MPII_CFG_RAID_PHYDISK_0_STATE_NOTCOMPATIBLE	(0x01)
1400 #define MPII_CFG_RAID_PHYDISK_0_STATE_OFFLINE		(0x02)
1401 #define MPII_CFG_RAID_PHYDISK_0_STATE_ONLINE		(0x03)
1402 #define MPII_CFG_RAID_PHYDISK_0_STATE_HOTSPARE		(0x04)
1403 #define MPII_CFG_RAID_PHYDISK_0_STATE_DEGRADED		(0x05)
1404 #define MPII_CFG_RAID_PHYDISK_0_STATE_REBUILDING	(0x06)
1405 #define MPII_CFG_RAID_PHYDISK_0_STATE_OPTIMAL		(0x07)
1406 	u_int8_t		offline_reason;
1407 #define MPII_CFG_RAID_PHYDISK_0_OFFLINE_MISSING		(0x01)
1408 #define MPII_CFG_RAID_PHYDISK_0_OFFLINE_FAILED		(0x03)
1409 #define MPII_CFG_RAID_PHYDISK_0_OFFLINE_INITIALIZING	(0x04)
1410 #define MPII_CFG_RAID_PHYDISK_0_OFFLINE_REQUESTED	(0x05)
1411 #define MPII_CFG_RAID_PHYDISK_0_OFFLINE_FAILEDREQ	(0x06)
1412 #define MPII_CFG_RAID_PHYDISK_0_OFFLINE_OTHER		(0xff)
1413 
1414 	u_int8_t		incompat_reason;
1415 	u_int8_t		phys_disk_attrs;
1416 
1417 	u_int32_t		phys_disk_status;
1418 #define MPII_CFG_RAID_PHYDISK_0_STATUS_OUTOFSYNC	(1<<0)
1419 #define MPII_CFG_RAID_PHYDISK_0_STATUS_QUIESCED		(1<<1)
1420 
1421 	u_int64_t		dev_max_lba;
1422 
1423 	u_int64_t		host_max_lba;
1424 
1425 	u_int64_t		coerced_max_lba;
1426 
1427 	u_int16_t		block_size;
1428 	u_int16_t		reserved4;
1429 
1430 	u_int32_t		reserved5;
1431 } __packed __aligned(4);
1432 
1433 struct mpii_cfg_raid_physdisk_pg1 {
1434 	struct mpii_cfg_hdr	config_header;
1435 
1436 	u_int8_t		num_phys_disk_paths;
1437 	u_int8_t		phys_disk_num;
1438 	u_int16_t		reserved1;
1439 
1440 	u_int32_t		reserved2;
1441 
1442 	/* followed by mpii_cfg_raid_physdisk_path structs */
1443 } __packed __aligned(4);
1444 
1445 struct mpii_cfg_raid_physdisk_path {
1446 	u_int8_t		phys_disk_id;
1447 	u_int8_t		phys_disk_bus;
1448 	u_int16_t		reserved1;
1449 
1450 	u_int64_t		wwwid;
1451 
1452 	u_int64_t		owner_wwid;
1453 
1454 	u_int8_t		ownder_id;
1455 	u_int8_t		reserved2;
1456 	u_int16_t		flags;
1457 #define MPII_CFG_RAID_PHYDISK_PATH_INVALID	(1<<0)
1458 #define MPII_CFG_RAID_PHYDISK_PATH_BROKEN	(1<<1)
1459 } __packed __aligned(4);
1460 
1461 #define MPII_CFG_SAS_DEV_ADDR_NEXT		(0<<28)
1462 #define MPII_CFG_SAS_DEV_ADDR_BUS		(1<<28)
1463 #define MPII_CFG_SAS_DEV_ADDR_HANDLE		(2<<28)
1464 
1465 struct mpii_cfg_sas_dev_pg0 {
1466 	struct mpii_ecfg_hdr	config_header;
1467 
1468 	u_int16_t		slot;
1469 	u_int16_t		enc_handle;
1470 
1471 	u_int64_t		sas_addr;
1472 
1473 	u_int16_t		parent_dev_handle;
1474 	u_int8_t		phy_num;
1475 	u_int8_t		access_status;
1476 
1477 	u_int16_t		dev_handle;
1478 	u_int8_t		target;
1479 	u_int8_t		bus;
1480 
1481 	u_int32_t		device_info;
1482 #define MPII_CFG_SAS_DEV_0_DEVINFO_TYPE			(0x7)
1483 #define MPII_CFG_SAS_DEV_0_DEVINFO_TYPE_NONE		(0x0)
1484 #define MPII_CFG_SAS_DEV_0_DEVINFO_TYPE_END		(0x1)
1485 #define MPII_CFG_SAS_DEV_0_DEVINFO_TYPE_EDGE_EXPANDER	(0x2)
1486 #define MPII_CFG_SAS_DEV_0_DEVINFO_TYPE_FANOUT_EXPANDER	(0x3)
1487 #define MPII_CFG_SAS_DEV_0_DEVINFO_SATA_HOST		(1<<3)
1488 #define MPII_CFG_SAS_DEV_0_DEVINFO_SMP_INITIATOR	(1<<4)
1489 #define MPII_CFG_SAS_DEV_0_DEVINFO_STP_INITIATOR	(1<<5)
1490 #define MPII_CFG_SAS_DEV_0_DEVINFO_SSP_INITIATOR	(1<<6)
1491 #define MPII_CFG_SAS_DEV_0_DEVINFO_SATA_DEVICE		(1<<7)
1492 #define MPII_CFG_SAS_DEV_0_DEVINFO_SMP_TARGET		(1<<8)
1493 #define MPII_CFG_SAS_DEV_0_DEVINFO_STP_TARGET		(1<<9)
1494 #define MPII_CFG_SAS_DEV_0_DEVINFO_SSP_TARGET		(1<<10)
1495 #define MPII_CFG_SAS_DEV_0_DEVINFO_DIRECT_ATTACHED	(1<<11)
1496 #define MPII_CFG_SAS_DEV_0_DEVINFO_LSI_DEVICE		(1<<12)
1497 #define MPII_CFG_SAS_DEV_0_DEVINFO_ATAPI_DEVICE		(1<<13)
1498 #define MPII_CFG_SAS_DEV_0_DEVINFO_SEP_DEVICE		(1<<14)
1499 
1500 	u_int16_t		flags;
1501 #define MPII_CFG_SAS_DEV_0_FLAGS_DEV_PRESENT		(1<<0)
1502 #define MPII_CFG_SAS_DEV_0_FLAGS_DEV_MAPPED		(1<<1)
1503 #define MPII_CFG_SAS_DEV_0_FLAGS_DEV_MAPPED_PERSISTENT	(1<<2)
1504 #define MPII_CFG_SAS_DEV_0_FLAGS_SATA_PORT_SELECTOR	(1<<3)
1505 #define MPII_CFG_SAS_DEV_0_FLAGS_SATA_FUA		(1<<4)
1506 #define MPII_CFG_SAS_DEV_0_FLAGS_SATA_NCQ		(1<<5)
1507 #define MPII_CFG_SAS_DEV_0_FLAGS_SATA_SMART		(1<<6)
1508 #define MPII_CFG_SAS_DEV_0_FLAGS_SATA_LBA48		(1<<7)
1509 #define MPII_CFG_SAS_DEV_0_FLAGS_UNSUPPORTED		(1<<8)
1510 #define MPII_CFG_SAS_DEV_0_FLAGS_SATA_SETTINGS		(1<<9)
1511 	u_int8_t		physical_port;
1512 	u_int8_t		max_port_conn;
1513 
1514 	u_int64_t		device_name;
1515 
1516 	u_int8_t		port_groups;
1517 	u_int8_t		dma_group;
1518 	u_int8_t		ctrl_group;
1519 	u_int8_t		reserved1;
1520 
1521 	u_int64_t		reserved2;
1522 } __packed __aligned(4);
1523 
1524 #define MPII_CFG_RAID_CONFIG_ACTIVE_CONFIG		(2<<28)
1525 
1526 struct mpii_cfg_raid_config_pg0 {
1527 	struct	mpii_ecfg_hdr	config_header;
1528 
1529 	u_int8_t		num_hot_spares;
1530 	u_int8_t		num_phys_disks;
1531 	u_int8_t		num_volumes;
1532 	u_int8_t		config_num;
1533 
1534 	u_int32_t		flags;
1535 #define MPII_CFG_RAID_CONFIG_0_FLAGS_NATIVE		(0<<0)
1536 #define MPII_CFG_RAID_CONFIG_0_FLAGS_FOREIGN		(1<<0)
1537 
1538 	u_int32_t		config_guid[6];
1539 
1540 	u_int32_t		reserved1;
1541 
1542 	u_int8_t		num_elements;
1543 	u_int8_t		reserved2[3];
1544 
1545 	/* followed by struct mpii_raid_config_element structs */
1546 } __packed __aligned(4);
1547 
1548 struct mpii_raid_config_element {
1549 	u_int16_t		element_flags;
1550 #define MPII_RAID_CONFIG_ELEMENT_FLAG_VOLUME		(0x0)
1551 #define MPII_RAID_CONFIG_ELEMENT_FLAG_VOLUME_PHYS_DISK	(0x1)
1552 #define	MPII_RAID_CONFIG_ELEMENT_FLAG_HSP_PHYS_DISK	(0x2)
1553 #define MPII_RAID_CONFIG_ELEMENT_ONLINE_CE_PHYS_DISK	(0x3)
1554 	u_int16_t		vol_dev_handle;
1555 
1556 	u_int8_t		hot_spare_pool;
1557 	u_int8_t		phys_disk_num;
1558 	u_int16_t		phys_disk_dev_handle;
1559 } __packed __aligned(4);
1560 
1561 struct mpii_cfg_dpm_pg0 {
1562 	struct mpii_ecfg_hdr	config_header;
1563 #define MPII_DPM_ADDRESS_FORM_MASK			(0xf0000000)
1564 #define MPII_DPM_ADDRESS_FORM_ENTRY_RANGE		(0x00000000)
1565 #define MPII_DPM_ADDRESS_ENTRY_COUNT_MASK		(0x0fff0000)
1566 #define MPII_DPM_ADDRESS_ENTRY_COUNT_SHIFT		(16)
1567 #define MPII_DPM_ADDRESS_START_ENTRY_MASK		(0x0000ffff)
1568 
1569 	/* followed by struct mpii_dpm_entry structs */
1570 } __packed __aligned(4);
1571 
1572 struct mpii_dpm_entry {
1573 	u_int64_t		physical_identifier;
1574 
1575 	u_int16_t		mapping_information;
1576 	u_int16_t		device_index;
1577 
1578 	u_int32_t		physical_bits_mapping;
1579 
1580 	u_int32_t		reserved1;
1581 } __packed __aligned(4);
1582 
1583 struct mpii_evt_sas_discovery {
1584 	u_int8_t		flags;
1585 #define	MPII_EVENT_SAS_DISC_FLAGS_DEV_CHANGE_MASK	(1<<1)
1586 #define MPII_EVENT_SAS_DISC_FLAGS_DEV_CHANGE_NO_CHANGE	(0<<1)
1587 #define MPII_EVENT_SAS_DISC_FLAGS_DEV_CHANGE_CHANGE	(1<<1)
1588 #define MPII_EVENT_SAS_DISC_FLAGS_DISC_IN_PROG_MASK	(1<<0)
1589 #define MPII_EVENT_SAS_DISC_FLAGS_DISC_NOT_IN_PROGRESS	(1<<0)
1590 #define MPII_EVENT_SAS_DISC_FLAGS_DISC_IN_PROGRESS	(0<<0)
1591 	u_int8_t		reason_code;
1592 #define MPII_EVENT_SAS_DISC_REASON_CODE_STARTED		(0x01)
1593 #define	MPII_EVENT_SAS_DISC_REASON_CODE_COMPLETED	(0x02)
1594 	u_int8_t		physical_port;
1595 	u_int8_t		reserved1;
1596 
1597 	u_int32_t		discovery_status;
1598 } __packed __aligned(4);
1599 
1600 struct mpii_evt_ir_status {
1601 	u_int16_t		vol_dev_handle;
1602 	u_int16_t		reserved1;
1603 
1604 	u_int8_t		operation;
1605 #define MPII_EVENT_IR_RAIDOP_RESYNC			(0x00)
1606 #define MPII_EVENT_IR_RAIDOP_OCE			(0x01)
1607 #define MPII_EVENT_IR_RAIDOP_CONS_CHECK			(0x02)
1608 #define MPII_EVENT_IR_RAIDOP_BG_INIT			(0x03)
1609 #define MPII_EVENT_IR_RAIDOP_MAKE_CONS			(0x04)
1610 	u_int8_t		percent;
1611 	u_int16_t		reserved2;
1612 
1613 	u_int32_t		reserved3;
1614 };
1615 
1616 struct mpii_evt_ir_volume {
1617 	u_int16_t		vol_dev_handle;
1618 	u_int8_t		reason_code;
1619 #define MPII_EVENT_IR_VOL_RC_SETTINGS_CHANGED		(0x01)
1620 #define MPII_EVENT_IR_VOL_RC_STATUS_CHANGED		(0x02)
1621 #define MPII_EVENT_IR_VOL_RC_STATE_CHANGED		(0x03)
1622 	u_int8_t		reserved1;
1623 
1624 	u_int32_t		new_value;
1625 	u_int32_t		prev_value;
1626 } __packed __aligned(4);
1627 
1628 struct mpii_evt_ir_physical_disk {
1629 	u_int16_t		reserved1;
1630 	u_int8_t		reason_code;
1631 #define MPII_EVENT_IR_PD_RC_SETTINGS_CHANGED		(0x01)
1632 #define MPII_EVENT_IR_PD_RC_STATUS_FLAGS_CHANGED	(0x02)
1633 #define MPII_EVENT_IR_PD_RC_STATUS_CHANGED		(0x03)
1634 	u_int8_t		phys_disk_num;
1635 
1636 	u_int16_t		phys_disk_dev_handle;
1637 	u_int16_t		reserved2;
1638 
1639 	u_int16_t		slot;
1640 	u_int16_t		enclosure_handle;
1641 
1642 	u_int32_t		new_value;
1643 	u_int32_t		previous_value;
1644 } __packed __aligned(4);
1645 
1646 struct mpii_evt_sas_tcl {
1647 	u_int16_t		enclosure_handle;
1648 	u_int16_t		expander_handle;
1649 
1650 	u_int8_t		num_phys;
1651 	u_int8_t		reserved1[3];
1652 
1653 	u_int8_t		num_entries;
1654 	u_int8_t		start_phy_num;
1655 	u_int8_t		expn_status;
1656 #define	MPII_EVENT_SAS_TOPO_ES_ADDED			(0x01)
1657 #define MPII_EVENT_SAS_TOPO_ES_NOT_RESPONDING		(0x02)
1658 #define MPII_EVENT_SAS_TOPO_ES_RESPONDING		(0x03)
1659 #define MPII_EVENT_SAS_TOPO_ES_DELAY_NOT_RESPONDING	(0x04)
1660 	u_int8_t		physical_port;
1661 
1662 	/* followed by num_entries number of struct mpii_evt_phy_entry */
1663 } __packed __aligned(4);
1664 
1665 struct mpii_evt_phy_entry {
1666 	u_int16_t		dev_handle;
1667 	u_int8_t		link_rate;
1668 	u_int8_t		phy_status;
1669 #define MPII_EVENT_SAS_TOPO_PS_RC_MASK			(0x0f)
1670 #define MPII_EVENT_SAS_TOPO_PS_RC_ADDED			(0x01)
1671 #define MPII_EVENT_SAS_TOPO_PS_RC_MISSING		(0x02)
1672 } __packed __aligned(4);
1673 
1674 struct mpii_evt_ir_cfg_change_list {
1675 	u_int8_t		num_elements;
1676 	u_int16_t		reserved;
1677 	u_int8_t		config_num;
1678 
1679 	u_int32_t		flags;
1680 #define MPII_EVT_IR_CFG_CHANGE_LIST_FOREIGN		(0x1)
1681 
1682 	/* followed by num_elements struct mpii_evt_ir_cfg_elements */
1683 } __packed __aligned(4);
1684 
1685 struct mpii_evt_ir_cfg_element {
1686 	u_int16_t		element_flags;
1687 #define MPII_EVT_IR_CFG_ELEMENT_TYPE_MASK		(0xf)
1688 #define MPII_EVT_IR_CFG_ELEMENT_TYPE_VOLUME		(0x0)
1689 #define MPII_EVT_IR_CFG_ELEMENT_TYPE_VOLUME_DISK	(0x1)
1690 #define MPII_EVT_IR_CFG_ELEMENT_TYPE_HOT_SPARE		(0x2)
1691 	u_int16_t		vol_dev_handle;
1692 
1693 	u_int8_t		reason_code;
1694 #define MPII_EVT_IR_CFG_ELEMENT_RC_ADDED		(0x01)
1695 #define MPII_EVT_IR_CFG_ELEMENT_RC_REMOVED		(0x02)
1696 #define MPII_EVT_IR_CFG_ELEMENT_RC_NO_CHANGE		(0x03)
1697 #define MPII_EVT_IR_CFG_ELEMENT_RC_HIDE			(0x04)
1698 #define MPII_EVT_IR_CFG_ELEMENT_RC_UNHIDE		(0x05)
1699 #define MPII_EVT_IR_CFG_ELEMENT_RC_VOLUME_CREATED	(0x06)
1700 #define MPII_EVT_IR_CFG_ELEMENT_RC_VOLUME_DELETED	(0x07)
1701 #define MPII_EVT_IR_CFG_ELEMENT_RC_PD_CREATED		(0x08)
1702 #define MPII_EVT_IR_CFG_ELEMENT_RC_PD_DELETED		(0x09)
1703 	u_int8_t		phys_disk_num;
1704 	u_int16_t		phys_disk_dev_handle;
1705 } __packed __aligned(4);
1706