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