root/drivers/scsi/esas2r/atvda.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


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

/* [<][>][^][v][top][bottom][index][help] */