xref: /linux/drivers/scsi/esas2r/atvda.h (revision 3d0fe49454652117522f60bfbefb978ba0e5300b)
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
1320