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