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