cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

atvda.h (35306B)


      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
     48struct __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
     61struct __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
     70struct __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
    189struct __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
    286struct __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
    349struct __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
    462struct __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
    480struct __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
    508struct __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
    532struct __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
    561struct __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
    598struct __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
    633struct __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
    651struct __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
    665struct  __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
    686struct __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
    699struct __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
    765struct __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
    792struct  __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
    847struct __packed atto_vda_ae_lu_tgt_lun {
    848	u16 wtarget_id;
    849	u8 bylun;
    850	u8 byreserved;
    851};
    852
    853
    854struct __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
    863struct __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
    893struct __packed atto_vda_ae_disk {
    894	struct atto_vda_ae_hdr hdr;
    895};
    896
    897
    898#define VDAAE_LOG_STRSZ 64
    899
    900struct __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
    908struct __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
    915struct __packed atto_vda_ae_nvc {
    916	struct atto_vda_ae_hdr hdr;
    917};
    918
    919
    920struct __packed atto_vda_ae_dev {
    921	struct atto_vda_ae_hdr hdr;
    922	struct atto_dev_addr devaddr;
    923};
    924
    925
    926union 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
    938struct __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
    969struct __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
   1000struct __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 */
   1021struct __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
   1033struct __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
   1081struct __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
   1104struct __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
   1124struct __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
   1139struct __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
   1151struct __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
   1180struct __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
   1197struct __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
   1217union 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
   1231struct __packed atto_vda_scsi_rsp {
   1232	u8 scsi_stat;
   1233	u8 sense_len;
   1234	u8 rsvd[2];
   1235	u32 residual_length;
   1236};
   1237
   1238struct __packed atto_vda_flash_rsp {
   1239	u32 file_size;
   1240};
   1241
   1242struct __packed atto_vda_ae_rsp {
   1243	u32 length;
   1244};
   1245
   1246struct __packed atto_vda_cli_rsp {
   1247	u32 cmd_rsp_len;
   1248};
   1249
   1250struct __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
   1261struct __packed atto_vda_cfg_rsp {
   1262	u16 vda_version;
   1263	u16 fw_release;
   1264	u32 fw_build;
   1265};
   1266
   1267struct __packed atto_vda_mgmt_rsp {
   1268	u32 length;
   1269	u16 dev_index;
   1270	u8 scan_generation;
   1271};
   1272
   1273union 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
   1284struct __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
   1293struct __packed atto_vda_ae_data {
   1294	u8 event_data[256];
   1295};
   1296
   1297struct __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
   1311union 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