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 { |
1022 | u32 ; |
1023 | u8 ; |
1024 | u8 ; |
1025 | u8 ; |
1026 | u8 ; |
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 |
1320 | |