root / hw / mfi.h @ 7430d0f5
History | View | Annotate | Download (36.9 kB)
1 | 7430d0f5 | Hannes Reinecke | /*
|
---|---|---|---|
2 | 7430d0f5 | Hannes Reinecke | * NetBSD header file, copied from
|
3 | 7430d0f5 | Hannes Reinecke | * http://gitorious.org/freebsd/freebsd/blobs/HEAD/sys/dev/mfi/mfireg.h
|
4 | 7430d0f5 | Hannes Reinecke | */
|
5 | 7430d0f5 | Hannes Reinecke | /*-
|
6 | 7430d0f5 | Hannes Reinecke | * Copyright (c) 2006 IronPort Systems
|
7 | 7430d0f5 | Hannes Reinecke | * Copyright (c) 2007 LSI Corp.
|
8 | 7430d0f5 | Hannes Reinecke | * Copyright (c) 2007 Rajesh Prabhakaran.
|
9 | 7430d0f5 | Hannes Reinecke | * All rights reserved.
|
10 | 7430d0f5 | Hannes Reinecke | *
|
11 | 7430d0f5 | Hannes Reinecke | * Redistribution and use in source and binary forms, with or without
|
12 | 7430d0f5 | Hannes Reinecke | * modification, are permitted provided that the following conditions
|
13 | 7430d0f5 | Hannes Reinecke | * are met:
|
14 | 7430d0f5 | Hannes Reinecke | * 1. Redistributions of source code must retain the above copyright
|
15 | 7430d0f5 | Hannes Reinecke | * notice, this list of conditions and the following disclaimer.
|
16 | 7430d0f5 | Hannes Reinecke | * 2. Redistributions in binary form must reproduce the above copyright
|
17 | 7430d0f5 | Hannes Reinecke | * notice, this list of conditions and the following disclaimer in the
|
18 | 7430d0f5 | Hannes Reinecke | * documentation and/or other materials provided with the distribution.
|
19 | 7430d0f5 | Hannes Reinecke | *
|
20 | 7430d0f5 | Hannes Reinecke | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
21 | 7430d0f5 | Hannes Reinecke | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
22 | 7430d0f5 | Hannes Reinecke | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
23 | 7430d0f5 | Hannes Reinecke | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
24 | 7430d0f5 | Hannes Reinecke | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
25 | 7430d0f5 | Hannes Reinecke | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
26 | 7430d0f5 | Hannes Reinecke | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
27 | 7430d0f5 | Hannes Reinecke | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
28 | 7430d0f5 | Hannes Reinecke | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
29 | 7430d0f5 | Hannes Reinecke | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
30 | 7430d0f5 | Hannes Reinecke | * SUCH DAMAGE.
|
31 | 7430d0f5 | Hannes Reinecke | */
|
32 | 7430d0f5 | Hannes Reinecke | |
33 | 7430d0f5 | Hannes Reinecke | #ifndef MFI_REG_H
|
34 | 7430d0f5 | Hannes Reinecke | #define MFI_REG_H
|
35 | 7430d0f5 | Hannes Reinecke | |
36 | 7430d0f5 | Hannes Reinecke | /*
|
37 | 7430d0f5 | Hannes Reinecke | * MegaRAID SAS MFI firmware definitions
|
38 | 7430d0f5 | Hannes Reinecke | */
|
39 | 7430d0f5 | Hannes Reinecke | |
40 | 7430d0f5 | Hannes Reinecke | /*
|
41 | 7430d0f5 | Hannes Reinecke | * Start with the register set. All registers are 32 bits wide.
|
42 | 7430d0f5 | Hannes Reinecke | * The usual Intel IOP style setup.
|
43 | 7430d0f5 | Hannes Reinecke | */
|
44 | 7430d0f5 | Hannes Reinecke | #define MFI_IMSG0 0x10 /* Inbound message 0 */ |
45 | 7430d0f5 | Hannes Reinecke | #define MFI_IMSG1 0x14 /* Inbound message 1 */ |
46 | 7430d0f5 | Hannes Reinecke | #define MFI_OMSG0 0x18 /* Outbound message 0 */ |
47 | 7430d0f5 | Hannes Reinecke | #define MFI_OMSG1 0x1c /* Outbound message 1 */ |
48 | 7430d0f5 | Hannes Reinecke | #define MFI_IDB 0x20 /* Inbound doorbell */ |
49 | 7430d0f5 | Hannes Reinecke | #define MFI_ISTS 0x24 /* Inbound interrupt status */ |
50 | 7430d0f5 | Hannes Reinecke | #define MFI_IMSK 0x28 /* Inbound interrupt mask */ |
51 | 7430d0f5 | Hannes Reinecke | #define MFI_ODB 0x2c /* Outbound doorbell */ |
52 | 7430d0f5 | Hannes Reinecke | #define MFI_OSTS 0x30 /* Outbound interrupt status */ |
53 | 7430d0f5 | Hannes Reinecke | #define MFI_OMSK 0x34 /* Outbound interrupt mask */ |
54 | 7430d0f5 | Hannes Reinecke | #define MFI_IQP 0x40 /* Inbound queue port */ |
55 | 7430d0f5 | Hannes Reinecke | #define MFI_OQP 0x44 /* Outbound queue port */ |
56 | 7430d0f5 | Hannes Reinecke | |
57 | 7430d0f5 | Hannes Reinecke | /*
|
58 | 7430d0f5 | Hannes Reinecke | * 1078 specific related register
|
59 | 7430d0f5 | Hannes Reinecke | */
|
60 | 7430d0f5 | Hannes Reinecke | #define MFI_ODR0 0x9c /* outbound doorbell register0 */ |
61 | 7430d0f5 | Hannes Reinecke | #define MFI_ODCR0 0xa0 /* outbound doorbell clear register0 */ |
62 | 7430d0f5 | Hannes Reinecke | #define MFI_OSP0 0xb0 /* outbound scratch pad0 */ |
63 | 7430d0f5 | Hannes Reinecke | #define MFI_IQPL 0xc0 /* Inbound queue port (low bytes) */ |
64 | 7430d0f5 | Hannes Reinecke | #define MFI_IQPH 0xc4 /* Inbound queue port (high bytes) */ |
65 | 7430d0f5 | Hannes Reinecke | #define MFI_DIAG 0xf8 /* Host diag */ |
66 | 7430d0f5 | Hannes Reinecke | #define MFI_SEQ 0xfc /* Sequencer offset */ |
67 | 7430d0f5 | Hannes Reinecke | #define MFI_1078_EIM 0x80000004 /* 1078 enable intrrupt mask */ |
68 | 7430d0f5 | Hannes Reinecke | #define MFI_RMI 0x2 /* reply message interrupt */ |
69 | 7430d0f5 | Hannes Reinecke | #define MFI_1078_RM 0x80000000 /* reply 1078 message interrupt */ |
70 | 7430d0f5 | Hannes Reinecke | #define MFI_ODC 0x4 /* outbound doorbell change interrupt */ |
71 | 7430d0f5 | Hannes Reinecke | |
72 | 7430d0f5 | Hannes Reinecke | /*
|
73 | 7430d0f5 | Hannes Reinecke | * gen2 specific changes
|
74 | 7430d0f5 | Hannes Reinecke | */
|
75 | 7430d0f5 | Hannes Reinecke | #define MFI_GEN2_EIM 0x00000005 /* gen2 enable interrupt mask */ |
76 | 7430d0f5 | Hannes Reinecke | #define MFI_GEN2_RM 0x00000001 /* reply gen2 message interrupt */ |
77 | 7430d0f5 | Hannes Reinecke | |
78 | 7430d0f5 | Hannes Reinecke | /*
|
79 | 7430d0f5 | Hannes Reinecke | * skinny specific changes
|
80 | 7430d0f5 | Hannes Reinecke | */
|
81 | 7430d0f5 | Hannes Reinecke | #define MFI_SKINNY_IDB 0x00 /* Inbound doorbell is at 0x00 for skinny */ |
82 | 7430d0f5 | Hannes Reinecke | #define MFI_SKINNY_RM 0x00000001 /* reply skinny message interrupt */ |
83 | 7430d0f5 | Hannes Reinecke | |
84 | 7430d0f5 | Hannes Reinecke | /* Bits for MFI_OSTS */
|
85 | 7430d0f5 | Hannes Reinecke | #define MFI_OSTS_INTR_VALID 0x00000002 |
86 | 7430d0f5 | Hannes Reinecke | |
87 | 7430d0f5 | Hannes Reinecke | /*
|
88 | 7430d0f5 | Hannes Reinecke | * Firmware state values. Found in OMSG0 during initialization.
|
89 | 7430d0f5 | Hannes Reinecke | */
|
90 | 7430d0f5 | Hannes Reinecke | #define MFI_FWSTATE_MASK 0xf0000000 |
91 | 7430d0f5 | Hannes Reinecke | #define MFI_FWSTATE_UNDEFINED 0x00000000 |
92 | 7430d0f5 | Hannes Reinecke | #define MFI_FWSTATE_BB_INIT 0x10000000 |
93 | 7430d0f5 | Hannes Reinecke | #define MFI_FWSTATE_FW_INIT 0x40000000 |
94 | 7430d0f5 | Hannes Reinecke | #define MFI_FWSTATE_WAIT_HANDSHAKE 0x60000000 |
95 | 7430d0f5 | Hannes Reinecke | #define MFI_FWSTATE_FW_INIT_2 0x70000000 |
96 | 7430d0f5 | Hannes Reinecke | #define MFI_FWSTATE_DEVICE_SCAN 0x80000000 |
97 | 7430d0f5 | Hannes Reinecke | #define MFI_FWSTATE_BOOT_MSG_PENDING 0x90000000 |
98 | 7430d0f5 | Hannes Reinecke | #define MFI_FWSTATE_FLUSH_CACHE 0xa0000000 |
99 | 7430d0f5 | Hannes Reinecke | #define MFI_FWSTATE_READY 0xb0000000 |
100 | 7430d0f5 | Hannes Reinecke | #define MFI_FWSTATE_OPERATIONAL 0xc0000000 |
101 | 7430d0f5 | Hannes Reinecke | #define MFI_FWSTATE_FAULT 0xf0000000 |
102 | 7430d0f5 | Hannes Reinecke | #define MFI_FWSTATE_MAXSGL_MASK 0x00ff0000 |
103 | 7430d0f5 | Hannes Reinecke | #define MFI_FWSTATE_MAXCMD_MASK 0x0000ffff |
104 | 7430d0f5 | Hannes Reinecke | #define MFI_FWSTATE_MSIX_SUPPORTED 0x04000000 |
105 | 7430d0f5 | Hannes Reinecke | #define MFI_FWSTATE_HOSTMEMREQD_MASK 0x08000000 |
106 | 7430d0f5 | Hannes Reinecke | |
107 | 7430d0f5 | Hannes Reinecke | /*
|
108 | 7430d0f5 | Hannes Reinecke | * Control bits to drive the card to ready state. These go into the IDB
|
109 | 7430d0f5 | Hannes Reinecke | * register.
|
110 | 7430d0f5 | Hannes Reinecke | */
|
111 | 7430d0f5 | Hannes Reinecke | #define MFI_FWINIT_ABORT 0x00000001 /* Abort all pending commands */ |
112 | 7430d0f5 | Hannes Reinecke | #define MFI_FWINIT_READY 0x00000002 /* Move from operational to ready */ |
113 | 7430d0f5 | Hannes Reinecke | #define MFI_FWINIT_MFIMODE 0x00000004 /* unknown */ |
114 | 7430d0f5 | Hannes Reinecke | #define MFI_FWINIT_CLEAR_HANDSHAKE 0x00000008 /* Respond to WAIT_HANDSHAKE */ |
115 | 7430d0f5 | Hannes Reinecke | #define MFI_FWINIT_HOTPLUG 0x00000010 |
116 | 7430d0f5 | Hannes Reinecke | #define MFI_FWINIT_STOP_ADP 0x00000020 /* Move to operational, stop */ |
117 | 7430d0f5 | Hannes Reinecke | #define MFI_FWINIT_ADP_RESET 0x00000040 /* Reset ADP */ |
118 | 7430d0f5 | Hannes Reinecke | |
119 | 7430d0f5 | Hannes Reinecke | /* MFI Commands */
|
120 | 7430d0f5 | Hannes Reinecke | typedef enum { |
121 | 7430d0f5 | Hannes Reinecke | MFI_CMD_INIT = 0x00,
|
122 | 7430d0f5 | Hannes Reinecke | MFI_CMD_LD_READ, |
123 | 7430d0f5 | Hannes Reinecke | MFI_CMD_LD_WRITE, |
124 | 7430d0f5 | Hannes Reinecke | MFI_CMD_LD_SCSI_IO, |
125 | 7430d0f5 | Hannes Reinecke | MFI_CMD_PD_SCSI_IO, |
126 | 7430d0f5 | Hannes Reinecke | MFI_CMD_DCMD, |
127 | 7430d0f5 | Hannes Reinecke | MFI_CMD_ABORT, |
128 | 7430d0f5 | Hannes Reinecke | MFI_CMD_SMP, |
129 | 7430d0f5 | Hannes Reinecke | MFI_CMD_STP |
130 | 7430d0f5 | Hannes Reinecke | } mfi_cmd_t; |
131 | 7430d0f5 | Hannes Reinecke | |
132 | 7430d0f5 | Hannes Reinecke | /* Direct commands */
|
133 | 7430d0f5 | Hannes Reinecke | typedef enum { |
134 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_MFI_HOST_MEM_ALLOC = 0x0100e100,
|
135 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_GET_INFO = 0x01010000,
|
136 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_GET_PROPERTIES = 0x01020100,
|
137 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_SET_PROPERTIES = 0x01020200,
|
138 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_ALARM = 0x01030000,
|
139 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_ALARM_GET = 0x01030100,
|
140 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_ALARM_ENABLE = 0x01030200,
|
141 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_ALARM_DISABLE = 0x01030300,
|
142 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_ALARM_SILENCE = 0x01030400,
|
143 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_ALARM_TEST = 0x01030500,
|
144 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_EVENT_GETINFO = 0x01040100,
|
145 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_EVENT_CLEAR = 0x01040200,
|
146 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_EVENT_GET = 0x01040300,
|
147 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_EVENT_COUNT = 0x01040400,
|
148 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_EVENT_WAIT = 0x01040500,
|
149 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_SHUTDOWN = 0x01050000,
|
150 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_HIBERNATE_STANDBY = 0x01060000,
|
151 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_GET_TIME = 0x01080101,
|
152 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_SET_TIME = 0x01080102,
|
153 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_BIOS_DATA_GET = 0x010c0100,
|
154 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_BIOS_DATA_SET = 0x010c0200,
|
155 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_FACTORY_DEFAULTS = 0x010d0000,
|
156 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_MFC_DEFAULTS_GET = 0x010e0201,
|
157 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_MFC_DEFAULTS_SET = 0x010e0202,
|
158 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CTRL_CACHE_FLUSH = 0x01101000,
|
159 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_PD_GET_LIST = 0x02010000,
|
160 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_PD_LIST_QUERY = 0x02010100,
|
161 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_PD_GET_INFO = 0x02020000,
|
162 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_PD_STATE_SET = 0x02030100,
|
163 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_PD_REBUILD = 0x02040100,
|
164 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_PD_BLINK = 0x02070100,
|
165 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_PD_UNBLINK = 0x02070200,
|
166 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_LD_GET_LIST = 0x03010000,
|
167 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_LD_GET_INFO = 0x03020000,
|
168 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_LD_GET_PROP = 0x03030000,
|
169 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_LD_SET_PROP = 0x03040000,
|
170 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_LD_DELETE = 0x03090000,
|
171 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CFG_READ = 0x04010000,
|
172 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CFG_ADD = 0x04020000,
|
173 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CFG_CLEAR = 0x04030000,
|
174 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CFG_FOREIGN_READ = 0x04060100,
|
175 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CFG_FOREIGN_IMPORT = 0x04060400,
|
176 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_BBU_STATUS = 0x05010000,
|
177 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_BBU_CAPACITY_INFO = 0x05020000,
|
178 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_BBU_DESIGN_INFO = 0x05030000,
|
179 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_BBU_PROP_GET = 0x05050100,
|
180 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CLUSTER = 0x08000000,
|
181 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CLUSTER_RESET_ALL = 0x08010100,
|
182 | 7430d0f5 | Hannes Reinecke | MFI_DCMD_CLUSTER_RESET_LD = 0x08010200
|
183 | 7430d0f5 | Hannes Reinecke | } mfi_dcmd_t; |
184 | 7430d0f5 | Hannes Reinecke | |
185 | 7430d0f5 | Hannes Reinecke | /* Modifiers for MFI_DCMD_CTRL_FLUSHCACHE */
|
186 | 7430d0f5 | Hannes Reinecke | #define MFI_FLUSHCACHE_CTRL 0x01 |
187 | 7430d0f5 | Hannes Reinecke | #define MFI_FLUSHCACHE_DISK 0x02 |
188 | 7430d0f5 | Hannes Reinecke | |
189 | 7430d0f5 | Hannes Reinecke | /* Modifiers for MFI_DCMD_CTRL_SHUTDOWN */
|
190 | 7430d0f5 | Hannes Reinecke | #define MFI_SHUTDOWN_SPINDOWN 0x01 |
191 | 7430d0f5 | Hannes Reinecke | |
192 | 7430d0f5 | Hannes Reinecke | /*
|
193 | 7430d0f5 | Hannes Reinecke | * MFI Frame flags
|
194 | 7430d0f5 | Hannes Reinecke | */
|
195 | 7430d0f5 | Hannes Reinecke | typedef enum { |
196 | 7430d0f5 | Hannes Reinecke | MFI_FRAME_DONT_POST_IN_REPLY_QUEUE = 0x0001,
|
197 | 7430d0f5 | Hannes Reinecke | MFI_FRAME_SGL64 = 0x0002,
|
198 | 7430d0f5 | Hannes Reinecke | MFI_FRAME_SENSE64 = 0x0004,
|
199 | 7430d0f5 | Hannes Reinecke | MFI_FRAME_DIR_WRITE = 0x0008,
|
200 | 7430d0f5 | Hannes Reinecke | MFI_FRAME_DIR_READ = 0x0010,
|
201 | 7430d0f5 | Hannes Reinecke | MFI_FRAME_IEEE_SGL = 0x0020,
|
202 | 7430d0f5 | Hannes Reinecke | } mfi_frame_flags; |
203 | 7430d0f5 | Hannes Reinecke | |
204 | 7430d0f5 | Hannes Reinecke | /* MFI Status codes */
|
205 | 7430d0f5 | Hannes Reinecke | typedef enum { |
206 | 7430d0f5 | Hannes Reinecke | MFI_STAT_OK = 0x00,
|
207 | 7430d0f5 | Hannes Reinecke | MFI_STAT_INVALID_CMD, |
208 | 7430d0f5 | Hannes Reinecke | MFI_STAT_INVALID_DCMD, |
209 | 7430d0f5 | Hannes Reinecke | MFI_STAT_INVALID_PARAMETER, |
210 | 7430d0f5 | Hannes Reinecke | MFI_STAT_INVALID_SEQUENCE_NUMBER, |
211 | 7430d0f5 | Hannes Reinecke | MFI_STAT_ABORT_NOT_POSSIBLE, |
212 | 7430d0f5 | Hannes Reinecke | MFI_STAT_APP_HOST_CODE_NOT_FOUND, |
213 | 7430d0f5 | Hannes Reinecke | MFI_STAT_APP_IN_USE, |
214 | 7430d0f5 | Hannes Reinecke | MFI_STAT_APP_NOT_INITIALIZED, |
215 | 7430d0f5 | Hannes Reinecke | MFI_STAT_ARRAY_INDEX_INVALID, |
216 | 7430d0f5 | Hannes Reinecke | MFI_STAT_ARRAY_ROW_NOT_EMPTY, |
217 | 7430d0f5 | Hannes Reinecke | MFI_STAT_CONFIG_RESOURCE_CONFLICT, |
218 | 7430d0f5 | Hannes Reinecke | MFI_STAT_DEVICE_NOT_FOUND, |
219 | 7430d0f5 | Hannes Reinecke | MFI_STAT_DRIVE_TOO_SMALL, |
220 | 7430d0f5 | Hannes Reinecke | MFI_STAT_FLASH_ALLOC_FAIL, |
221 | 7430d0f5 | Hannes Reinecke | MFI_STAT_FLASH_BUSY, |
222 | 7430d0f5 | Hannes Reinecke | MFI_STAT_FLASH_ERROR = 0x10,
|
223 | 7430d0f5 | Hannes Reinecke | MFI_STAT_FLASH_IMAGE_BAD, |
224 | 7430d0f5 | Hannes Reinecke | MFI_STAT_FLASH_IMAGE_INCOMPLETE, |
225 | 7430d0f5 | Hannes Reinecke | MFI_STAT_FLASH_NOT_OPEN, |
226 | 7430d0f5 | Hannes Reinecke | MFI_STAT_FLASH_NOT_STARTED, |
227 | 7430d0f5 | Hannes Reinecke | MFI_STAT_FLUSH_FAILED, |
228 | 7430d0f5 | Hannes Reinecke | MFI_STAT_HOST_CODE_NOT_FOUNT, |
229 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LD_CC_IN_PROGRESS, |
230 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LD_INIT_IN_PROGRESS, |
231 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LD_LBA_OUT_OF_RANGE, |
232 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LD_MAX_CONFIGURED, |
233 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LD_NOT_OPTIMAL, |
234 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LD_RBLD_IN_PROGRESS, |
235 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LD_RECON_IN_PROGRESS, |
236 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LD_WRONG_RAID_LEVEL, |
237 | 7430d0f5 | Hannes Reinecke | MFI_STAT_MAX_SPARES_EXCEEDED, |
238 | 7430d0f5 | Hannes Reinecke | MFI_STAT_MEMORY_NOT_AVAILABLE = 0x20,
|
239 | 7430d0f5 | Hannes Reinecke | MFI_STAT_MFC_HW_ERROR, |
240 | 7430d0f5 | Hannes Reinecke | MFI_STAT_NO_HW_PRESENT, |
241 | 7430d0f5 | Hannes Reinecke | MFI_STAT_NOT_FOUND, |
242 | 7430d0f5 | Hannes Reinecke | MFI_STAT_NOT_IN_ENCL, |
243 | 7430d0f5 | Hannes Reinecke | MFI_STAT_PD_CLEAR_IN_PROGRESS, |
244 | 7430d0f5 | Hannes Reinecke | MFI_STAT_PD_TYPE_WRONG, |
245 | 7430d0f5 | Hannes Reinecke | MFI_STAT_PR_DISABLED, |
246 | 7430d0f5 | Hannes Reinecke | MFI_STAT_ROW_INDEX_INVALID, |
247 | 7430d0f5 | Hannes Reinecke | MFI_STAT_SAS_CONFIG_INVALID_ACTION, |
248 | 7430d0f5 | Hannes Reinecke | MFI_STAT_SAS_CONFIG_INVALID_DATA, |
249 | 7430d0f5 | Hannes Reinecke | MFI_STAT_SAS_CONFIG_INVALID_PAGE, |
250 | 7430d0f5 | Hannes Reinecke | MFI_STAT_SAS_CONFIG_INVALID_TYPE, |
251 | 7430d0f5 | Hannes Reinecke | MFI_STAT_SCSI_DONE_WITH_ERROR, |
252 | 7430d0f5 | Hannes Reinecke | MFI_STAT_SCSI_IO_FAILED, |
253 | 7430d0f5 | Hannes Reinecke | MFI_STAT_SCSI_RESERVATION_CONFLICT, |
254 | 7430d0f5 | Hannes Reinecke | MFI_STAT_SHUTDOWN_FAILED = 0x30,
|
255 | 7430d0f5 | Hannes Reinecke | MFI_STAT_TIME_NOT_SET, |
256 | 7430d0f5 | Hannes Reinecke | MFI_STAT_WRONG_STATE, |
257 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LD_OFFLINE, |
258 | 7430d0f5 | Hannes Reinecke | MFI_STAT_PEER_NOTIFICATION_REJECTED, |
259 | 7430d0f5 | Hannes Reinecke | MFI_STAT_PEER_NOTIFICATION_FAILED, |
260 | 7430d0f5 | Hannes Reinecke | MFI_STAT_RESERVATION_IN_PROGRESS, |
261 | 7430d0f5 | Hannes Reinecke | MFI_STAT_I2C_ERRORS_DETECTED, |
262 | 7430d0f5 | Hannes Reinecke | MFI_STAT_PCI_ERRORS_DETECTED, |
263 | 7430d0f5 | Hannes Reinecke | MFI_STAT_DIAG_FAILED, |
264 | 7430d0f5 | Hannes Reinecke | MFI_STAT_BOOT_MSG_PENDING, |
265 | 7430d0f5 | Hannes Reinecke | MFI_STAT_FOREIGN_CONFIG_INCOMPLETE, |
266 | 7430d0f5 | Hannes Reinecke | MFI_STAT_INVALID_SGL, |
267 | 7430d0f5 | Hannes Reinecke | MFI_STAT_UNSUPPORTED_HW, |
268 | 7430d0f5 | Hannes Reinecke | MFI_STAT_CC_SCHEDULE_DISABLED, |
269 | 7430d0f5 | Hannes Reinecke | MFI_STAT_PD_COPYBACK_IN_PROGRESS, |
270 | 7430d0f5 | Hannes Reinecke | MFI_STAT_MULTIPLE_PDS_IN_ARRAY = 0x40,
|
271 | 7430d0f5 | Hannes Reinecke | MFI_STAT_FW_DOWNLOAD_ERROR, |
272 | 7430d0f5 | Hannes Reinecke | MFI_STAT_FEATURE_SECURITY_NOT_ENABLED, |
273 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LOCK_KEY_ALREADY_EXISTS, |
274 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LOCK_KEY_BACKUP_NOT_ALLOWED, |
275 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LOCK_KEY_VERIFY_NOT_ALLOWED, |
276 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LOCK_KEY_VERIFY_FAILED, |
277 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LOCK_KEY_REKEY_NOT_ALLOWED, |
278 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LOCK_KEY_INVALID, |
279 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LOCK_KEY_ESCROW_INVALID, |
280 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LOCK_KEY_BACKUP_REQUIRED, |
281 | 7430d0f5 | Hannes Reinecke | MFI_STAT_SECURE_LD_EXISTS, |
282 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LD_SECURE_NOT_ALLOWED, |
283 | 7430d0f5 | Hannes Reinecke | MFI_STAT_REPROVISION_NOT_ALLOWED, |
284 | 7430d0f5 | Hannes Reinecke | MFI_STAT_PD_SECURITY_TYPE_WRONG, |
285 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LD_ENCRYPTION_TYPE_INVALID, |
286 | 7430d0f5 | Hannes Reinecke | MFI_STAT_CONFIG_FDE_NON_FDE_MIX_NOT_ALLOWED = 0x50,
|
287 | 7430d0f5 | Hannes Reinecke | MFI_STAT_CONFIG_LD_ENCRYPTION_TYPE_MIX_NOT_ALLOWED, |
288 | 7430d0f5 | Hannes Reinecke | MFI_STAT_SECRET_KEY_NOT_ALLOWED, |
289 | 7430d0f5 | Hannes Reinecke | MFI_STAT_PD_HW_ERRORS_DETECTED, |
290 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LD_CACHE_PINNED, |
291 | 7430d0f5 | Hannes Reinecke | MFI_STAT_POWER_STATE_SET_IN_PROGRESS, |
292 | 7430d0f5 | Hannes Reinecke | MFI_STAT_POWER_STATE_SET_BUSY, |
293 | 7430d0f5 | Hannes Reinecke | MFI_STAT_POWER_STATE_WRONG, |
294 | 7430d0f5 | Hannes Reinecke | MFI_STAT_PR_NO_AVAILABLE_PD_FOUND, |
295 | 7430d0f5 | Hannes Reinecke | MFI_STAT_CTRL_RESET_REQUIRED, |
296 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LOCK_KEY_EKM_NO_BOOT_AGENT, |
297 | 7430d0f5 | Hannes Reinecke | MFI_STAT_SNAP_NO_SPACE, |
298 | 7430d0f5 | Hannes Reinecke | MFI_STAT_SNAP_PARTIAL_FAILURE, |
299 | 7430d0f5 | Hannes Reinecke | MFI_STAT_UPGRADE_KEY_INCOMPATIBLE, |
300 | 7430d0f5 | Hannes Reinecke | MFI_STAT_PFK_INCOMPATIBLE, |
301 | 7430d0f5 | Hannes Reinecke | MFI_STAT_PD_MAX_UNCONFIGURED, |
302 | 7430d0f5 | Hannes Reinecke | MFI_STAT_IO_METRICS_DISABLED = 0x60,
|
303 | 7430d0f5 | Hannes Reinecke | MFI_STAT_AEC_NOT_STOPPED, |
304 | 7430d0f5 | Hannes Reinecke | MFI_STAT_PI_TYPE_WRONG, |
305 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LD_PD_PI_INCOMPATIBLE, |
306 | 7430d0f5 | Hannes Reinecke | MFI_STAT_PI_NOT_ENABLED, |
307 | 7430d0f5 | Hannes Reinecke | MFI_STAT_LD_BLOCK_SIZE_MISMATCH, |
308 | 7430d0f5 | Hannes Reinecke | MFI_STAT_INVALID_STATUS = 0xFF
|
309 | 7430d0f5 | Hannes Reinecke | } mfi_status_t; |
310 | 7430d0f5 | Hannes Reinecke | |
311 | 7430d0f5 | Hannes Reinecke | /* Event classes */
|
312 | 7430d0f5 | Hannes Reinecke | typedef enum { |
313 | 7430d0f5 | Hannes Reinecke | MFI_EVT_CLASS_DEBUG = -2,
|
314 | 7430d0f5 | Hannes Reinecke | MFI_EVT_CLASS_PROGRESS = -1,
|
315 | 7430d0f5 | Hannes Reinecke | MFI_EVT_CLASS_INFO = 0,
|
316 | 7430d0f5 | Hannes Reinecke | MFI_EVT_CLASS_WARNING = 1,
|
317 | 7430d0f5 | Hannes Reinecke | MFI_EVT_CLASS_CRITICAL = 2,
|
318 | 7430d0f5 | Hannes Reinecke | MFI_EVT_CLASS_FATAL = 3,
|
319 | 7430d0f5 | Hannes Reinecke | MFI_EVT_CLASS_DEAD = 4
|
320 | 7430d0f5 | Hannes Reinecke | } mfi_evt_class_t; |
321 | 7430d0f5 | Hannes Reinecke | |
322 | 7430d0f5 | Hannes Reinecke | /* Event locales */
|
323 | 7430d0f5 | Hannes Reinecke | typedef enum { |
324 | 7430d0f5 | Hannes Reinecke | MFI_EVT_LOCALE_LD = 0x0001,
|
325 | 7430d0f5 | Hannes Reinecke | MFI_EVT_LOCALE_PD = 0x0002,
|
326 | 7430d0f5 | Hannes Reinecke | MFI_EVT_LOCALE_ENCL = 0x0004,
|
327 | 7430d0f5 | Hannes Reinecke | MFI_EVT_LOCALE_BBU = 0x0008,
|
328 | 7430d0f5 | Hannes Reinecke | MFI_EVT_LOCALE_SAS = 0x0010,
|
329 | 7430d0f5 | Hannes Reinecke | MFI_EVT_LOCALE_CTRL = 0x0020,
|
330 | 7430d0f5 | Hannes Reinecke | MFI_EVT_LOCALE_CONFIG = 0x0040,
|
331 | 7430d0f5 | Hannes Reinecke | MFI_EVT_LOCALE_CLUSTER = 0x0080,
|
332 | 7430d0f5 | Hannes Reinecke | MFI_EVT_LOCALE_ALL = 0xffff
|
333 | 7430d0f5 | Hannes Reinecke | } mfi_evt_locale_t; |
334 | 7430d0f5 | Hannes Reinecke | |
335 | 7430d0f5 | Hannes Reinecke | /* Event args */
|
336 | 7430d0f5 | Hannes Reinecke | typedef enum { |
337 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_NONE = 0x00,
|
338 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_CDB_SENSE, |
339 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_LD, |
340 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_LD_COUNT, |
341 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_LD_LBA, |
342 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_LD_OWNER, |
343 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_LD_LBA_PD_LBA, |
344 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_LD_PROG, |
345 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_LD_STATE, |
346 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_LD_STRIP, |
347 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_PD, |
348 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_PD_ERR, |
349 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_PD_LBA, |
350 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_PD_LBA_LD, |
351 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_PD_PROG, |
352 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_PD_STATE, |
353 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_PCI, |
354 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_RATE, |
355 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_STR, |
356 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_TIME, |
357 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_ECC, |
358 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_LD_PROP, |
359 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_PD_SPARE, |
360 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_PD_INDEX, |
361 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_DIAG_PASS, |
362 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_DIAG_FAIL, |
363 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_PD_LBA_LBA, |
364 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_PORT_PHY, |
365 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_PD_MISSING, |
366 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_PD_ADDRESS, |
367 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_BITMAP, |
368 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_CONNECTOR, |
369 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_PD_PD, |
370 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_PD_FRU, |
371 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_PD_PATHINFO, |
372 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_PD_POWER_STATE, |
373 | 7430d0f5 | Hannes Reinecke | MR_EVT_ARGS_GENERIC, |
374 | 7430d0f5 | Hannes Reinecke | } mfi_evt_args; |
375 | 7430d0f5 | Hannes Reinecke | |
376 | 7430d0f5 | Hannes Reinecke | /* Event codes */
|
377 | 7430d0f5 | Hannes Reinecke | #define MR_EVT_CFG_CLEARED 0x0004 |
378 | 7430d0f5 | Hannes Reinecke | #define MR_EVT_CTRL_SHUTDOWN 0x002a |
379 | 7430d0f5 | Hannes Reinecke | #define MR_EVT_LD_STATE_CHANGE 0x0051 |
380 | 7430d0f5 | Hannes Reinecke | #define MR_EVT_PD_INSERTED 0x005b |
381 | 7430d0f5 | Hannes Reinecke | #define MR_EVT_PD_REMOVED 0x0070 |
382 | 7430d0f5 | Hannes Reinecke | #define MR_EVT_PD_STATE_CHANGED 0x0072 |
383 | 7430d0f5 | Hannes Reinecke | #define MR_EVT_LD_CREATED 0x008a |
384 | 7430d0f5 | Hannes Reinecke | #define MR_EVT_LD_DELETED 0x008b |
385 | 7430d0f5 | Hannes Reinecke | #define MR_EVT_FOREIGN_CFG_IMPORTED 0x00db |
386 | 7430d0f5 | Hannes Reinecke | #define MR_EVT_LD_OFFLINE 0x00fc |
387 | 7430d0f5 | Hannes Reinecke | #define MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED 0x0152 |
388 | 7430d0f5 | Hannes Reinecke | |
389 | 7430d0f5 | Hannes Reinecke | typedef enum { |
390 | 7430d0f5 | Hannes Reinecke | MR_LD_CACHE_WRITE_BACK = 0x01,
|
391 | 7430d0f5 | Hannes Reinecke | MR_LD_CACHE_WRITE_ADAPTIVE = 0x02,
|
392 | 7430d0f5 | Hannes Reinecke | MR_LD_CACHE_READ_AHEAD = 0x04,
|
393 | 7430d0f5 | Hannes Reinecke | MR_LD_CACHE_READ_ADAPTIVE = 0x08,
|
394 | 7430d0f5 | Hannes Reinecke | MR_LD_CACHE_WRITE_CACHE_BAD_BBU = 0x10,
|
395 | 7430d0f5 | Hannes Reinecke | MR_LD_CACHE_ALLOW_WRITE_CACHE = 0x20,
|
396 | 7430d0f5 | Hannes Reinecke | MR_LD_CACHE_ALLOW_READ_CACHE = 0x40
|
397 | 7430d0f5 | Hannes Reinecke | } mfi_ld_cache; |
398 | 7430d0f5 | Hannes Reinecke | |
399 | 7430d0f5 | Hannes Reinecke | typedef enum { |
400 | 7430d0f5 | Hannes Reinecke | MR_PD_CACHE_UNCHANGED = 0,
|
401 | 7430d0f5 | Hannes Reinecke | MR_PD_CACHE_ENABLE = 1,
|
402 | 7430d0f5 | Hannes Reinecke | MR_PD_CACHE_DISABLE = 2
|
403 | 7430d0f5 | Hannes Reinecke | } mfi_pd_cache; |
404 | 7430d0f5 | Hannes Reinecke | |
405 | 7430d0f5 | Hannes Reinecke | typedef enum { |
406 | 7430d0f5 | Hannes Reinecke | MR_PD_QUERY_TYPE_ALL = 0,
|
407 | 7430d0f5 | Hannes Reinecke | MR_PD_QUERY_TYPE_STATE = 1,
|
408 | 7430d0f5 | Hannes Reinecke | MR_PD_QUERY_TYPE_POWER_STATE = 2,
|
409 | 7430d0f5 | Hannes Reinecke | MR_PD_QUERY_TYPE_MEDIA_TYPE = 3,
|
410 | 7430d0f5 | Hannes Reinecke | MR_PD_QUERY_TYPE_SPEED = 4,
|
411 | 7430d0f5 | Hannes Reinecke | MR_PD_QUERY_TYPE_EXPOSED_TO_HOST = 5, /*query for system drives */ |
412 | 7430d0f5 | Hannes Reinecke | } mfi_pd_query_type; |
413 | 7430d0f5 | Hannes Reinecke | |
414 | 7430d0f5 | Hannes Reinecke | /*
|
415 | 7430d0f5 | Hannes Reinecke | * Other propertities and definitions
|
416 | 7430d0f5 | Hannes Reinecke | */
|
417 | 7430d0f5 | Hannes Reinecke | #define MFI_MAX_PD_CHANNELS 2 |
418 | 7430d0f5 | Hannes Reinecke | #define MFI_MAX_LD_CHANNELS 2 |
419 | 7430d0f5 | Hannes Reinecke | #define MFI_MAX_CHANNELS (MFI_MAX_PD_CHANNELS + MFI_MAX_LD_CHANNELS)
|
420 | 7430d0f5 | Hannes Reinecke | #define MFI_MAX_CHANNEL_DEVS 128 |
421 | 7430d0f5 | Hannes Reinecke | #define MFI_DEFAULT_ID -1 |
422 | 7430d0f5 | Hannes Reinecke | #define MFI_MAX_LUN 8 |
423 | 7430d0f5 | Hannes Reinecke | #define MFI_MAX_LD 64 |
424 | 7430d0f5 | Hannes Reinecke | |
425 | 7430d0f5 | Hannes Reinecke | #define MFI_FRAME_SIZE 64 |
426 | 7430d0f5 | Hannes Reinecke | #define MFI_MBOX_SIZE 12 |
427 | 7430d0f5 | Hannes Reinecke | |
428 | 7430d0f5 | Hannes Reinecke | /* Firmware flashing can take 40s */
|
429 | 7430d0f5 | Hannes Reinecke | #define MFI_POLL_TIMEOUT_SECS 50 |
430 | 7430d0f5 | Hannes Reinecke | |
431 | 7430d0f5 | Hannes Reinecke | /* Allow for speedier math calculations */
|
432 | 7430d0f5 | Hannes Reinecke | #define MFI_SECTOR_LEN 512 |
433 | 7430d0f5 | Hannes Reinecke | |
434 | 7430d0f5 | Hannes Reinecke | /* Scatter Gather elements */
|
435 | 7430d0f5 | Hannes Reinecke | struct mfi_sg32 {
|
436 | 7430d0f5 | Hannes Reinecke | uint32_t addr; |
437 | 7430d0f5 | Hannes Reinecke | uint32_t len; |
438 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
439 | 7430d0f5 | Hannes Reinecke | |
440 | 7430d0f5 | Hannes Reinecke | struct mfi_sg64 {
|
441 | 7430d0f5 | Hannes Reinecke | uint64_t addr; |
442 | 7430d0f5 | Hannes Reinecke | uint32_t len; |
443 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
444 | 7430d0f5 | Hannes Reinecke | |
445 | 7430d0f5 | Hannes Reinecke | struct mfi_sg_skinny {
|
446 | 7430d0f5 | Hannes Reinecke | uint64_t addr; |
447 | 7430d0f5 | Hannes Reinecke | uint32_t len; |
448 | 7430d0f5 | Hannes Reinecke | uint32_t flag; |
449 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
450 | 7430d0f5 | Hannes Reinecke | |
451 | 7430d0f5 | Hannes Reinecke | union mfi_sgl {
|
452 | 7430d0f5 | Hannes Reinecke | struct mfi_sg32 sg32[1]; |
453 | 7430d0f5 | Hannes Reinecke | struct mfi_sg64 sg64[1]; |
454 | 7430d0f5 | Hannes Reinecke | struct mfi_sg_skinny sg_skinny[1]; |
455 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
456 | 7430d0f5 | Hannes Reinecke | |
457 | 7430d0f5 | Hannes Reinecke | /* Message frames. All messages have a common header */
|
458 | 7430d0f5 | Hannes Reinecke | struct mfi_frame_header {
|
459 | 7430d0f5 | Hannes Reinecke | uint8_t frame_cmd; |
460 | 7430d0f5 | Hannes Reinecke | uint8_t sense_len; |
461 | 7430d0f5 | Hannes Reinecke | uint8_t cmd_status; |
462 | 7430d0f5 | Hannes Reinecke | uint8_t scsi_status; |
463 | 7430d0f5 | Hannes Reinecke | uint8_t target_id; |
464 | 7430d0f5 | Hannes Reinecke | uint8_t lun_id; |
465 | 7430d0f5 | Hannes Reinecke | uint8_t cdb_len; |
466 | 7430d0f5 | Hannes Reinecke | uint8_t sge_count; |
467 | 7430d0f5 | Hannes Reinecke | uint64_t context; |
468 | 7430d0f5 | Hannes Reinecke | uint16_t flags; |
469 | 7430d0f5 | Hannes Reinecke | uint16_t timeout; |
470 | 7430d0f5 | Hannes Reinecke | uint32_t data_len; |
471 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
472 | 7430d0f5 | Hannes Reinecke | |
473 | 7430d0f5 | Hannes Reinecke | struct mfi_init_frame {
|
474 | 7430d0f5 | Hannes Reinecke | struct mfi_frame_header header;
|
475 | 7430d0f5 | Hannes Reinecke | uint32_t qinfo_new_addr_lo; |
476 | 7430d0f5 | Hannes Reinecke | uint32_t qinfo_new_addr_hi; |
477 | 7430d0f5 | Hannes Reinecke | uint32_t qinfo_old_addr_lo; |
478 | 7430d0f5 | Hannes Reinecke | uint32_t qinfo_old_addr_hi; |
479 | 7430d0f5 | Hannes Reinecke | uint32_t reserved[6];
|
480 | 7430d0f5 | Hannes Reinecke | }; |
481 | 7430d0f5 | Hannes Reinecke | |
482 | 7430d0f5 | Hannes Reinecke | #define MFI_IO_FRAME_SIZE 40 |
483 | 7430d0f5 | Hannes Reinecke | struct mfi_io_frame {
|
484 | 7430d0f5 | Hannes Reinecke | struct mfi_frame_header header;
|
485 | 7430d0f5 | Hannes Reinecke | uint32_t sense_addr_lo; |
486 | 7430d0f5 | Hannes Reinecke | uint32_t sense_addr_hi; |
487 | 7430d0f5 | Hannes Reinecke | uint32_t lba_lo; |
488 | 7430d0f5 | Hannes Reinecke | uint32_t lba_hi; |
489 | 7430d0f5 | Hannes Reinecke | union mfi_sgl sgl;
|
490 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
491 | 7430d0f5 | Hannes Reinecke | |
492 | 7430d0f5 | Hannes Reinecke | #define MFI_PASS_FRAME_SIZE 48 |
493 | 7430d0f5 | Hannes Reinecke | struct mfi_pass_frame {
|
494 | 7430d0f5 | Hannes Reinecke | struct mfi_frame_header header;
|
495 | 7430d0f5 | Hannes Reinecke | uint32_t sense_addr_lo; |
496 | 7430d0f5 | Hannes Reinecke | uint32_t sense_addr_hi; |
497 | 7430d0f5 | Hannes Reinecke | uint8_t cdb[16];
|
498 | 7430d0f5 | Hannes Reinecke | union mfi_sgl sgl;
|
499 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
500 | 7430d0f5 | Hannes Reinecke | |
501 | 7430d0f5 | Hannes Reinecke | #define MFI_DCMD_FRAME_SIZE 40 |
502 | 7430d0f5 | Hannes Reinecke | struct mfi_dcmd_frame {
|
503 | 7430d0f5 | Hannes Reinecke | struct mfi_frame_header header;
|
504 | 7430d0f5 | Hannes Reinecke | uint32_t opcode; |
505 | 7430d0f5 | Hannes Reinecke | uint8_t mbox[MFI_MBOX_SIZE]; |
506 | 7430d0f5 | Hannes Reinecke | union mfi_sgl sgl;
|
507 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
508 | 7430d0f5 | Hannes Reinecke | |
509 | 7430d0f5 | Hannes Reinecke | struct mfi_abort_frame {
|
510 | 7430d0f5 | Hannes Reinecke | struct mfi_frame_header header;
|
511 | 7430d0f5 | Hannes Reinecke | uint64_t abort_context; |
512 | 7430d0f5 | Hannes Reinecke | uint32_t abort_mfi_addr_lo; |
513 | 7430d0f5 | Hannes Reinecke | uint32_t abort_mfi_addr_hi; |
514 | 7430d0f5 | Hannes Reinecke | uint32_t reserved1[6];
|
515 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
516 | 7430d0f5 | Hannes Reinecke | |
517 | 7430d0f5 | Hannes Reinecke | struct mfi_smp_frame {
|
518 | 7430d0f5 | Hannes Reinecke | struct mfi_frame_header header;
|
519 | 7430d0f5 | Hannes Reinecke | uint64_t sas_addr; |
520 | 7430d0f5 | Hannes Reinecke | union {
|
521 | 7430d0f5 | Hannes Reinecke | struct mfi_sg32 sg32[2]; |
522 | 7430d0f5 | Hannes Reinecke | struct mfi_sg64 sg64[2]; |
523 | 7430d0f5 | Hannes Reinecke | } sgl; |
524 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
525 | 7430d0f5 | Hannes Reinecke | |
526 | 7430d0f5 | Hannes Reinecke | struct mfi_stp_frame {
|
527 | 7430d0f5 | Hannes Reinecke | struct mfi_frame_header header;
|
528 | 7430d0f5 | Hannes Reinecke | uint16_t fis[10];
|
529 | 7430d0f5 | Hannes Reinecke | uint32_t stp_flags; |
530 | 7430d0f5 | Hannes Reinecke | union {
|
531 | 7430d0f5 | Hannes Reinecke | struct mfi_sg32 sg32[2]; |
532 | 7430d0f5 | Hannes Reinecke | struct mfi_sg64 sg64[2]; |
533 | 7430d0f5 | Hannes Reinecke | } sgl; |
534 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
535 | 7430d0f5 | Hannes Reinecke | |
536 | 7430d0f5 | Hannes Reinecke | union mfi_frame {
|
537 | 7430d0f5 | Hannes Reinecke | struct mfi_frame_header header;
|
538 | 7430d0f5 | Hannes Reinecke | struct mfi_init_frame init;
|
539 | 7430d0f5 | Hannes Reinecke | struct mfi_io_frame io;
|
540 | 7430d0f5 | Hannes Reinecke | struct mfi_pass_frame pass;
|
541 | 7430d0f5 | Hannes Reinecke | struct mfi_dcmd_frame dcmd;
|
542 | 7430d0f5 | Hannes Reinecke | struct mfi_abort_frame abort;
|
543 | 7430d0f5 | Hannes Reinecke | struct mfi_smp_frame smp;
|
544 | 7430d0f5 | Hannes Reinecke | struct mfi_stp_frame stp;
|
545 | 7430d0f5 | Hannes Reinecke | uint64_t raw[8];
|
546 | 7430d0f5 | Hannes Reinecke | uint8_t bytes[MFI_FRAME_SIZE]; |
547 | 7430d0f5 | Hannes Reinecke | }; |
548 | 7430d0f5 | Hannes Reinecke | |
549 | 7430d0f5 | Hannes Reinecke | #define MFI_SENSE_LEN 128 |
550 | 7430d0f5 | Hannes Reinecke | struct mfi_sense {
|
551 | 7430d0f5 | Hannes Reinecke | uint8_t data[MFI_SENSE_LEN]; |
552 | 7430d0f5 | Hannes Reinecke | }; |
553 | 7430d0f5 | Hannes Reinecke | |
554 | 7430d0f5 | Hannes Reinecke | #define MFI_QUEUE_FLAG_CONTEXT64 0x00000002 |
555 | 7430d0f5 | Hannes Reinecke | |
556 | 7430d0f5 | Hannes Reinecke | /* The queue init structure that is passed with the init message */
|
557 | 7430d0f5 | Hannes Reinecke | struct mfi_init_qinfo {
|
558 | 7430d0f5 | Hannes Reinecke | uint32_t flags; |
559 | 7430d0f5 | Hannes Reinecke | uint32_t rq_entries; |
560 | 7430d0f5 | Hannes Reinecke | uint32_t rq_addr_lo; |
561 | 7430d0f5 | Hannes Reinecke | uint32_t rq_addr_hi; |
562 | 7430d0f5 | Hannes Reinecke | uint32_t pi_addr_lo; |
563 | 7430d0f5 | Hannes Reinecke | uint32_t pi_addr_hi; |
564 | 7430d0f5 | Hannes Reinecke | uint32_t ci_addr_lo; |
565 | 7430d0f5 | Hannes Reinecke | uint32_t ci_addr_hi; |
566 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
567 | 7430d0f5 | Hannes Reinecke | |
568 | 7430d0f5 | Hannes Reinecke | /* Controller properties */
|
569 | 7430d0f5 | Hannes Reinecke | struct mfi_ctrl_props {
|
570 | 7430d0f5 | Hannes Reinecke | uint16_t seq_num; |
571 | 7430d0f5 | Hannes Reinecke | uint16_t pred_fail_poll_interval; |
572 | 7430d0f5 | Hannes Reinecke | uint16_t intr_throttle_cnt; |
573 | 7430d0f5 | Hannes Reinecke | uint16_t intr_throttle_timeout; |
574 | 7430d0f5 | Hannes Reinecke | uint8_t rebuild_rate; |
575 | 7430d0f5 | Hannes Reinecke | uint8_t patrol_read_rate; |
576 | 7430d0f5 | Hannes Reinecke | uint8_t bgi_rate; |
577 | 7430d0f5 | Hannes Reinecke | uint8_t cc_rate; |
578 | 7430d0f5 | Hannes Reinecke | uint8_t recon_rate; |
579 | 7430d0f5 | Hannes Reinecke | uint8_t cache_flush_interval; |
580 | 7430d0f5 | Hannes Reinecke | uint8_t spinup_drv_cnt; |
581 | 7430d0f5 | Hannes Reinecke | uint8_t spinup_delay; |
582 | 7430d0f5 | Hannes Reinecke | uint8_t cluster_enable; |
583 | 7430d0f5 | Hannes Reinecke | uint8_t coercion_mode; |
584 | 7430d0f5 | Hannes Reinecke | uint8_t alarm_enable; |
585 | 7430d0f5 | Hannes Reinecke | uint8_t disable_auto_rebuild; |
586 | 7430d0f5 | Hannes Reinecke | uint8_t disable_battery_warn; |
587 | 7430d0f5 | Hannes Reinecke | uint8_t ecc_bucket_size; |
588 | 7430d0f5 | Hannes Reinecke | uint16_t ecc_bucket_leak_rate; |
589 | 7430d0f5 | Hannes Reinecke | uint8_t restore_hotspare_on_insertion; |
590 | 7430d0f5 | Hannes Reinecke | uint8_t expose_encl_devices; |
591 | 7430d0f5 | Hannes Reinecke | uint8_t maintainPdFailHistory; |
592 | 7430d0f5 | Hannes Reinecke | uint8_t disallowHostRequestReordering; |
593 | 7430d0f5 | Hannes Reinecke | uint8_t abortCCOnError; |
594 | 7430d0f5 | Hannes Reinecke | uint8_t loadBalanceMode; |
595 | 7430d0f5 | Hannes Reinecke | uint8_t disableAutoDetectBackplane; |
596 | 7430d0f5 | Hannes Reinecke | uint8_t snapVDSpace; |
597 | 7430d0f5 | Hannes Reinecke | uint32_t OnOffProperties; |
598 | 7430d0f5 | Hannes Reinecke | /* set TRUE to disable copyBack (0=copyback enabled) */
|
599 | 7430d0f5 | Hannes Reinecke | #define MFI_CTRL_PROP_CopyBackDisabled (1 << 0) |
600 | 7430d0f5 | Hannes Reinecke | #define MFI_CTRL_PROP_SMARTerEnabled (1 << 1) |
601 | 7430d0f5 | Hannes Reinecke | #define MFI_CTRL_PROP_PRCorrectUnconfiguredAreas (1 << 2) |
602 | 7430d0f5 | Hannes Reinecke | #define MFI_CTRL_PROP_UseFdeOnly (1 << 3) |
603 | 7430d0f5 | Hannes Reinecke | #define MFI_CTRL_PROP_DisableNCQ (1 << 4) |
604 | 7430d0f5 | Hannes Reinecke | #define MFI_CTRL_PROP_SSDSMARTerEnabled (1 << 5) |
605 | 7430d0f5 | Hannes Reinecke | #define MFI_CTRL_PROP_SSDPatrolReadEnabled (1 << 6) |
606 | 7430d0f5 | Hannes Reinecke | #define MFI_CTRL_PROP_EnableSpinDownUnconfigured (1 << 7) |
607 | 7430d0f5 | Hannes Reinecke | #define MFI_CTRL_PROP_AutoEnhancedImport (1 << 8) |
608 | 7430d0f5 | Hannes Reinecke | #define MFI_CTRL_PROP_EnableSecretKeyControl (1 << 9) |
609 | 7430d0f5 | Hannes Reinecke | #define MFI_CTRL_PROP_DisableOnlineCtrlReset (1 << 10) |
610 | 7430d0f5 | Hannes Reinecke | #define MFI_CTRL_PROP_AllowBootWithPinnedCache (1 << 11) |
611 | 7430d0f5 | Hannes Reinecke | #define MFI_CTRL_PROP_DisableSpinDownHS (1 << 12) |
612 | 7430d0f5 | Hannes Reinecke | #define MFI_CTRL_PROP_EnableJBOD (1 << 13) |
613 | 7430d0f5 | Hannes Reinecke | |
614 | 7430d0f5 | Hannes Reinecke | uint8_t autoSnapVDSpace; /* % of source LD to be
|
615 | 7430d0f5 | Hannes Reinecke | * reserved for auto snapshot
|
616 | 7430d0f5 | Hannes Reinecke | * in snapshot repository, for
|
617 | 7430d0f5 | Hannes Reinecke | * metadata and user data
|
618 | 7430d0f5 | Hannes Reinecke | * 1=5%, 2=10%, 3=15% and so on
|
619 | 7430d0f5 | Hannes Reinecke | */
|
620 | 7430d0f5 | Hannes Reinecke | uint8_t viewSpace; /* snapshot writeable VIEWs
|
621 | 7430d0f5 | Hannes Reinecke | * capacity as a % of source LD
|
622 | 7430d0f5 | Hannes Reinecke | * capacity. 0=READ only
|
623 | 7430d0f5 | Hannes Reinecke | * 1=5%, 2=10%, 3=15% and so on
|
624 | 7430d0f5 | Hannes Reinecke | */
|
625 | 7430d0f5 | Hannes Reinecke | uint16_t spinDownTime; /* # of idle minutes before device
|
626 | 7430d0f5 | Hannes Reinecke | * is spun down (0=use FW defaults)
|
627 | 7430d0f5 | Hannes Reinecke | */
|
628 | 7430d0f5 | Hannes Reinecke | uint8_t reserved[24];
|
629 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
630 | 7430d0f5 | Hannes Reinecke | |
631 | 7430d0f5 | Hannes Reinecke | /* PCI information about the card. */
|
632 | 7430d0f5 | Hannes Reinecke | struct mfi_info_pci {
|
633 | 7430d0f5 | Hannes Reinecke | uint16_t vendor; |
634 | 7430d0f5 | Hannes Reinecke | uint16_t device; |
635 | 7430d0f5 | Hannes Reinecke | uint16_t subvendor; |
636 | 7430d0f5 | Hannes Reinecke | uint16_t subdevice; |
637 | 7430d0f5 | Hannes Reinecke | uint8_t reserved[24];
|
638 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
639 | 7430d0f5 | Hannes Reinecke | |
640 | 7430d0f5 | Hannes Reinecke | /* Host (front end) interface information */
|
641 | 7430d0f5 | Hannes Reinecke | struct mfi_info_host {
|
642 | 7430d0f5 | Hannes Reinecke | uint8_t type; |
643 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_HOST_PCIX 0x01 |
644 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_HOST_PCIE 0x02 |
645 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_HOST_ISCSI 0x04 |
646 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_HOST_SAS3G 0x08 |
647 | 7430d0f5 | Hannes Reinecke | uint8_t reserved[6];
|
648 | 7430d0f5 | Hannes Reinecke | uint8_t port_count; |
649 | 7430d0f5 | Hannes Reinecke | uint64_t port_addr[8];
|
650 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
651 | 7430d0f5 | Hannes Reinecke | |
652 | 7430d0f5 | Hannes Reinecke | /* Device (back end) interface information */
|
653 | 7430d0f5 | Hannes Reinecke | struct mfi_info_device {
|
654 | 7430d0f5 | Hannes Reinecke | uint8_t type; |
655 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_DEV_SPI 0x01 |
656 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_DEV_SAS3G 0x02 |
657 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_DEV_SATA1 0x04 |
658 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_DEV_SATA3G 0x08 |
659 | 7430d0f5 | Hannes Reinecke | uint8_t reserved[6];
|
660 | 7430d0f5 | Hannes Reinecke | uint8_t port_count; |
661 | 7430d0f5 | Hannes Reinecke | uint64_t port_addr[8];
|
662 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
663 | 7430d0f5 | Hannes Reinecke | |
664 | 7430d0f5 | Hannes Reinecke | /* Firmware component information */
|
665 | 7430d0f5 | Hannes Reinecke | struct mfi_info_component {
|
666 | 7430d0f5 | Hannes Reinecke | char name[8]; |
667 | 7430d0f5 | Hannes Reinecke | char version[32]; |
668 | 7430d0f5 | Hannes Reinecke | char build_date[16]; |
669 | 7430d0f5 | Hannes Reinecke | char build_time[16]; |
670 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
671 | 7430d0f5 | Hannes Reinecke | |
672 | 7430d0f5 | Hannes Reinecke | /* Controller default settings */
|
673 | 7430d0f5 | Hannes Reinecke | struct mfi_defaults {
|
674 | 7430d0f5 | Hannes Reinecke | uint64_t sas_addr; |
675 | 7430d0f5 | Hannes Reinecke | uint8_t phy_polarity; |
676 | 7430d0f5 | Hannes Reinecke | uint8_t background_rate; |
677 | 7430d0f5 | Hannes Reinecke | uint8_t stripe_size; |
678 | 7430d0f5 | Hannes Reinecke | uint8_t flush_time; |
679 | 7430d0f5 | Hannes Reinecke | uint8_t write_back; |
680 | 7430d0f5 | Hannes Reinecke | uint8_t read_ahead; |
681 | 7430d0f5 | Hannes Reinecke | uint8_t cache_when_bbu_bad; |
682 | 7430d0f5 | Hannes Reinecke | uint8_t cached_io; |
683 | 7430d0f5 | Hannes Reinecke | uint8_t smart_mode; |
684 | 7430d0f5 | Hannes Reinecke | uint8_t alarm_disable; |
685 | 7430d0f5 | Hannes Reinecke | uint8_t coercion; |
686 | 7430d0f5 | Hannes Reinecke | uint8_t zrc_config; |
687 | 7430d0f5 | Hannes Reinecke | uint8_t dirty_led_shows_drive_activity; |
688 | 7430d0f5 | Hannes Reinecke | uint8_t bios_continue_on_error; |
689 | 7430d0f5 | Hannes Reinecke | uint8_t spindown_mode; |
690 | 7430d0f5 | Hannes Reinecke | uint8_t allowed_device_types; |
691 | 7430d0f5 | Hannes Reinecke | uint8_t allow_mix_in_enclosure; |
692 | 7430d0f5 | Hannes Reinecke | uint8_t allow_mix_in_ld; |
693 | 7430d0f5 | Hannes Reinecke | uint8_t allow_sata_in_cluster; |
694 | 7430d0f5 | Hannes Reinecke | uint8_t max_chained_enclosures; |
695 | 7430d0f5 | Hannes Reinecke | uint8_t disable_ctrl_r; |
696 | 7430d0f5 | Hannes Reinecke | uint8_t enable_web_bios; |
697 | 7430d0f5 | Hannes Reinecke | uint8_t phy_polarity_split; |
698 | 7430d0f5 | Hannes Reinecke | uint8_t direct_pd_mapping; |
699 | 7430d0f5 | Hannes Reinecke | uint8_t bios_enumerate_lds; |
700 | 7430d0f5 | Hannes Reinecke | uint8_t restored_hot_spare_on_insertion; |
701 | 7430d0f5 | Hannes Reinecke | uint8_t expose_enclosure_devices; |
702 | 7430d0f5 | Hannes Reinecke | uint8_t maintain_pd_fail_history; |
703 | 7430d0f5 | Hannes Reinecke | uint8_t disable_puncture; |
704 | 7430d0f5 | Hannes Reinecke | uint8_t zero_based_enumeration; |
705 | 7430d0f5 | Hannes Reinecke | uint8_t disable_preboot_cli; |
706 | 7430d0f5 | Hannes Reinecke | uint8_t show_drive_led_on_activity; |
707 | 7430d0f5 | Hannes Reinecke | uint8_t cluster_disable; |
708 | 7430d0f5 | Hannes Reinecke | uint8_t sas_disable; |
709 | 7430d0f5 | Hannes Reinecke | uint8_t auto_detect_backplane; |
710 | 7430d0f5 | Hannes Reinecke | uint8_t fde_only; |
711 | 7430d0f5 | Hannes Reinecke | uint8_t delay_during_post; |
712 | 7430d0f5 | Hannes Reinecke | uint8_t resv[19];
|
713 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
714 | 7430d0f5 | Hannes Reinecke | |
715 | 7430d0f5 | Hannes Reinecke | /* Controller default settings */
|
716 | 7430d0f5 | Hannes Reinecke | struct mfi_bios_data {
|
717 | 7430d0f5 | Hannes Reinecke | uint16_t boot_target_id; |
718 | 7430d0f5 | Hannes Reinecke | uint8_t do_not_int_13; |
719 | 7430d0f5 | Hannes Reinecke | uint8_t continue_on_error; |
720 | 7430d0f5 | Hannes Reinecke | uint8_t verbose; |
721 | 7430d0f5 | Hannes Reinecke | uint8_t geometry; |
722 | 7430d0f5 | Hannes Reinecke | uint8_t expose_all_drives; |
723 | 7430d0f5 | Hannes Reinecke | uint8_t reserved[56];
|
724 | 7430d0f5 | Hannes Reinecke | uint8_t check_sum; |
725 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
726 | 7430d0f5 | Hannes Reinecke | |
727 | 7430d0f5 | Hannes Reinecke | /* SAS (?) controller info, returned from MFI_DCMD_CTRL_GETINFO. */
|
728 | 7430d0f5 | Hannes Reinecke | struct mfi_ctrl_info {
|
729 | 7430d0f5 | Hannes Reinecke | struct mfi_info_pci pci;
|
730 | 7430d0f5 | Hannes Reinecke | struct mfi_info_host host;
|
731 | 7430d0f5 | Hannes Reinecke | struct mfi_info_device device;
|
732 | 7430d0f5 | Hannes Reinecke | |
733 | 7430d0f5 | Hannes Reinecke | /* Firmware components that are present and active. */
|
734 | 7430d0f5 | Hannes Reinecke | uint32_t image_check_word; |
735 | 7430d0f5 | Hannes Reinecke | uint32_t image_component_count; |
736 | 7430d0f5 | Hannes Reinecke | struct mfi_info_component image_component[8]; |
737 | 7430d0f5 | Hannes Reinecke | |
738 | 7430d0f5 | Hannes Reinecke | /* Firmware components that have been flashed but are inactive */
|
739 | 7430d0f5 | Hannes Reinecke | uint32_t pending_image_component_count; |
740 | 7430d0f5 | Hannes Reinecke | struct mfi_info_component pending_image_component[8]; |
741 | 7430d0f5 | Hannes Reinecke | |
742 | 7430d0f5 | Hannes Reinecke | uint8_t max_arms; |
743 | 7430d0f5 | Hannes Reinecke | uint8_t max_spans; |
744 | 7430d0f5 | Hannes Reinecke | uint8_t max_arrays; |
745 | 7430d0f5 | Hannes Reinecke | uint8_t max_lds; |
746 | 7430d0f5 | Hannes Reinecke | char product_name[80]; |
747 | 7430d0f5 | Hannes Reinecke | char serial_number[32]; |
748 | 7430d0f5 | Hannes Reinecke | uint32_t hw_present; |
749 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_HW_BBU 0x01 |
750 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_HW_ALARM 0x02 |
751 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_HW_NVRAM 0x04 |
752 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_HW_UART 0x08 |
753 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_HW_MEM 0x10 |
754 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_HW_FLASH 0x20 |
755 | 7430d0f5 | Hannes Reinecke | uint32_t current_fw_time; |
756 | 7430d0f5 | Hannes Reinecke | uint16_t max_cmds; |
757 | 7430d0f5 | Hannes Reinecke | uint16_t max_sg_elements; |
758 | 7430d0f5 | Hannes Reinecke | uint32_t max_request_size; |
759 | 7430d0f5 | Hannes Reinecke | uint16_t lds_present; |
760 | 7430d0f5 | Hannes Reinecke | uint16_t lds_degraded; |
761 | 7430d0f5 | Hannes Reinecke | uint16_t lds_offline; |
762 | 7430d0f5 | Hannes Reinecke | uint16_t pd_present; |
763 | 7430d0f5 | Hannes Reinecke | uint16_t pd_disks_present; |
764 | 7430d0f5 | Hannes Reinecke | uint16_t pd_disks_pred_failure; |
765 | 7430d0f5 | Hannes Reinecke | uint16_t pd_disks_failed; |
766 | 7430d0f5 | Hannes Reinecke | uint16_t nvram_size; |
767 | 7430d0f5 | Hannes Reinecke | uint16_t memory_size; |
768 | 7430d0f5 | Hannes Reinecke | uint16_t flash_size; |
769 | 7430d0f5 | Hannes Reinecke | uint16_t ram_correctable_errors; |
770 | 7430d0f5 | Hannes Reinecke | uint16_t ram_uncorrectable_errors; |
771 | 7430d0f5 | Hannes Reinecke | uint8_t cluster_allowed; |
772 | 7430d0f5 | Hannes Reinecke | uint8_t cluster_active; |
773 | 7430d0f5 | Hannes Reinecke | uint16_t max_strips_per_io; |
774 | 7430d0f5 | Hannes Reinecke | |
775 | 7430d0f5 | Hannes Reinecke | uint32_t raid_levels; |
776 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_RAID_0 0x01 |
777 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_RAID_1 0x02 |
778 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_RAID_5 0x04 |
779 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_RAID_1E 0x08 |
780 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_RAID_6 0x10 |
781 | 7430d0f5 | Hannes Reinecke | |
782 | 7430d0f5 | Hannes Reinecke | uint32_t adapter_ops; |
783 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_AOPS_RBLD_RATE 0x0001 |
784 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_AOPS_CC_RATE 0x0002 |
785 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_AOPS_BGI_RATE 0x0004 |
786 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_AOPS_RECON_RATE 0x0008 |
787 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_AOPS_PATROL_RATE 0x0010 |
788 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_AOPS_ALARM_CONTROL 0x0020 |
789 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_AOPS_CLUSTER_SUPPORTED 0x0040 |
790 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_AOPS_BBU 0x0080 |
791 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_AOPS_SPANNING_ALLOWED 0x0100 |
792 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_AOPS_DEDICATED_SPARES 0x0200 |
793 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_AOPS_REVERTIBLE_SPARES 0x0400 |
794 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_AOPS_FOREIGN_IMPORT 0x0800 |
795 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_AOPS_SELF_DIAGNOSTIC 0x1000 |
796 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_AOPS_MIXED_ARRAY 0x2000 |
797 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_AOPS_GLOBAL_SPARES 0x4000 |
798 | 7430d0f5 | Hannes Reinecke | |
799 | 7430d0f5 | Hannes Reinecke | uint32_t ld_ops; |
800 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_LDOPS_READ_POLICY 0x01 |
801 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_LDOPS_WRITE_POLICY 0x02 |
802 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_LDOPS_IO_POLICY 0x04 |
803 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_LDOPS_ACCESS_POLICY 0x08 |
804 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_LDOPS_DISK_CACHE_POLICY 0x10 |
805 | 7430d0f5 | Hannes Reinecke | |
806 | 7430d0f5 | Hannes Reinecke | struct {
|
807 | 7430d0f5 | Hannes Reinecke | uint8_t min; |
808 | 7430d0f5 | Hannes Reinecke | uint8_t max; |
809 | 7430d0f5 | Hannes Reinecke | uint8_t reserved[2];
|
810 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)) stripe_sz_ops; |
811 | 7430d0f5 | Hannes Reinecke | |
812 | 7430d0f5 | Hannes Reinecke | uint32_t pd_ops; |
813 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_PDOPS_FORCE_ONLINE 0x01 |
814 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_PDOPS_FORCE_OFFLINE 0x02 |
815 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_PDOPS_FORCE_REBUILD 0x04 |
816 | 7430d0f5 | Hannes Reinecke | |
817 | 7430d0f5 | Hannes Reinecke | uint32_t pd_mix_support; |
818 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_PDMIX_SAS 0x01 |
819 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_PDMIX_SATA 0x02 |
820 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_PDMIX_ENCL 0x04 |
821 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_PDMIX_LD 0x08 |
822 | 7430d0f5 | Hannes Reinecke | #define MFI_INFO_PDMIX_SATA_CLUSTER 0x10 |
823 | 7430d0f5 | Hannes Reinecke | |
824 | 7430d0f5 | Hannes Reinecke | uint8_t ecc_bucket_count; |
825 | 7430d0f5 | Hannes Reinecke | uint8_t reserved2[11];
|
826 | 7430d0f5 | Hannes Reinecke | struct mfi_ctrl_props properties;
|
827 | 7430d0f5 | Hannes Reinecke | char package_version[0x60]; |
828 | 7430d0f5 | Hannes Reinecke | uint8_t pad[0x800 - 0x6a0]; |
829 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
830 | 7430d0f5 | Hannes Reinecke | |
831 | 7430d0f5 | Hannes Reinecke | /* keep track of an event. */
|
832 | 7430d0f5 | Hannes Reinecke | union mfi_evt {
|
833 | 7430d0f5 | Hannes Reinecke | struct {
|
834 | 7430d0f5 | Hannes Reinecke | uint16_t locale; |
835 | 7430d0f5 | Hannes Reinecke | uint8_t reserved; |
836 | 7430d0f5 | Hannes Reinecke | int8_t class; |
837 | 7430d0f5 | Hannes Reinecke | } members; |
838 | 7430d0f5 | Hannes Reinecke | uint32_t word; |
839 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
840 | 7430d0f5 | Hannes Reinecke | |
841 | 7430d0f5 | Hannes Reinecke | /* event log state. */
|
842 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_log_state {
|
843 | 7430d0f5 | Hannes Reinecke | uint32_t newest_seq_num; |
844 | 7430d0f5 | Hannes Reinecke | uint32_t oldest_seq_num; |
845 | 7430d0f5 | Hannes Reinecke | uint32_t clear_seq_num; |
846 | 7430d0f5 | Hannes Reinecke | uint32_t shutdown_seq_num; |
847 | 7430d0f5 | Hannes Reinecke | uint32_t boot_seq_num; |
848 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
849 | 7430d0f5 | Hannes Reinecke | |
850 | 7430d0f5 | Hannes Reinecke | struct mfi_progress {
|
851 | 7430d0f5 | Hannes Reinecke | uint16_t progress; |
852 | 7430d0f5 | Hannes Reinecke | uint16_t elapsed_seconds; |
853 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
854 | 7430d0f5 | Hannes Reinecke | |
855 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_ld {
|
856 | 7430d0f5 | Hannes Reinecke | uint16_t target_id; |
857 | 7430d0f5 | Hannes Reinecke | uint8_t ld_index; |
858 | 7430d0f5 | Hannes Reinecke | uint8_t reserved; |
859 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
860 | 7430d0f5 | Hannes Reinecke | |
861 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_pd {
|
862 | 7430d0f5 | Hannes Reinecke | uint16_t device_id; |
863 | 7430d0f5 | Hannes Reinecke | uint8_t enclosure_index; |
864 | 7430d0f5 | Hannes Reinecke | uint8_t slot_number; |
865 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
866 | 7430d0f5 | Hannes Reinecke | |
867 | 7430d0f5 | Hannes Reinecke | /* event detail, returned from MFI_DCMD_CTRL_EVENT_WAIT. */
|
868 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_detail {
|
869 | 7430d0f5 | Hannes Reinecke | uint32_t seq; |
870 | 7430d0f5 | Hannes Reinecke | uint32_t time; |
871 | 7430d0f5 | Hannes Reinecke | uint32_t code; |
872 | 7430d0f5 | Hannes Reinecke | union mfi_evt class;
|
873 | 7430d0f5 | Hannes Reinecke | uint8_t arg_type; |
874 | 7430d0f5 | Hannes Reinecke | uint8_t reserved1[15];
|
875 | 7430d0f5 | Hannes Reinecke | |
876 | 7430d0f5 | Hannes Reinecke | union {
|
877 | 7430d0f5 | Hannes Reinecke | struct {
|
878 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_pd pd;
|
879 | 7430d0f5 | Hannes Reinecke | uint8_t cdb_len; |
880 | 7430d0f5 | Hannes Reinecke | uint8_t sense_len; |
881 | 7430d0f5 | Hannes Reinecke | uint8_t reserved[2];
|
882 | 7430d0f5 | Hannes Reinecke | uint8_t cdb[16];
|
883 | 7430d0f5 | Hannes Reinecke | uint8_t sense[64];
|
884 | 7430d0f5 | Hannes Reinecke | } cdb_sense; |
885 | 7430d0f5 | Hannes Reinecke | |
886 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_ld ld;
|
887 | 7430d0f5 | Hannes Reinecke | |
888 | 7430d0f5 | Hannes Reinecke | struct {
|
889 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_ld ld;
|
890 | 7430d0f5 | Hannes Reinecke | uint64_t count; |
891 | 7430d0f5 | Hannes Reinecke | } ld_count; |
892 | 7430d0f5 | Hannes Reinecke | |
893 | 7430d0f5 | Hannes Reinecke | struct {
|
894 | 7430d0f5 | Hannes Reinecke | uint64_t lba; |
895 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_ld ld;
|
896 | 7430d0f5 | Hannes Reinecke | } ld_lba; |
897 | 7430d0f5 | Hannes Reinecke | |
898 | 7430d0f5 | Hannes Reinecke | struct {
|
899 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_ld ld;
|
900 | 7430d0f5 | Hannes Reinecke | uint32_t pre_owner; |
901 | 7430d0f5 | Hannes Reinecke | uint32_t new_owner; |
902 | 7430d0f5 | Hannes Reinecke | } ld_owner; |
903 | 7430d0f5 | Hannes Reinecke | |
904 | 7430d0f5 | Hannes Reinecke | struct {
|
905 | 7430d0f5 | Hannes Reinecke | uint64_t ld_lba; |
906 | 7430d0f5 | Hannes Reinecke | uint64_t pd_lba; |
907 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_ld ld;
|
908 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_pd pd;
|
909 | 7430d0f5 | Hannes Reinecke | } ld_lba_pd_lba; |
910 | 7430d0f5 | Hannes Reinecke | |
911 | 7430d0f5 | Hannes Reinecke | struct {
|
912 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_ld ld;
|
913 | 7430d0f5 | Hannes Reinecke | struct mfi_progress prog;
|
914 | 7430d0f5 | Hannes Reinecke | } ld_prog; |
915 | 7430d0f5 | Hannes Reinecke | |
916 | 7430d0f5 | Hannes Reinecke | struct {
|
917 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_ld ld;
|
918 | 7430d0f5 | Hannes Reinecke | uint32_t prev_state; |
919 | 7430d0f5 | Hannes Reinecke | uint32_t new_state; |
920 | 7430d0f5 | Hannes Reinecke | } ld_state; |
921 | 7430d0f5 | Hannes Reinecke | |
922 | 7430d0f5 | Hannes Reinecke | struct {
|
923 | 7430d0f5 | Hannes Reinecke | uint64_t strip; |
924 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_ld ld;
|
925 | 7430d0f5 | Hannes Reinecke | } ld_strip; |
926 | 7430d0f5 | Hannes Reinecke | |
927 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_pd pd;
|
928 | 7430d0f5 | Hannes Reinecke | |
929 | 7430d0f5 | Hannes Reinecke | struct {
|
930 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_pd pd;
|
931 | 7430d0f5 | Hannes Reinecke | uint32_t err; |
932 | 7430d0f5 | Hannes Reinecke | } pd_err; |
933 | 7430d0f5 | Hannes Reinecke | |
934 | 7430d0f5 | Hannes Reinecke | struct {
|
935 | 7430d0f5 | Hannes Reinecke | uint64_t lba; |
936 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_pd pd;
|
937 | 7430d0f5 | Hannes Reinecke | } pd_lba; |
938 | 7430d0f5 | Hannes Reinecke | |
939 | 7430d0f5 | Hannes Reinecke | struct {
|
940 | 7430d0f5 | Hannes Reinecke | uint64_t lba; |
941 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_pd pd;
|
942 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_ld ld;
|
943 | 7430d0f5 | Hannes Reinecke | } pd_lba_ld; |
944 | 7430d0f5 | Hannes Reinecke | |
945 | 7430d0f5 | Hannes Reinecke | struct {
|
946 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_pd pd;
|
947 | 7430d0f5 | Hannes Reinecke | struct mfi_progress prog;
|
948 | 7430d0f5 | Hannes Reinecke | } pd_prog; |
949 | 7430d0f5 | Hannes Reinecke | |
950 | 7430d0f5 | Hannes Reinecke | struct {
|
951 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_pd ld;
|
952 | 7430d0f5 | Hannes Reinecke | uint32_t prev_state; |
953 | 7430d0f5 | Hannes Reinecke | uint32_t new_state; |
954 | 7430d0f5 | Hannes Reinecke | } pd_state; |
955 | 7430d0f5 | Hannes Reinecke | |
956 | 7430d0f5 | Hannes Reinecke | struct {
|
957 | 7430d0f5 | Hannes Reinecke | uint16_t venderId; |
958 | 7430d0f5 | Hannes Reinecke | uint16_t deviceId; |
959 | 7430d0f5 | Hannes Reinecke | uint16_t subVenderId; |
960 | 7430d0f5 | Hannes Reinecke | uint16_t subDeviceId; |
961 | 7430d0f5 | Hannes Reinecke | } pci; |
962 | 7430d0f5 | Hannes Reinecke | |
963 | 7430d0f5 | Hannes Reinecke | uint32_t rate; |
964 | 7430d0f5 | Hannes Reinecke | |
965 | 7430d0f5 | Hannes Reinecke | char str[96]; |
966 | 7430d0f5 | Hannes Reinecke | |
967 | 7430d0f5 | Hannes Reinecke | struct {
|
968 | 7430d0f5 | Hannes Reinecke | uint32_t rtc; |
969 | 7430d0f5 | Hannes Reinecke | uint16_t elapsedSeconds; |
970 | 7430d0f5 | Hannes Reinecke | } time; |
971 | 7430d0f5 | Hannes Reinecke | |
972 | 7430d0f5 | Hannes Reinecke | struct {
|
973 | 7430d0f5 | Hannes Reinecke | uint32_t ecar; |
974 | 7430d0f5 | Hannes Reinecke | uint32_t elog; |
975 | 7430d0f5 | Hannes Reinecke | char str[64]; |
976 | 7430d0f5 | Hannes Reinecke | } ecc; |
977 | 7430d0f5 | Hannes Reinecke | |
978 | 7430d0f5 | Hannes Reinecke | uint8_t b[96];
|
979 | 7430d0f5 | Hannes Reinecke | uint16_t s[48];
|
980 | 7430d0f5 | Hannes Reinecke | uint32_t w[24];
|
981 | 7430d0f5 | Hannes Reinecke | uint64_t d[12];
|
982 | 7430d0f5 | Hannes Reinecke | } args; |
983 | 7430d0f5 | Hannes Reinecke | |
984 | 7430d0f5 | Hannes Reinecke | char description[128]; |
985 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
986 | 7430d0f5 | Hannes Reinecke | |
987 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_list {
|
988 | 7430d0f5 | Hannes Reinecke | uint32_t count; |
989 | 7430d0f5 | Hannes Reinecke | uint32_t reserved; |
990 | 7430d0f5 | Hannes Reinecke | struct mfi_evt_detail event[1]; |
991 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
992 | 7430d0f5 | Hannes Reinecke | |
993 | 7430d0f5 | Hannes Reinecke | union mfi_pd_ref {
|
994 | 7430d0f5 | Hannes Reinecke | struct {
|
995 | 7430d0f5 | Hannes Reinecke | uint16_t device_id; |
996 | 7430d0f5 | Hannes Reinecke | uint16_t seq_num; |
997 | 7430d0f5 | Hannes Reinecke | } v; |
998 | 7430d0f5 | Hannes Reinecke | uint32_t ref; |
999 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
1000 | 7430d0f5 | Hannes Reinecke | |
1001 | 7430d0f5 | Hannes Reinecke | union mfi_pd_ddf_type {
|
1002 | 7430d0f5 | Hannes Reinecke | struct {
|
1003 | 7430d0f5 | Hannes Reinecke | uint16_t pd_type; |
1004 | 7430d0f5 | Hannes Reinecke | #define MFI_PD_DDF_TYPE_FORCED_PD_GUID (1 << 0) |
1005 | 7430d0f5 | Hannes Reinecke | #define MFI_PD_DDF_TYPE_IN_VD (1 << 1) |
1006 | 7430d0f5 | Hannes Reinecke | #define MFI_PD_DDF_TYPE_IS_GLOBAL_SPARE (1 << 2) |
1007 | 7430d0f5 | Hannes Reinecke | #define MFI_PD_DDF_TYPE_IS_SPARE (1 << 3) |
1008 | 7430d0f5 | Hannes Reinecke | #define MFI_PD_DDF_TYPE_IS_FOREIGN (1 << 4) |
1009 | 7430d0f5 | Hannes Reinecke | #define MFI_PD_DDF_TYPE_INTF_SPI (1 << 12) |
1010 | 7430d0f5 | Hannes Reinecke | #define MFI_PD_DDF_TYPE_INTF_SAS (1 << 13) |
1011 | 7430d0f5 | Hannes Reinecke | #define MFI_PD_DDF_TYPE_INTF_SATA1 (1 << 14) |
1012 | 7430d0f5 | Hannes Reinecke | #define MFI_PD_DDF_TYPE_INTF_SATA3G (1 << 15) |
1013 | 7430d0f5 | Hannes Reinecke | uint16_t reserved; |
1014 | 7430d0f5 | Hannes Reinecke | } ddf; |
1015 | 7430d0f5 | Hannes Reinecke | struct {
|
1016 | 7430d0f5 | Hannes Reinecke | uint32_t reserved; |
1017 | 7430d0f5 | Hannes Reinecke | } non_disk; |
1018 | 7430d0f5 | Hannes Reinecke | uint32_t type; |
1019 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
1020 | 7430d0f5 | Hannes Reinecke | |
1021 | 7430d0f5 | Hannes Reinecke | struct mfi_pd_progress {
|
1022 | 7430d0f5 | Hannes Reinecke | uint32_t active; |
1023 | 7430d0f5 | Hannes Reinecke | #define PD_PROGRESS_ACTIVE_REBUILD (1 << 0) |
1024 | 7430d0f5 | Hannes Reinecke | #define PD_PROGRESS_ACTIVE_PATROL (1 << 1) |
1025 | 7430d0f5 | Hannes Reinecke | #define PD_PROGRESS_ACTIVE_CLEAR (1 << 2) |
1026 | 7430d0f5 | Hannes Reinecke | struct mfi_progress rbld;
|
1027 | 7430d0f5 | Hannes Reinecke | struct mfi_progress patrol;
|
1028 | 7430d0f5 | Hannes Reinecke | struct mfi_progress clear;
|
1029 | 7430d0f5 | Hannes Reinecke | struct mfi_progress reserved[4]; |
1030 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
1031 | 7430d0f5 | Hannes Reinecke | |
1032 | 7430d0f5 | Hannes Reinecke | struct mfi_pd_info {
|
1033 | 7430d0f5 | Hannes Reinecke | union mfi_pd_ref ref;
|
1034 | 7430d0f5 | Hannes Reinecke | uint8_t inquiry_data[96];
|
1035 | 7430d0f5 | Hannes Reinecke | uint8_t vpd_page83[64];
|
1036 | 7430d0f5 | Hannes Reinecke | uint8_t not_supported; |
1037 | 7430d0f5 | Hannes Reinecke | uint8_t scsi_dev_type; |
1038 | 7430d0f5 | Hannes Reinecke | uint8_t connected_port_bitmap; |
1039 | 7430d0f5 | Hannes Reinecke | uint8_t device_speed; |
1040 | 7430d0f5 | Hannes Reinecke | uint32_t media_err_count; |
1041 | 7430d0f5 | Hannes Reinecke | uint32_t other_err_count; |
1042 | 7430d0f5 | Hannes Reinecke | uint32_t pred_fail_count; |
1043 | 7430d0f5 | Hannes Reinecke | uint32_t last_pred_fail_event_seq_num; |
1044 | 7430d0f5 | Hannes Reinecke | uint16_t fw_state; |
1045 | 7430d0f5 | Hannes Reinecke | uint8_t disable_for_removal; |
1046 | 7430d0f5 | Hannes Reinecke | uint8_t link_speed; |
1047 | 7430d0f5 | Hannes Reinecke | union mfi_pd_ddf_type state;
|
1048 | 7430d0f5 | Hannes Reinecke | struct {
|
1049 | 7430d0f5 | Hannes Reinecke | uint8_t count; |
1050 | 7430d0f5 | Hannes Reinecke | uint8_t is_path_broken; |
1051 | 7430d0f5 | Hannes Reinecke | uint8_t reserved[6];
|
1052 | 7430d0f5 | Hannes Reinecke | uint64_t sas_addr[4];
|
1053 | 7430d0f5 | Hannes Reinecke | } path_info; |
1054 | 7430d0f5 | Hannes Reinecke | uint64_t raw_size; |
1055 | 7430d0f5 | Hannes Reinecke | uint64_t non_coerced_size; |
1056 | 7430d0f5 | Hannes Reinecke | uint64_t coerced_size; |
1057 | 7430d0f5 | Hannes Reinecke | uint16_t encl_device_id; |
1058 | 7430d0f5 | Hannes Reinecke | uint8_t encl_index; |
1059 | 7430d0f5 | Hannes Reinecke | uint8_t slot_number; |
1060 | 7430d0f5 | Hannes Reinecke | struct mfi_pd_progress prog_info;
|
1061 | 7430d0f5 | Hannes Reinecke | uint8_t bad_block_table_full; |
1062 | 7430d0f5 | Hannes Reinecke | uint8_t unusable_in_current_config; |
1063 | 7430d0f5 | Hannes Reinecke | uint8_t vpd_page83_ext[64];
|
1064 | 7430d0f5 | Hannes Reinecke | uint8_t reserved[512-358]; |
1065 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
1066 | 7430d0f5 | Hannes Reinecke | |
1067 | 7430d0f5 | Hannes Reinecke | struct mfi_pd_address {
|
1068 | 7430d0f5 | Hannes Reinecke | uint16_t device_id; |
1069 | 7430d0f5 | Hannes Reinecke | uint16_t encl_device_id; |
1070 | 7430d0f5 | Hannes Reinecke | uint8_t encl_index; |
1071 | 7430d0f5 | Hannes Reinecke | uint8_t slot_number; |
1072 | 7430d0f5 | Hannes Reinecke | uint8_t scsi_dev_type; |
1073 | 7430d0f5 | Hannes Reinecke | uint8_t connect_port_bitmap; |
1074 | 7430d0f5 | Hannes Reinecke | uint64_t sas_addr[2];
|
1075 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
1076 | 7430d0f5 | Hannes Reinecke | |
1077 | 7430d0f5 | Hannes Reinecke | #define MFI_MAX_SYS_PDS 240 |
1078 | 7430d0f5 | Hannes Reinecke | struct mfi_pd_list {
|
1079 | 7430d0f5 | Hannes Reinecke | uint32_t size; |
1080 | 7430d0f5 | Hannes Reinecke | uint32_t count; |
1081 | 7430d0f5 | Hannes Reinecke | struct mfi_pd_address addr[MFI_MAX_SYS_PDS];
|
1082 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
1083 | 7430d0f5 | Hannes Reinecke | |
1084 | 7430d0f5 | Hannes Reinecke | union mfi_ld_ref {
|
1085 | 7430d0f5 | Hannes Reinecke | struct {
|
1086 | 7430d0f5 | Hannes Reinecke | uint8_t target_id; |
1087 | 7430d0f5 | Hannes Reinecke | uint8_t reserved; |
1088 | 7430d0f5 | Hannes Reinecke | uint16_t seq; |
1089 | 7430d0f5 | Hannes Reinecke | } v; |
1090 | 7430d0f5 | Hannes Reinecke | uint32_t ref; |
1091 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
1092 | 7430d0f5 | Hannes Reinecke | |
1093 | 7430d0f5 | Hannes Reinecke | struct mfi_ld_list {
|
1094 | 7430d0f5 | Hannes Reinecke | uint32_t ld_count; |
1095 | 7430d0f5 | Hannes Reinecke | uint32_t reserved1; |
1096 | 7430d0f5 | Hannes Reinecke | struct {
|
1097 | 7430d0f5 | Hannes Reinecke | union mfi_ld_ref ld;
|
1098 | 7430d0f5 | Hannes Reinecke | uint8_t state; |
1099 | 7430d0f5 | Hannes Reinecke | uint8_t reserved2[3];
|
1100 | 7430d0f5 | Hannes Reinecke | uint64_t size; |
1101 | 7430d0f5 | Hannes Reinecke | } ld_list[MFI_MAX_LD]; |
1102 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
1103 | 7430d0f5 | Hannes Reinecke | |
1104 | 7430d0f5 | Hannes Reinecke | enum mfi_ld_access {
|
1105 | 7430d0f5 | Hannes Reinecke | MFI_LD_ACCESS_RW = 0,
|
1106 | 7430d0f5 | Hannes Reinecke | MFI_LD_ACCSSS_RO = 2,
|
1107 | 7430d0f5 | Hannes Reinecke | MFI_LD_ACCESS_BLOCKED = 3,
|
1108 | 7430d0f5 | Hannes Reinecke | }; |
1109 | 7430d0f5 | Hannes Reinecke | #define MFI_LD_ACCESS_MASK 3 |
1110 | 7430d0f5 | Hannes Reinecke | |
1111 | 7430d0f5 | Hannes Reinecke | enum mfi_ld_state {
|
1112 | 7430d0f5 | Hannes Reinecke | MFI_LD_STATE_OFFLINE = 0,
|
1113 | 7430d0f5 | Hannes Reinecke | MFI_LD_STATE_PARTIALLY_DEGRADED = 1,
|
1114 | 7430d0f5 | Hannes Reinecke | MFI_LD_STATE_DEGRADED = 2,
|
1115 | 7430d0f5 | Hannes Reinecke | MFI_LD_STATE_OPTIMAL = 3
|
1116 | 7430d0f5 | Hannes Reinecke | }; |
1117 | 7430d0f5 | Hannes Reinecke | |
1118 | 7430d0f5 | Hannes Reinecke | enum mfi_syspd_state {
|
1119 | 7430d0f5 | Hannes Reinecke | MFI_PD_STATE_UNCONFIGURED_GOOD = 0x00,
|
1120 | 7430d0f5 | Hannes Reinecke | MFI_PD_STATE_UNCONFIGURED_BAD = 0x01,
|
1121 | 7430d0f5 | Hannes Reinecke | MFI_PD_STATE_HOT_SPARE = 0x02,
|
1122 | 7430d0f5 | Hannes Reinecke | MFI_PD_STATE_OFFLINE = 0x10,
|
1123 | 7430d0f5 | Hannes Reinecke | MFI_PD_STATE_FAILED = 0x11,
|
1124 | 7430d0f5 | Hannes Reinecke | MFI_PD_STATE_REBUILD = 0x14,
|
1125 | 7430d0f5 | Hannes Reinecke | MFI_PD_STATE_ONLINE = 0x18,
|
1126 | 7430d0f5 | Hannes Reinecke | MFI_PD_STATE_COPYBACK = 0x20,
|
1127 | 7430d0f5 | Hannes Reinecke | MFI_PD_STATE_SYSTEM = 0x40
|
1128 | 7430d0f5 | Hannes Reinecke | }; |
1129 | 7430d0f5 | Hannes Reinecke | |
1130 | 7430d0f5 | Hannes Reinecke | struct mfi_ld_props {
|
1131 | 7430d0f5 | Hannes Reinecke | union mfi_ld_ref ld;
|
1132 | 7430d0f5 | Hannes Reinecke | char name[16]; |
1133 | 7430d0f5 | Hannes Reinecke | uint8_t default_cache_policy; |
1134 | 7430d0f5 | Hannes Reinecke | uint8_t access_policy; |
1135 | 7430d0f5 | Hannes Reinecke | uint8_t disk_cache_policy; |
1136 | 7430d0f5 | Hannes Reinecke | uint8_t current_cache_policy; |
1137 | 7430d0f5 | Hannes Reinecke | uint8_t no_bgi; |
1138 | 7430d0f5 | Hannes Reinecke | uint8_t reserved[7];
|
1139 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
1140 | 7430d0f5 | Hannes Reinecke | |
1141 | 7430d0f5 | Hannes Reinecke | struct mfi_ld_params {
|
1142 | 7430d0f5 | Hannes Reinecke | uint8_t primary_raid_level; |
1143 | 7430d0f5 | Hannes Reinecke | uint8_t raid_level_qualifier; |
1144 | 7430d0f5 | Hannes Reinecke | uint8_t secondary_raid_level; |
1145 | 7430d0f5 | Hannes Reinecke | uint8_t stripe_size; |
1146 | 7430d0f5 | Hannes Reinecke | uint8_t num_drives; |
1147 | 7430d0f5 | Hannes Reinecke | uint8_t span_depth; |
1148 | 7430d0f5 | Hannes Reinecke | uint8_t state; |
1149 | 7430d0f5 | Hannes Reinecke | uint8_t init_state; |
1150 | 7430d0f5 | Hannes Reinecke | uint8_t is_consistent; |
1151 | 7430d0f5 | Hannes Reinecke | uint8_t reserved[23];
|
1152 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
1153 | 7430d0f5 | Hannes Reinecke | |
1154 | 7430d0f5 | Hannes Reinecke | struct mfi_ld_progress {
|
1155 | 7430d0f5 | Hannes Reinecke | uint32_t active; |
1156 | 7430d0f5 | Hannes Reinecke | #define MFI_LD_PROGRESS_CC (1<<0) |
1157 | 7430d0f5 | Hannes Reinecke | #define MFI_LD_PROGRESS_BGI (1<<1) |
1158 | 7430d0f5 | Hannes Reinecke | #define MFI_LD_PROGRESS_FGI (1<<2) |
1159 | 7430d0f5 | Hannes Reinecke | #define MFI_LD_PORGRESS_RECON (1<<3) |
1160 | 7430d0f5 | Hannes Reinecke | struct mfi_progress cc;
|
1161 | 7430d0f5 | Hannes Reinecke | struct mfi_progress bgi;
|
1162 | 7430d0f5 | Hannes Reinecke | struct mfi_progress fgi;
|
1163 | 7430d0f5 | Hannes Reinecke | struct mfi_progress recon;
|
1164 | 7430d0f5 | Hannes Reinecke | struct mfi_progress reserved[4]; |
1165 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
1166 | 7430d0f5 | Hannes Reinecke | |
1167 | 7430d0f5 | Hannes Reinecke | struct mfi_span {
|
1168 | 7430d0f5 | Hannes Reinecke | uint64_t start_block; |
1169 | 7430d0f5 | Hannes Reinecke | uint64_t num_blocks; |
1170 | 7430d0f5 | Hannes Reinecke | uint16_t array_ref; |
1171 | 7430d0f5 | Hannes Reinecke | uint8_t reserved[6];
|
1172 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
1173 | 7430d0f5 | Hannes Reinecke | |
1174 | 7430d0f5 | Hannes Reinecke | #define MFI_MAX_SPAN_DEPTH 8 |
1175 | 7430d0f5 | Hannes Reinecke | struct mfi_ld_config {
|
1176 | 7430d0f5 | Hannes Reinecke | struct mfi_ld_props properties;
|
1177 | 7430d0f5 | Hannes Reinecke | struct mfi_ld_params params;
|
1178 | 7430d0f5 | Hannes Reinecke | struct mfi_span span[MFI_MAX_SPAN_DEPTH];
|
1179 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
1180 | 7430d0f5 | Hannes Reinecke | |
1181 | 7430d0f5 | Hannes Reinecke | struct mfi_ld_info {
|
1182 | 7430d0f5 | Hannes Reinecke | struct mfi_ld_config ld_config;
|
1183 | 7430d0f5 | Hannes Reinecke | uint64_t size; |
1184 | 7430d0f5 | Hannes Reinecke | struct mfi_ld_progress progress;
|
1185 | 7430d0f5 | Hannes Reinecke | uint16_t cluster_owner; |
1186 | 7430d0f5 | Hannes Reinecke | uint8_t reconstruct_active; |
1187 | 7430d0f5 | Hannes Reinecke | uint8_t reserved1[1];
|
1188 | 7430d0f5 | Hannes Reinecke | uint8_t vpd_page83[64];
|
1189 | 7430d0f5 | Hannes Reinecke | uint8_t reserved2[16];
|
1190 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
1191 | 7430d0f5 | Hannes Reinecke | |
1192 | 7430d0f5 | Hannes Reinecke | union mfi_spare_type {
|
1193 | 7430d0f5 | Hannes Reinecke | uint8_t flags; |
1194 | 7430d0f5 | Hannes Reinecke | #define MFI_SPARE_IS_DEDICATED (1 << 0) |
1195 | 7430d0f5 | Hannes Reinecke | #define MFI_SPARE_IS_REVERTABLE (1 << 1) |
1196 | 7430d0f5 | Hannes Reinecke | #define MFI_SPARE_IS_ENCL_AFFINITY (1 << 2) |
1197 | 7430d0f5 | Hannes Reinecke | uint8_t type; |
1198 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
1199 | 7430d0f5 | Hannes Reinecke | |
1200 | 7430d0f5 | Hannes Reinecke | #define MFI_MAX_ARRAYS 16 |
1201 | 7430d0f5 | Hannes Reinecke | struct mfi_spare {
|
1202 | 7430d0f5 | Hannes Reinecke | union mfi_pd_ref ref;
|
1203 | 7430d0f5 | Hannes Reinecke | union mfi_spare_type spare_type;
|
1204 | 7430d0f5 | Hannes Reinecke | uint8_t reserved[2];
|
1205 | 7430d0f5 | Hannes Reinecke | uint8_t array_count; |
1206 | 7430d0f5 | Hannes Reinecke | uint16_t array_refd[MFI_MAX_ARRAYS]; |
1207 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
1208 | 7430d0f5 | Hannes Reinecke | |
1209 | 7430d0f5 | Hannes Reinecke | #define MFI_MAX_ROW_SIZE 32 |
1210 | 7430d0f5 | Hannes Reinecke | struct mfi_array {
|
1211 | 7430d0f5 | Hannes Reinecke | uint64_t size; |
1212 | 7430d0f5 | Hannes Reinecke | uint8_t num_drives; |
1213 | 7430d0f5 | Hannes Reinecke | uint8_t reserved; |
1214 | 7430d0f5 | Hannes Reinecke | uint16_t array_ref; |
1215 | 7430d0f5 | Hannes Reinecke | uint8_t pad[20];
|
1216 | 7430d0f5 | Hannes Reinecke | struct {
|
1217 | 7430d0f5 | Hannes Reinecke | union mfi_pd_ref ref;
|
1218 | 7430d0f5 | Hannes Reinecke | uint16_t fw_state; /* enum mfi_syspd_state */
|
1219 | 7430d0f5 | Hannes Reinecke | struct {
|
1220 | 7430d0f5 | Hannes Reinecke | uint8_t pd; |
1221 | 7430d0f5 | Hannes Reinecke | uint8_t slot; |
1222 | 7430d0f5 | Hannes Reinecke | } encl; |
1223 | 7430d0f5 | Hannes Reinecke | } pd[MFI_MAX_ROW_SIZE]; |
1224 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
1225 | 7430d0f5 | Hannes Reinecke | |
1226 | 7430d0f5 | Hannes Reinecke | struct mfi_config_data {
|
1227 | 7430d0f5 | Hannes Reinecke | uint32_t size; |
1228 | 7430d0f5 | Hannes Reinecke | uint16_t array_count; |
1229 | 7430d0f5 | Hannes Reinecke | uint16_t array_size; |
1230 | 7430d0f5 | Hannes Reinecke | uint16_t log_drv_count; |
1231 | 7430d0f5 | Hannes Reinecke | uint16_t log_drv_size; |
1232 | 7430d0f5 | Hannes Reinecke | uint16_t spares_count; |
1233 | 7430d0f5 | Hannes Reinecke | uint16_t spares_size; |
1234 | 7430d0f5 | Hannes Reinecke | uint8_t reserved[16];
|
1235 | 7430d0f5 | Hannes Reinecke | /*
|
1236 | 7430d0f5 | Hannes Reinecke | struct mfi_array array[];
|
1237 | 7430d0f5 | Hannes Reinecke | struct mfi_ld_config ld[];
|
1238 | 7430d0f5 | Hannes Reinecke | struct mfi_spare spare[];
|
1239 | 7430d0f5 | Hannes Reinecke | */
|
1240 | 7430d0f5 | Hannes Reinecke | } __attribute__ ((packed)); |
1241 | 7430d0f5 | Hannes Reinecke | |
1242 | 7430d0f5 | Hannes Reinecke | #define MFI_SCSI_MAX_TARGETS 128 |
1243 | 7430d0f5 | Hannes Reinecke | #define MFI_SCSI_MAX_LUNS 8 |
1244 | 7430d0f5 | Hannes Reinecke | #define MFI_SCSI_INITIATOR_ID 255 |
1245 | 7430d0f5 | Hannes Reinecke | #define MFI_SCSI_MAX_CMDS 8 |
1246 | 7430d0f5 | Hannes Reinecke | #define MFI_SCSI_MAX_CDB_LEN 16 |
1247 | 7430d0f5 | Hannes Reinecke | |
1248 | 7430d0f5 | Hannes Reinecke | #endif /* MFI_REG_H */ |