diff options
author | Bradley Grove <bgrove@attotech.com> | 2013-08-23 10:35:45 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2013-09-03 10:27:58 -0400 |
commit | 26780d9e12edf45c0b98315de272b1feff5a8e93 (patch) | |
tree | 2a5a00f53fa007277c9f92ef8c99b85d99d3b633 /drivers/scsi/esas2r/atvda.h | |
parent | 127be355285d14b483da0478a33302a680204144 (diff) |
[SCSI] esas2r: ATTO Technology ExpressSAS 6G SAS/SATA RAID Adapter Driver
This is a new driver for ATTO Technology's ExpressSAS series of hardware RAID
adapters. It supports the following adapters:
- ExpressSAS R60F
- ExpressSAS R680
- ExpressSAS R608
- ExpressSAS R644
Signed-off-by: Bradley Grove <bgrove@attotech.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/esas2r/atvda.h')
-rw-r--r-- | drivers/scsi/esas2r/atvda.h | 1319 |
1 files changed, 1319 insertions, 0 deletions
diff --git a/drivers/scsi/esas2r/atvda.h b/drivers/scsi/esas2r/atvda.h new file mode 100644 index 000000000000..5fc1f991d24e --- /dev/null +++ b/drivers/scsi/esas2r/atvda.h | |||
@@ -0,0 +1,1319 @@ | |||
1 | /* linux/drivers/scsi/esas2r/atvda.h | ||
2 | * ATTO VDA interface definitions | ||
3 | * | ||
4 | * Copyright (c) 2001-2013 ATTO Technology, Inc. | ||
5 | * (mailto:linuxdrivers@attotech.com) | ||
6 | */ | ||
7 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | ||
8 | /* | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; version 2 of the License. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | * | ||
18 | * NO WARRANTY | ||
19 | * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR | ||
20 | * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT | ||
21 | * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, | ||
22 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is | ||
23 | * solely responsible for determining the appropriateness of using and | ||
24 | * distributing the Program and assumes all risks associated with its | ||
25 | * exercise of rights under this Agreement, including but not limited to | ||
26 | * the risks and costs of program errors, damage to or loss of data, | ||
27 | * programs or equipment, and unavailability or interruption of operations. | ||
28 | * | ||
29 | * DISCLAIMER OF LIABILITY | ||
30 | * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY | ||
31 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
32 | * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND | ||
33 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR | ||
34 | * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE | ||
35 | * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED | ||
36 | * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES | ||
37 | * | ||
38 | * You should have received a copy of the GNU General Public License | ||
39 | * along with this program; if not, write to the Free Software | ||
40 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
41 | */ | ||
42 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | ||
43 | |||
44 | |||
45 | #ifndef ATVDA_H | ||
46 | #define ATVDA_H | ||
47 | |||
48 | struct __packed atto_dev_addr { | ||
49 | u64 dev_port; | ||
50 | u64 hba_port; | ||
51 | u8 lun; | ||
52 | u8 flags; | ||
53 | #define VDA_DEVADDRF_SATA 0x01 | ||
54 | #define VDA_DEVADDRF_SSD 0x02 | ||
55 | u8 link_speed; /* VDALINKSPEED_xxx */ | ||
56 | u8 pad[1]; | ||
57 | }; | ||
58 | |||
59 | /* dev_addr2 was added for 64-bit alignment */ | ||
60 | |||
61 | struct __packed atto_dev_addr2 { | ||
62 | u64 dev_port; | ||
63 | u64 hba_port; | ||
64 | u8 lun; | ||
65 | u8 flags; | ||
66 | u8 link_speed; | ||
67 | u8 pad[5]; | ||
68 | }; | ||
69 | |||
70 | struct __packed atto_vda_sge { | ||
71 | u32 length; | ||
72 | u64 address; | ||
73 | }; | ||
74 | |||
75 | |||
76 | /* VDA request function codes */ | ||
77 | |||
78 | #define VDA_FUNC_SCSI 0x00 | ||
79 | #define VDA_FUNC_FLASH 0x01 | ||
80 | #define VDA_FUNC_DIAG 0x02 | ||
81 | #define VDA_FUNC_AE 0x03 | ||
82 | #define VDA_FUNC_CLI 0x04 | ||
83 | #define VDA_FUNC_IOCTL 0x05 | ||
84 | #define VDA_FUNC_CFG 0x06 | ||
85 | #define VDA_FUNC_MGT 0x07 | ||
86 | #define VDA_FUNC_GSV 0x08 | ||
87 | |||
88 | |||
89 | /* VDA request status values. for host driver considerations, values for | ||
90 | * SCSI requests start at zero. other requests may use these values as well. */ | ||
91 | |||
92 | #define RS_SUCCESS 0x00 /*! successful completion */ | ||
93 | #define RS_INV_FUNC 0x01 /*! invalid command function */ | ||
94 | #define RS_BUSY 0x02 /*! insufficient resources */ | ||
95 | #define RS_SEL 0x03 /*! no target at target_id */ | ||
96 | #define RS_NO_LUN 0x04 /*! invalid LUN */ | ||
97 | #define RS_TIMEOUT 0x05 /*! request timeout */ | ||
98 | #define RS_OVERRUN 0x06 /*! data overrun */ | ||
99 | #define RS_UNDERRUN 0x07 /*! data underrun */ | ||
100 | #define RS_SCSI_ERROR 0x08 /*! SCSI error occurred */ | ||
101 | #define RS_ABORTED 0x0A /*! command aborted */ | ||
102 | #define RS_RESID_MISM 0x0B /*! residual length incorrect */ | ||
103 | #define RS_TM_FAILED 0x0C /*! task management failed */ | ||
104 | #define RS_RESET 0x0D /*! aborted due to bus reset */ | ||
105 | #define RS_ERR_DMA_SG 0x0E /*! error reading SG list */ | ||
106 | #define RS_ERR_DMA_DATA 0x0F /*! error transferring data */ | ||
107 | #define RS_UNSUPPORTED 0x10 /*! unsupported request */ | ||
108 | #define RS_SEL2 0x70 /*! internal generated RS_SEL */ | ||
109 | #define RS_VDA_BASE 0x80 /*! base of VDA-specific errors */ | ||
110 | #define RS_MGT_BASE 0x80 /*! base of VDA management errors */ | ||
111 | #define RS_SCAN_FAIL (RS_MGT_BASE + 0x00) | ||
112 | #define RS_DEV_INVALID (RS_MGT_BASE + 0x01) | ||
113 | #define RS_DEV_ASSIGNED (RS_MGT_BASE + 0x02) | ||
114 | #define RS_DEV_REMOVE (RS_MGT_BASE + 0x03) | ||
115 | #define RS_DEV_LOST (RS_MGT_BASE + 0x04) | ||
116 | #define RS_SCAN_GEN (RS_MGT_BASE + 0x05) | ||
117 | #define RS_GRP_INVALID (RS_MGT_BASE + 0x08) | ||
118 | #define RS_GRP_EXISTS (RS_MGT_BASE + 0x09) | ||
119 | #define RS_GRP_LIMIT (RS_MGT_BASE + 0x0A) | ||
120 | #define RS_GRP_INTLV (RS_MGT_BASE + 0x0B) | ||
121 | #define RS_GRP_SPAN (RS_MGT_BASE + 0x0C) | ||
122 | #define RS_GRP_TYPE (RS_MGT_BASE + 0x0D) | ||
123 | #define RS_GRP_MEMBERS (RS_MGT_BASE + 0x0E) | ||
124 | #define RS_GRP_COMMIT (RS_MGT_BASE + 0x0F) | ||
125 | #define RS_GRP_REBUILD (RS_MGT_BASE + 0x10) | ||
126 | #define RS_GRP_REBUILD_TYPE (RS_MGT_BASE + 0x11) | ||
127 | #define RS_GRP_BLOCK_SIZE (RS_MGT_BASE + 0x12) | ||
128 | #define RS_CFG_SAVE (RS_MGT_BASE + 0x14) | ||
129 | #define RS_PART_LAST (RS_MGT_BASE + 0x18) | ||
130 | #define RS_ELEM_INVALID (RS_MGT_BASE + 0x19) | ||
131 | #define RS_PART_MAPPED (RS_MGT_BASE + 0x1A) | ||
132 | #define RS_PART_TARGET (RS_MGT_BASE + 0x1B) | ||
133 | #define RS_PART_LUN (RS_MGT_BASE + 0x1C) | ||
134 | #define RS_PART_DUP (RS_MGT_BASE + 0x1D) | ||
135 | #define RS_PART_NOMAP (RS_MGT_BASE + 0x1E) | ||
136 | #define RS_PART_MAX (RS_MGT_BASE + 0x1F) | ||
137 | #define RS_PART_CAP (RS_MGT_BASE + 0x20) | ||
138 | #define RS_PART_STATE (RS_MGT_BASE + 0x21) | ||
139 | #define RS_TEST_IN_PROG (RS_MGT_BASE + 0x22) | ||
140 | #define RS_METRICS_ERROR (RS_MGT_BASE + 0x23) | ||
141 | #define RS_HS_ERROR (RS_MGT_BASE + 0x24) | ||
142 | #define RS_NO_METRICS_TEST (RS_MGT_BASE + 0x25) | ||
143 | #define RS_BAD_PARAM (RS_MGT_BASE + 0x26) | ||
144 | #define RS_GRP_MEMBER_SIZE (RS_MGT_BASE + 0x27) | ||
145 | #define RS_FLS_BASE 0xB0 /*! base of VDA errors */ | ||
146 | #define RS_FLS_ERR_AREA (RS_FLS_BASE + 0x00) | ||
147 | #define RS_FLS_ERR_BUSY (RS_FLS_BASE + 0x01) | ||
148 | #define RS_FLS_ERR_RANGE (RS_FLS_BASE + 0x02) | ||
149 | #define RS_FLS_ERR_BEGIN (RS_FLS_BASE + 0x03) | ||
150 | #define RS_FLS_ERR_CHECK (RS_FLS_BASE + 0x04) | ||
151 | #define RS_FLS_ERR_FAIL (RS_FLS_BASE + 0x05) | ||
152 | #define RS_FLS_ERR_RSRC (RS_FLS_BASE + 0x06) | ||
153 | #define RS_FLS_ERR_NOFILE (RS_FLS_BASE + 0x07) | ||
154 | #define RS_FLS_ERR_FSIZE (RS_FLS_BASE + 0x08) | ||
155 | #define RS_CFG_BASE 0xC0 /*! base of VDA configuration errors */ | ||
156 | #define RS_CFG_ERR_BUSY (RS_CFG_BASE + 0) | ||
157 | #define RS_CFG_ERR_SGE (RS_CFG_BASE + 1) | ||
158 | #define RS_CFG_ERR_DATE (RS_CFG_BASE + 2) | ||
159 | #define RS_CFG_ERR_TIME (RS_CFG_BASE + 3) | ||
160 | #define RS_DEGRADED 0xFB /*! degraded mode */ | ||
161 | #define RS_CLI_INTERNAL 0xFC /*! VDA CLI internal error */ | ||
162 | #define RS_VDA_INTERNAL 0xFD /*! catch-all */ | ||
163 | #define RS_PENDING 0xFE /*! pending, not started */ | ||
164 | #define RS_STARTED 0xFF /*! started */ | ||
165 | |||
166 | |||
167 | /* flash request subfunctions. these are used in both the IOCTL and the | ||
168 | * driver-firmware interface (VDA_FUNC_FLASH). */ | ||
169 | |||
170 | #define VDA_FLASH_BEGINW 0x00 | ||
171 | #define VDA_FLASH_READ 0x01 | ||
172 | #define VDA_FLASH_WRITE 0x02 | ||
173 | #define VDA_FLASH_COMMIT 0x03 | ||
174 | #define VDA_FLASH_CANCEL 0x04 | ||
175 | #define VDA_FLASH_INFO 0x05 | ||
176 | #define VDA_FLASH_FREAD 0x06 | ||
177 | #define VDA_FLASH_FWRITE 0x07 | ||
178 | #define VDA_FLASH_FINFO 0x08 | ||
179 | |||
180 | |||
181 | /* IOCTL request subfunctions. these identify the payload type for | ||
182 | * VDA_FUNC_IOCTL. | ||
183 | */ | ||
184 | |||
185 | #define VDA_IOCTL_HBA 0x00 | ||
186 | #define VDA_IOCTL_CSMI 0x01 | ||
187 | #define VDA_IOCTL_SMP 0x02 | ||
188 | |||
189 | struct __packed atto_vda_devinfo { | ||
190 | struct atto_dev_addr dev_addr; | ||
191 | u8 vendor_id[8]; | ||
192 | u8 product_id[16]; | ||
193 | u8 revision[4]; | ||
194 | u64 capacity; | ||
195 | u32 block_size; | ||
196 | u8 dev_type; | ||
197 | |||
198 | union { | ||
199 | u8 dev_status; | ||
200 | #define VDADEVSTAT_INVALID 0x00 | ||
201 | #define VDADEVSTAT_CORRUPT VDADEVSTAT_INVALID | ||
202 | #define VDADEVSTAT_ASSIGNED 0x01 | ||
203 | #define VDADEVSTAT_SPARE 0x02 | ||
204 | #define VDADEVSTAT_UNAVAIL 0x03 | ||
205 | #define VDADEVSTAT_PT_MAINT 0x04 | ||
206 | #define VDADEVSTAT_LCLSPARE 0x05 | ||
207 | #define VDADEVSTAT_UNUSEABLE 0x06 | ||
208 | #define VDADEVSTAT_AVAIL 0xFF | ||
209 | |||
210 | u8 op_ctrl; | ||
211 | #define VDA_DEV_OP_CTRL_START 0x01 | ||
212 | #define VDA_DEV_OP_CTRL_HALT 0x02 | ||
213 | #define VDA_DEV_OP_CTRL_RESUME 0x03 | ||
214 | #define VDA_DEV_OP_CTRL_CANCEL 0x04 | ||
215 | }; | ||
216 | |||
217 | u8 member_state; | ||
218 | #define VDAMBRSTATE_ONLINE 0x00 | ||
219 | #define VDAMBRSTATE_DEGRADED 0x01 | ||
220 | #define VDAMBRSTATE_UNAVAIL 0x02 | ||
221 | #define VDAMBRSTATE_FAULTED 0x03 | ||
222 | #define VDAMBRSTATE_MISREAD 0x04 | ||
223 | #define VDAMBRSTATE_INCOMPAT 0x05 | ||
224 | |||
225 | u8 operation; | ||
226 | #define VDAOP_NONE 0x00 | ||
227 | #define VDAOP_REBUILD 0x01 | ||
228 | #define VDAOP_ERASE 0x02 | ||
229 | #define VDAOP_PATTERN 0x03 | ||
230 | #define VDAOP_CONVERSION 0x04 | ||
231 | #define VDAOP_FULL_INIT 0x05 | ||
232 | #define VDAOP_QUICK_INIT 0x06 | ||
233 | #define VDAOP_SECT_SCAN 0x07 | ||
234 | #define VDAOP_SECT_SCAN_PARITY 0x08 | ||
235 | #define VDAOP_SECT_SCAN_PARITY_FIX 0x09 | ||
236 | #define VDAOP_RECOV_REBUILD 0x0A | ||
237 | |||
238 | u8 op_status; | ||
239 | #define VDAOPSTAT_OK 0x00 | ||
240 | #define VDAOPSTAT_FAULTED 0x01 | ||
241 | #define VDAOPSTAT_HALTED 0x02 | ||
242 | #define VDAOPSTAT_INT 0x03 | ||
243 | |||
244 | u8 progress; /* 0 - 100% */ | ||
245 | u16 ses_dev_index; | ||
246 | #define VDASESDI_INVALID 0xFFFF | ||
247 | |||
248 | u8 serial_no[32]; | ||
249 | |||
250 | union { | ||
251 | u16 target_id; | ||
252 | #define VDATGTID_INVALID 0xFFFF | ||
253 | |||
254 | u16 features_mask; | ||
255 | }; | ||
256 | |||
257 | u16 lun; | ||
258 | u16 features; | ||
259 | #define VDADEVFEAT_ENC_SERV 0x0001 | ||
260 | #define VDADEVFEAT_IDENT 0x0002 | ||
261 | #define VDADEVFEAT_DH_SUPP 0x0004 | ||
262 | #define VDADEVFEAT_PHYS_ID 0x0008 | ||
263 | |||
264 | u8 ses_element_id; | ||
265 | u8 link_speed; | ||
266 | #define VDALINKSPEED_UNKNOWN 0x00 | ||
267 | #define VDALINKSPEED_1GB 0x01 | ||
268 | #define VDALINKSPEED_1_5GB 0x02 | ||
269 | #define VDALINKSPEED_2GB 0x03 | ||
270 | #define VDALINKSPEED_3GB 0x04 | ||
271 | #define VDALINKSPEED_4GB 0x05 | ||
272 | #define VDALINKSPEED_6GB 0x06 | ||
273 | #define VDALINKSPEED_8GB 0x07 | ||
274 | |||
275 | u16 phys_target_id; | ||
276 | u8 reserved[2]; | ||
277 | }; | ||
278 | |||
279 | |||
280 | /*! struct atto_vda_devinfo2 is a replacement for atto_vda_devinfo. it | ||
281 | * extends beyond the 0x70 bytes allowed in atto_vda_mgmt_req; therefore, | ||
282 | * the entire structure is DMaed between the firmware and host buffer and | ||
283 | * the data will always be in little endian format. | ||
284 | */ | ||
285 | |||
286 | struct __packed atto_vda_devinfo2 { | ||
287 | struct atto_dev_addr dev_addr; | ||
288 | u8 vendor_id[8]; | ||
289 | u8 product_id[16]; | ||
290 | u8 revision[4]; | ||
291 | u64 capacity; | ||
292 | u32 block_size; | ||
293 | u8 dev_type; | ||
294 | u8 dev_status; | ||
295 | u8 member_state; | ||
296 | u8 operation; | ||
297 | u8 op_status; | ||
298 | u8 progress; | ||
299 | u16 ses_dev_index; | ||
300 | u8 serial_no[32]; | ||
301 | union { | ||
302 | u16 target_id; | ||
303 | u16 features_mask; | ||
304 | }; | ||
305 | |||
306 | u16 lun; | ||
307 | u16 features; | ||
308 | u8 ses_element_id; | ||
309 | u8 link_speed; | ||
310 | u16 phys_target_id; | ||
311 | u8 reserved[2]; | ||
312 | |||
313 | /* This is where fields specific to struct atto_vda_devinfo2 begin. Note | ||
314 | * that the structure version started at one so applications that unionize this | ||
315 | * structure with atto_vda_dev_info can differentiate them if desired. | ||
316 | */ | ||
317 | |||
318 | u8 version; | ||
319 | #define VDADEVINFO_VERSION0 0x00 | ||
320 | #define VDADEVINFO_VERSION1 0x01 | ||
321 | #define VDADEVINFO_VERSION2 0x02 | ||
322 | #define VDADEVINFO_VERSION3 0x03 | ||
323 | #define VDADEVINFO_VERSION VDADEVINFO_VERSION3 | ||
324 | |||
325 | u8 reserved2[3]; | ||
326 | |||
327 | /* sector scanning fields */ | ||
328 | |||
329 | u32 ss_curr_errors; | ||
330 | u64 ss_curr_scanned; | ||
331 | u32 ss_curr_recvrd; | ||
332 | u32 ss_scan_length; | ||
333 | u32 ss_total_errors; | ||
334 | u32 ss_total_recvrd; | ||
335 | u32 ss_num_scans; | ||
336 | |||
337 | /* grp_name was added in version 2 of this structure. */ | ||
338 | |||
339 | char grp_name[15]; | ||
340 | u8 reserved3[4]; | ||
341 | |||
342 | /* dev_addr_list was added in version 3 of this structure. */ | ||
343 | |||
344 | u8 num_dev_addr; | ||
345 | struct atto_dev_addr2 dev_addr_list[8]; | ||
346 | }; | ||
347 | |||
348 | |||
349 | struct __packed atto_vda_grp_info { | ||
350 | u8 grp_index; | ||
351 | #define VDA_MAX_RAID_GROUPS 32 | ||
352 | |||
353 | char grp_name[15]; | ||
354 | u64 capacity; | ||
355 | u32 block_size; | ||
356 | u32 interleave; | ||
357 | u8 type; | ||
358 | #define VDA_GRP_TYPE_RAID0 0 | ||
359 | #define VDA_GRP_TYPE_RAID1 1 | ||
360 | #define VDA_GRP_TYPE_RAID4 4 | ||
361 | #define VDA_GRP_TYPE_RAID5 5 | ||
362 | #define VDA_GRP_TYPE_RAID6 6 | ||
363 | #define VDA_GRP_TYPE_RAID10 10 | ||
364 | #define VDA_GRP_TYPE_RAID40 40 | ||
365 | #define VDA_GRP_TYPE_RAID50 50 | ||
366 | #define VDA_GRP_TYPE_RAID60 60 | ||
367 | #define VDA_GRP_TYPE_DVRAID_HS 252 | ||
368 | #define VDA_GRP_TYPE_DVRAID_NOHS 253 | ||
369 | #define VDA_GRP_TYPE_JBOD 254 | ||
370 | #define VDA_GRP_TYPE_SPARE 255 | ||
371 | |||
372 | union { | ||
373 | u8 status; | ||
374 | #define VDA_GRP_STAT_INVALID 0x00 | ||
375 | #define VDA_GRP_STAT_NEW 0x01 | ||
376 | #define VDA_GRP_STAT_WAITING 0x02 | ||
377 | #define VDA_GRP_STAT_ONLINE 0x03 | ||
378 | #define VDA_GRP_STAT_DEGRADED 0x04 | ||
379 | #define VDA_GRP_STAT_OFFLINE 0x05 | ||
380 | #define VDA_GRP_STAT_DELETED 0x06 | ||
381 | #define VDA_GRP_STAT_RECOV_BASIC 0x07 | ||
382 | #define VDA_GRP_STAT_RECOV_EXTREME 0x08 | ||
383 | |||
384 | u8 op_ctrl; | ||
385 | #define VDA_GRP_OP_CTRL_START 0x01 | ||
386 | #define VDA_GRP_OP_CTRL_HALT 0x02 | ||
387 | #define VDA_GRP_OP_CTRL_RESUME 0x03 | ||
388 | #define VDA_GRP_OP_CTRL_CANCEL 0x04 | ||
389 | }; | ||
390 | |||
391 | u8 rebuild_state; | ||
392 | #define VDA_RBLD_NONE 0x00 | ||
393 | #define VDA_RBLD_REBUILD 0x01 | ||
394 | #define VDA_RBLD_ERASE 0x02 | ||
395 | #define VDA_RBLD_PATTERN 0x03 | ||
396 | #define VDA_RBLD_CONV 0x04 | ||
397 | #define VDA_RBLD_FULL_INIT 0x05 | ||
398 | #define VDA_RBLD_QUICK_INIT 0x06 | ||
399 | #define VDA_RBLD_SECT_SCAN 0x07 | ||
400 | #define VDA_RBLD_SECT_SCAN_PARITY 0x08 | ||
401 | #define VDA_RBLD_SECT_SCAN_PARITY_FIX 0x09 | ||
402 | #define VDA_RBLD_RECOV_REBUILD 0x0A | ||
403 | #define VDA_RBLD_RECOV_BASIC 0x0B | ||
404 | #define VDA_RBLD_RECOV_EXTREME 0x0C | ||
405 | |||
406 | u8 span_depth; | ||
407 | u8 progress; | ||
408 | u8 mirror_width; | ||
409 | u8 stripe_width; | ||
410 | u8 member_cnt; | ||
411 | |||
412 | union { | ||
413 | u16 members[32]; | ||
414 | #define VDA_MEMBER_MISSING 0xFFFF | ||
415 | #define VDA_MEMBER_NEW 0xFFFE | ||
416 | u16 features_mask; | ||
417 | }; | ||
418 | |||
419 | u16 features; | ||
420 | #define VDA_GRP_FEAT_HOTSWAP 0x0001 | ||
421 | #define VDA_GRP_FEAT_SPDRD_MASK 0x0006 | ||
422 | #define VDA_GRP_FEAT_SPDRD_DIS 0x0000 | ||
423 | #define VDA_GRP_FEAT_SPDRD_ENB 0x0002 | ||
424 | #define VDA_GRP_FEAT_SPDRD_AUTO 0x0004 | ||
425 | #define VDA_GRP_FEAT_IDENT 0x0008 | ||
426 | #define VDA_GRP_FEAT_RBLDPRI_MASK 0x0030 | ||
427 | #define VDA_GRP_FEAT_RBLDPRI_LOW 0x0010 | ||
428 | #define VDA_GRP_FEAT_RBLDPRI_SAME 0x0020 | ||
429 | #define VDA_GRP_FEAT_RBLDPRI_HIGH 0x0030 | ||
430 | #define VDA_GRP_FEAT_WRITE_CACHE 0x0040 | ||
431 | #define VDA_GRP_FEAT_RBLD_RESUME 0x0080 | ||
432 | #define VDA_GRP_FEAT_SECT_RESUME 0x0100 | ||
433 | #define VDA_GRP_FEAT_INIT_RESUME 0x0200 | ||
434 | #define VDA_GRP_FEAT_SSD 0x0400 | ||
435 | #define VDA_GRP_FEAT_BOOT_DEV 0x0800 | ||
436 | |||
437 | /* | ||
438 | * for backward compatibility, a prefetch value of zero means the | ||
439 | * setting is ignored/unsupported. therefore, the firmware supported | ||
440 | * 0-6 values are incremented to 1-7. | ||
441 | */ | ||
442 | |||
443 | u8 prefetch; | ||
444 | u8 op_status; | ||
445 | #define VDAGRPOPSTAT_MASK 0x0F | ||
446 | #define VDAGRPOPSTAT_INVALID 0x00 | ||
447 | #define VDAGRPOPSTAT_OK 0x01 | ||
448 | #define VDAGRPOPSTAT_FAULTED 0x02 | ||
449 | #define VDAGRPOPSTAT_HALTED 0x03 | ||
450 | #define VDAGRPOPSTAT_INT 0x04 | ||
451 | #define VDAGRPOPPROC_MASK 0xF0 | ||
452 | #define VDAGRPOPPROC_STARTABLE 0x10 | ||
453 | #define VDAGRPOPPROC_CANCELABLE 0x20 | ||
454 | #define VDAGRPOPPROC_RESUMABLE 0x40 | ||
455 | #define VDAGRPOPPROC_HALTABLE 0x80 | ||
456 | u8 over_provision; | ||
457 | u8 reserved[3]; | ||
458 | |||
459 | }; | ||
460 | |||
461 | |||
462 | struct __packed atto_vdapart_info { | ||
463 | u8 part_no; | ||
464 | #define VDA_MAX_PARTITIONS 128 | ||
465 | |||
466 | char grp_name[15]; | ||
467 | u64 part_size; | ||
468 | u64 start_lba; | ||
469 | u32 block_size; | ||
470 | u16 target_id; | ||
471 | u8 LUN; | ||
472 | char serial_no[41]; | ||
473 | u8 features; | ||
474 | #define VDAPI_FEAT_WRITE_CACHE 0x01 | ||
475 | |||
476 | u8 reserved[7]; | ||
477 | }; | ||
478 | |||
479 | |||
480 | struct __packed atto_vda_dh_info { | ||
481 | u8 req_type; | ||
482 | #define VDADH_RQTYPE_CACHE 0x01 | ||
483 | #define VDADH_RQTYPE_FETCH 0x02 | ||
484 | #define VDADH_RQTYPE_SET_STAT 0x03 | ||
485 | #define VDADH_RQTYPE_GET_STAT 0x04 | ||
486 | |||
487 | u8 req_qual; | ||
488 | #define VDADH_RQQUAL_SMART 0x01 | ||
489 | #define VDADH_RQQUAL_MEDDEF 0x02 | ||
490 | #define VDADH_RQQUAL_INFOEXC 0x04 | ||
491 | |||
492 | u8 num_smart_attribs; | ||
493 | u8 status; | ||
494 | #define VDADH_STAT_DISABLE 0x00 | ||
495 | #define VDADH_STAT_ENABLE 0x01 | ||
496 | |||
497 | u32 med_defect_cnt; | ||
498 | u32 info_exc_cnt; | ||
499 | u8 smart_status; | ||
500 | #define VDADH_SMARTSTAT_OK 0x00 | ||
501 | #define VDADH_SMARTSTAT_ERR 0x01 | ||
502 | |||
503 | u8 reserved[35]; | ||
504 | struct atto_vda_sge sge[1]; | ||
505 | }; | ||
506 | |||
507 | |||
508 | struct __packed atto_vda_dh_smart { | ||
509 | u8 attrib_id; | ||
510 | u8 current_val; | ||
511 | u8 worst; | ||
512 | u8 threshold; | ||
513 | u8 raw_data[6]; | ||
514 | u8 raw_attrib_status; | ||
515 | #define VDADHSM_RAWSTAT_PREFAIL_WARRANTY 0x01 | ||
516 | #define VDADHSM_RAWSTAT_ONLINE_COLLECTION 0x02 | ||
517 | #define VDADHSM_RAWSTAT_PERFORMANCE_ATTR 0x04 | ||
518 | #define VDADHSM_RAWSTAT_ERROR_RATE_ATTR 0x08 | ||
519 | #define VDADHSM_RAWSTAT_EVENT_COUNT_ATTR 0x10 | ||
520 | #define VDADHSM_RAWSTAT_SELF_PRESERVING_ATTR 0x20 | ||
521 | |||
522 | u8 calc_attrib_status; | ||
523 | #define VDADHSM_CALCSTAT_UNKNOWN 0x00 | ||
524 | #define VDADHSM_CALCSTAT_GOOD 0x01 | ||
525 | #define VDADHSM_CALCSTAT_PREFAIL 0x02 | ||
526 | #define VDADHSM_CALCSTAT_OLDAGE 0x03 | ||
527 | |||
528 | u8 reserved[4]; | ||
529 | }; | ||
530 | |||
531 | |||
532 | struct __packed atto_vda_metrics_info { | ||
533 | u8 data_version; | ||
534 | #define VDAMET_VERSION0 0x00 | ||
535 | #define VDAMET_VERSION VDAMET_VERSION0 | ||
536 | |||
537 | u8 metrics_action; | ||
538 | #define VDAMET_METACT_NONE 0x00 | ||
539 | #define VDAMET_METACT_START 0x01 | ||
540 | #define VDAMET_METACT_STOP 0x02 | ||
541 | #define VDAMET_METACT_RETRIEVE 0x03 | ||
542 | #define VDAMET_METACT_CLEAR 0x04 | ||
543 | |||
544 | u8 test_action; | ||
545 | #define VDAMET_TSTACT_NONE 0x00 | ||
546 | #define VDAMET_TSTACT_STRT_INIT 0x01 | ||
547 | #define VDAMET_TSTACT_STRT_READ 0x02 | ||
548 | #define VDAMET_TSTACT_STRT_VERIFY 0x03 | ||
549 | #define VDAMET_TSTACT_STRT_INIT_VERIFY 0x04 | ||
550 | #define VDAMET_TSTACT_STOP 0x05 | ||
551 | |||
552 | u8 num_dev_indexes; | ||
553 | #define VDAMET_ALL_DEVICES 0xFF | ||
554 | |||
555 | u16 dev_indexes[32]; | ||
556 | u8 reserved[12]; | ||
557 | struct atto_vda_sge sge[1]; | ||
558 | }; | ||
559 | |||
560 | |||
561 | struct __packed atto_vda_metrics_data { | ||
562 | u16 dev_index; | ||
563 | u16 length; | ||
564 | #define VDAMD_LEN_LAST 0x8000 | ||
565 | #define VDAMD_LEN_MASK 0x0FFF | ||
566 | |||
567 | u32 flags; | ||
568 | #define VDAMDF_RUN 0x00000007 | ||
569 | #define VDAMDF_RUN_READ 0x00000001 | ||
570 | #define VDAMDF_RUN_WRITE 0x00000002 | ||
571 | #define VDAMDF_RUN_ALL 0x00000004 | ||
572 | #define VDAMDF_READ 0x00000010 | ||
573 | #define VDAMDF_WRITE 0x00000020 | ||
574 | #define VDAMDF_ALL 0x00000040 | ||
575 | #define VDAMDF_DRIVETEST 0x40000000 | ||
576 | #define VDAMDF_NEW 0x80000000 | ||
577 | |||
578 | u64 total_read_data; | ||
579 | u64 total_write_data; | ||
580 | u64 total_read_io; | ||
581 | u64 total_write_io; | ||
582 | u64 read_start_time; | ||
583 | u64 read_stop_time; | ||
584 | u64 write_start_time; | ||
585 | u64 write_stop_time; | ||
586 | u64 read_maxio_time; | ||
587 | u64 wpvdadmetricsdatarite_maxio_time; | ||
588 | u64 read_totalio_time; | ||
589 | u64 write_totalio_time; | ||
590 | u64 read_total_errs; | ||
591 | u64 write_total_errs; | ||
592 | u64 read_recvrd_errs; | ||
593 | u64 write_recvrd_errs; | ||
594 | u64 miscompares; | ||
595 | }; | ||
596 | |||
597 | |||
598 | struct __packed atto_vda_schedule_info { | ||
599 | u8 schedule_type; | ||
600 | #define VDASI_SCHTYPE_ONETIME 0x01 | ||
601 | #define VDASI_SCHTYPE_DAILY 0x02 | ||
602 | #define VDASI_SCHTYPE_WEEKLY 0x03 | ||
603 | |||
604 | u8 operation; | ||
605 | #define VDASI_OP_NONE 0x00 | ||
606 | #define VDASI_OP_CREATE 0x01 | ||
607 | #define VDASI_OP_CANCEL 0x02 | ||
608 | |||
609 | u8 hour; | ||
610 | u8 minute; | ||
611 | u8 day; | ||
612 | #define VDASI_DAY_NONE 0x00 | ||
613 | |||
614 | u8 progress; | ||
615 | #define VDASI_PROG_NONE 0xFF | ||
616 | |||
617 | u8 event_type; | ||
618 | #define VDASI_EVTTYPE_SECT_SCAN 0x01 | ||
619 | #define VDASI_EVTTYPE_SECT_SCAN_PARITY 0x02 | ||
620 | #define VDASI_EVTTYPE_SECT_SCAN_PARITY_FIX 0x03 | ||
621 | |||
622 | u8 recurrences; | ||
623 | #define VDASI_RECUR_FOREVER 0x00 | ||
624 | |||
625 | u32 id; | ||
626 | #define VDASI_ID_NONE 0x00 | ||
627 | |||
628 | char grp_name[15]; | ||
629 | u8 reserved[85]; | ||
630 | }; | ||
631 | |||
632 | |||
633 | struct __packed atto_vda_n_vcache_info { | ||
634 | u8 super_cap_status; | ||
635 | #define VDANVCI_SUPERCAP_NOT_PRESENT 0x00 | ||
636 | #define VDANVCI_SUPERCAP_FULLY_CHARGED 0x01 | ||
637 | #define VDANVCI_SUPERCAP_NOT_CHARGED 0x02 | ||
638 | |||
639 | u8 nvcache_module_status; | ||
640 | #define VDANVCI_NVCACHEMODULE_NOT_PRESENT 0x00 | ||
641 | #define VDANVCI_NVCACHEMODULE_PRESENT 0x01 | ||
642 | |||
643 | u8 protection_mode; | ||
644 | #define VDANVCI_PROTMODE_HI_PROTECT 0x00 | ||
645 | #define VDANVCI_PROTMODE_HI_PERFORM 0x01 | ||
646 | |||
647 | u8 reserved[109]; | ||
648 | }; | ||
649 | |||
650 | |||
651 | struct __packed atto_vda_buzzer_info { | ||
652 | u8 status; | ||
653 | #define VDABUZZI_BUZZER_OFF 0x00 | ||
654 | #define VDABUZZI_BUZZER_ON 0x01 | ||
655 | #define VDABUZZI_BUZZER_LAST 0x02 | ||
656 | |||
657 | u8 reserved[3]; | ||
658 | u32 duration; | ||
659 | #define VDABUZZI_DURATION_INDEFINITE 0xffffffff | ||
660 | |||
661 | u8 reserved2[104]; | ||
662 | }; | ||
663 | |||
664 | |||
665 | struct __packed atto_vda_adapter_info { | ||
666 | u8 version; | ||
667 | #define VDAADAPINFO_VERSION0 0x00 | ||
668 | #define VDAADAPINFO_VERSION VDAADAPINFO_VERSION0 | ||
669 | |||
670 | u8 reserved; | ||
671 | signed short utc_offset; | ||
672 | u32 utc_time; | ||
673 | u32 features; | ||
674 | #define VDA_ADAP_FEAT_IDENT 0x0001 | ||
675 | #define VDA_ADAP_FEAT_BUZZ_ERR 0x0002 | ||
676 | #define VDA_ADAP_FEAT_UTC_TIME 0x0004 | ||
677 | |||
678 | u32 valid_features; | ||
679 | char active_config[33]; | ||
680 | u8 temp_count; | ||
681 | u8 fan_count; | ||
682 | u8 reserved3[61]; | ||
683 | }; | ||
684 | |||
685 | |||
686 | struct __packed atto_vda_temp_info { | ||
687 | u8 temp_index; | ||
688 | u8 max_op_temp; | ||
689 | u8 min_op_temp; | ||
690 | u8 op_temp_warn; | ||
691 | u8 temperature; | ||
692 | u8 type; | ||
693 | #define VDA_TEMP_TYPE_CPU 1 | ||
694 | |||
695 | u8 reserved[106]; | ||
696 | }; | ||
697 | |||
698 | |||
699 | struct __packed atto_vda_fan_info { | ||
700 | u8 fan_index; | ||
701 | u8 status; | ||
702 | #define VDA_FAN_STAT_UNKNOWN 0 | ||
703 | #define VDA_FAN_STAT_NORMAL 1 | ||
704 | #define VDA_FAN_STAT_FAIL 2 | ||
705 | |||
706 | u16 crit_pvdafaninfothreshold; | ||
707 | u16 warn_threshold; | ||
708 | u16 speed; | ||
709 | u8 reserved[104]; | ||
710 | }; | ||
711 | |||
712 | |||
713 | /* VDA management commands */ | ||
714 | |||
715 | #define VDAMGT_DEV_SCAN 0x00 | ||
716 | #define VDAMGT_DEV_INFO 0x01 | ||
717 | #define VDAMGT_DEV_CLEAN 0x02 | ||
718 | #define VDAMGT_DEV_IDENTIFY 0x03 | ||
719 | #define VDAMGT_DEV_IDENTSTOP 0x04 | ||
720 | #define VDAMGT_DEV_PT_INFO 0x05 | ||
721 | #define VDAMGT_DEV_FEATURES 0x06 | ||
722 | #define VDAMGT_DEV_PT_FEATURES 0x07 | ||
723 | #define VDAMGT_DEV_HEALTH_REQ 0x08 | ||
724 | #define VDAMGT_DEV_METRICS 0x09 | ||
725 | #define VDAMGT_DEV_INFO2 0x0A | ||
726 | #define VDAMGT_DEV_OPERATION 0x0B | ||
727 | #define VDAMGT_DEV_INFO2_BYADDR 0x0C | ||
728 | #define VDAMGT_GRP_INFO 0x10 | ||
729 | #define VDAMGT_GRP_CREATE 0x11 | ||
730 | #define VDAMGT_GRP_DELETE 0x12 | ||
731 | #define VDAMGT_ADD_STORAGE 0x13 | ||
732 | #define VDAMGT_MEMBER_ADD 0x14 | ||
733 | #define VDAMGT_GRP_COMMIT 0x15 | ||
734 | #define VDAMGT_GRP_REBUILD 0x16 | ||
735 | #define VDAMGT_GRP_COMMIT_INIT 0x17 | ||
736 | #define VDAMGT_QUICK_RAID 0x18 | ||
737 | #define VDAMGT_GRP_FEATURES 0x19 | ||
738 | #define VDAMGT_GRP_COMMIT_INIT_AUTOMAP 0x1A | ||
739 | #define VDAMGT_QUICK_RAID_INIT_AUTOMAP 0x1B | ||
740 | #define VDAMGT_GRP_OPERATION 0x1C | ||
741 | #define VDAMGT_CFG_SAVE 0x20 | ||
742 | #define VDAMGT_LAST_ERROR 0x21 | ||
743 | #define VDAMGT_ADAP_INFO 0x22 | ||
744 | #define VDAMGT_ADAP_FEATURES 0x23 | ||
745 | #define VDAMGT_TEMP_INFO 0x24 | ||
746 | #define VDAMGT_FAN_INFO 0x25 | ||
747 | #define VDAMGT_PART_INFO 0x30 | ||
748 | #define VDAMGT_PART_MAP 0x31 | ||
749 | #define VDAMGT_PART_UNMAP 0x32 | ||
750 | #define VDAMGT_PART_AUTOMAP 0x33 | ||
751 | #define VDAMGT_PART_SPLIT 0x34 | ||
752 | #define VDAMGT_PART_MERGE 0x35 | ||
753 | #define VDAMGT_SPARE_LIST 0x40 | ||
754 | #define VDAMGT_SPARE_ADD 0x41 | ||
755 | #define VDAMGT_SPARE_REMOVE 0x42 | ||
756 | #define VDAMGT_LOCAL_SPARE_ADD 0x43 | ||
757 | #define VDAMGT_SCHEDULE_EVENT 0x50 | ||
758 | #define VDAMGT_SCHEDULE_INFO 0x51 | ||
759 | #define VDAMGT_NVCACHE_INFO 0x60 | ||
760 | #define VDAMGT_NVCACHE_SET 0x61 | ||
761 | #define VDAMGT_BUZZER_INFO 0x70 | ||
762 | #define VDAMGT_BUZZER_SET 0x71 | ||
763 | |||
764 | |||
765 | struct __packed atto_vda_ae_hdr { | ||
766 | u8 bylength; | ||
767 | u8 byflags; | ||
768 | #define VDAAE_HDRF_EVENT_ACK 0x01 | ||
769 | |||
770 | u8 byversion; | ||
771 | #define VDAAE_HDR_VER_0 0 | ||
772 | |||
773 | u8 bytype; | ||
774 | #define VDAAE_HDR_TYPE_RAID 1 | ||
775 | #define VDAAE_HDR_TYPE_LU 2 | ||
776 | #define VDAAE_HDR_TYPE_DISK 3 | ||
777 | #define VDAAE_HDR_TYPE_RESET 4 | ||
778 | #define VDAAE_HDR_TYPE_LOG_INFO 5 | ||
779 | #define VDAAE_HDR_TYPE_LOG_WARN 6 | ||
780 | #define VDAAE_HDR_TYPE_LOG_CRIT 7 | ||
781 | #define VDAAE_HDR_TYPE_LOG_FAIL 8 | ||
782 | #define VDAAE_HDR_TYPE_NVC 9 | ||
783 | #define VDAAE_HDR_TYPE_TLG_INFO 10 | ||
784 | #define VDAAE_HDR_TYPE_TLG_WARN 11 | ||
785 | #define VDAAE_HDR_TYPE_TLG_CRIT 12 | ||
786 | #define VDAAE_HDR_TYPE_PWRMGT 13 | ||
787 | #define VDAAE_HDR_TYPE_MUTE 14 | ||
788 | #define VDAAE_HDR_TYPE_DEV 15 | ||
789 | }; | ||
790 | |||
791 | |||
792 | struct __packed atto_vda_ae_raid { | ||
793 | struct atto_vda_ae_hdr hdr; | ||
794 | u32 dwflags; | ||
795 | #define VDAAE_GROUP_STATE 0x00000001 | ||
796 | #define VDAAE_RBLD_STATE 0x00000002 | ||
797 | #define VDAAE_RBLD_PROG 0x00000004 | ||
798 | #define VDAAE_MEMBER_CHG 0x00000008 | ||
799 | #define VDAAE_PART_CHG 0x00000010 | ||
800 | #define VDAAE_MEM_STATE_CHG 0x00000020 | ||
801 | |||
802 | u8 bygroup_state; | ||
803 | #define VDAAE_RAID_INVALID 0 | ||
804 | #define VDAAE_RAID_NEW 1 | ||
805 | #define VDAAE_RAID_WAITING 2 | ||
806 | #define VDAAE_RAID_ONLINE 3 | ||
807 | #define VDAAE_RAID_DEGRADED 4 | ||
808 | #define VDAAE_RAID_OFFLINE 5 | ||
809 | #define VDAAE_RAID_DELETED 6 | ||
810 | #define VDAAE_RAID_BASIC 7 | ||
811 | #define VDAAE_RAID_EXTREME 8 | ||
812 | #define VDAAE_RAID_UNKNOWN 9 | ||
813 | |||
814 | u8 byrebuild_state; | ||
815 | #define VDAAE_RBLD_NONE 0 | ||
816 | #define VDAAE_RBLD_REBUILD 1 | ||
817 | #define VDAAE_RBLD_ERASE 2 | ||
818 | #define VDAAE_RBLD_PATTERN 3 | ||
819 | #define VDAAE_RBLD_CONV 4 | ||
820 | #define VDAAE_RBLD_FULL_INIT 5 | ||
821 | #define VDAAE_RBLD_QUICK_INIT 6 | ||
822 | #define VDAAE_RBLD_SECT_SCAN 7 | ||
823 | #define VDAAE_RBLD_SECT_SCAN_PARITY 8 | ||
824 | #define VDAAE_RBLD_SECT_SCAN_PARITY_FIX 9 | ||
825 | #define VDAAE_RBLD_RECOV_REBUILD 10 | ||
826 | #define VDAAE_RBLD_UNKNOWN 11 | ||
827 | |||
828 | u8 byrebuild_progress; | ||
829 | u8 op_status; | ||
830 | #define VDAAE_GRPOPSTAT_MASK 0x0F | ||
831 | #define VDAAE_GRPOPSTAT_INVALID 0x00 | ||
832 | #define VDAAE_GRPOPSTAT_OK 0x01 | ||
833 | #define VDAAE_GRPOPSTAT_FAULTED 0x02 | ||
834 | #define VDAAE_GRPOPSTAT_HALTED 0x03 | ||
835 | #define VDAAE_GRPOPSTAT_INT 0x04 | ||
836 | #define VDAAE_GRPOPPROC_MASK 0xF0 | ||
837 | #define VDAAE_GRPOPPROC_STARTABLE 0x10 | ||
838 | #define VDAAE_GRPOPPROC_CANCELABLE 0x20 | ||
839 | #define VDAAE_GRPOPPROC_RESUMABLE 0x40 | ||
840 | #define VDAAE_GRPOPPROC_HALTABLE 0x80 | ||
841 | char acname[15]; | ||
842 | u8 byreserved; | ||
843 | u8 byreserved2[0x80 - 0x1C]; | ||
844 | }; | ||
845 | |||
846 | |||
847 | struct __packed atto_vda_ae_lu_tgt_lun { | ||
848 | u16 wtarget_id; | ||
849 | u8 bylun; | ||
850 | u8 byreserved; | ||
851 | }; | ||
852 | |||
853 | |||
854 | struct __packed atto_vda_ae_lu_tgt_lun_raid { | ||
855 | u16 wtarget_id; | ||
856 | u8 bylun; | ||
857 | u8 byreserved; | ||
858 | u32 dwinterleave; | ||
859 | u32 dwblock_size; | ||
860 | }; | ||
861 | |||
862 | |||
863 | struct __packed atto_vda_ae_lu { | ||
864 | struct atto_vda_ae_hdr hdr; | ||
865 | u32 dwevent; | ||
866 | #define VDAAE_LU_DISC 0x00000001 | ||
867 | #define VDAAE_LU_LOST 0x00000002 | ||
868 | #define VDAAE_LU_STATE 0x00000004 | ||
869 | #define VDAAE_LU_PASSTHROUGH 0x10000000 | ||
870 | #define VDAAE_LU_PHYS_ID 0x20000000 | ||
871 | |||
872 | u8 bystate; | ||
873 | #define VDAAE_LU_UNDEFINED 0 | ||
874 | #define VDAAE_LU_NOT_PRESENT 1 | ||
875 | #define VDAAE_LU_OFFLINE 2 | ||
876 | #define VDAAE_LU_ONLINE 3 | ||
877 | #define VDAAE_LU_DEGRADED 4 | ||
878 | #define VDAAE_LU_FACTORY_DISABLED 5 | ||
879 | #define VDAAE_LU_DELETED 6 | ||
880 | #define VDAAE_LU_BUSSCAN 7 | ||
881 | #define VDAAE_LU_UNKNOWN 8 | ||
882 | |||
883 | u8 byreserved; | ||
884 | u16 wphys_target_id; | ||
885 | |||
886 | union { | ||
887 | struct atto_vda_ae_lu_tgt_lun tgtlun; | ||
888 | struct atto_vda_ae_lu_tgt_lun_raid tgtlun_raid; | ||
889 | } id; | ||
890 | }; | ||
891 | |||
892 | |||
893 | struct __packed atto_vda_ae_disk { | ||
894 | struct atto_vda_ae_hdr hdr; | ||
895 | }; | ||
896 | |||
897 | |||
898 | #define VDAAE_LOG_STRSZ 64 | ||
899 | |||
900 | struct __packed atto_vda_ae_log { | ||
901 | struct atto_vda_ae_hdr hdr; | ||
902 | char aclog_ascii[VDAAE_LOG_STRSZ]; | ||
903 | }; | ||
904 | |||
905 | |||
906 | #define VDAAE_TLG_STRSZ 56 | ||
907 | |||
908 | struct __packed atto_vda_ae_timestamp_log { | ||
909 | struct atto_vda_ae_hdr hdr; | ||
910 | u32 dwtimestamp; | ||
911 | char aclog_ascii[VDAAE_TLG_STRSZ]; | ||
912 | }; | ||
913 | |||
914 | |||
915 | struct __packed atto_vda_ae_nvc { | ||
916 | struct atto_vda_ae_hdr hdr; | ||
917 | }; | ||
918 | |||
919 | |||
920 | struct __packed atto_vda_ae_dev { | ||
921 | struct atto_vda_ae_hdr hdr; | ||
922 | struct atto_dev_addr devaddr; | ||
923 | }; | ||
924 | |||
925 | |||
926 | union atto_vda_ae { | ||
927 | struct atto_vda_ae_hdr hdr; | ||
928 | struct atto_vda_ae_disk disk; | ||
929 | struct atto_vda_ae_lu lu; | ||
930 | struct atto_vda_ae_raid raid; | ||
931 | struct atto_vda_ae_log log; | ||
932 | struct atto_vda_ae_timestamp_log tslog; | ||
933 | struct atto_vda_ae_nvc nvcache; | ||
934 | struct atto_vda_ae_dev dev; | ||
935 | }; | ||
936 | |||
937 | |||
938 | struct __packed atto_vda_date_and_time { | ||
939 | u8 flags; | ||
940 | #define VDA_DT_DAY_MASK 0x07 | ||
941 | #define VDA_DT_DAY_NONE 0x00 | ||
942 | #define VDA_DT_DAY_SUN 0x01 | ||
943 | #define VDA_DT_DAY_MON 0x02 | ||
944 | #define VDA_DT_DAY_TUE 0x03 | ||
945 | #define VDA_DT_DAY_WED 0x04 | ||
946 | #define VDA_DT_DAY_THU 0x05 | ||
947 | #define VDA_DT_DAY_FRI 0x06 | ||
948 | #define VDA_DT_DAY_SAT 0x07 | ||
949 | #define VDA_DT_PM 0x40 | ||
950 | #define VDA_DT_MILITARY 0x80 | ||
951 | |||
952 | u8 seconds; | ||
953 | u8 minutes; | ||
954 | u8 hours; | ||
955 | u8 day; | ||
956 | u8 month; | ||
957 | u16 year; | ||
958 | }; | ||
959 | |||
960 | #define SGE_LEN_LIMIT 0x003FFFFF /*! mask of segment length */ | ||
961 | #define SGE_LEN_MAX 0x003FF000 /*! maximum segment length */ | ||
962 | #define SGE_LAST 0x01000000 /*! last entry */ | ||
963 | #define SGE_ADDR_64 0x04000000 /*! 64-bit addressing flag */ | ||
964 | #define SGE_CHAIN 0x80000000 /*! chain descriptor flag */ | ||
965 | #define SGE_CHAIN_LEN 0x0000FFFF /*! mask of length in chain entries */ | ||
966 | #define SGE_CHAIN_SZ 0x00FF0000 /*! mask of size of chained buffer */ | ||
967 | |||
968 | |||
969 | struct __packed atto_vda_cfg_init { | ||
970 | struct atto_vda_date_and_time date_time; | ||
971 | u32 sgl_page_size; | ||
972 | u32 vda_version; | ||
973 | u32 fw_version; | ||
974 | u32 fw_build; | ||
975 | u32 fw_release; | ||
976 | u32 epoch_time; | ||
977 | u32 ioctl_tunnel; | ||
978 | #define VDA_ITF_MEM_RW 0x00000001 | ||
979 | #define VDA_ITF_TRACE 0x00000002 | ||
980 | #define VDA_ITF_SCSI_PASS_THRU 0x00000004 | ||
981 | #define VDA_ITF_GET_DEV_ADDR 0x00000008 | ||
982 | #define VDA_ITF_PHY_CTRL 0x00000010 | ||
983 | #define VDA_ITF_CONN_CTRL 0x00000020 | ||
984 | #define VDA_ITF_GET_DEV_INFO 0x00000040 | ||
985 | |||
986 | u32 num_targets_backend; | ||
987 | u8 reserved[0x48]; | ||
988 | }; | ||
989 | |||
990 | |||
991 | /* configuration commands */ | ||
992 | |||
993 | #define VDA_CFG_INIT 0x00 | ||
994 | #define VDA_CFG_GET_INIT 0x01 | ||
995 | #define VDA_CFG_GET_INIT2 0x02 | ||
996 | |||
997 | |||
998 | /*! physical region descriptor (PRD) aka scatter/gather entry */ | ||
999 | |||
1000 | struct __packed atto_physical_region_description { | ||
1001 | u64 address; | ||
1002 | u32 ctl_len; | ||
1003 | #define PRD_LEN_LIMIT 0x003FFFFF | ||
1004 | #define PRD_LEN_MAX 0x003FF000 | ||
1005 | #define PRD_NXT_PRD_CNT 0x0000007F | ||
1006 | #define PRD_CHAIN 0x01000000 | ||
1007 | #define PRD_DATA 0x00000000 | ||
1008 | #define PRD_INT_SEL 0xF0000000 | ||
1009 | #define PRD_INT_SEL_F0 0x00000000 | ||
1010 | #define PRD_INT_SEL_F1 0x40000000 | ||
1011 | #define PRD_INT_SEL_F2 0x80000000 | ||
1012 | #define PRD_INT_SEL_F3 0xc0000000 | ||
1013 | #define PRD_INT_SEL_SRAM 0x10000000 | ||
1014 | #define PRD_INT_SEL_PBSR 0x20000000 | ||
1015 | |||
1016 | }; | ||
1017 | |||
1018 | /* Request types. NOTE that ALL requests have the same layout for the first | ||
1019 | * few bytes. | ||
1020 | */ | ||
1021 | struct __packed atto_vda_req_header { | ||
1022 | u32 length; | ||
1023 | u8 function; | ||
1024 | u8 variable1; | ||
1025 | u8 chain_offset; | ||
1026 | u8 sg_list_offset; | ||
1027 | u32 handle; | ||
1028 | }; | ||
1029 | |||
1030 | |||
1031 | #define FCP_CDB_SIZE 16 | ||
1032 | |||
1033 | struct __packed atto_vda_scsi_req { | ||
1034 | u32 length; | ||
1035 | u8 function; /* VDA_FUNC_SCSI */ | ||
1036 | u8 sense_len; | ||
1037 | u8 chain_offset; | ||
1038 | u8 sg_list_offset; | ||
1039 | u32 handle; | ||
1040 | u32 flags; | ||
1041 | #define FCP_CMND_LUN_MASK 0x000000FF | ||
1042 | #define FCP_CMND_TA_MASK 0x00000700 | ||
1043 | #define FCP_CMND_TA_SIMPL_Q 0x00000000 | ||
1044 | #define FCP_CMND_TA_HEAD_Q 0x00000100 | ||
1045 | #define FCP_CMND_TA_ORDRD_Q 0x00000200 | ||
1046 | #define FCP_CMND_TA_ACA 0x00000400 | ||
1047 | #define FCP_CMND_PRI_MASK 0x00007800 | ||
1048 | #define FCP_CMND_TM_MASK 0x00FF0000 | ||
1049 | #define FCP_CMND_ATS 0x00020000 | ||
1050 | #define FCP_CMND_CTS 0x00040000 | ||
1051 | #define FCP_CMND_LRS 0x00100000 | ||
1052 | #define FCP_CMND_TRS 0x00200000 | ||
1053 | #define FCP_CMND_CLA 0x00400000 | ||
1054 | #define FCP_CMND_TRM 0x00800000 | ||
1055 | #define FCP_CMND_DATA_DIR 0x03000000 | ||
1056 | #define FCP_CMND_WRD 0x01000000 | ||
1057 | #define FCP_CMND_RDD 0x02000000 | ||
1058 | |||
1059 | u8 cdb[FCP_CDB_SIZE]; | ||
1060 | union { | ||
1061 | struct __packed { | ||
1062 | u64 ppsense_buf; | ||
1063 | u16 target_id; | ||
1064 | u8 iblk_cnt_prd; | ||
1065 | u8 reserved; | ||
1066 | }; | ||
1067 | |||
1068 | struct atto_physical_region_description sense_buff_prd; | ||
1069 | }; | ||
1070 | |||
1071 | union { | ||
1072 | struct atto_vda_sge sge[1]; | ||
1073 | |||
1074 | u32 abort_handle; | ||
1075 | u32 dwords[245]; | ||
1076 | struct atto_physical_region_description prd[1]; | ||
1077 | } u; | ||
1078 | }; | ||
1079 | |||
1080 | |||
1081 | struct __packed atto_vda_flash_req { | ||
1082 | u32 length; | ||
1083 | u8 function; /* VDA_FUNC_FLASH */ | ||
1084 | u8 sub_func; | ||
1085 | u8 chain_offset; | ||
1086 | u8 sg_list_offset; | ||
1087 | u32 handle; | ||
1088 | u32 flash_addr; | ||
1089 | u8 checksum; | ||
1090 | u8 rsvd[3]; | ||
1091 | |||
1092 | union { | ||
1093 | struct { | ||
1094 | char file_name[16]; /* 8.3 fname, NULL term, wc=* */ | ||
1095 | struct atto_vda_sge sge[1]; | ||
1096 | } file; | ||
1097 | |||
1098 | struct atto_vda_sge sge[1]; | ||
1099 | struct atto_physical_region_description prde[2]; | ||
1100 | } data; | ||
1101 | }; | ||
1102 | |||
1103 | |||
1104 | struct __packed atto_vda_diag_req { | ||
1105 | u32 length; | ||
1106 | u8 function; /* VDA_FUNC_DIAG */ | ||
1107 | u8 sub_func; | ||
1108 | #define VDA_DIAG_STATUS 0x00 | ||
1109 | #define VDA_DIAG_RESET 0x01 | ||
1110 | #define VDA_DIAG_PAUSE 0x02 | ||
1111 | #define VDA_DIAG_RESUME 0x03 | ||
1112 | #define VDA_DIAG_READ 0x04 | ||
1113 | #define VDA_DIAG_WRITE 0x05 | ||
1114 | |||
1115 | u8 chain_offset; | ||
1116 | u8 sg_list_offset; | ||
1117 | u32 handle; | ||
1118 | u32 rsvd; | ||
1119 | u64 local_addr; | ||
1120 | struct atto_vda_sge sge[1]; | ||
1121 | }; | ||
1122 | |||
1123 | |||
1124 | struct __packed atto_vda_ae_req { | ||
1125 | u32 length; | ||
1126 | u8 function; /* VDA_FUNC_AE */ | ||
1127 | u8 reserved1; | ||
1128 | u8 chain_offset; | ||
1129 | u8 sg_list_offset; | ||
1130 | u32 handle; | ||
1131 | |||
1132 | union { | ||
1133 | struct atto_vda_sge sge[1]; | ||
1134 | struct atto_physical_region_description prde[1]; | ||
1135 | }; | ||
1136 | }; | ||
1137 | |||
1138 | |||
1139 | struct __packed atto_vda_cli_req { | ||
1140 | u32 length; | ||
1141 | u8 function; /* VDA_FUNC_CLI */ | ||
1142 | u8 reserved1; | ||
1143 | u8 chain_offset; | ||
1144 | u8 sg_list_offset; | ||
1145 | u32 handle; | ||
1146 | u32 cmd_rsp_len; | ||
1147 | struct atto_vda_sge sge[1]; | ||
1148 | }; | ||
1149 | |||
1150 | |||
1151 | struct __packed atto_vda_ioctl_req { | ||
1152 | u32 length; | ||
1153 | u8 function; /* VDA_FUNC_IOCTL */ | ||
1154 | u8 sub_func; | ||
1155 | u8 chain_offset; | ||
1156 | u8 sg_list_offset; | ||
1157 | u32 handle; | ||
1158 | |||
1159 | union { | ||
1160 | struct atto_vda_sge reserved_sge; | ||
1161 | struct atto_physical_region_description reserved_prde; | ||
1162 | }; | ||
1163 | |||
1164 | union { | ||
1165 | struct { | ||
1166 | u32 ctrl_code; | ||
1167 | u16 target_id; | ||
1168 | u8 lun; | ||
1169 | u8 reserved; | ||
1170 | } csmi; | ||
1171 | }; | ||
1172 | |||
1173 | union { | ||
1174 | struct atto_vda_sge sge[1]; | ||
1175 | struct atto_physical_region_description prde[1]; | ||
1176 | }; | ||
1177 | }; | ||
1178 | |||
1179 | |||
1180 | struct __packed atto_vda_cfg_req { | ||
1181 | u32 length; | ||
1182 | u8 function; /* VDA_FUNC_CFG */ | ||
1183 | u8 sub_func; | ||
1184 | u8 rsvd1; | ||
1185 | u8 sg_list_offset; | ||
1186 | u32 handle; | ||
1187 | |||
1188 | union { | ||
1189 | u8 bytes[116]; | ||
1190 | struct atto_vda_cfg_init init; | ||
1191 | struct atto_vda_sge sge; | ||
1192 | struct atto_physical_region_description prde; | ||
1193 | } data; | ||
1194 | }; | ||
1195 | |||
1196 | |||
1197 | struct __packed atto_vda_mgmt_req { | ||
1198 | u32 length; | ||
1199 | u8 function; /* VDA_FUNC_MGT */ | ||
1200 | u8 mgt_func; | ||
1201 | u8 chain_offset; | ||
1202 | u8 sg_list_offset; | ||
1203 | u32 handle; | ||
1204 | u8 scan_generation; | ||
1205 | u8 payld_sglst_offset; | ||
1206 | u16 dev_index; | ||
1207 | u32 payld_length; | ||
1208 | u32 pad; | ||
1209 | union { | ||
1210 | struct atto_vda_sge sge[2]; | ||
1211 | struct atto_physical_region_description prde[2]; | ||
1212 | }; | ||
1213 | struct atto_vda_sge payld_sge[1]; | ||
1214 | }; | ||
1215 | |||
1216 | |||
1217 | union atto_vda_req { | ||
1218 | struct atto_vda_scsi_req scsi; | ||
1219 | struct atto_vda_flash_req flash; | ||
1220 | struct atto_vda_diag_req diag; | ||
1221 | struct atto_vda_ae_req ae; | ||
1222 | struct atto_vda_cli_req cli; | ||
1223 | struct atto_vda_ioctl_req ioctl; | ||
1224 | struct atto_vda_cfg_req cfg; | ||
1225 | struct atto_vda_mgmt_req mgt; | ||
1226 | u8 bytes[1024]; | ||
1227 | }; | ||
1228 | |||
1229 | /* Outbound response structures */ | ||
1230 | |||
1231 | struct __packed atto_vda_scsi_rsp { | ||
1232 | u8 scsi_stat; | ||
1233 | u8 sense_len; | ||
1234 | u8 rsvd[2]; | ||
1235 | u32 residual_length; | ||
1236 | }; | ||
1237 | |||
1238 | struct __packed atto_vda_flash_rsp { | ||
1239 | u32 file_size; | ||
1240 | }; | ||
1241 | |||
1242 | struct __packed atto_vda_ae_rsp { | ||
1243 | u32 length; | ||
1244 | }; | ||
1245 | |||
1246 | struct __packed atto_vda_cli_rsp { | ||
1247 | u32 cmd_rsp_len; | ||
1248 | }; | ||
1249 | |||
1250 | struct __packed atto_vda_ioctl_rsp { | ||
1251 | union { | ||
1252 | struct { | ||
1253 | u32 csmi_status; | ||
1254 | u16 target_id; | ||
1255 | u8 lun; | ||
1256 | u8 reserved; | ||
1257 | } csmi; | ||
1258 | }; | ||
1259 | }; | ||
1260 | |||
1261 | struct __packed atto_vda_cfg_rsp { | ||
1262 | u16 vda_version; | ||
1263 | u16 fw_release; | ||
1264 | u32 fw_build; | ||
1265 | }; | ||
1266 | |||
1267 | struct __packed atto_vda_mgmt_rsp { | ||
1268 | u32 length; | ||
1269 | u16 dev_index; | ||
1270 | u8 scan_generation; | ||
1271 | }; | ||
1272 | |||
1273 | union atto_vda_func_rsp { | ||
1274 | struct atto_vda_scsi_rsp scsi_rsp; | ||
1275 | struct atto_vda_flash_rsp flash_rsp; | ||
1276 | struct atto_vda_ae_rsp ae_rsp; | ||
1277 | struct atto_vda_cli_rsp cli_rsp; | ||
1278 | struct atto_vda_ioctl_rsp ioctl_rsp; | ||
1279 | struct atto_vda_cfg_rsp cfg_rsp; | ||
1280 | struct atto_vda_mgmt_rsp mgt_rsp; | ||
1281 | u32 dwords[2]; | ||
1282 | }; | ||
1283 | |||
1284 | struct __packed atto_vda_ob_rsp { | ||
1285 | u32 handle; | ||
1286 | u8 req_stat; | ||
1287 | u8 rsvd[3]; | ||
1288 | |||
1289 | union atto_vda_func_rsp | ||
1290 | func_rsp; | ||
1291 | }; | ||
1292 | |||
1293 | struct __packed atto_vda_ae_data { | ||
1294 | u8 event_data[256]; | ||
1295 | }; | ||
1296 | |||
1297 | struct __packed atto_vda_mgmt_data { | ||
1298 | union { | ||
1299 | u8 bytes[112]; | ||
1300 | struct atto_vda_devinfo dev_info; | ||
1301 | struct atto_vda_grp_info grp_info; | ||
1302 | struct atto_vdapart_info part_info; | ||
1303 | struct atto_vda_dh_info dev_health_info; | ||
1304 | struct atto_vda_metrics_info metrics_info; | ||
1305 | struct atto_vda_schedule_info sched_info; | ||
1306 | struct atto_vda_n_vcache_info nvcache_info; | ||
1307 | struct atto_vda_buzzer_info buzzer_info; | ||
1308 | } data; | ||
1309 | }; | ||
1310 | |||
1311 | union atto_vda_rsp_data { | ||
1312 | struct atto_vda_ae_data ae_data; | ||
1313 | struct atto_vda_mgmt_data mgt_data; | ||
1314 | u8 sense_data[252]; | ||
1315 | #define SENSE_DATA_SZ 252; | ||
1316 | u8 bytes[256]; | ||
1317 | }; | ||
1318 | |||
1319 | #endif | ||