xref: /illumos-gate/usr/src/uts/common/sys/mpt/mpi_cnfg.h (revision 3299f39fdcbdab4be7a9c70daa3873f2b78a398d)
1 /*
2  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
3  * Use is subject to license terms.
4  */
5 
6 #ifndef	_SYS_MPI_CNFG_H
7 #define	_SYS_MPI_CNFG_H
8 
9 #ifdef	__cplusplus
10 extern "C" {
11 #endif
12 
13 /*
14  * Config Message and Structures
15  */
16 typedef struct config_page_header {
17 	uint8_t		PageVersion;
18 	uint8_t		PageLength;
19 	uint8_t		PageNumber;
20 	uint8_t		PageType;
21 } config_page_header_t;
22 
23 typedef union config_page_header_union {
24 	config_page_header_t	Struct;
25 	uint8_t			Bytes[4];
26 	uint16_t		Word16[2];
27 	uint32_t		Word32;
28 } config_page_header_union_t;
29 
30 /*
31  * The extended header is used for 1064 and on
32  */
33 typedef struct config_extended_page_header {
34 	uint8_t			PageVersion;
35 	uint8_t			Reserved1;
36 	uint8_t			PageNumber;
37 	uint8_t			PageType;
38 	uint16_t		ExtPageLength;
39 	uint8_t			ExtPageType;
40 	uint8_t			Reserved2;
41 } config_extended_page_header_t;
42 
43 /*
44  * PageType field values
45  */
46 #define	MPI_CONFIG_PAGEATTR_READ_ONLY		0x00
47 #define	MPI_CONFIG_PAGEATTR_CHANGEABLE		0x10
48 #define	MPI_CONFIG_PAGEATTR_PERSISTENT		0x20
49 #define	MPI_CONFIG_PAGEATTR_RO_PERSISTENT	0x30
50 #define	MPI_CONFIG_PAGEATTR_MASK		0xF0
51 
52 #define	MPI_CONFIG_PAGETYPE_IO_UNIT		0x00
53 #define	MPI_CONFIG_PAGETYPE_IOC			0x01
54 #define	MPI_CONFIG_PAGETYPE_BIOS		0x02
55 #define	MPI_CONFIG_PAGETYPE_SCSI_PORT		0x03
56 #define	MPI_CONFIG_PAGETYPE_SCSI_DEVICE		0x04
57 #define	MPI_CONFIG_PAGETYPE_FC_PORT		0x05
58 #define	MPI_CONFIG_PAGETYPE_FC_DEVICE		0x06
59 #define	MPI_CONFIG_PAGETYPE_LAN			0x07
60 #define	MPI_CONFIG_PAGETYPE_RAID_VOLUME		0x08
61 #define	MPI_CONFIG_PAGETYPE_MANUFACTURING	0x09
62 #define	MPI_CONFIG_PAGETYPE_RAID_PHYSDISK	0x0A
63 #define	MPI_CONFIG_PAGETYPE_INBAND		0x0B
64 #define	MPI_CONFIG_PAGETYPE_EXTENDED		0x0F
65 #define	MPI_CONFIG_PAGETYPE_MASK		0x0F
66 
67 #define	MPI_CONFIG_TYPENUM_MASK			0x0FFF
68 
69 /*
70  * ExtPageType field values
71  */
72 #define	MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT	0x10
73 #define	MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER	0x11
74 #define	MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE	0x12
75 #define	MPI_CONFIG_EXTPAGETYPE_SAS_PHY		0x13
76 
77 /*
78  * Page Address field values
79  */
80 #define	MPI_SCSI_PORT_PGAD_PORT_MASK		0x000000FF
81 
82 #define	MPI_SCSI_DEVICE_TARGET_ID_MASK		0x000000FF
83 #define	MPI_SCSI_DEVICE_TARGET_ID_SHIFT		0
84 #define	MPI_SCSI_DEVICE_BUS_MASK		0x0000FF00
85 #define	MPI_SCSI_DEVICE_BUS_SHIFT		8
86 
87 #define	MPI_FC_PORT_PGAD_PORT_MASK		0xF0000000
88 #define	MPI_FC_PORT_PGAD_PORT_SHIFT		28
89 #define	MPI_FC_PORT_PGAD_FORM_MASK		0x0F000000
90 #define	MPI_FC_PORT_PGAD_FORM_INDEX		0x01000000
91 #define	MPI_FC_PORT_PGAD_INDEX_MASK		0x0000FFFF
92 #define	MPI_FC_PORT_PGAD_INDEX_SHIFT		0
93 
94 #define	MPI_FC_DEVICE_PGAD_PORT_MASK		0xF0000000
95 #define	MPI_FC_DEVICE_PGAD_PORT_SHIFT		28
96 #define	MPI_FC_DEVICE_PGAD_FORM_MASK		0x0F000000
97 #define	MPI_FC_DEVICE_PGAD_FORM_NEXT_DID	0x00000000
98 #define	MPI_FC_DEVICE_PGAD_ND_PORT_MASK		0xF0000000
99 #define	MPI_FC_DEVICE_PGAD_ND_PORT_SHIFT	28
100 #define	MPI_FC_DEVICE_PGAD_ND_DID_MASK		0x00FFFFFF
101 #define	MPI_FC_DEVICE_PGAD_ND_DID_SHIFT		0
102 #define	MPI_FC_DEVICE_PGAD_FORM_BUS_TID		0x01000000
103 #define	MPI_FC_DEVICE_PGAD_BT_BUS_MASK		0x0000FF00
104 #define	MPI_FC_DEVICE_PGAD_BT_BUS_SHIFT		8
105 #define	MPI_FC_DEVICE_PGAD_BT_TID_MASK		0x000000FF
106 #define	MPI_FC_DEVICE_PGAD_BT_TID_SHIFT		0
107 
108 #define	MPI_PHYSDISK_PGAD_PHYSDISKNUM_MASK	0x000000FF
109 #define	MPI_PHYSDISK_PGAD_PHYSDISKNUM_SHIFT	0
110 
111 #define	MPI_SAS_EXPAND_PGAD_FORM_MASK			0xF0000000
112 #define	MPI_SAS_EXPAND_PGAD_FORM_SHIFT			28
113 #define	MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE	0x00000000
114 #define	MPI_SAS_EXPAND_PGAD_FORM_HANDLE_PHY_NUM		0x00000001
115 #define	MPI_SAS_EXPAND_PGAD_FORM_HANDLE			0x00000002
116 #define	MPI_SAS_EXPAND_PGAD_GNH_MASK_HANDLE		0x0000FFFF
117 #define	MPI_SAS_EXPAND_PGAD_GNH_SHIFT_HANDLE		0
118 #define	MPI_SAS_EXPAND_PGAD_HPN_MASK_PHY		0x00FF0000
119 #define	MPI_SAS_EXPAND_PGAD_HPN_SHIFT_PHY		16
120 #define	MPI_SAS_EXPAND_PGAD_HPN_MASK_HANDLE		0x0000FFFF
121 #define	MPI_SAS_EXPAND_PGAD_HPN_SHIFT_HANDLE		0
122 #define	MPI_SAS_EXPAND_PGAD_H_MASK_HANDLE		0x0000FFFF
123 #define	MPI_SAS_EXPAND_PGAD_H_SHIFT_HANDLE		0
124 
125 #define	MPI_SAS_DEVICE_PGAD_FORM_MASK			0xF0000000
126 #define	MPI_SAS_DEVICE_PGAD_FORM_SHIFT			28
127 #define	MPI_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE	0x00000000
128 #define	MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID		0x00000001
129 #define	MPI_SAS_DEVICE_PGAD_FORM_HANDLE			0x00000002
130 #define	MPI_SAS_DEVICE_PGAD_GNH_HANDLE_MASK		0x0000FFFF
131 #define	MPI_SAS_DEVICE_PGAD_GNH_HANDLE_SHIFT		0
132 #define	MPI_SAS_DEVICE_PGAD_BT_BUS_MASK			0x0000FF00
133 #define	MPI_SAS_DEVICE_PGAD_BT_BUS_SHIFT		8
134 #define	MPI_SAS_DEVICE_PGAD_BT_TID_MASK			0x000000FF
135 #define	MPI_SAS_DEVICE_PGAD_BT_TID_SHIFT		0
136 #define	MPI_SAS_DEVICE_PGAD_H_HANDLE_MASK		0x0000FFFF
137 #define	MPI_SAS_DEVICE_PGAD_H_HANDLE_SHIFT		0
138 
139 #define	MPI_SAS_PHY_PGAD_PHY_NUMBER_MASK		0x000000FF
140 #define	MPI_SAS_PHY_PGAD_PHY_NUMBER_SHIFT		0
141 
142 /*
143  * Config Message
144  */
145 typedef struct msg_config {
146 	uint8_t			Action;
147 	uint8_t			Reserved;
148 	uint8_t			ChainOffset;
149 	uint8_t			Function;
150 	uint16_t		ExtPageLength; /* 1064 only */
151 	uint8_t			ExtPageType; /* 1064 only */
152 	uint8_t			MsgFlags;
153 	uint32_t		MsgContext;
154 	uint8_t			Reserved2[8];
155 	config_page_header_t	Header;
156 	uint32_t		PageAddress;
157 	sge_io_union_t		PageBufferSGE;
158 } msg_config_t;
159 
160 /*
161  * Action field values
162  */
163 #define	MPI_CONFIG_ACTION_PAGE_HEADER		0x00
164 #define	MPI_CONFIG_ACTION_PAGE_READ_CURRENT	0x01
165 #define	MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT	0x02
166 #define	MPI_CONFIG_ACTION_PAGE_DEFAULT		0x03
167 #define	MPI_CONFIG_ACTION_PAGE_WRITE_NVRAM	0x04
168 #define	MPI_CONFIG_ACTION_PAGE_READ_DEFAULT	0x05
169 #define	MPI_CONFIG_ACTION_PAGE_READ_NVRAM	0x06
170 
171 /*
172  * Config Reply Message
173  */
174 typedef struct msg_config_reply {
175 	uint8_t			Action;
176 	uint8_t			Reserved;
177 	uint8_t			MsgLength;
178 	uint8_t			Function;
179 	uint16_t		ExtPageLength;
180 	uint8_t			ExtPageType;
181 	uint8_t			MsgFlags;
182 	uint32_t		MsgContext;
183 	uint8_t			Reserved2[2];
184 	uint16_t		IOCStatus;
185 	uint32_t		IOCLogInfo;
186 	config_page_header_t	Header;
187 } msg_config_reply_t;
188 
189 /*
190  * Manufacturing Config pages
191  */
192 #define	MPI_MANUFACTPAGE_VENDORID_LSILOGIC	0x1000
193 #define	MPI_MANUFACTPAGE_DEVICEID_FC909		0x0621
194 #define	MPI_MANUFACTPAGE_DEVICEID_FC919		0x0624
195 #define	MPI_MANUFACTPAGE_DEVICEID_FC929		0x0622
196 #define	MPI_MANUFACTPAGE_DEVICEID_FC919X	0x0628
197 #define	MPI_MANUFACTPAGE_DEVICEID_FC929X	0x0626
198 #define	MPI_MANUFACTPAGE_DEVID_53C1030		0x0030
199 #define	MPI_MANUFACTPAGE_DEVID_53C1030ZC	0x0031
200 #define	MPI_MANUFACTPAGE_DEVID_1030_53C1035	0x0032
201 #define	MPI_MANUFACTPAGE_DEVID_1030ZC_53C1035	0x0033
202 #define	MPI_MANUFACTPAGE_DEVID_53C1035		0x0040
203 #define	MPI_MANUFACTPAGE_DEVID_53C1035ZC	0x0041
204 #define	MPI_MANUFACTPAGE_DEVID_SAS1064		0x0050
205 
206 typedef struct config_page_manufacturing_0 {
207 	config_page_header_t	Header;
208 	uint8_t			ChipName[16];
209 	uint8_t			ChipRevision[8];
210 	uint8_t			BoardName[16];
211 	uint8_t			BoardAssembly[16];
212 	uint8_t			BoardTracerNumber[16];
213 } config_page_manufacturing_0_t;
214 
215 #define	MPI_MANUFACTURING0_PAGEVERSION		0x00
216 
217 typedef struct config_page_manufacturing_1 {
218 	config_page_header_t	Header;
219 	uint8_t			VPD[256];
220 } config_page_manufacturing_1_t;
221 
222 #define	MPI_MANUFACTURING1_PAGEVERSION		0x00
223 
224 typedef struct mpi_chip_revision_id {
225 	uint16_t		DeviceID;
226 	uint8_t			PCIRevisionID;
227 	uint8_t			Reserved;
228 } mpi_chip_revision_id_t;
229 
230 /*
231  * Host code (drivers, BIOS, utilities, etc.) should leave this
232  * define set to one and check Header.PageLength at runtime.
233  */
234 #ifndef	MPI_MAN_PAGE_2_HW_SETTINGS_WORDS
235 #define	MPI_MAN_PAGE_2_HW_SETTINGS_WORDS	1
236 #endif
237 
238 typedef struct config_page_manufacturing_2 {
239 	config_page_header_t	Header;
240 	mpi_chip_revision_id_t	ChipId;
241 	uint32_t		HwSettings[MPI_MAN_PAGE_2_HW_SETTINGS_WORDS];
242 } config_page_manufacturing_2_t;
243 
244 #define	MPI_MANUFACTURING2_PAGEVERSION		0x00
245 
246 /*
247  * Host code (drivers, BIOS, utilities, etc.) should leave this
248  * define set to one and check Header.PageLength at runtime.
249  */
250 #ifndef	MPI_MAN_PAGE_3_INFO_WORDS
251 #define	MPI_MAN_PAGE_3_INFO_WORDS		1
252 #endif
253 
254 typedef struct config_page_manufacturing_3 {
255 	config_page_header_t	Header;
256 	mpi_chip_revision_id_t	ChipId;
257 	uint32_t		Info[MPI_MAN_PAGE_3_INFO_WORDS];
258 } config_page_manufacturing_3_t;
259 
260 #define	MPI_MANUFACTURING3_PAGEVERSION		0x00
261 
262 typedef struct config_page_manufacturing_4 {
263 	config_page_header_t	Header;
264 	uint32_t		Reserved1;
265 	uint8_t			InfoOffset0;
266 	uint8_t			InfoSize0;
267 	uint8_t			InfoOffset1;
268 	uint8_t			InfoSize1;
269 	uint8_t			InquirySize;
270 	uint8_t			Flags;
271 	uint16_t		Reserved2;
272 	uint8_t			InquiryData[56];
273 	uint32_t		ISVolumeSettings;
274 	uint32_t		IMEVolumeSettings;
275 	uint32_t		IMVolumeSettings;
276 } config_page_manufacturing_4_t;
277 
278 #define	MPI_MANUFACTURING4_PAGEVERSION		0x01
279 #define	MPI_MANPAGE4_IR_NO_MIX_SAS_SATA		0x01
280 
281 typedef struct config_page_manufacturing_5 {
282 	config_page_header_t	Header;
283 	uint64_t		BaseWWID;
284 } config_page_manufacturing_5_t;
285 
286 #define	MPI_MANUFACTURING5_PAGEVERSION		0x00
287 
288 typedef struct config_page_manufacturing_6 {
289 	config_page_header_t	Header;
290 	uint32_t		ProductSpecificInfo;
291 } config_page_manufacturing_6_t;
292 
293 #define	MPI_MANUFACTURING6_PAGEVERSION		0x00
294 
295 /*
296  * IO Unit Config Pages
297  */
298 typedef struct config_page_io_unit_0 {
299 	config_page_header_t	Header;
300 	uint64_t		UniqueValue;
301 } config_page_io_unit_0_t;
302 
303 #define	MPI_IOUNITPAGE0_PAGEVERSION		0x00
304 
305 typedef struct config_page_io_unit_1 {
306 	config_page_header_t	Header;
307 	uint32_t		Flags;
308 } config_page_io_unit_1_t;
309 
310 #define	MPI_IOUNITPAGE1_PAGEVERSION		0x01
311 
312 #define	MPI_IOUNITPAGE1_MULTI_FUNCTION			0x00000000
313 #define	MPI_IOUNITPAGE1_SINGLE_FUNCTION			0x00000001
314 #define	MPI_IOUNITPAGE1_MULTI_PATHING			0x00000002
315 #define	MPI_IOUNITPAGE1_SINGLE_PATHING			0x00000000
316 #define	MPI_IOUNITPAGE1_IR_USE_STATIC_VOLUME_ID		0x00000004
317 #define	MPI_IOUNITPAGE1_DISABLE_QUEUE_FULL_HANDLING	0x00000020
318 #define	MPI_IOUNITPAGE1_DISABLE_IR			0x00000040
319 #define	MPI_IOUNITPAGE1_FORCE_32			0x00000080
320 #define	MPI_IOUNITPAGE1_NATIVE_COMMAND_Q_DISABLE	0x00000100
321 
322 typedef struct mpi_adapter_info {
323 	uint8_t			PciBusNumber;
324 	uint8_t			PciDeviceAndFunctionNumber;
325 	uint16_t		AdapterFlags;
326 } mpi_adapter_info_t;
327 
328 #define	MPI_ADAPTER_INFO_FLAGS_EMBEDDED		0x0001
329 #define	MPI_ADAPTER_INFO_FLAGS_INIT_STATUS	0x0002
330 
331 typedef struct config_page_io_unit_2 {
332 	config_page_header_t	Header;
333 	uint32_t		Flags;
334 	uint32_t		BiosVersion;
335 	mpi_adapter_info_t	AdapterOrder[4];
336 } config_page_io_unit_2_t;
337 
338 #define	MPI_IOUNITPAGE2_PAGEVERSION		0x00
339 
340 #define	MPI_IOUNITPAGE2_FLAGS_PAUSE_ON_ERROR	0x00000002
341 #define	MPI_IOUNITPAGE2_FLAGS_VERBOSE_ENABLE	0x00000004
342 #define	MPI_IOUNITPAGE2_FLAGS_COLOR_VIDEO_DISABLE 0x00000008
343 #define	MPI_IOUNITPAGE2_FLAGS_DONT_HOOK_INT_40	0x00000010
344 
345 #define	MPI_IOUNITPAGE2_FLAGS_DEV_LIST_DISPLAY_MASK	0x000000E0
346 #define	MPI_IOUNITPAGE2_FLAGS_INSTALLED_DEV_DISPLAY	0x00000000
347 #define	MPI_IOUNITPAGE2_FLAGS_ADAPTER_DISPLAY		0x00000020
348 #define	MPI_IOUNITPAGE2_FLAGS_ADAPTER_DEV_DISPLAY	0x00000040
349 
350 /*
351  * Host code (drivers, BIOS, utilities, etc.) should leave this
352  * define set to one and check Header.PageLength at runtime.
353  */
354 #ifndef	MPI_IO_UNIT_PAGE_3_GPIO_VAL_MAX
355 #define	MPI_IO_UNIT_PAGE_3_GPIO_VAL_MAX		1
356 #endif
357 
358 typedef struct config_page_io_unit_3 {
359 	config_page_header_t	Header;
360 	uint8_t			GPIOCount;
361 	uint8_t			Reserved1;
362 	uint16_t		Reserved2;
363 	uint16_t		GPIOVal[MPI_IO_UNIT_PAGE_3_GPIO_VAL_MAX];
364 } config_page_io_unit_3_t;
365 
366 #define	MPI_IOUNITPAGE3_PAGEVERSION		0x01
367 
368 #define	MPI_IOUNITPAGE3_GPIO_FUNCTION_MASK	0xFC
369 #define	MPI_IOUNITPAGE3_GPIO_FUNCTION_SHIFT	2
370 #define	MPI_IOUNITPAGE3_GPIO_SETTING_OFF	0x00
371 #define	MPI_IOUNITPAGE3_GPIO_SETTING_ON		0x01
372 
373 /*
374  * IOC Config Pages
375  */
376 typedef struct config_page_ioc_0 {
377 	config_page_header_t	Header;
378 	uint32_t		TotalNVStore;
379 	uint32_t		FreeNVStore;
380 	uint16_t		VendorID;
381 	uint16_t		DeviceID;
382 	uint8_t			RevisionID;
383 	uint8_t			Reserved[3];
384 	uint32_t		ClassCode;
385 	uint16_t		SubsystemVendorID;
386 	uint16_t		SubsystemID;
387 } config_page_ioc_0_t;
388 
389 #define	MPI_IOCPAGE0_PAGEVERSION		0x01
390 
391 typedef struct config_page_ioc_1 {
392 	config_page_header_t	Header;
393 	uint32_t		Flags;
394 	uint32_t		CoalescingTimeout;
395 	uint8_t			CoalescingDepth;
396 	uint8_t			PCISlotNum;
397 	uint8_t			Reserved[2];
398 } config_page_ioc_1_t;
399 
400 #define	MPI_IOCPAGE1_PAGEVERSION		0x01
401 #define	MPI_IOCPAGE1_EEDP_HOST_SUPPORTS_DIF	0x08000000
402 #define	MPI_IOCPAGE1_EEDP_MODE_MASK		0x07000000
403 #define	MPI_IOCPAGE1_EEDP_MODE_OFF		0x00000000
404 #define	MPI_IOCPAGE1_EEDP_MODE_T10		0x01000000
405 #define	MPI_IOCPAGE1_EEDP_MODE_LSI_1		0x02000000
406 #define	MPI_IOCPAGE1_EEDP_MODE_LSI_2		0x03000000
407 #define	MPI_IOCPAGE1_REPLY_COALESCING		0x00000001
408 #define	MPI_IOCPAGE1_PCISLOTNUM_UNKNOWN		0xFF
409 
410 typedef struct config_page_ioc_2_raid_vol {
411 	uint8_t			VolumeID;
412 	uint8_t			VolumeBus;
413 	uint8_t			VolumeIOC;
414 	uint8_t			VolumePageNumber;
415 	uint8_t			VolumeType;
416 	uint8_t			Flags;
417 	uint16_t		Reserved3;
418 } config_page_ioc_2_raid_vol_t;
419 
420 #define	MPI_RAID_VOL_TYPE_IS			0x00
421 #define	MPI_RAID_VOL_TYPE_IME			0x01
422 #define	MPI_RAID_VOL_TYPE_IM			0x02
423 #define	MPI_IOCPAGE2_FLAG_VOLUME_INACTIVE	0x08
424 
425 /*
426  * Host code (drivers, BIOS, utilities, etc.) should leave this
427  * define set to one and check Header.PageLength at runtime.
428  */
429 #ifndef	MPI_IOC_PAGE_2_RAID_VOLUME_MAX
430 #define	MPI_IOC_PAGE_2_RAID_VOLUME_MAX		1
431 #endif
432 
433 typedef struct config_page_ioc_2 {
434 	config_page_header_t	Header;
435 	uint32_t		CapabilitiesFlags;
436 	uint8_t			NumActiveVolumes;
437 	uint8_t			MaxVolumes;
438 	uint8_t			NumActivePhysDisks;
439 	uint8_t			MaxPhysDisks;
440 	config_page_ioc_2_raid_vol_t RaidVolume[MPI_IOC_PAGE_2_RAID_VOLUME_MAX];
441 } config_page_ioc_2_t;
442 
443 #define	MPI_IOCPAGE2_PAGEVERSION		0x02
444 
445 /*
446  * IOC Page 2 Capabilities flags
447  */
448 #define	MPI_IOCPAGE2_CAP_FLAGS_IS_SUPPORT	0x00000001
449 #define	MPI_IOCPAGE2_CAP_FLAGS_IME_SUPPORT	0x00000002
450 #define	MPI_IOCPAGE2_CAP_FLAGS_IM_SUPPORT	0x00000004
451 #define	MPI_IOCPAGE2_CAP_FLAGS_SES_SUPPORT	0x20000000
452 #define	MPI_IOCPAGE2_CAP_FLAGS_SAFTE_SUPPORT	0x40000000
453 #define	MPI_IOCPAGE2_CAP_FLAGS_CROSS_CHANNEL_SUPPORT 0x80000000
454 #define	MPI_IOCPAGE2_CAP_FLAGS_RAID_64_BIT_ADDRESSING	0x10000000
455 
456 typedef struct ioc_3_phys_disk {
457 	uint8_t			PhysDiskID;
458 	uint8_t			PhysDiskBus;
459 	uint8_t			PhysDiskIOC;
460 	uint8_t			PhysDiskNum;
461 } ioc_3_phys_disk_t;
462 
463 /*
464  * Host code (drivers, BIOS, utilities, etc.) should leave this
465  * define set to one and check Header.PageLength at runtime.
466  */
467 #ifndef	MPI_IOC_PAGE_3_PHYSDISK_MAX
468 #define	MPI_IOC_PAGE_3_PHYSDISK_MAX		1
469 #endif
470 
471 typedef struct config_page_ioc_3 {
472 	config_page_header_t	Header;
473 	uint8_t			NumPhysDisks;
474 	uint8_t			Reserved1;
475 	uint16_t		Reserved2;
476 	ioc_3_phys_disk_t	PhysDisk[MPI_IOC_PAGE_3_PHYSDISK_MAX];
477 } config_page_ioc_3_t;
478 
479 #define	MPI_IOCPAGE3_PAGEVERSION		0x00
480 
481 typedef struct ioc_4_sep {
482 	uint8_t			SEPTargetID;
483 	uint8_t			SEPBus;
484 	uint16_t		Reserved;
485 } ioc_4_sep_t;
486 
487 /*
488  * Host code (drivers, BIOS, utilities, etc.) should leave this
489  * define set to one and check Header.PageLength at runtime.
490  */
491 #ifndef	MPI_IOC_PAGE_4_SEP_MAX
492 #define	MPI_IOC_PAGE_4_SEP_MAX			1
493 #endif
494 
495 typedef struct config_page_ioc_4 {
496 	config_page_header_t	Header;
497 	uint8_t			ActiveSEP;
498 	uint8_t			MaxSEP;
499 	uint16_t		Reserved1;
500 	ioc_4_sep_t		SEP[MPI_IOC_PAGE_4_SEP_MAX];
501 } config_page_ioc_4_t;
502 
503 #define	MPI_IOCPAGE4_PAGEVERSION		0x00
504 
505 /*
506  * SCSI Port Config Pages
507  */
508 typedef struct config_page_scsi_port_0 {
509 	config_page_header_t	Header;
510 	uint32_t		Capabilities;
511 	uint32_t		PhysicalInterface;
512 } config_page_scsi_port_0_t;
513 
514 #define	MPI_SCSIPORTPAGE0_PAGEVERSION			0x01
515 
516 /*
517  * Capabilities
518  */
519 #define	MPI_SCSIPORTPAGE0_CAP_IU			0x00000001
520 #define	MPI_SCSIPORTPAGE0_CAP_DT			0x00000002
521 #define	MPI_SCSIPORTPAGE0_CAP_QAS			0x00000004
522 #define	MPI_SCSIPORTPAGE0_CAP_PACING_TRANSFERS		0x00000008
523 #define	MPI_SCSIPORTPAGE0_CAP_MIN_SYNC_PERIOD_MASK	0x0000FF00
524 #define	MPI_SCSIPORTPAGE0_CAP_MAX_SYNC_OFFSET_MASK	0x00FF0000
525 #define	MPI_SCSIPORTPAGE0_CAP_WIDE			0x20000000
526 #define	MPI_SCSIPORTPAGE0_CAP_AIP			0x80000000
527 
528 /*
529  * Physical Interface
530  */
531 #define	MPI_SCSIPORTPAGE0_PHY_SIGNAL_TYPE_MASK		0x00000003
532 #define	MPI_SCSIPORTPAGE0_PHY_SIGNAL_HVD		0x01
533 #define	MPI_SCSIPORTPAGE0_PHY_SIGNAL_SE			0x02
534 #define	MPI_SCSIPORTPAGE0_PHY_SIGNAL_LVD		0x03
535 
536 typedef struct config_page_scsi_port_1 {
537 	config_page_header_t	Header;
538 	uint32_t		Configuration;
539 	uint32_t		OnBusTimerValue;
540 } config_page_scsi_port_1_t;
541 
542 #define	MPI_SCSIPORTPAGE1_PAGEVERSION			0x02
543 
544 #define	MPI_SCSIPORTPAGE1_CFG_PORT_SCSI_ID_MASK		0x000000FF
545 #define	MPI_SCSIPORTPAGE1_CFG_PORT_RESPONSE_ID_MASK	0xFFFF0000
546 
547 typedef struct mpi_device_info {
548 	uint8_t			Timeout;
549 	uint8_t			SyncFactor;
550 	uint16_t		DeviceFlags;
551 } mpi_device_info_t;
552 
553 typedef struct config_page_scsi_port_2 {
554 	config_page_header_t	Header;
555 	uint32_t		PortFlags;
556 	uint32_t		PortSettings;
557 	mpi_device_info_t	DeviceSettings[16];
558 } config_page_scsi_port_2_t;
559 
560 #define	MPI_SCSIPORTPAGE2_PAGEVERSION			0x01
561 
562 #define	MPI_SCSIPORTPAGE2_PORT_FLAGS_SCAN_HIGH_TO_LOW	0x00000001
563 #define	MPI_SCSIPORTPAGE2_PORT_FLAGS_AVOID_SCSI_RESET	0x00000004
564 #define	MPI_SCSIPORTPAGE2_PORT_FLAGS_ALTERNATE_CHS	0x00000008
565 #define	MPI_SCSIPORTPAGE2_PORT_FLAGS_TERMINATION_DISABLE 0x00000010
566 
567 #define	MPI_SCSIPORTPAGE2_PORT_HOST_ID_MASK		0x0000000F
568 #define	MPI_SCSIPORTPAGE2_PORT_MASK_INIT_HBA		0x00000030
569 #define	MPI_SCSIPORTPAGE2_PORT_DISABLE_INIT_HBA		0x00000000
570 #define	MPI_SCSIPORTPAGE2_PORT_BIOS_INIT_HBA		0x00000010
571 #define	MPI_SCSIPORTPAGE2_PORT_OS_INIT_HBA		0x00000020
572 #define	MPI_SCSIPORTPAGE2_PORT_BIOS_OS_INIT_HBA		0x00000030
573 #define	MPI_SCSIPORTPAGE2_PORT_REMOVABLE_MEDIA		0x000000C0
574 #define	MPI_SCSIPORTPAGE2_PORT_SPINUP_DELAY_MASK	0x00000F00
575 #define	MPI_SCSIPORTPAGE2_PORT_MASK_NEGO_MASTER_SETTINGS 0x00003000
576 #define	MPI_SCSIPORTPAGE2_PORT_NEGO_MASTER_SETTINGS	0x00000000
577 #define	MPI_SCSIPORTPAGE2_PORT_NONE_MASTER_SETTINGS	0x00001000
578 #define	MPI_SCSIPORTPAGE2_PORT_ALL_MASTER_SETTINGS	0x00003000
579 
580 #define	MPI_SCSIPORTPAGE2_DEVICE_DISCONNECT_ENABLE	0x0001
581 #define	MPI_SCSIPORTPAGE2_DEVICE_ID_SCAN_ENABLE		0x0002
582 #define	MPI_SCSIPORTPAGE2_DEVICE_LUN_SCAN_ENABLE	0x0004
583 #define	MPI_SCSIPORTPAGE2_DEVICE_TAG_QUEUE_ENABLE	0x0008
584 #define	MPI_SCSIPORTPAGE2_DEVICE_WIDE_DISABLE		0x0010
585 #define	MPI_SCSIPORTPAGE2_DEVICE_BOOT_CHOICE		0x0020
586 
587 /*
588  * SCSI Target Device Config Pages
589  */
590 typedef struct config_page_scsi_device_0 {
591 	config_page_header_t	Header;
592 	uint32_t		NegotiatedParameters;
593 	uint32_t		Information;
594 } config_page_scsi_device_0_t;
595 
596 #define	MPI_SCSIDEVPAGE0_PAGEVERSION			0x02
597 
598 #define	MPI_SCSIDEVPAGE0_NP_IU				0x00000001
599 #define	MPI_SCSIDEVPAGE0_NP_DT				0x00000002
600 #define	MPI_SCSIDEVPAGE0_NP_QAS				0x00000004
601 #define	MPI_SCSIDEVPAGE0_NP_NEG_SYNC_PERIOD_MASK	0x0000FF00
602 #define	MPI_SCSIDEVPAGE0_NP_NEG_SYNC_OFFSET_MASK	0x00FF0000
603 #define	MPI_SCSIDEVPAGE0_NP_WIDE			0x20000000
604 #define	MPI_SCSIDEVPAGE0_NP_AIP				0x80000000
605 #define	MPI_SCSIDEVPAGE0_NP_IDP				0x08000000
606 
607 #define	MPI_SCSIDEVPAGE0_INFO_PARAMS_NEGOTIATED		0x00000001
608 #define	MPI_SCSIDEVPAGE0_INFO_SDTR_REJECTED		0x00000002
609 #define	MPI_SCSIDEVPAGE0_INFO_WDTR_REJECTED		0x00000004
610 #define	MPI_SCSIDEVPAGE0_INFO_PPR_REJECTED		0x00000008
611 
612 typedef struct config_page_scsi_device_1 {
613 	config_page_header_t	Header;
614 	uint32_t		RequestedParameters;
615 	uint32_t		Reserved;
616 	uint32_t		Configuration;
617 } config_page_scsi_device_1_t;
618 
619 #define	MPI_SCSIDEVPAGE1_PAGEVERSION			0x03
620 
621 #define	MPI_SCSIDEVPAGE1_RP_IU				0x00000001
622 #define	MPI_SCSIDEVPAGE1_RP_DT				0x00000002
623 #define	MPI_SCSIDEVPAGE1_RP_QAS				0x00000004
624 #define	MPI_SCSIDEVPAGE1_RP_MIN_SYNC_PERIOD_MASK	0x0000FF00
625 #define	MPI_SCSIDEVPAGE1_RP_MAX_SYNC_OFFSET_MASK	0x00FF0000
626 #define	MPI_SCSIDEVPAGE1_RP_WIDE			0x20000000
627 #define	MPI_SCSIDEVPAGE1_RP_AIP				0x80000000
628 #define	MPI_SCSIDEVPAGE1_RP_IDP				0x08000000
629 
630 #define	MPI_SCSIDEVPAGE1_DV_LVD_DRIVE_STRENGTH_MASK	0x00000003
631 #define	MPI_SCSIDEVPAGE1_DV_SE_SLEW_RATE_MASK		0x00000300
632 
633 #define	MPI_SCSIDEVPAGE1_CONF_WDTR_DISALLOWED		0x00000002
634 #define	MPI_SCSIDEVPAGE1_CONF_SDTR_DISALLOWED		0x00000004
635 
636 typedef struct config_page_scsi_device_2 {
637 	config_page_header_t	Header;
638 	uint32_t		DomainValidation;
639 	uint32_t		ParityPipeSelect;
640 	uint32_t		DataPipeSelect;
641 } config_page_scsi_device_2_t;
642 
643 #define	MPI_SCSIDEVPAGE2_PAGEVERSION			0x00
644 
645 #define	MPI_SCSIDEVPAGE2_DV_ISI_ENABLE			0x00000010
646 #define	MPI_SCSIDEVPAGE2_DV_SECONDARY_DRIVER_ENABLE	0x00000020
647 #define	MPI_SCSIDEVPAGE2_DV_SLEW_RATE_CTRL		0x00000380
648 #define	MPI_SCSIDEVPAGE2_DV_PRIM_DRIVE_STR_CTRL		0x00001C00
649 #define	MPI_SCSIDEVPAGE2_DV_SECOND_DRIVE_STR_CTRL	0x0000E000
650 #define	MPI_SCSIDEVPAGE2_DV_XCLKH_ST			0x10000000
651 #define	MPI_SCSIDEVPAGE2_DV_XCLKS_ST			0x20000000
652 #define	MPI_SCSIDEVPAGE2_DV_XCLKH_DT			0x40000000
653 #define	MPI_SCSIDEVPAGE2_DV_XCLKS_DT			0x80000000
654 
655 #define	MPI_SCSIDEVPAGE2_PPS_PPS_MASK			0x00000003
656 
657 #define	MPI_SCSIDEVPAGE2_DPS_BIT_0_PL_SELECT_MASK	0x00000003
658 #define	MPI_SCSIDEVPAGE2_DPS_BIT_1_PL_SELECT_MASK	0x0000000C
659 #define	MPI_SCSIDEVPAGE2_DPS_BIT_2_PL_SELECT_MASK	0x00000030
660 #define	MPI_SCSIDEVPAGE2_DPS_BIT_3_PL_SELECT_MASK	0x000000C0
661 #define	MPI_SCSIDEVPAGE2_DPS_BIT_4_PL_SELECT_MASK	0x00000300
662 #define	MPI_SCSIDEVPAGE2_DPS_BIT_5_PL_SELECT_MASK	0x00000C00
663 #define	MPI_SCSIDEVPAGE2_DPS_BIT_6_PL_SELECT_MASK	0x00003000
664 #define	MPI_SCSIDEVPAGE2_DPS_BIT_7_PL_SELECT_MASK	0x0000C000
665 #define	MPI_SCSIDEVPAGE2_DPS_BIT_8_PL_SELECT_MASK	0x00030000
666 #define	MPI_SCSIDEVPAGE2_DPS_BIT_9_PL_SELECT_MASK	0x000C0000
667 #define	MPI_SCSIDEVPAGE2_DPS_BIT_10_PL_SELECT_MASK	0x00300000
668 #define	MPI_SCSIDEVPAGE2_DPS_BIT_11_PL_SELECT_MASK	0x00C00000
669 #define	MPI_SCSIDEVPAGE2_DPS_BIT_12_PL_SELECT_MASK	0x03000000
670 #define	MPI_SCSIDEVPAGE2_DPS_BIT_13_PL_SELECT_MASK	0x0C000000
671 #define	MPI_SCSIDEVPAGE2_DPS_BIT_14_PL_SELECT_MASK	0x30000000
672 #define	MPI_SCSIDEVPAGE2_DPS_BIT_15_PL_SELECT_MASK	0xC0000000
673 
674 /*
675  * FC Port Config Pages
676  */
677 typedef struct config_page_fc_port_0 {
678 	config_page_header_t	Header;
679 	uint32_t		Flags;
680 	uint8_t			MPIPortNumber;
681 	uint8_t			Reserved[3];
682 	uint32_t		PortIdentifier;
683 	uint64_t		WWNN;
684 	uint64_t		WWPN;
685 	uint32_t		SupportedServiceClass;
686 	uint32_t		SupportedSpeeds;
687 	uint32_t		CurrentSpeed;
688 	uint32_t		MaxFrameSize;
689 	uint64_t		FabricWWNN;
690 	uint64_t		FabricWWPN;
691 	uint32_t		DiscoveredPortsCount;
692 	uint32_t		MaxInitiators;
693 } config_page_fc_port_0_t;
694 
695 #define	MPI_FCPORTPAGE0_PAGEVERSION			0x01
696 
697 #define	MPI_FCPORTPAGE0_FLAGS_PROT_MASK			0x0000000F
698 #define	MPI_FCPORTPAGE0_FLAGS_PROT_FCP_INIT \
699 					MPI_PORTFACTS_PROTOCOL_INITIATOR
700 #define	MPI_FCPORTPAGE0_FLAGS_PROT_FCP_TARG \
701 					MPI_PORTFACTS_PROTOCOL_TARGET
702 #define	MPI_FCPORTPAGE0_FLAGS_PROT_LAN \
703 					MPI_PORTFACTS_PROTOCOL_LAN
704 #define	MPI_FCPORTPAGE0_FLAGS_PROT_LOGBUSADDR \
705 					MPI_PORTFACTS_PROTOCOL_LOGBUSADDR
706 
707 #define	MPI_FCPORTPAGE0_FLAGS_ALIAS_ALPA_SUPPORTED	0x00000010
708 #define	MPI_FCPORTPAGE0_FLAGS_ALIAS_WWN_SUPPORTED	0x00000020
709 #define	MPI_FCPORTPAGE0_FLAGS_FABRIC_WWN_VALID		0x00000030
710 
711 #define	MPI_FCPORTPAGE0_FLAGS_ATTACH_TYPE_MASK		0x00000F00
712 #define	MPI_FCPORTPAGE0_FLAGS_ATTACH_NO_INIT		0x00000000
713 #define	MPI_FCPORTPAGE0_FLAGS_ATTACH_POINT_TO_POINT	0x00000100
714 #define	MPI_FCPORTPAGE0_FLAGS_ATTACH_PRIVATE_LOOP	0x00000200
715 #define	MPI_FCPORTPAGE0_FLAGS_ATTACH_FABRIC_DIRECT	0x00000400
716 #define	MPI_FCPORTPAGE0_FLAGS_ATTACH_PUBLIC_LOOP	0x00000800
717 
718 #define	MPI_FCPORTPAGE0_FLAGS_ATTACH_TYPE_MASK		0x00000F00
719 #define	MPI_FCPORTPAGE0_FLAGS_ATTACH_NO_INIT		0x00000000
720 #define	MPI_FCPORTPAGE0_FLAGS_ATTACH_POINT_TO_POINT	0x00000100
721 #define	MPI_FCPORTPAGE0_FLAGS_ATTACH_PRIVATE_LOOP	0x00000200
722 #define	MPI_FCPORTPAGE0_FLAGS_ATTACH_FABRIC_DIRECT	0x00000400
723 #define	MPI_FCPORTPAGE0_FLAGS_ATTACH_PUBLIC_LOOP	0x00000800
724 
725 #define	MPI_FCPORTPAGE0_LTYPE_RESERVED			0x00
726 #define	MPI_FCPORTPAGE0_LTYPE_OTHER			0x01
727 #define	MPI_FCPORTPAGE0_LTYPE_UNKNOWN			0x02
728 #define	MPI_FCPORTPAGE0_LTYPE_COPPER			0x03
729 #define	MPI_FCPORTPAGE0_LTYPE_SINGLE_1300		0x04
730 #define	MPI_FCPORTPAGE0_LTYPE_SINGLE_1500		0x05
731 #define	MPI_FCPORTPAGE0_LTYPE_50_LASER_MULTI		0x06
732 #define	MPI_FCPORTPAGE0_LTYPE_50_LED_MULTI		0x07
733 #define	MPI_FCPORTPAGE0_LTYPE_62_LASER_MULTI		0x08
734 #define	MPI_FCPORTPAGE0_LTYPE_62_LED_MULTI		0x09
735 #define	MPI_FCPORTPAGE0_LTYPE_MULTI_LONG_WAVE		0x0A
736 #define	MPI_FCPORTPAGE0_LTYPE_MULTI_SHORT_WAVE		0x0B
737 #define	MPI_FCPORTPAGE0_LTYPE_LASER_SHORT_WAVE		0x0C
738 #define	MPI_FCPORTPAGE0_LTYPE_LED_SHORT_WAVE		0x0D
739 #define	MPI_FCPORTPAGE0_LTYPE_1300_LONG_WAVE		0x0E
740 #define	MPI_FCPORTPAGE0_LTYPE_1500_LONG_WAVE		0x0F
741 
742 #define	MPI_FCPORTPAGE0_PORTSTATE_UNKNOWN		0x01
743 #define	MPI_FCPORTPAGE0_PORTSTATE_ONLINE		0x02
744 #define	MPI_FCPORTPAGE0_PORTSTATE_OFFLINE		0x03
745 #define	MPI_FCPORTPAGE0_PORTSTATE_BYPASSED		0x04
746 #define	MPI_FCPORTPAGE0_PORTSTATE_DIAGNOST		0x05
747 #define	MPI_FCPORTPAGE0_PORTSTATE_LINKDOWN		0x06
748 #define	MPI_FCPORTPAGE0_PORTSTATE_ERROR			0x07
749 #define	MPI_FCPORTPAGE0_PORTSTATE_LOOPBACK		0x08
750 
751 #define	MPI_FCPORTPAGE0_SUPPORT_CLASS_1			0x00000001
752 #define	MPI_FCPORTPAGE0_SUPPORT_CLASS_2			0x00000002
753 #define	MPI_FCPORTPAGE0_SUPPORT_CLASS_3			0x00000004
754 
755 #define	MPI_FCPORTPAGE0_SUPPORT_1GBIT_SPEED		0x00000001
756 #define	MPI_FCPORTPAGE0_SUPPORT_2GBIT_SPEED		0x00000002
757 #define	MPI_FCPORTPAGE0_SUPPORT_10GBIT_SPEED		0x00000004
758 
759 #define	MPI_FCPORTPAGE0_CURRENT_SPEED_1GBIT \
760 			MPI_FCPORTPAGE0_SUPPORT_1GBIT_SPEED
761 #define	MPI_FCPORTPAGE0_CURRENT_SPEED_2GBIT \
762 			MPI_FCPORTPAGE0_SUPPORT_2GBIT_SPEED
763 #define	MPI_FCPORTPAGE0_CURRENT_SPEED_10GBIT \
764 			MPI_FCPORTPAGE0_SUPPORT_10GBIT_SPEED
765 
766 typedef struct config_page_fc_port_1 {
767 	config_page_header_t	Header;
768 	uint32_t		Flags;
769 	uint64_t		NoSEEPROMWWNN;
770 	uint64_t		NoSEEPROMWWPN;
771 	uint8_t			HardALPA;
772 	uint8_t			LinkConfig;
773 	uint8_t			TopologyConfig;
774 	uint8_t			Reserved;
775 } config_page_fc_port_1_t;
776 
777 #define	MPI_FCPORTPAGE1_PAGEVERSION			0x02
778 
779 #define	MPI_FCPORTPAGE1_FLAGS_EXT_FCP_STATUS_EN		0x08000000
780 #define	MPI_FCPORTPAGE1_FLAGS_IMMEDIATE_ERROR_REPLY	0x04000000
781 #define	MPI_FCPORTPAGE1_FLAGS_SORT_BY_DID		0x00000001
782 #define	MPI_FCPORTPAGE1_FLAGS_SORT_BY_WWN		0x00000000
783 
784 /*
785  *  Flags used for programming protocol modes in NVStore
786  */
787 #define	MPI_FCPORTPAGE1_FLAGS_PROT_MASK			0xF0000000
788 #define	MPI_FCPORTPAGE1_FLAGS_PROT_SHIFT		28
789 #define	MPI_FCPORTPAGE1_FLAGS_PROT_FCP_INIT \
790 	((uint32_t)MPI_PORTFACTS_PROTOCOL_INITIATOR << \
791 		MPI_FCPORTPAGE1_FLAGS_PROT_SHIFT)
792 #define	MPI_FCPORTPAGE1_FLAGS_PROT_FCP_TARG \
793 	((uint32_t)MPI_PORTFACTS_PROTOCOL_TARGET << \
794 		MPI_FCPORTPAGE1_FLAGS_PROT_SHIFT)
795 #define	MPI_FCPORTPAGE1_FLAGS_PROT_LAN \
796 	((uint32_t)MPI_PORTFACTS_PROTOCOL_LAN << \
797 		MPI_FCPORTPAGE1_FLAGS_PROT_SHIFT)
798 #define	MPI_FCPORTPAGE1_FLAGS_PROT_LOGBUSADDR \
799 	((uint32_t)MPI_PORTFACTS_PROTOCOL_LOGBUSADDR << \
800 		MPI_FCPORTPAGE1_FLAGS_PROT_SHIFT)
801 
802 #define	MPI_FCPORTPAGE1_HARD_ALPA_NOT_USED		0xFF
803 
804 #define	MPI_FCPORTPAGE1_LCONFIG_SPEED_MASK		0x0F
805 #define	MPI_FCPORTPAGE1_LCONFIG_SPEED_1GIG		0x00
806 #define	MPI_FCPORTPAGE1_LCONFIG_SPEED_2GIG		0x01
807 #define	MPI_FCPORTPAGE1_LCONFIG_SPEED_4GIG		0x02
808 #define	MPI_FCPORTPAGE1_LCONFIG_SPEED_10GIG		0x03
809 #define	MPI_FCPORTPAGE1_LCONFIG_SPEED_AUTO		0x0F
810 
811 #define	MPI_FCPORTPAGE1_TOPOLOGY_MASK			0x0F
812 #define	MPI_FCPORTPAGE1_TOPOLOGY_NLPORT			0x01
813 #define	MPI_FCPORTPAGE1_TOPOLOGY_NPORT			0x02
814 #define	MPI_FCPORTPAGE1_TOPOLOGY_AUTO			0x0F
815 
816 typedef struct config_page_fc_port_2 {
817 	config_page_header_t	Header;
818 	uint8_t			NumberActive;
819 	uint8_t			ALPA[127];
820 } config_page_fc_port_2_t;
821 
822 #define	MPI_FCPORTPAGE2_PAGEVERSION			0x01
823 
824 typedef struct wwn_format {
825 	uint64_t		WWNN;
826 	uint64_t		WWPN;
827 } wwn_format_t;
828 
829 typedef union fc_port_persistent_physical_id {
830 	wwn_format_t		WWN;
831 	uint32_t		Did;
832 } fc_port_persistent_physical_id_t;
833 
834 typedef struct fc_port_persistent {
835 	fc_port_persistent_physical_id_t PhysicalIdentifier;
836 	uint8_t			TargetID;
837 	uint8_t			Bus;
838 	uint16_t		Flags;
839 } fc_port_persistent_t;
840 
841 #define	MPI_PERSISTENT_FLAGS_SHIFT			16
842 #define	MPI_PERSISTENT_FLAGS_ENTRY_VALID		0x0001
843 #define	MPI_PERSISTENT_FLAGS_SCAN_ID			0x0002
844 #define	MPI_PERSISTENT_FLAGS_SCAN_LUNS			0x0004
845 #define	MPI_PERSISTENT_FLAGS_BOOT_DEVICE		0x0008
846 #define	MPI_PERSISTENT_FLAGS_BY_DID			0x0080
847 
848 /*
849  * Host code (drivers, BIOS, utilities, etc.) should leave this
850  * define set to one and check Header.PageLength at runtime.
851  */
852 #ifndef	MPI_FC_PORT_PAGE_3_ENTRY_MAX
853 #define	MPI_FC_PORT_PAGE_3_ENTRY_MAX			1
854 #endif
855 
856 typedef struct config_page_fc_port_3 {
857 	config_page_header_t	Header;
858 	fc_port_persistent_t	Entry[MPI_FC_PORT_PAGE_3_ENTRY_MAX];
859 } config_page_fc_port_3_t;
860 
861 #define	MPI_FCPORTPAGE3_PAGEVERSION			0x01
862 
863 typedef struct config_page_fc_port_4 {
864 	config_page_header_t	Header;
865 	uint32_t		PortFlags;
866 	uint32_t		PortSettings;
867 } config_page_fc_port_4_t;
868 
869 #define	MPI_FCPORTPAGE4_PAGEVERSION			0x00
870 
871 #define	MPI_FCPORTPAGE4_PORT_FLAGS_ALTERNATE_CHS	0x00000008
872 
873 #define	MPI_FCPORTPAGE4_PORT_MASK_INIT_HBA		0x00000030
874 #define	MPI_FCPORTPAGE4_PORT_DISABLE_INIT_HBA		0x00000000
875 #define	MPI_FCPORTPAGE4_PORT_BIOS_INIT_HBA		0x00000010
876 #define	MPI_FCPORTPAGE4_PORT_OS_INIT_HBA		0x00000020
877 #define	MPI_FCPORTPAGE4_PORT_BIOS_OS_INIT_HBA		0x00000030
878 #define	MPI_FCPORTPAGE4_PORT_REMOVABLE_MEDIA		0x000000C0
879 #define	MPI_FCPORTPAGE4_PORT_SPINUP_DELAY_MASK		0x00000F00
880 
881 typedef struct config_page_fc_port_5_alias_info {
882 	uint8_t			Flags;
883 	uint8_t			AliasAlpa;
884 	uint16_t		Reserved;
885 	uint64_t		AliasWWNN;
886 	uint64_t		AliasWWPN;
887 } config_page_fc_port_5_alias_info_t;
888 
889 /*
890  * Host code (drivers, BIOS, utilities, etc.) should leave this
891  * define set to one and check Header.PageLength at runtime.
892  */
893 #ifndef	MPI_FC_PORT_PAGE_5_ALIAS_MAX
894 #define	MPI_FC_PORT_PAGE_5_ALIAS_MAX			1
895 #endif
896 
897 typedef struct config_page_fc_port_5 {
898 	config_page_header_t	Header;
899 	config_page_fc_port_5_alias_info_t
900 			AliasInfo[MPI_FC_PORT_PAGE_5_ALIAS_MAX];
901 } config_page_fc_port_5_t;
902 
903 #define	MPI_FCPORTPAGE5_PAGEVERSION			0x00
904 
905 #define	MPI_FCPORTPAGE5_FLAGS_ALIAS_ALPA_VALID		0x01
906 #define	MPI_FCPORTPAGE5_FLAGS_ALIAS_WWN_VALID		0x02
907 
908 typedef struct config_page_fc_port_6 {
909 	config_page_header_t	Header;
910 	uint32_t		Reserved;
911 	uint64_t		TimeSinceReset;
912 	uint64_t		TxFrames;
913 	uint64_t		RxFrames;
914 	uint64_t		TxWords;
915 	uint64_t		RxWords;
916 	uint64_t		LipCount;
917 	uint64_t		NosCount;
918 	uint64_t		ErrorFrames;
919 	uint64_t		DumpedFrames;
920 	uint64_t		LinkFailureCount;
921 	uint64_t		LossOfSyncCount;
922 	uint64_t		LossOfSignalCount;
923 	uint64_t		PrimativeSeqErrCount;
924 	uint64_t		InvalidTxWordCount;
925 	uint64_t		InvalidCrcCount;
926 	uint64_t		FcpInitiatorIoCount;
927 } config_page_fc_port_6_t;
928 
929 #define	MPI_FCPORTPAGE6_PAGEVERSION			0x00
930 
931 typedef struct config_page_fc_port_7 {
932 	config_page_header_t	Header;
933 	uint32_t		Reserved;
934 	uint8_t			PortSymbolicName[256];
935 } config_page_fc_port_7_t;
936 
937 #define	MPI_FCPORTPAGE7_PAGEVERSION			0x00
938 
939 typedef struct config_page_fc_port_8 {
940 	config_page_header_t	Header;
941 	uint32_t		BitVector[8];
942 } config_page_fc_port_8_t;
943 
944 #define	MPI_FCPORTPAGE8_PAGEVERSION			0x00
945 
946 typedef struct config_page_fc_port_9 {
947 	config_page_header_t	Header;
948 	uint32_t		Reserved;
949 	uint64_t		GlobalWWPN;
950 	uint64_t		GlobalWWNN;
951 	uint32_t		UnitType;
952 	uint32_t		PhysicalPortNumber;
953 	uint32_t		NumAttachedNodes;
954 	uint16_t		IPVersion;
955 	uint16_t		UDPPortNumber;
956 	uint8_t			IPAddress[16];
957 	uint16_t		Reserved1;
958 	uint16_t		TopologyDiscoveryFlags;
959 } config_page_fc_port_9_t;
960 
961 #define	MPI_FCPORTPAGE9_PAGEVERSION			0x00
962 
963 /*
964  * FC Device Config Pages
965  */
966 typedef struct config_page_fc_device_0 {
967 	config_page_header_t	Header;
968 	uint64_t		WWNN;
969 	uint64_t		WWPN;
970 	uint32_t		PortIdentifier;
971 	uint8_t			Protocol;
972 	uint8_t			Flags;
973 	uint16_t		BBCredit;
974 	uint16_t		MaxRxFrameSize;
975 	uint8_t			Reserved1;
976 	uint8_t			PortNumber;
977 	uint8_t			FcPhLowestVersion;
978 	uint8_t			FcPhHighestVersion;
979 	uint8_t			CurrentTargetID;
980 	uint8_t			CurrentBus;
981 } config_page_fc_device_0_t;
982 
983 #define	MPI_FC_DEVICE_PAGE_0_PAGEVERSION		0x02
984 
985 #define	MPI_FC_DEVICE_PAGE0_FLAGS_TARGETID_BUS_VALID	0x01
986 
987 #define	MPI_FC_DEVICE_PAGE_0_PROT_IP			0x01
988 #define	MPI_FC_DEVICE_PAGE_0_PROT_FCP_TARGET		0x02
989 #define	MPI_FC_DEVICE_PAGE_0_PROT_FCP_INITIATOR		0x04
990 
991 #define	MPI_FC_DEVICE_PAGE0_PGAD_PORT_MASK \
992 			(MPI_FC_DEVICE_PGAD_PORT_MASK)
993 #define	MPI_FC_DEVICE_PAGE0_PGAD_FORM_MASK \
994 			(MPI_FC_DEVICE_PGAD_FORM_MASK)
995 #define	MPI_FC_DEVICE_PAGE0_PGAD_FORM_NEXT_DID \
996 			(MPI_FC_DEVICE_PGAD_FORM_NEXT_DID)
997 #define	MPI_FC_DEVICE_PAGE0_PGAD_FORM_BUS_TID \
998 			(MPI_FC_DEVICE_PGAD_FORM_BUS_TID)
999 #define	MPI_FC_DEVICE_PAGE0_PGAD_DID_MASK \
1000 			(MPI_FC_DEVICE_PGAD_ND_DID_MASK)
1001 #define	MPI_FC_DEVICE_PAGE0_PGAD_BUS_MASK \
1002 			(MPI_FC_DEVICE_PGAD_BT_BUS_MASK)
1003 #define	MPI_FC_DEVICE_PAGE0_PGAD_BUS_SHIFT \
1004 			(MPI_FC_DEVICE_PGAD_BT_BUS_SHIFT)
1005 #define	MPI_FC_DEVICE_PAGE0_PGAD_TID_MASK \
1006 			(MPI_FC_DEVICE_PGAD_BT_TID_MASK)
1007 
1008 /*
1009  *  RAID Volume Config Pages
1010  */
1011 typedef struct raid_vol0_phys_disk {
1012 	uint16_t		Reserved;
1013 	uint8_t			PhysDiskMap;
1014 	uint8_t			PhysDiskNum;
1015 } raid_vol0_phys_disk_t;
1016 
1017 #define	MPI_RAIDVOL0_PHYSDISK_PRIMARY			0x01
1018 #define	MPI_RAIDVOL0_PHYSDISK_SECONDARY			0x02
1019 
1020 typedef struct raid_vol0_status {
1021 	uint8_t			Flags;
1022 	uint8_t			State;
1023 	uint16_t		Reserved;
1024 } raid_vol0_status_t;
1025 
1026 /*
1027  * RAID Volume Page 0 VolumeStatus defines
1028  */
1029 #define	MPI_RAIDVOL0_STATUS_FLAG_ENABLED		0x01
1030 #define	MPI_RAIDVOL0_STATUS_FLAG_QUIESCED		0x02
1031 #define	MPI_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS	0x04
1032 #define	MPI_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE	0x08
1033 
1034 #define	MPI_RAIDVOL0_STATUS_STATE_OPTIMAL		0x00
1035 #define	MPI_RAIDVOL0_STATUS_STATE_DEGRADED		0x01
1036 #define	MPI_RAIDVOL0_STATUS_STATE_FAILED		0x02
1037 #define	MPI_RAIDVOL0_STATUS_STATE_MISSING		0x03
1038 
1039 typedef struct raid_vol0_settings {
1040 	uint16_t		Settings;
1041 	uint8_t			HotSparePool;
1042 	uint8_t			Reserved;
1043 } raid_vol0_settings_t;
1044 
1045 /*
1046  * RAID Volume Page 0 VolumeSettings defines
1047  */
1048 #define	MPI_RAIDVOL0_SETTING_WRITE_CACHING_ENABLE	0x0001
1049 #define	MPI_RAIDVOL0_SETTING_OFFLINE_ON_SMART		0x0002
1050 #define	MPI_RAIDVOL0_SETTING_AUTO_CONFIGURE		0x0004
1051 #define	MPI_RAIDVOL0_SETTING_PRIORITY_RESYNC		0x0008
1052 #define	MPI_RAIDVOL0_SETTING_MASK_METADATA_SIZE		0x00C0
1053 #define	MPI_RAIDVOL0_SETTING_64MB_METADATA_SIZE		0x0000
1054 #define	MPI_RAIDVOL0_SETTING_512MB_METADATA_SIZE	0x0040
1055 #define	MPI_RAIDVOL0_SETTING_USE_PRODUCT_ID_SUFFIX	0x0010
1056 #define	MPI_RAIDVOL0_SETTING_USE_DEFAULTS		0x8000
1057 
1058 /*
1059  * RAID Volume Page 0 HotSparePool defines, also used in RAID Physical Disk
1060  */
1061 #define	MPI_RAID_HOT_SPARE_POOL_0			0x01
1062 #define	MPI_RAID_HOT_SPARE_POOL_1			0x02
1063 #define	MPI_RAID_HOT_SPARE_POOL_2			0x04
1064 #define	MPI_RAID_HOT_SPARE_POOL_3			0x08
1065 #define	MPI_RAID_HOT_SPARE_POOL_4			0x10
1066 #define	MPI_RAID_HOT_SPARE_POOL_5			0x20
1067 #define	MPI_RAID_HOT_SPARE_POOL_6			0x40
1068 #define	MPI_RAID_HOT_SPARE_POOL_7			0x80
1069 
1070 /*
1071  * Host code (drivers, BIOS, utilities, etc.) should leave this
1072  * define set to one and check Header.PageLength at runtime.
1073  */
1074 #ifndef	MPI_RAID_VOL_PAGE_0_PHYSDISK_MAX
1075 #define	MPI_RAID_VOL_PAGE_0_PHYSDISK_MAX		1
1076 #endif
1077 
1078 typedef struct config_page_raid_vol_0 {
1079 	config_page_header_t	Header;
1080 	uint8_t			VolumeID;
1081 	uint8_t			VolumeBus;
1082 	uint8_t			VolumeIOC;
1083 	uint8_t			VolumeType;
1084 	raid_vol0_status_t	VolumeStatus;
1085 	raid_vol0_settings_t	VolumeSettings;
1086 	uint32_t		MaxLBA;
1087 	uint32_t		MaxLBAHigh;
1088 	uint32_t		StripeSize;
1089 	uint32_t		Reserved2;
1090 	uint32_t		Reserved3;
1091 	uint8_t			NumPhysDisks;
1092 	uint8_t			Reserved4;
1093 	uint8_t			ResyncRate;
1094 	uint8_t			Reserved5;
1095 	raid_vol0_phys_disk_t	PhysDisk[MPI_RAID_VOL_PAGE_0_PHYSDISK_MAX];
1096 } config_page_raid_vol_0_t;
1097 
1098 #define	MPI_RAIDVOLPAGE0_PAGEVERSION			0x00
1099 
1100 typedef struct config_page_raid_vol_1
1101 {
1102 	config_page_header_t	Header;		/* 00h */
1103 	uint8_t			VolumeID;	/* 04h */
1104 	uint8_t			VolumeBus;	/* 05h */
1105 	uint8_t			VolumeIOC;	/* 06h */
1106 	uint8_t			Reserved0;	/* 07h */
1107 	uint8_t			GUID[24];	/* 08h */
1108 	uint8_t			Name[32];	/* 20h */
1109 	uint64_t		WWID;		/* 40h */
1110 	uint8_t			Reserved1;	/* 48h */
1111 	uint8_t			Reserved2;	/* 4Ch */
1112 } config_page_raid_vol_1_t;
1113 
1114 #define	MPI_RAIDVOLPAGE1_PAGEVERSION			0x01
1115 
1116 /*
1117  * RAID Physical Disk Config Pages
1118  */
1119 typedef struct raid_phys_disk0_error_data {
1120 	uint8_t			ErrorCdbByte;
1121 	uint8_t			ErrorSenseKey;
1122 	uint16_t		Reserved;
1123 	uint16_t		ErrorCount;
1124 	uint8_t			ErrorASC;
1125 	uint8_t			ErrorASCQ;
1126 	uint16_t		SmartCount;
1127 	uint8_t			SmartASC;
1128 	uint8_t			SmartASCQ;
1129 } raid_phys_disk0_error_data_t;
1130 
1131 typedef struct raid_phys_disk_inquiry_data {
1132 	uint8_t			VendorID[8];
1133 	uint8_t			ProductID[16];
1134 	uint8_t			ProductRevLevel[4];
1135 	uint8_t			Info[32];
1136 } raid_phys_disk0_inquiry_data_t;
1137 
1138 typedef struct raid_phys_disk0_settings {
1139 	uint8_t			SepID;
1140 	uint8_t			SepBus;
1141 	uint8_t			HotSparePool;
1142 	uint8_t			PhysDiskSettings;
1143 } raid_phys_disk0_settings_t;
1144 
1145 typedef struct raid_phys_disk0_status {
1146 	uint8_t			Flags;
1147 	uint8_t			State;
1148 	uint16_t		Reserved;
1149 } raid_phys_disk0_status_t;
1150 
1151 /*
1152  * RAID Volume 2 IM Physical Disk DiskStatus flags
1153  */
1154 #define	MPI_PHYSDISK0_STATUS_FLAG_OUT_OF_SYNC		0x01
1155 #define	MPI_PHYSDISK0_STATUS_FLAG_QUIESCED		0x02
1156 
1157 #define	MPI_PHYSDISK0_STATUS_ONLINE			0x00
1158 #define	MPI_PHYSDISK0_STATUS_MISSING			0x01
1159 #define	MPI_PHYSDISK0_STATUS_NOT_COMPATIBLE		0x02
1160 #define	MPI_PHYSDISK0_STATUS_FAILED			0x03
1161 #define	MPI_PHYSDISK0_STATUS_INITIALIZING		0x04
1162 #define	MPI_PHYSDISK0_STATUS_OFFLINE_REQUESTED		0x05
1163 #define	MPI_PHYSDISK0_STATUS_FAILED_REQUESTED		0x06
1164 #define	MPI_PHYSDISK0_STATUS_OTHER_OFFLINE		0xFF
1165 
1166 typedef struct config_page_raid_phys_disk_0 {
1167 	config_page_header_t	Header;
1168 	uint8_t			PhysDiskID;
1169 	uint8_t			PhysDiskBus;
1170 	uint8_t			PhysDiskIOC;
1171 	uint8_t			PhysDiskNum;
1172 	raid_phys_disk0_settings_t PhysDiskSettings;
1173 	uint32_t		Reserved1;
1174 	uint32_t		Reserved2;
1175 	uint32_t		Reserved3;
1176 	uint8_t			DiskIdentifier[16];
1177 	raid_phys_disk0_inquiry_data_t InquiryData;
1178 	raid_phys_disk0_status_t PhysDiskStatus;
1179 	uint32_t		MaxLBA;
1180 	raid_phys_disk0_error_data_t ErrorData;
1181 } config_page_raid_phys_disk_0_t;
1182 
1183 #define	MPI_RAIDPHYSDISKPAGE0_PAGEVERSION		0x00
1184 
1185 typedef struct raid_phys_disk1_path {
1186 	uint8_t			PhysDiskID;
1187 	uint8_t			PhysDiskBus;
1188 	uint16_t		Reserved1;
1189 	uint64_t		WWID;
1190 	uint64_t		OwnerWWID;
1191 	uint8_t			OwnerIdentifier;
1192 	uint8_t			Reserved2;
1193 	uint16_t		Flags;
1194 } raid_phys_disk1_path_t;
1195 
1196 /* RAID Physical Disk Page 1 Flags field defines */
1197 
1198 #define	MPI_RAID_PHYSDISK1_FLAG_BROKEN		0x0002
1199 #define	MPI_RAID_PHYSDISK1_FLAG_INVALID		0x0001
1200 
1201 #ifndef	MPI_RAID_PHYS_DISK1_PATH_MAX
1202 #define	MPI_RAID_PHYS_DISK1_PATH_MAX		1
1203 #endif
1204 
1205 typedef struct config_page_raid_phys_disk_1 {
1206 	config_page_header_t	Header;
1207 	uint8_t			NumPhysDiskPaths;
1208 	uint8_t			PhysDiskNum;
1209 	uint16_t		Reserved2;
1210 	uint32_t		Reserved1;
1211 	raid_phys_disk1_path_t	Path[MPI_RAID_PHYS_DISK1_PATH_MAX];
1212 } config_page_raid_phys_disk_1_t;
1213 
1214 #define	MPI_RAIDPHYSDISKPAGE1_PAGEVERSION		0x01
1215 /*
1216  * LAN Config Pages
1217  */
1218 typedef struct config_page_lan_0 {
1219 	config_page_header_t	Header;
1220 	uint16_t		TxRxModes;
1221 	uint16_t		Reserved;
1222 	uint32_t		PacketPrePad;
1223 } config_page_lan_0_t;
1224 
1225 #define	MPI_LAN_PAGE0_PAGEVERSION			0x01
1226 
1227 #define	MPI_LAN_PAGE0_RETURN_LOOPBACK			0x0000
1228 #define	MPI_LAN_PAGE0_SUPPRESS_LOOPBACK			0x0001
1229 #define	MPI_LAN_PAGE0_LOOPBACK_MASK			0x0001
1230 
1231 typedef struct config_page_lan_1 {
1232 	config_page_header_t	Header;
1233 	uint16_t		Reserved;
1234 	uint8_t			CurrentDeviceState;
1235 	uint8_t			Reserved1;
1236 	uint32_t		MinPacketSize;
1237 	uint32_t		MaxPacketSize;
1238 	uint32_t		HardwareAddressLow;
1239 	uint32_t		HardwareAddressHigh;
1240 	uint32_t		MaxWireSpeedLow;
1241 	uint32_t		MaxWireSpeedHigh;
1242 	uint32_t		BucketsRemaining;
1243 	uint32_t		MaxReplySize;
1244 	uint32_t		NegWireSpeedLow;
1245 	uint32_t		NegWireSpeedHigh;
1246 } config_page_lan_1_t;
1247 
1248 #define	MPI_LAN_PAGE1_PAGEVERSION			0x03
1249 
1250 #define	MPI_LAN_PAGE1_DEV_STATE_RESET			0x00
1251 #define	MPI_LAN_PAGE1_DEV_STATE_OPERATIONAL		0x01
1252 
1253 /*
1254  * Inband config pages
1255  */
1256 typedef struct config_page_inband_0 {
1257 	config_page_header_t	Header;
1258 	mpi_version_format_t	InbandVersion;
1259 	uint16_t		MaximumBuffers;
1260 	uint16_t		Reserved1;
1261 } config_page_inband_0_t;
1262 
1263 /*
1264  * SAS IO Unit config pages
1265  */
1266 typedef struct mpi_sas_io_unit0_phy_data {
1267 	uint8_t			Port;
1268 	uint8_t			PortFlags;
1269 	uint8_t			PhyFlags;
1270 	uint8_t			NegotiatedLinkRate;
1271 	uint32_t		ControllerPhyDeviceInfo;
1272 	uint16_t		AttachedDeviceHandle;
1273 	uint16_t		ControllerDevHandle;
1274 	uint32_t		Reserved2;
1275 } mpi_sas_io_unit0_phy_data_t;
1276 
1277 /*
1278  * Host code (drivers, BIOS, utilities, etc.) should leave this define set to
1279  * one and check Header.PageLength at runtime.
1280  */
1281 #ifndef	MPI_SAS_IOUNIT0_PHY_MAX
1282 #define	MPI_SAS_IOUNIT0_PHY_MAX		1
1283 #endif
1284 
1285 typedef struct config_page_sas_io_unit_0 {
1286 	config_extended_page_header_t	Header;
1287 	uint16_t			NvdataVersionDefault;
1288 	uint16_t			NvdataVersionPersistent;
1289 	uint8_t				NumPhys;
1290 	uint8_t				Reserved2;
1291 	uint16_t			Reserved3;
1292 	mpi_sas_io_unit0_phy_data_t	PhyData[MPI_SAS_IOUNIT0_PHY_MAX];
1293 } config_page_sas_io_unit_0_t;
1294 
1295 #define	MPI_SASIOUNITPAGE0_PAGEVERSION		0x00
1296 
1297 #define	MPI_SAS_IOUNIT0_PORT_FLAGS_DISCOVERY_IN_PROGRESS	0x08
1298 #define	MPI_SAS_IOUNIT0_PORT_FLAGS_0_TARGET_IOC_NUM		0x00
1299 #define	MPI_SAS_IOUNIT0_PORT_FLAGS_1_TARGET_IOC_NUM		0x04
1300 #define	MPI_SAS_IOUNIT0_PORT_FLAGS_WAIT_FOR_PORTENABLE		0x02
1301 #define	MPI_SAS_IOUNIT0_PORT_FLAGS_AUTO_PORT_CONFIG		0x01
1302 
1303 #define	MPI_SAS_IOUNIT0_PHY_FLAGS_PHY_DISABLED			0x04
1304 #define	MPI_SAS_IOUNIT0_PHY_FLAGS_TX_INVERT			0x02
1305 #define	MPI_SAS_IOUNIT0_PHY_FLAGS_RX_INVERT			0x01
1306 
1307 #define	MPI_SAS_IOUNIT0_RATE_UNKNOWN				0x00
1308 #define	MPI_SAS_IOUNIT0_RATE_PHY_DISABLED			0x01
1309 #define	MPI_SAS_IOUNIT0_RATE_FAILED_SPEED_NEGOTIATION		0x02
1310 #define	MPI_SAS_IOUNIT0_RATE_SATA_OOB_COMPLETE			0x03
1311 #define	MPI_SAS_IOUNIT0_RATE_1_5				0x08
1312 #define	MPI_SAS_IOUNIT0_RATE_3_0				0x09
1313 
1314 typedef struct mpi_sas_io_unit1_phy_data {
1315 	uint8_t				Port;
1316 	uint8_t				PortFlags;
1317 	uint8_t				PhyFlags;
1318 	uint8_t				MaxMinLinkRate;
1319 	uint32_t			ControllerPhyDeviceInfo;
1320 	uint32_t			Reserved1;
1321 } mpi_sas_io_unit1_phy_data_t;
1322 
1323 /*
1324  * Host code (drivers, BIOS, utilities, etc.) should leave this define set to
1325  * one and check Header.PageLength at runtime.
1326  */
1327 #ifndef	MPI_SAS_IOUNIT1_PHY_MAX
1328 #define	MPI_SAS_IOUNIT1_PHY_MAX		1
1329 #endif
1330 
1331 typedef struct config_page_sas_io_unit_1 {
1332 	config_extended_page_header_t	Header;
1333 	uint16_t			ControlFlags;
1334 	uint16_t			MaxNumSATATargets;
1335 	uint16_t			AdditionalControlFlags;
1336 	uint16_t			Reserved1;
1337 	uint8_t				NumPhys;
1338 	uint8_t				SATAMaxQDepth;
1339 	uint8_t				ReportMissingDeviceDelay;
1340 	uint8_t				IODeviceMissingDelay;
1341 	mpi_sas_io_unit1_phy_data_t	PhyData[MPI_SAS_IOUNIT1_PHY_MAX];
1342 } config_page_sas_io_unit_1_t;
1343 
1344 #define	MPI_SASIOUNITPAGE1_PAGEVERSION		0x00
1345 
1346 #define	MPI_SAS_IOUNIT1_PORT_FLAGS_0_TARGET_IOC_NUM		0x00
1347 #define	MPI_SAS_IOUNIT1_PORT_FLAGS_1_TARGET_IOC_NUM		0x04
1348 #define	MPI_SAS_IOUNIT1_PORT_FLAGS_WAIT_FOR_PORTENABLE		0x02
1349 #define	MPI_SAS_IOUNIT1_PORT_FLAGS_AUTO_PORT_CONFIG		0x01
1350 
1351 #define	MPI_SAS_IOUNIT1_PHY_FLAGS_PHY_DISABLE			0x04
1352 #define	MPI_SAS_IOUNIT1_PHY_FLAGS_TX_INVERT			0x02
1353 #define	MPI_SAS_IOUNIT1_PHY_FLAGS_RX_INVERT			0x01
1354 
1355 #define	MPI_SAS_IOUNIT1_MAX_RATE_MASK				0xF0
1356 #define	MPI_SAS_IOUNIT1_MAX_RATE_1_5				0x80
1357 #define	MPI_SAS_IOUNIT1_MAX_RATE_3_0				0x90
1358 #define	MPI_SAS_IOUNIT1_MIN_RATE_MASK				0x0F
1359 #define	MPI_SAS_IOUNIT1_MIN_RATE_1_5				0x08
1360 #define	MPI_SAS_IOUNIT1_MIN_RATE_3_0				0x09
1361 
1362 typedef struct config_page_sas_io_unit_2 {
1363 	config_extended_page_header_t		Header;
1364 	uint32_t				Reserved1;
1365 	uint16_t				MaxPersistentIDs;
1366 	uint16_t				NumPersistentIDsUsed;
1367 	uint8_t					Status;
1368 	uint8_t					Flags;
1369 	uint16_t				Reserved2;
1370 } config_page_sas_io_unit_2_t;
1371 
1372 #define	MPI_SASIOUNITPAGE2_PAGEVERSION		0x00
1373 
1374 #define	MPI_SAS_IOUNIT2_STATUS_DISABLED_PERSISTENT_MAPPINGS	0x02
1375 #define	MPI_SAS_IOUNIT2_STATUS_FULL_PERSISTENT_MAPPINGS		0x01
1376 
1377 #define	MPI_SAS_IOUNIT2_FLAGS_DISABLE_PERSISTENT_MAPPINGS	0x01
1378 
1379 #define	MPI_SAS_IOUNIT2_FLAGS_MASK_PHYS_MAP_MODE		0x0E
1380 #define	MPI_SAS_IOUNIT2_FLAGS_SHIFT_PHYS_MAP_MODE		1
1381 #define	MPI_SAS_IOUNIT2_FLAGS_NO_PHYS_MAP			0x00
1382 #define	MPI_SAS_IOUNIT2_FLAGS_DIRECT_ATTACH_PHYS_MAP		0x01
1383 #define	MPI_SAS_IOUNIT2_FLAGS_ENCLOSURE_SLOT_PHYS_MAP		0x02
1384 #define	MPI_SAS_IOUNIT2_FLAGS_HOST_ASSIGNED_PHYS_MAP		0x07
1385 
1386 typedef struct config_page_sas_io_unit_3 {
1387 	config_extended_page_header_t		Header;
1388 	uint32_t				Reserved1;
1389 	uint32_t				MaxInvalidDwordCount;
1390 	uint32_t				InvalidDwordCountTime;
1391 	uint32_t				MaxRunningDisparityErrorCount;
1392 	uint32_t				RunningDisparityErrorTime;
1393 	uint32_t				MaxLossDwordSynchCount;
1394 	uint32_t				LossDwordSynchCountTime;
1395 	uint32_t				MaxPhyResetProblemCount;
1396 	uint32_t				PhyResetProblemTime;
1397 } config_page_sas_io_unit_3_t;
1398 
1399 #define	MPI_SASIOUNITPAGE3_PAGEVERSION		0x00
1400 
1401 typedef struct config_page_sas_expander_0 {
1402 	config_extended_page_header_t	Header;
1403 	uint8_t				PhysicalPort;
1404 	uint8_t				Reserved1;
1405 	uint16_t			EnclosureHandle;
1406 	uint64_t			SASAddress;
1407 	uint32_t			Reserved2;
1408 	uint16_t			DevHandle;
1409 	uint16_t			ParentDevHandle;
1410 	uint16_t			ExpanderChangeCount;
1411 	uint16_t			ExpanderRouteIndexes;
1412 	uint8_t				NumPhys;
1413 	uint8_t				SASLevel;
1414 	uint8_t				Flags;
1415 	uint8_t				Reserved3;
1416 } config_page_sas_expander_0_t;
1417 
1418 #define	MPI_SASEXPANDER0_PAGEVERSION		0x00
1419 
1420 #define	MPI_SAS_EXPANDER0_FLAGS_ROUTE_TABLE_CONFIG	0x02
1421 #define	MPI_SAS_EXPANDER0_FLAGS_CONFIG_IN_PROGRESS	0x01
1422 
1423 
1424 typedef struct config_page_sas_expander_1 {
1425 	config_extended_page_header_t	Header;
1426 	uint32_t			Reserved1;
1427 	uint8_t				NumPhys;
1428 	uint8_t				Phy;
1429 	uint16_t			Reserved2;
1430 	uint8_t				ProgrammedLinkRate;
1431 	uint8_t				HwLinkRate;
1432 	uint16_t			AttachedDevHandle;
1433 	uint32_t			PhyInfo;
1434 	uint32_t			AttachedDeviceInfo;
1435 	uint16_t			OwnerDevHandle;
1436 	uint8_t				ChangeCount;
1437 	uint8_t				Reserved3;
1438 	uint8_t				PhyIdentifier;
1439 	uint8_t				AttachedPhyIdentifier;
1440 	uint8_t				NumTableEntriesProg;
1441 	uint8_t				DiscoveryInfo;
1442 	uint32_t			Reserved4;
1443 } config_page_sas_expander_1_t;
1444 
1445 #define	MPI_SASEXPANDER1_PAGEVERSION		0x00
1446 
1447 /* use MPI_SAS_PHY0_PRATE_ defines for ProgrammedLinkRate */
1448 
1449 /* use MPI_SAS_PHY0_HWRATE_ defines for HwLinkRate */
1450 
1451 /* use MPI_SAS_PHY0_PHYINFO_ defines for PhyInfo */
1452 
1453 /* see mpi_sas.h for values for SAS Expander Page 1 AttachedDeviceInfo values */
1454 
1455 /* values for SAS Expander Page 1 DiscoveryInfo field */
1456 #define	MPI_SAS_EXPANDER1_DISCINFO_LINK_STATUS_CHANGE	0x02
1457 #define	MPI_SAS_EXPANDER1_DISCINFO_NO_ROUTING_ENTRIES	0x01
1458 
1459 typedef struct config_page_sas_device_0 {
1460 	config_extended_page_header_t	Header;
1461 	uint16_t			Slot;
1462 	uint16_t			EnclosureHandle;
1463 	uint64_t			SASAddress;
1464 	uint16_t			ParentDevHandle;
1465 	uint8_t				PhyNum;
1466 	uint8_t				AccessStatus;
1467 	uint16_t			DevHandle;
1468 	uint8_t				TargetID;
1469 	uint8_t				Bus;
1470 	uint32_t			DeviceInfo;
1471 	uint16_t			Flags;
1472 	uint8_t				PhysicalPort;
1473 	uint8_t				Reserved2;
1474 } config_page_sas_device_0_t;
1475 
1476 #define	MPI_SASDEVICE0_PAGEVERSION		0x00
1477 
1478 #define	MPI_SAS_DEVICE0_FLAGS_MAPPING_PERSISTENT	0x04
1479 #define	MPI_SAS_DEVICE0_FLAGS_DEVICE_MAPPED		0x02
1480 #define	MPI_SAS_DEVICE0_FLAGS_DEVICE_PRESENT		0x01
1481 
1482 typedef struct config_page_sas_device_1 {
1483 	config_extended_page_header_t	Header;
1484 	uint32_t			Reserved1;
1485 	uint64_t			SASAddress;
1486 	uint32_t			Reserved2;
1487 	uint16_t			DevHandle;
1488 	uint8_t				TargetID;
1489 	uint8_t				Bus;
1490 	uint8_t				InitialRegDeviceFIS[20];
1491 } config_page_sas_device_1_t;
1492 
1493 #define	MPI_SASDEVICE1_PAGEVERSION		0x00
1494 
1495 typedef struct config_page_sas_phy_0 {
1496 	config_extended_page_header_t	Header;
1497 	uint32_t			Reserved1;
1498 	uint64_t			SASAddress;
1499 	uint16_t			AttachedDevHandle;
1500 	uint8_t				AttachedPhyIdentifier;
1501 	uint8_t				Reserved2;
1502 	uint32_t			AttachedDeviceInfo;
1503 	uint8_t				ProgrammedLinkRate;
1504 	uint8_t				HwLinkRate;
1505 	uint8_t				ChangeCount;
1506 	uint8_t				Reserved3;
1507 	uint32_t			PhyInfo;
1508 } config_page_sas_phy_0_t;
1509 
1510 #define	MPI_SASPHY0_PAGEVERSION		0x00
1511 
1512 #define	MPI_SAS_PHY0_PRATE_MAX_RATE_MASK		0xF0
1513 #define	MPI_SAS_PHY0_PRATE_MAX_RATE_NOT_PROGRAMMABLE	0x00
1514 #define	MPI_SAS_PHY0_PRATE_MAX_RATE_1_5			0x80
1515 #define	MPI_SAS_PHY0_PRATE_MAX_RATE_3_0			0x90
1516 #define	MPI_SAS_PHY0_PRATE_MIN_RATE_MASK		0x0F
1517 #define	MPI_SAS_PHY0_PRATE_MIN_RATE_NOT_PROGRAMMABLE	0x00
1518 #define	MPI_SAS_PHY0_PRATE_MIN_RATE_1_5			0x08
1519 #define	MPI_SAS_PHY0_PRATE_MIN_RATE_3_0			0x09
1520 
1521 #define	MPI_SAS_PHY0_HWRATE_MAX_RATE_MASK		0xF0
1522 #define	MPI_SAS_PHY0_HWRATE_MAX_RATE_1_5		0x80
1523 #define	MPI_SAS_PHY0_HWRATE_MAX_RATE_3_0		0x90
1524 #define	MPI_SAS_PHY0_HWRATE_MIN_RATE_MASK		0x0F
1525 #define	MPI_SAS_PHY0_HWRATE_MIN_RATE_1_5		0x08
1526 #define	MPI_SAS_PHY0_HWRATE_MIN_RATE_3_0		0x09
1527 
1528 #define	MPI_SAS_PHY0_PHYINFO_SATA_PORT_ACTIVE		0x00004000
1529 #define	MPI_SAS_PHY0_PHYINFO_SATA_PORT_SELECTOR		0x00002000
1530 #define	MPI_SAS_PHY0_PHYINFO_VIRTUAL_PHY		0x00001000
1531 
1532 #define	MPI_SAS_PHY0_PHYINFO_MASK_PARTIAL_PATHWAY_TIME	0x00000F00
1533 #define	MPI_SAS_PHY0_PHYINFO_SHIFT_PARTIAL_PATHWAY_TIME	8
1534 
1535 #define	MPI_SAS_PHY0_PHYINFO_MASK_ROUTING_ATTRIBUTE	0x000000F0
1536 #define	MPI_SAS_PHY0_PHYINFO_DIRECT_ROUTING		0x00000000
1537 #define	MPI_SAS_PHY0_PHYINFO_SUBTRACTIVE_ROUTING	0x00000010
1538 #define	MPI_SAS_PHY0_PHYINFO_TABLE_ROUTING		0x00000020
1539 
1540 #define	MPI_SAS_PHY0_DEVINFO_SATA_DEVICE		0x00000080
1541 
1542 #define	MPI_SAS_PHY0_PHYINFO_MASK_LINK_RATE		0x0000000F
1543 #define	MPI_SAS_PHY0_PHYINFO_UNKNOWN_LINK_RATE		0x00000000
1544 #define	MPI_SAS_PHY0_PHYINFO_PHY_DISABLED		0x00000001
1545 #define	MPI_SAS_PHY0_PHYINFO_NEGOTIATION_FAILED		0x00000002
1546 #define	MPI_SAS_PHY0_PHYINFO_SATA_OOB_COMPLETE		0x00000003
1547 #define	MPI_SAS_PHY0_PHYINFO_RATE_1_5			0x00000008
1548 #define	MPI_SAS_PHY0_PHYINFO_RATE_3_0			0x00000009
1549 
1550 typedef struct config_page_sas_phy_1 {
1551 	config_extended_page_header_t	Header;
1552 	uint32_t			Reserved1;
1553 	uint32_t			InvalidDwordCount;
1554 	uint32_t			RunningDisparityErrorCount;
1555 	uint32_t			LossDwordSynchCount;
1556 	uint32_t			PhyResetProblemCount;
1557 } config_page_sas_phy_1_t;
1558 
1559 #define	MPI_SASPHY1_PAGEVERSION		0x00
1560 
1561 #ifdef	__cplusplus
1562 }
1563 #endif
1564 
1565 #endif	/* _SYS_MPI_CNFG_H */
1566