Linux Audio

Check our new training course

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