xref: /freebsd/sys/dev/mfi/mfireg.h (revision 741367d5a5fd63597870bbe01eb750839d0c457a)
12e21a3efSScott Long /*-
22e21a3efSScott Long  * Copyright (c) 2006 IronPort Systems
32e21a3efSScott Long  * All rights reserved.
42e21a3efSScott Long  *
52e21a3efSScott Long  * Redistribution and use in source and binary forms, with or without
62e21a3efSScott Long  * modification, are permitted provided that the following conditions
72e21a3efSScott Long  * are met:
82e21a3efSScott Long  * 1. Redistributions of source code must retain the above copyright
92e21a3efSScott Long  *    notice, this list of conditions and the following disclaimer.
102e21a3efSScott Long  * 2. Redistributions in binary form must reproduce the above copyright
112e21a3efSScott Long  *    notice, this list of conditions and the following disclaimer in the
122e21a3efSScott Long  *    documentation and/or other materials provided with the distribution.
132e21a3efSScott Long  *
142e21a3efSScott Long  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
152e21a3efSScott Long  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
162e21a3efSScott Long  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
172e21a3efSScott Long  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
182e21a3efSScott Long  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
192e21a3efSScott Long  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
202e21a3efSScott Long  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
212e21a3efSScott Long  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
222e21a3efSScott Long  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
232e21a3efSScott Long  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
242e21a3efSScott Long  * SUCH DAMAGE.
252e21a3efSScott Long  */
262e21a3efSScott Long 
272e21a3efSScott Long #ifndef _MFIREG_H
282e21a3efSScott Long #define _MFIREG_H
292e21a3efSScott Long 
302e21a3efSScott Long #include <sys/cdefs.h>
312e21a3efSScott Long __FBSDID("$FreeBSD$");
322e21a3efSScott Long 
332e21a3efSScott Long /*
342e21a3efSScott Long  * MegaRAID SAS MFI firmware definitions
352e21a3efSScott Long  *
362e21a3efSScott Long  * Calling this driver 'MegaRAID SAS' is a bit misleading.  It's a completely
372e21a3efSScott Long  * new firmware interface from the old AMI MegaRAID one, and there is no
382e21a3efSScott Long  * reason why this interface should be limited to just SAS.  In any case, LSI
392e21a3efSScott Long  * seems to also call this interface 'MFI', so that will be used here.
402e21a3efSScott Long  */
412e21a3efSScott Long 
422e21a3efSScott Long /*
432e21a3efSScott Long  * Start with the register set.  All registers are 32 bits wide.
442e21a3efSScott Long  * The usual Intel IOP style setup.
452e21a3efSScott Long  */
462e21a3efSScott Long #define MFI_IMSG0	0x10	/* Inbound message 0 */
472e21a3efSScott Long #define MFI_IMSG1	0x14	/* Inbound message 1 */
482e21a3efSScott Long #define MFI_OMSG0	0x18	/* Outbound message 0 */
492e21a3efSScott Long #define MFI_OMSG1	0x1c	/* Outbound message 1 */
502e21a3efSScott Long #define MFI_IDB		0x20	/* Inbound doorbell */
512e21a3efSScott Long #define MFI_ISTS	0x24	/* Inbound interrupt status */
522e21a3efSScott Long #define MFI_IMSK	0x28	/* Inbound interrupt mask */
532e21a3efSScott Long #define MFI_ODB		0x2c	/* Outbound doorbell */
542e21a3efSScott Long #define MFI_OSTS	0x30	/* Outbound interrupt status */
552e21a3efSScott Long #define MFI_OMSK	0x34	/* Outbound interrupt mask */
562e21a3efSScott Long #define MFI_IQP		0x40	/* Inbound queue port */
572e21a3efSScott Long #define MFI_OQP		0x44	/* Outbound queue port */
582e21a3efSScott Long 
592e21a3efSScott Long /* Bits for MFI_OSTS */
602e21a3efSScott Long #define MFI_OSTS_INTR_VALID	0x00000002
612e21a3efSScott Long 
622e21a3efSScott Long /*
632e21a3efSScott Long  * Firmware state values.  Found in OMSG0 during initialization.
642e21a3efSScott Long  */
652e21a3efSScott Long #define MFI_FWSTATE_MASK		0xf0000000
662e21a3efSScott Long #define MFI_FWSTATE_UNDEFINED		0x00000000
672e21a3efSScott Long #define MFI_FWSTATE_BB_INIT		0x10000000
682e21a3efSScott Long #define MFI_FWSTATE_FW_INIT		0x40000000
692e21a3efSScott Long #define MFI_FWSTATE_WAIT_HANDSHAKE	0x60000000
702e21a3efSScott Long #define MFI_FWSTATE_FW_INIT_2		0x70000000
712e21a3efSScott Long #define MFI_FWSTATE_DEVICE_SCAN		0x80000000
722e21a3efSScott Long #define MFI_FWSTATE_FLUSH_CACHE		0xa0000000
732e21a3efSScott Long #define MFI_FWSTATE_READY		0xb0000000
742e21a3efSScott Long #define MFI_FWSTATE_OPERATIONAL		0xc0000000
752e21a3efSScott Long #define MFI_FWSTATE_FAULT		0xf0000000
762e21a3efSScott Long #define MFI_FWSTATE_MAXSGL_MASK		0x00ff0000
772e21a3efSScott Long #define MFI_FWSTATE_MAXCMD_MASK		0x0000ffff
782e21a3efSScott Long 
792e21a3efSScott Long /*
802e21a3efSScott Long  * Control bits to drive the card to ready state.  These go into the IDB
812e21a3efSScott Long  * register.
822e21a3efSScott Long  */
832e21a3efSScott Long #define MFI_FWINIT_ABORT	0x00000000 /* Abort all pending commands */
842e21a3efSScott Long #define MFI_FWINIT_READY	0x00000002 /* Move from operational to ready */
852e21a3efSScott Long #define MFI_FWINIT_MFIMODE	0x00000004 /* unknown */
862e21a3efSScott Long #define MFI_FWINIT_CLEAR_HANDSHAKE 0x00000008 /* Respond to WAIT_HANDSHAKE */
872e21a3efSScott Long 
882e21a3efSScott Long /* MFI Commands */
892e21a3efSScott Long typedef enum {
902e21a3efSScott Long 	MFI_CMD_INIT =		0x00,
912e21a3efSScott Long 	MFI_CMD_LD_READ,
922e21a3efSScott Long 	MFI_CMD_LD_WRITE,
932e21a3efSScott Long 	MFI_CMD_LD_SCSI_IO,
942e21a3efSScott Long 	MFI_CMD_PD_SCSI_IO,
952e21a3efSScott Long 	MFI_CMD_DCMD,
962e21a3efSScott Long 	MFI_CMD_ABORT,
972e21a3efSScott Long 	MFI_CMD_SMP,
982e21a3efSScott Long 	MFI_CMD_STP
992e21a3efSScott Long } mfi_cmd_t;
1002e21a3efSScott Long 
1012e21a3efSScott Long /* Direct commands */
1022e21a3efSScott Long typedef enum {
1032e21a3efSScott Long 	MFI_DCMD_CTRL_GETINFO =		0x01010000,
1042e21a3efSScott Long 	MFI_DCMD_CTRL_FLUSHCACHE =	0x01101000,
1052e21a3efSScott Long 	MFI_DCMD_CTRL_SHUTDOWN =	0x01050000,
1062e21a3efSScott Long 	MFI_DCMD_CTRL_EVENT_GETINFO =	0x01040100,
1072e21a3efSScott Long 	MFI_DCMD_CTRL_EVENT_GET =	0x01040300,
1082e21a3efSScott Long 	MFI_DCMD_CTRL_EVENT_WAIT =	0x01040500,
1092e21a3efSScott Long 	MFI_DCMD_LD_GET_PROP =		0x03030000,
1102e21a3efSScott Long 	MFI_DCMD_CLUSTER =		0x08000000,
1112e21a3efSScott Long 	MFI_DCMD_CLUSTER_RESET_ALL =	0x08010100,
1122e21a3efSScott Long 	MFI_DCMD_CLUSTER_RESET_LD =	0x08010200
1132e21a3efSScott Long } mfi_dcmd_t;
1142e21a3efSScott Long 
1152e21a3efSScott Long /* Modifiers for MFI_DCMD_CTRL_FLUSHCACHE */
1162e21a3efSScott Long #define MFI_FLUSHCACHE_CTRL	0x01
1172e21a3efSScott Long #define MFI_FLUSHCACHE_DISK	0x02
1182e21a3efSScott Long 
1192e21a3efSScott Long /* Modifiers for MFI_DCMD_CTRL_SHUTDOWN */
1202e21a3efSScott Long #define MFI_SHUTDOWN_SPINDOWN	0x01
1212e21a3efSScott Long 
1222e21a3efSScott Long /*
123741367d5SDoug Ambrisko  * MFI Frame flags
1242e21a3efSScott Long  */
1252e21a3efSScott Long #define MFI_FRAME_POST_IN_REPLY_QUEUE		0x0000
1262e21a3efSScott Long #define MFI_FRAME_DONT_POST_IN_REPLY_QUEUE	0x0001
1272e21a3efSScott Long #define MFI_FRAME_SGL32				0x0000
1282e21a3efSScott Long #define MFI_FRAME_SGL64				0x0002
1292e21a3efSScott Long #define MFI_FRAME_SENSE32			0x0000
1302e21a3efSScott Long #define MFI_FRAME_SENSE64			0x0004
1312e21a3efSScott Long #define MFI_FRAME_DIR_NONE			0x0000
1322e21a3efSScott Long #define MFI_FRAME_DIR_WRITE			0x0008
1332e21a3efSScott Long #define MFI_FRAME_DIR_READ			0x0010
1342e21a3efSScott Long #define MFI_FRAME_DIR_BOTH			0x0018
1352e21a3efSScott Long 
1362e21a3efSScott Long /* MFI Status codes */
1372e21a3efSScott Long typedef enum {
1382e21a3efSScott Long 	MFI_STAT_OK =			0x00,
1392e21a3efSScott Long 	MFI_STAT_INVALID_CMD,
1402e21a3efSScott Long 	MFI_STAT_INVALID_DCMD,
1412e21a3efSScott Long 	MFI_STAT_INVALID_PARAMETER,
1422e21a3efSScott Long 	MFI_STAT_INVALID_SEQUENCE_NUMBER,
1432e21a3efSScott Long 	MFI_STAT_ABORT_NOT_POSSIBLE,
1442e21a3efSScott Long 	MFI_STAT_APP_HOST_CODE_NOT_FOUND,
1452e21a3efSScott Long 	MFI_STAT_APP_IN_USE,
1462e21a3efSScott Long 	MFI_STAT_APP_NOT_INITIALIZED,
1472e21a3efSScott Long 	MFI_STAT_ARRAY_INDEX_INVALID,
1482e21a3efSScott Long 	MFI_STAT_ARRAY_ROW_NOT_EMPTY,
1492e21a3efSScott Long 	MFI_STAT_CONFIG_RESOURCE_CONFLICT,
1502e21a3efSScott Long 	MFI_STAT_DEVICE_NOT_FOUND,
1512e21a3efSScott Long 	MFI_STAT_DRIVE_TOO_SMALL,
1522e21a3efSScott Long 	MFI_STAT_FLASH_ALLOC_FAIL,
1532e21a3efSScott Long 	MFI_STAT_FLASH_BUSY,
1542e21a3efSScott Long 	MFI_STAT_FLASH_ERROR =		0x10,
1552e21a3efSScott Long 	MFI_STAT_FLASH_IMAGE_BAD,
1562e21a3efSScott Long 	MFI_STAT_FLASH_IMAGE_INCOMPLETE,
1572e21a3efSScott Long 	MFI_STAT_FLASH_NOT_OPEN,
1582e21a3efSScott Long 	MFI_STAT_FLASH_NOT_STARTED,
1592e21a3efSScott Long 	MFI_STAT_FLUSH_FAILED,
1602e21a3efSScott Long 	MFI_STAT_HOST_CODE_NOT_FOUNT,
1612e21a3efSScott Long 	MFI_STAT_LD_CC_IN_PROGRESS,
1622e21a3efSScott Long 	MFI_STAT_LD_INIT_IN_PROGRESS,
1632e21a3efSScott Long 	MFI_STAT_LD_LBA_OUT_OF_RANGE,
1642e21a3efSScott Long 	MFI_STAT_LD_MAX_CONFIGURED,
1652e21a3efSScott Long 	MFI_STAT_LD_NOT_OPTIMAL,
1662e21a3efSScott Long 	MFI_STAT_LD_RBLD_IN_PROGRESS,
1672e21a3efSScott Long 	MFI_STAT_LD_RECON_IN_PROGRESS,
1682e21a3efSScott Long 	MFI_STAT_LD_WRONG_RAID_LEVEL,
1692e21a3efSScott Long 	MFI_STAT_MAX_SPARES_EXCEEDED,
1702e21a3efSScott Long 	MFI_STAT_MEMORY_NOT_AVAILABLE =	0x20,
1712e21a3efSScott Long 	MFI_STAT_MFC_HW_ERROR,
1722e21a3efSScott Long 	MFI_STAT_NO_HW_PRESENT,
1732e21a3efSScott Long 	MFI_STAT_NOT_FOUND,
1742e21a3efSScott Long 	MFI_STAT_NOT_IN_ENCL,
1752e21a3efSScott Long 	MFI_STAT_PD_CLEAR_IN_PROGRESS,
1762e21a3efSScott Long 	MFI_STAT_PD_TYPE_WRONG,
1772e21a3efSScott Long 	MFI_STAT_PR_DISABLED,
1782e21a3efSScott Long 	MFI_STAT_ROW_INDEX_INVALID,
1792e21a3efSScott Long 	MFI_STAT_SAS_CONFIG_INVALID_ACTION,
1802e21a3efSScott Long 	MFI_STAT_SAS_CONFIG_INVALID_DATA,
1812e21a3efSScott Long 	MFI_STAT_SAS_CONFIG_INVALID_PAGE,
1822e21a3efSScott Long 	MFI_STAT_SAS_CONFIG_INVALID_TYPE,
1832e21a3efSScott Long 	MFI_STAT_SCSI_DONE_WITH_ERROR,
1842e21a3efSScott Long 	MFI_STAT_SCSI_IO_FAILED,
1852e21a3efSScott Long 	MFI_STAT_SCSI_RESERVATION_CONFLICT,
1862e21a3efSScott Long 	MFI_STAT_SHUTDOWN_FAILED =	0x30,
1872e21a3efSScott Long 	MFI_STAT_TIME_NOT_SET,
1882e21a3efSScott Long 	MFI_STAT_WRONG_STATE,
1892e21a3efSScott Long 	MFI_STAT_LD_OFFLINE,
1902e21a3efSScott Long 	MFI_STAT_PEER_NOTIFICATION_REJECTED,
1912e21a3efSScott Long 	MFI_STAT_PEER_NOTIFICATION_FAILED,
1922e21a3efSScott Long 	MFI_STAT_RESERVATION_IN_PROGRESS,
1932e21a3efSScott Long 	MFI_STAT_I2C_ERRORS_DETECTED,
1942e21a3efSScott Long 	MFI_STAT_PCI_ERRORS_DETECTED,
1952e21a3efSScott Long 	MFI_STAT_INVALID_STATUS =	0xFF
1962e21a3efSScott Long } mfi_status_t;
1972e21a3efSScott Long 
1982e21a3efSScott Long typedef enum {
1992e21a3efSScott Long 	MFI_EVT_CLASS_DEBUG =		-2,
2002e21a3efSScott Long 	MFI_EVT_CLASS_PROGRESS =	-1,
2012e21a3efSScott Long 	MFI_EVT_CLASS_INFO =		0,
2022e21a3efSScott Long 	MFI_EVT_CLASS_WARNING =		1,
2032e21a3efSScott Long 	MFI_EVT_CLASS_CRITICAL =	2,
2042e21a3efSScott Long 	MFI_EVT_CLASS_FATAL =		3,
2052e21a3efSScott Long 	MFI_EVT_CLASS_DEAD =		4
2062e21a3efSScott Long } mfi_evt_class_t;
2072e21a3efSScott Long 
2082e21a3efSScott Long typedef enum {
2092e21a3efSScott Long 	MFI_EVT_LOCALE_LD =		0x0001,
2102e21a3efSScott Long 	MFI_EVT_LOCALE_PD =		0x0002,
2112e21a3efSScott Long 	MFI_EVT_LOCALE_ENCL =		0x0004,
2122e21a3efSScott Long 	MFI_EVT_LOCALE_BBU =		0x0008,
2132e21a3efSScott Long 	MFI_EVT_LOCALE_SAS =		0x0010,
2142e21a3efSScott Long 	MFI_EVT_LOCALE_CTRL =		0x0020,
2152e21a3efSScott Long 	MFI_EVT_LOCALE_CONFIG =		0x0040,
2162e21a3efSScott Long 	MFI_EVT_LOCALE_CLUSTER =	0x0080,
2172e21a3efSScott Long 	MFI_EVT_LOCALE_ALL =		0xffff
2182e21a3efSScott Long } mfi_evt_locale_t;
2192e21a3efSScott Long 
2202e21a3efSScott Long typedef enum {
2212e21a3efSScott Long 	MR_EVT_ARGS_NONE =		0x00,
2222e21a3efSScott Long 	MR_EVT_ARGS_CDB_SENSE,
2232e21a3efSScott Long 	MR_EVT_ARGS_LD,
2242e21a3efSScott Long 	MR_EVT_ARGS_LD_COUNT,
2252e21a3efSScott Long 	MR_EVT_ARGS_LD_LBA,
2262e21a3efSScott Long 	MR_EVT_ARGS_LD_OWNER,
2272e21a3efSScott Long 	MR_EVT_ARGS_LD_LBA_PD_LBA,
2282e21a3efSScott Long 	MR_EVT_ARGS_LD_PROG,
2292e21a3efSScott Long 	MR_EVT_ARGS_LD_STATE,
2302e21a3efSScott Long 	MR_EVT_ARGS_LD_STRIP,
2312e21a3efSScott Long 	MR_EVT_ARGS_PD,
2322e21a3efSScott Long 	MR_EVT_ARGS_PD_ERR,
2332e21a3efSScott Long 	MR_EVT_ARGS_PD_LBA,
2342e21a3efSScott Long 	MR_EVT_ARGS_PD_LBA_LD,
2352e21a3efSScott Long 	MR_EVT_ARGS_PD_PROG,
2362e21a3efSScott Long 	MR_EVT_ARGS_PD_STATE,
2372e21a3efSScott Long 	MR_EVT_ARGS_PCI,
2382e21a3efSScott Long 	MR_EVT_ARGS_RATE,
2392e21a3efSScott Long 	MR_EVT_ARGS_STR,
2402e21a3efSScott Long 	MR_EVT_ARGS_TIME,
2412e21a3efSScott Long 	MR_EVT_ARGS_ECC
2422e21a3efSScott Long } mfi_evt_args;
2432e21a3efSScott Long 
2442e21a3efSScott Long /*
2452e21a3efSScott Long  * Other propertities and definitions
2462e21a3efSScott Long  */
2472e21a3efSScott Long #define MFI_MAX_PD_CHANNELS	2
2482e21a3efSScott Long #define MFI_MAX_LD_CHANNELS	2
2492e21a3efSScott Long #define MFI_MAX_CHANNELS	(MFI_MAX_PD_CHANNELS + MFI_MAX_LD_CHANNELS)
2502e21a3efSScott Long #define MFI_MAX_CHANNEL_DEVS	128
2512e21a3efSScott Long #define MFI_DEFAULT_ID		-1
2522e21a3efSScott Long #define MFI_MAX_LUN		8
2532e21a3efSScott Long #define MFI_MAX_LD		64
2542e21a3efSScott Long 
2552e21a3efSScott Long #define MFI_FRAME_SIZE		64
2562e21a3efSScott Long #define MFI_MBOX_SIZE		12
2572e21a3efSScott Long 
2582e21a3efSScott Long #define MFI_POLL_TIMEOUT_SECS	10
2592e21a3efSScott Long 
2602e21a3efSScott Long /* Allow for speedier math calculations */
2612e21a3efSScott Long #define MFI_SECTOR_LEN		512
2622e21a3efSScott Long 
2632e21a3efSScott Long /* Scatter Gather elements */
2642e21a3efSScott Long struct mfi_sg32 {
2652e21a3efSScott Long 	uint32_t	addr;
2662e21a3efSScott Long 	uint32_t	len;
2672e21a3efSScott Long } __packed;
2682e21a3efSScott Long 
2692e21a3efSScott Long struct mfi_sg64 {
2702e21a3efSScott Long 	uint64_t	addr;
2712e21a3efSScott Long 	uint32_t	len;
2722e21a3efSScott Long } __packed;
2732e21a3efSScott Long 
2742e21a3efSScott Long union mfi_sgl {
2752e21a3efSScott Long 	struct mfi_sg32	sg32[1];
2762e21a3efSScott Long 	struct mfi_sg64	sg64[1];
2772e21a3efSScott Long } __packed;
2782e21a3efSScott Long 
2792e21a3efSScott Long /* Message frames.  All messages have a common header */
2802e21a3efSScott Long struct mfi_frame_header {
2812e21a3efSScott Long 	uint8_t		cmd;
2822e21a3efSScott Long 	uint8_t		sense_len;
2832e21a3efSScott Long 	uint8_t		cmd_status;
2842e21a3efSScott Long 	uint8_t		scsi_status;
2852e21a3efSScott Long 	uint8_t		target_id;
2862e21a3efSScott Long 	uint8_t		lun_id;
2872e21a3efSScott Long 	uint8_t		cdb_len;
2882e21a3efSScott Long 	uint8_t		sg_count;
2892e21a3efSScott Long 	uint32_t	context;
2902e21a3efSScott Long 	uint32_t	pad0;
2912e21a3efSScott Long 	uint16_t	flags;
2922e21a3efSScott Long 	uint16_t	timeout;
2932e21a3efSScott Long 	uint32_t	data_len;
2942e21a3efSScott Long } __packed;
2952e21a3efSScott Long 
2962e21a3efSScott Long struct mfi_init_frame {
2972e21a3efSScott Long 	struct mfi_frame_header	header;
2982e21a3efSScott Long 	uint32_t	qinfo_new_addr_lo;
2992e21a3efSScott Long 	uint32_t	qinfo_new_addr_hi;
3002e21a3efSScott Long 	uint32_t	qinfo_old_addr_lo;
3012e21a3efSScott Long 	uint32_t	qinfo_old_addr_hi;
3022e21a3efSScott Long 	uint32_t	reserved[6];
3032e21a3efSScott Long } __packed;
3042e21a3efSScott Long 
3052e21a3efSScott Long #define MFI_IO_FRAME_SIZE 40
3062e21a3efSScott Long struct mfi_io_frame {
3072e21a3efSScott Long 	struct mfi_frame_header	header;
3082e21a3efSScott Long 	uint32_t	sense_addr_lo;
3092e21a3efSScott Long 	uint32_t	sense_addr_hi;
3102e21a3efSScott Long 	uint32_t	lba_lo;
3112e21a3efSScott Long 	uint32_t	lba_hi;
3122e21a3efSScott Long 	union mfi_sgl	sgl;
3132e21a3efSScott Long } __packed;
3142e21a3efSScott Long 
3152e21a3efSScott Long #define MFI_PASS_FRAME_SIZE 48
3162e21a3efSScott Long struct mfi_pass_frame {
3172e21a3efSScott Long 	struct mfi_frame_header header;
3182e21a3efSScott Long 	uint32_t	sense_addr_lo;
3192e21a3efSScott Long 	uint32_t	sense_addr_hi;
3202e21a3efSScott Long 	uint8_t		cdb[16];
3212e21a3efSScott Long 	union mfi_sgl	sgl;
3222e21a3efSScott Long } __packed;
3232e21a3efSScott Long 
3242e21a3efSScott Long #define MFI_DCMD_FRAME_SIZE 40
3252e21a3efSScott Long struct mfi_dcmd_frame {
3262e21a3efSScott Long 	struct mfi_frame_header header;
3272e21a3efSScott Long 	uint32_t	opcode;
3282e21a3efSScott Long 	uint8_t		mbox[MFI_MBOX_SIZE];
3292e21a3efSScott Long 	union mfi_sgl	sgl;
3302e21a3efSScott Long } __packed;
3312e21a3efSScott Long 
3322e21a3efSScott Long struct mfi_abort_frame {
3332e21a3efSScott Long 	struct mfi_frame_header header;
3342e21a3efSScott Long 	uint32_t	abort_context;
3352e21a3efSScott Long 	uint32_t	pad;
3362e21a3efSScott Long 	uint32_t	abort_mfi_addr_lo;
3372e21a3efSScott Long 	uint32_t	abort_mfi_addr_hi;
3382e21a3efSScott Long 	uint32_t	reserved[6];
3392e21a3efSScott Long } __packed;
3402e21a3efSScott Long 
3412e21a3efSScott Long struct mfi_smp_frame {
3422e21a3efSScott Long 	struct mfi_frame_header header;
3432e21a3efSScott Long 	uint64_t	sas_addr;
3442e21a3efSScott Long 	union {
3452e21a3efSScott Long 		struct mfi_sg32 sg32[2];
3462e21a3efSScott Long 		struct mfi_sg64 sg64[2];
3472e21a3efSScott Long 	} sgl;
3482e21a3efSScott Long } __packed;
3492e21a3efSScott Long 
3502e21a3efSScott Long struct mfi_stp_frame {
3512e21a3efSScott Long 	struct mfi_frame_header header;
3522e21a3efSScott Long 	uint16_t	fis[10];
3532e21a3efSScott Long 	uint32_t	stp_flags;
3542e21a3efSScott Long 	union {
3552e21a3efSScott Long 		struct mfi_sg32 sg32[2];
3562e21a3efSScott Long 		struct mfi_sg64 sg64[2];
3572e21a3efSScott Long 	} sgl;
3582e21a3efSScott Long } __packed;
3592e21a3efSScott Long 
3602e21a3efSScott Long union mfi_frame {
3612e21a3efSScott Long 	struct mfi_frame_header header;
3622e21a3efSScott Long 	struct mfi_init_frame	init;
3632e21a3efSScott Long 	struct mfi_io_frame	io;
3642e21a3efSScott Long 	struct mfi_pass_frame	pass;
3652e21a3efSScott Long 	struct mfi_dcmd_frame	dcmd;
3662e21a3efSScott Long 	struct mfi_abort_frame	abort;
3672e21a3efSScott Long 	struct mfi_smp_frame	smp;
3682e21a3efSScott Long 	struct mfi_stp_frame	stp;
3692e21a3efSScott Long 	uint8_t			bytes[MFI_FRAME_SIZE];
3702e21a3efSScott Long };
3712e21a3efSScott Long 
3722e21a3efSScott Long #define MFI_SENSE_LEN 128
3732e21a3efSScott Long struct mfi_sense {
3742e21a3efSScott Long 	uint8_t		data[MFI_SENSE_LEN];
3752e21a3efSScott Long };
3762e21a3efSScott Long 
3772e21a3efSScott Long /* The queue init structure that is passed with the init message */
3782e21a3efSScott Long struct mfi_init_qinfo {
3792e21a3efSScott Long 	uint32_t	flags;
3802e21a3efSScott Long 	uint32_t	rq_entries;
3812e21a3efSScott Long 	uint32_t	rq_addr_lo;
3822e21a3efSScott Long 	uint32_t	rq_addr_hi;
3832e21a3efSScott Long 	uint32_t	pi_addr_lo;
3842e21a3efSScott Long 	uint32_t	pi_addr_hi;
3852e21a3efSScott Long 	uint32_t	ci_addr_lo;
3862e21a3efSScott Long 	uint32_t	ci_addr_hi;
3872e21a3efSScott Long } __packed;
3882e21a3efSScott Long 
3892e21a3efSScott Long /* SAS (?) controller properties, part of mfi_ctrl_info */
3902e21a3efSScott Long struct mfi_ctrl_props {
3912e21a3efSScott Long 	uint16_t	seq_num;
3922e21a3efSScott Long 	uint16_t	pred_fail_poll_interval;
3932e21a3efSScott Long 	uint16_t	intr_throttle_cnt;
3942e21a3efSScott Long 	uint16_t	intr_throttle_timeout;
3952e21a3efSScott Long 	uint8_t		rebuild_rate;
3962e21a3efSScott Long 	uint8_t		patrol_read_rate;
3972e21a3efSScott Long 	uint8_t		bgi_rate;
3982e21a3efSScott Long 	uint8_t		cc_rate;
3992e21a3efSScott Long 	uint8_t		recon_rate;
4002e21a3efSScott Long 	uint8_t		cache_flush_interval;
4012e21a3efSScott Long 	uint8_t		spinup_drv_cnt;
4022e21a3efSScott Long 	uint8_t		spinup_delay;
4032e21a3efSScott Long 	uint8_t		cluster_enable;
4042e21a3efSScott Long 	uint8_t		coercion_mode;
4052e21a3efSScott Long 	uint8_t		alarm_enable;
4062e21a3efSScott Long 	uint8_t		disable_auto_rebuild;
4072e21a3efSScott Long 	uint8_t		disable_battery_warn;
4082e21a3efSScott Long 	uint8_t		ecc_bucket_size;
4092e21a3efSScott Long 	uint16_t	ecc_bucket_leak_rate;
4102e21a3efSScott Long 	uint8_t		restore_hotspare_on_insertion;
4112e21a3efSScott Long 	uint8_t		expose_encl_devices;
4122e21a3efSScott Long 	uint8_t		reserved[38];
4132e21a3efSScott Long } __packed;
4142e21a3efSScott Long 
4152e21a3efSScott Long /* PCI information about the card. */
4162e21a3efSScott Long struct mfi_info_pci {
4172e21a3efSScott Long 	uint16_t	vendor;
4182e21a3efSScott Long 	uint16_t	device;
4192e21a3efSScott Long 	uint16_t	subvendor;
4202e21a3efSScott Long 	uint16_t	subdevice;
4212e21a3efSScott Long 	uint8_t		reserved[24];
4222e21a3efSScott Long } __packed;
4232e21a3efSScott Long 
4242e21a3efSScott Long /* Host (front end) interface information */
4252e21a3efSScott Long struct mfi_info_host {
4262e21a3efSScott Long 	uint8_t		type;
4272e21a3efSScott Long #define MFI_INFO_HOST_PCIX	0x01
4282e21a3efSScott Long #define MFI_INFO_HOST_PCIE	0x02
4292e21a3efSScott Long #define MFI_INFO_HOST_ISCSI	0x04
4302e21a3efSScott Long #define MFI_INFO_HOST_SAS3G	0x08
4312e21a3efSScott Long 	uint8_t		reserved[6];
4322e21a3efSScott Long 	uint8_t		port_count;
4332e21a3efSScott Long 	uint64_t	port_addr[8];
4342e21a3efSScott Long } __packed;
4352e21a3efSScott Long 
4362e21a3efSScott Long /* Device (back end) interface information */
4372e21a3efSScott Long struct mfi_info_device {
4382e21a3efSScott Long 	uint8_t		type;
4392e21a3efSScott Long #define MFI_INFO_DEV_SPI	0x01
4402e21a3efSScott Long #define MFI_INFO_DEV_SAS3G	0x02
4412e21a3efSScott Long #define MFI_INFO_DEV_SATA1	0x04
4422e21a3efSScott Long #define MFI_INFO_DEV_SATA3G	0x08
4432e21a3efSScott Long 	uint8_t		reserved[6];
4442e21a3efSScott Long 	uint8_t		port_count;
4452e21a3efSScott Long 	uint64_t	port_addr[8];
4462e21a3efSScott Long } __packed;
4472e21a3efSScott Long 
4482e21a3efSScott Long /* Firmware component information */
4492e21a3efSScott Long struct mfi_info_component {
4502e21a3efSScott Long 	char		 name[8];
4512e21a3efSScott Long 	char		 version[32];
4522e21a3efSScott Long 	char		 build_date[16];
4532e21a3efSScott Long 	char		 build_time[16];
4542e21a3efSScott Long } __packed;
4552e21a3efSScott Long 
4562e21a3efSScott Long 
4572e21a3efSScott Long /* SAS (?) controller info, returned from MFI_DCMD_CTRL_GETINFO. */
4582e21a3efSScott Long struct mfi_ctrl_info {
4592e21a3efSScott Long 	struct mfi_info_pci	pci;
4602e21a3efSScott Long 	struct mfi_info_host	host;
4612e21a3efSScott Long 	struct mfi_info_device	device;
4622e21a3efSScott Long 
4632e21a3efSScott Long 	/* Firmware components that are present and active. */
4642e21a3efSScott Long 	uint32_t		image_check_word;
4652e21a3efSScott Long 	uint32_t		image_component_count;
4662e21a3efSScott Long 	struct mfi_info_component image_component[8];
4672e21a3efSScott Long 
4682e21a3efSScott Long 	/* Firmware components that have been flashed but are inactive */
4692e21a3efSScott Long 	uint32_t		pending_image_component_count;
4702e21a3efSScott Long 	struct mfi_info_component pending_image_component[8];
4712e21a3efSScott Long 
4722e21a3efSScott Long 	uint8_t			max_arms;
4732e21a3efSScott Long 	uint8_t			max_spans;
4742e21a3efSScott Long 	uint8_t			max_arrays;
4752e21a3efSScott Long 	uint8_t			max_lds;
4762e21a3efSScott Long 	char			product_name[80];
4772e21a3efSScott Long 	char			serial_number[32];
4782e21a3efSScott Long 	uint32_t		hw_present;
4792e21a3efSScott Long #define MFI_INFO_HW_BBU		0x01
4802e21a3efSScott Long #define MFI_INFO_HW_ALARM	0x02
4812e21a3efSScott Long #define MFI_INFO_HW_NVRAM	0x04
4822e21a3efSScott Long #define MFI_INFO_HW_UART	0x08
4832e21a3efSScott Long 	uint32_t		current_fw_time;
4842e21a3efSScott Long 	uint16_t		max_cmds;
4852e21a3efSScott Long 	uint16_t		max_sg_elements;
4862e21a3efSScott Long 	uint32_t		max_request_size;
4872e21a3efSScott Long 	uint16_t		lds_present;
4882e21a3efSScott Long 	uint16_t		lds_degraded;
4892e21a3efSScott Long 	uint16_t		lds_offline;
4902e21a3efSScott Long 	uint16_t		pd_present;
4912e21a3efSScott Long 	uint16_t		pd_disks_present;
4922e21a3efSScott Long 	uint16_t		pd_disks_pred_failure;
4932e21a3efSScott Long 	uint16_t		pd_disks_failed;
4942e21a3efSScott Long 	uint16_t		nvram_size;
4952e21a3efSScott Long 	uint16_t		memory_size;
4962e21a3efSScott Long 	uint16_t		flash_size;
4972e21a3efSScott Long 	uint16_t		ram_correctable_errors;
4982e21a3efSScott Long 	uint16_t		ram_uncorrectable_errors;
4992e21a3efSScott Long 	uint8_t			cluster_allowed;
5002e21a3efSScott Long 	uint8_t			cluster_active;
5012e21a3efSScott Long 	uint16_t		max_strips_per_io;
5022e21a3efSScott Long 
5032e21a3efSScott Long 	uint32_t		raid_levels;
5042e21a3efSScott Long #define MFI_INFO_RAID_0		0x01
5052e21a3efSScott Long #define MFI_INFO_RAID_1		0x02
5062e21a3efSScott Long #define MFI_INFO_RAID_5		0x04
5072e21a3efSScott Long #define MFI_INFO_RAID_1E	0x08
5082e21a3efSScott Long #define MFI_INFO_RAID_6		0x10
5092e21a3efSScott Long 
5102e21a3efSScott Long 	uint32_t		adapter_ops;
5112e21a3efSScott Long #define MFI_INFO_AOPS_RBLD_RATE		0x0001
5122e21a3efSScott Long #define MFI_INFO_AOPS_CC_RATE		0x0002
5132e21a3efSScott Long #define MFI_INFO_AOPS_BGI_RATE		0x0004
5142e21a3efSScott Long #define MFI_INFO_AOPS_RECON_RATE	0x0008
5152e21a3efSScott Long #define MFI_INFO_AOPS_PATROL_RATE	0x0010
5162e21a3efSScott Long #define MFI_INFO_AOPS_ALARM_CONTROL	0x0020
5172e21a3efSScott Long #define MFI_INFO_AOPS_CLUSTER_SUPPORTED	0x0040
5182e21a3efSScott Long #define MFI_INFO_AOPS_BBU		0x0080
5192e21a3efSScott Long #define MFI_INFO_AOPS_SPANNING_ALLOWED	0x0100
5202e21a3efSScott Long #define MFI_INFO_AOPS_DEDICATED_SPARES	0x0200
5212e21a3efSScott Long #define MFI_INFO_AOPS_REVERTIBLE_SPARES	0x0400
5222e21a3efSScott Long #define MFI_INFO_AOPS_FOREIGN_IMPORT	0x0800
5232e21a3efSScott Long #define MFI_INFO_AOPS_SELF_DIAGNOSTIC	0x1000
5242e21a3efSScott Long #define MFI_INFO_AOPS_MIXED_ARRAY	0x2000
5252e21a3efSScott Long #define MFI_INFO_AOPS_GLOBAL_SPARES	0x4000
5262e21a3efSScott Long 
5272e21a3efSScott Long 	uint32_t		ld_ops;
5282e21a3efSScott Long #define MFI_INFO_LDOPS_READ_POLICY	0x01
5292e21a3efSScott Long #define MFI_INFO_LDOPS_WRITE_POLICY	0x02
5302e21a3efSScott Long #define MFI_INFO_LDOPS_IO_POLICY	0x04
5312e21a3efSScott Long #define MFI_INFO_LDOPS_ACCESS_POLICY	0x08
5322e21a3efSScott Long #define MFI_INFO_LDOPS_DISK_CACHE_POLICY 0x10
5332e21a3efSScott Long 
5342e21a3efSScott Long 	struct {
5352e21a3efSScott Long 		uint8_t		min;
5362e21a3efSScott Long 		uint8_t		max;
5372e21a3efSScott Long 		uint8_t		reserved[2];
5382e21a3efSScott Long 	} __packed stripe_sz_ops;
5392e21a3efSScott Long 
5402e21a3efSScott Long 	uint32_t		pd_ops;
5412e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_ONLINE	0x01
5422e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_OFFLINE	0x02
5432e21a3efSScott Long #define MFI_INFO_PDOPS_FORCE_REBUILD	0x04
5442e21a3efSScott Long 
5452e21a3efSScott Long 	uint32_t		pd_mix_support;
5462e21a3efSScott Long #define MFI_INFO_PDMIX_SAS		0x01
5472e21a3efSScott Long #define MFI_INFO_PDMIX_SATA		0x02
5482e21a3efSScott Long #define MFI_INFO_PDMIX_ENCL		0x04
5492e21a3efSScott Long #define MFI_INFO_PDMIX_LD		0x08
5502e21a3efSScott Long #define MFI_INFO_PDMIX_SATA_CLUSTER	0x10
5512e21a3efSScott Long 
5522e21a3efSScott Long 	uint8_t			ecc_bucket_count;
5532e21a3efSScott Long 	uint8_t			reserved2[11];
5542e21a3efSScott Long 	struct mfi_ctrl_props	properties;
5552e21a3efSScott Long 	char			package_version[0x60];
5562e21a3efSScott Long 	uint8_t			pad[0x800 - 0x6a0];
5572e21a3efSScott Long } __packed;
5582e21a3efSScott Long 
559741367d5SDoug Ambrisko /* keep track of an event. */
560741367d5SDoug Ambrisko union mfi_evt {
561741367d5SDoug Ambrisko 	struct {
562741367d5SDoug Ambrisko 		uint16_t	locale;
563741367d5SDoug Ambrisko 		uint8_t		reserved;
564741367d5SDoug Ambrisko 		uint8_t		class;
565741367d5SDoug Ambrisko 	} members;
566741367d5SDoug Ambrisko 	uint32_t		word;
567741367d5SDoug Ambrisko } __packed;
568741367d5SDoug Ambrisko 
569741367d5SDoug Ambrisko /* event log state. */
570741367d5SDoug Ambrisko struct mfi_evt_log_state {
571741367d5SDoug Ambrisko 	uint32_t		newest_seq_num;
572741367d5SDoug Ambrisko 	uint32_t		oldest_seq_num;
573741367d5SDoug Ambrisko 	uint32_t		clear_seq_num;
574741367d5SDoug Ambrisko 	uint32_t		shutdown_seq_num;
575741367d5SDoug Ambrisko 	uint32_t		boot_seq_num;
576741367d5SDoug Ambrisko } __packed;
577741367d5SDoug Ambrisko 
578741367d5SDoug Ambrisko struct mfi_progress {
579741367d5SDoug Ambrisko 	uint16_t		progress;
580741367d5SDoug Ambrisko 	uint16_t		elapsed_seconds;
581741367d5SDoug Ambrisko } __packed;
582741367d5SDoug Ambrisko 
583741367d5SDoug Ambrisko struct mfi_evt_ld {
584741367d5SDoug Ambrisko 	uint16_t		target_id;
585741367d5SDoug Ambrisko 	uint8_t			ld_index;
586741367d5SDoug Ambrisko 	uint8_t			reserved;
587741367d5SDoug Ambrisko } __packed;
588741367d5SDoug Ambrisko 
589741367d5SDoug Ambrisko struct mfi_evt_pd {
590741367d5SDoug Ambrisko 	uint16_t		device_id;
591741367d5SDoug Ambrisko 	uint8_t			enclosure_index;
592741367d5SDoug Ambrisko 	uint8_t			slot_number;
593741367d5SDoug Ambrisko } __packed;
594741367d5SDoug Ambrisko 
595741367d5SDoug Ambrisko /* SAS (?) event detail, returned from MFI_DCMD_CTRL_EVENT_WAIT. */
596741367d5SDoug Ambrisko struct mfi_evt_detail {
597741367d5SDoug Ambrisko 	uint32_t		seq;
598741367d5SDoug Ambrisko 	uint32_t		time;
599741367d5SDoug Ambrisko 	uint32_t		code;
600741367d5SDoug Ambrisko 	union mfi_evt		class;
601741367d5SDoug Ambrisko 	uint8_t			arg_type;
602741367d5SDoug Ambrisko 	uint8_t			reserved1[15];
603741367d5SDoug Ambrisko 
604741367d5SDoug Ambrisko 	union {
605741367d5SDoug Ambrisko 		struct {
606741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
607741367d5SDoug Ambrisko 			uint8_t			cdb_len;
608741367d5SDoug Ambrisko 			uint8_t			sense_len;
609741367d5SDoug Ambrisko 			uint8_t			reserved[2];
610741367d5SDoug Ambrisko 			uint8_t			cdb[16];
611741367d5SDoug Ambrisko 			uint8_t			sense[64];
612741367d5SDoug Ambrisko 		} cdb_sense;
613741367d5SDoug Ambrisko 
614741367d5SDoug Ambrisko 		struct mfi_evt_ld		ld;
615741367d5SDoug Ambrisko 
616741367d5SDoug Ambrisko 		struct {
617741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
618741367d5SDoug Ambrisko 			uint64_t		count;
619741367d5SDoug Ambrisko 		} ld_count;
620741367d5SDoug Ambrisko 
621741367d5SDoug Ambrisko 		struct {
622741367d5SDoug Ambrisko 			uint64_t		lba;
623741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
624741367d5SDoug Ambrisko 		} ld_lba;
625741367d5SDoug Ambrisko 
626741367d5SDoug Ambrisko 		struct {
627741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
628741367d5SDoug Ambrisko 			uint32_t		pre_owner;
629741367d5SDoug Ambrisko 			uint32_t		new_owner;
630741367d5SDoug Ambrisko 		} ld_owner;
631741367d5SDoug Ambrisko 
632741367d5SDoug Ambrisko 		struct {
633741367d5SDoug Ambrisko 			uint64_t		ld_lba;
634741367d5SDoug Ambrisko 			uint64_t		pd_lba;
635741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
636741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
637741367d5SDoug Ambrisko 		} ld_lba_pd_lba;
638741367d5SDoug Ambrisko 
639741367d5SDoug Ambrisko 		struct {
640741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
641741367d5SDoug Ambrisko 			struct mfi_progress	prog;
642741367d5SDoug Ambrisko 		} ld_prog;
643741367d5SDoug Ambrisko 
644741367d5SDoug Ambrisko 		struct {
645741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
646741367d5SDoug Ambrisko 			uint32_t		prev_state;
647741367d5SDoug Ambrisko 			uint32_t		new_state;
648741367d5SDoug Ambrisko 		} ld_state;
649741367d5SDoug Ambrisko 
650741367d5SDoug Ambrisko 		struct {
651741367d5SDoug Ambrisko 			uint64_t		strip;
652741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
653741367d5SDoug Ambrisko 		} ld_strip;
654741367d5SDoug Ambrisko 
655741367d5SDoug Ambrisko 		struct mfi_evt_pd		pd;
656741367d5SDoug Ambrisko 
657741367d5SDoug Ambrisko 		struct {
658741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
659741367d5SDoug Ambrisko 			uint32_t		err;
660741367d5SDoug Ambrisko 		} pd_err;
661741367d5SDoug Ambrisko 
662741367d5SDoug Ambrisko 		struct {
663741367d5SDoug Ambrisko 			uint64_t		lba;
664741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
665741367d5SDoug Ambrisko 		} pd_lba;
666741367d5SDoug Ambrisko 
667741367d5SDoug Ambrisko 		struct {
668741367d5SDoug Ambrisko 			uint64_t		lba;
669741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
670741367d5SDoug Ambrisko 			struct mfi_evt_ld	ld;
671741367d5SDoug Ambrisko 		} pd_lba_ld;
672741367d5SDoug Ambrisko 
673741367d5SDoug Ambrisko 		struct {
674741367d5SDoug Ambrisko 			struct mfi_evt_pd	pd;
675741367d5SDoug Ambrisko 			struct mfi_progress	prog;
676741367d5SDoug Ambrisko 		} pd_prog;
677741367d5SDoug Ambrisko 
678741367d5SDoug Ambrisko 		struct {
679741367d5SDoug Ambrisko 			struct mfi_evt_pd	ld;
680741367d5SDoug Ambrisko 			uint32_t		prev_state;
681741367d5SDoug Ambrisko 			uint32_t		new_state;
682741367d5SDoug Ambrisko 		} pd_state;
683741367d5SDoug Ambrisko 
684741367d5SDoug Ambrisko 		struct {
685741367d5SDoug Ambrisko 			uint16_t		venderId;
686741367d5SDoug Ambrisko 			uint16_t		deviceId;
687741367d5SDoug Ambrisko 			uint16_t		subVenderId;
688741367d5SDoug Ambrisko 			uint16_t		subDeviceId;
689741367d5SDoug Ambrisko 		} pci;
690741367d5SDoug Ambrisko 
691741367d5SDoug Ambrisko 		uint32_t			rate;
692741367d5SDoug Ambrisko 
693741367d5SDoug Ambrisko 		char				str[96];
694741367d5SDoug Ambrisko 
695741367d5SDoug Ambrisko 		struct {
696741367d5SDoug Ambrisko 			uint32_t		rtc;
697741367d5SDoug Ambrisko 			uint16_t		elapsedSeconds;
698741367d5SDoug Ambrisko 		} time;
699741367d5SDoug Ambrisko 
700741367d5SDoug Ambrisko 		struct {
701741367d5SDoug Ambrisko 			uint32_t		ecar;
702741367d5SDoug Ambrisko 			uint32_t		elog;
703741367d5SDoug Ambrisko 			char			str[64];
704741367d5SDoug Ambrisko 		} ecc;
705741367d5SDoug Ambrisko 
706741367d5SDoug Ambrisko 		uint8_t		b[96];
707741367d5SDoug Ambrisko 		uint16_t	s[48];
708741367d5SDoug Ambrisko 		uint32_t	w[24];
709741367d5SDoug Ambrisko 		uint64_t	d[12];
710741367d5SDoug Ambrisko 	} args;
711741367d5SDoug Ambrisko 
712741367d5SDoug Ambrisko 	char description[128];
713741367d5SDoug Ambrisko } __packed;
714741367d5SDoug Ambrisko 
715741367d5SDoug Ambrisko /* SAS log detail guessed at */
716741367d5SDoug Ambrisko struct mfi_log_detail {
717741367d5SDoug Ambrisko 	uint32_t		something1;
718741367d5SDoug Ambrisko 	uint32_t		something2;
719741367d5SDoug Ambrisko 	uint32_t		seq;
720741367d5SDoug Ambrisko 	uint32_t		something3;
721741367d5SDoug Ambrisko 	uint32_t		arg_type;
722741367d5SDoug Ambrisko 	uint8_t			reserved1[15];
723741367d5SDoug Ambrisko 
724741367d5SDoug Ambrisko 	union {
725741367d5SDoug Ambrisko 		uint8_t		b[96];
726741367d5SDoug Ambrisko 	} args;
727741367d5SDoug Ambrisko 	char description[128];
728741367d5SDoug Ambrisko } __packed;
729741367d5SDoug Ambrisko 
7302e21a3efSScott Long #endif /* _MFIREG_H */
731