linux/drivers/scsi/myrs.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0
   2 *
   3 * Linux Driver for Mylex DAC960/AcceleRAID/eXtremeRAID PCI RAID Controllers
   4 *
   5 * This driver supports the newer, SCSI-based firmware interface only.
   6 *
   7 * Copyright 2018 Hannes Reinecke, SUSE Linux GmbH <hare@suse.com>
   8 *
   9 * Based on the original DAC960 driver, which has
  10 * Copyright 1998-2001 by Leonard N. Zubkoff <lnz@dandelion.com>
  11 * Portions Copyright 2002 by Mylex (An IBM Business Unit)
  12 */
  13
  14#ifndef _MYRS_H
  15#define _MYRS_H
  16
  17#define MYRS_MAILBOX_TIMEOUT 1000000
  18
  19#define MYRS_DCMD_TAG 1
  20#define MYRS_MCMD_TAG 2
  21
  22#define MYRS_LINE_BUFFER_SIZE 128
  23
  24#define MYRS_PRIMARY_MONITOR_INTERVAL (10 * HZ)
  25#define MYRS_SECONDARY_MONITOR_INTERVAL (60 * HZ)
  26
  27/* Maximum number of Scatter/Gather Segments supported */
  28#define MYRS_SG_LIMIT           128
  29
  30/*
  31 * Number of Command and Status Mailboxes used by the
  32 * DAC960 V2 Firmware Memory Mailbox Interface.
  33 */
  34#define MYRS_MAX_CMD_MBOX               512
  35#define MYRS_MAX_STAT_MBOX              512
  36
  37#define MYRS_DCDB_SIZE                  16
  38#define MYRS_SENSE_SIZE                 14
  39
  40/*
  41 * DAC960 V2 Firmware Command Opcodes.
  42 */
  43enum myrs_cmd_opcode {
  44        MYRS_CMD_OP_MEMCOPY             = 0x01,
  45        MYRS_CMD_OP_SCSI_10_PASSTHRU    = 0x02,
  46        MYRS_CMD_OP_SCSI_255_PASSTHRU   = 0x03,
  47        MYRS_CMD_OP_SCSI_10             = 0x04,
  48        MYRS_CMD_OP_SCSI_256            = 0x05,
  49        MYRS_CMD_OP_IOCTL               = 0x20,
  50} __packed;
  51
  52/*
  53 * DAC960 V2 Firmware IOCTL Opcodes.
  54 */
  55enum myrs_ioctl_opcode {
  56        MYRS_IOCTL_GET_CTLR_INFO        = 0x01,
  57        MYRS_IOCTL_GET_LDEV_INFO_VALID  = 0x03,
  58        MYRS_IOCTL_GET_PDEV_INFO_VALID  = 0x05,
  59        MYRS_IOCTL_GET_HEALTH_STATUS    = 0x11,
  60        MYRS_IOCTL_GET_EVENT            = 0x15,
  61        MYRS_IOCTL_START_DISCOVERY      = 0x81,
  62        MYRS_IOCTL_SET_DEVICE_STATE     = 0x82,
  63        MYRS_IOCTL_INIT_PDEV_START      = 0x84,
  64        MYRS_IOCTL_INIT_PDEV_STOP       = 0x85,
  65        MYRS_IOCTL_INIT_LDEV_START      = 0x86,
  66        MYRS_IOCTL_INIT_LDEV_STOP       = 0x87,
  67        MYRS_IOCTL_RBLD_DEVICE_START    = 0x88,
  68        MYRS_IOCTL_RBLD_DEVICE_STOP     = 0x89,
  69        MYRS_IOCTL_MAKE_CONSISTENT_START = 0x8A,
  70        MYRS_IOCTL_MAKE_CONSISTENT_STOP = 0x8B,
  71        MYRS_IOCTL_CC_START             = 0x8C,
  72        MYRS_IOCTL_CC_STOP              = 0x8D,
  73        MYRS_IOCTL_SET_MEM_MBOX         = 0x8E,
  74        MYRS_IOCTL_RESET_DEVICE         = 0x90,
  75        MYRS_IOCTL_FLUSH_DEVICE_DATA    = 0x91,
  76        MYRS_IOCTL_PAUSE_DEVICE         = 0x92,
  77        MYRS_IOCTL_UNPAUS_EDEVICE       = 0x93,
  78        MYRS_IOCTL_LOCATE_DEVICE        = 0x94,
  79        MYRS_IOCTL_CREATE_CONFIGURATION = 0xC0,
  80        MYRS_IOCTL_DELETE_LDEV          = 0xC1,
  81        MYRS_IOCTL_REPLACE_INTERNALDEVICE = 0xC2,
  82        MYRS_IOCTL_RENAME_LDEV          = 0xC3,
  83        MYRS_IOCTL_ADD_CONFIGURATION    = 0xC4,
  84        MYRS_IOCTL_XLATE_PDEV_TO_LDEV   = 0xC5,
  85        MYRS_IOCTL_CLEAR_CONFIGURATION  = 0xCA,
  86} __packed;
  87
  88/*
  89 * DAC960 V2 Firmware Command Status Codes.
  90 */
  91#define MYRS_STATUS_SUCCESS                     0x00
  92#define MYRS_STATUS_FAILED                      0x02
  93#define MYRS_STATUS_DEVICE_BUSY                 0x08
  94#define MYRS_STATUS_DEVICE_NON_RESPONSIVE       0x0E
  95#define MYRS_STATUS_DEVICE_NON_RESPONSIVE2      0x0F
  96#define MYRS_STATUS_RESERVATION_CONFLICT        0x18
  97
  98/*
  99 * DAC960 V2 Firmware Memory Type structure.
 100 */
 101struct myrs_mem_type {
 102        enum {
 103                MYRS_MEMTYPE_RESERVED   = 0x00,
 104                MYRS_MEMTYPE_DRAM       = 0x01,
 105                MYRS_MEMTYPE_EDRAM      = 0x02,
 106                MYRS_MEMTYPE_EDO        = 0x03,
 107                MYRS_MEMTYPE_SDRAM      = 0x04,
 108                MYRS_MEMTYPE_LAST       = 0x1F,
 109        } __packed mem_type:5;  /* Byte 0 Bits 0-4 */
 110        unsigned rsvd:1;                        /* Byte 0 Bit 5 */
 111        unsigned mem_parity:1;                  /* Byte 0 Bit 6 */
 112        unsigned mem_ecc:1;                     /* Byte 0 Bit 7 */
 113};
 114
 115/*
 116 * DAC960 V2 Firmware Processor Type structure.
 117 */
 118enum myrs_cpu_type {
 119        MYRS_CPUTYPE_i960CA     = 0x01,
 120        MYRS_CPUTYPE_i960RD     = 0x02,
 121        MYRS_CPUTYPE_i960RN     = 0x03,
 122        MYRS_CPUTYPE_i960RP     = 0x04,
 123        MYRS_CPUTYPE_NorthBay   = 0x05,
 124        MYRS_CPUTYPE_StrongArm  = 0x06,
 125        MYRS_CPUTYPE_i960RM     = 0x07,
 126} __packed;
 127
 128/*
 129 * DAC960 V2 Firmware Get Controller Info reply structure.
 130 */
 131struct myrs_ctlr_info {
 132        unsigned char rsvd1;                            /* Byte 0 */
 133        enum {
 134                MYRS_SCSI_BUS   = 0x00,
 135                MYRS_Fibre_BUS  = 0x01,
 136                MYRS_PCI_BUS    = 0x03
 137        } __packed bus; /* Byte 1 */
 138        enum {
 139                MYRS_CTLR_DAC960E       = 0x01,
 140                MYRS_CTLR_DAC960M       = 0x08,
 141                MYRS_CTLR_DAC960PD      = 0x10,
 142                MYRS_CTLR_DAC960PL      = 0x11,
 143                MYRS_CTLR_DAC960PU      = 0x12,
 144                MYRS_CTLR_DAC960PE      = 0x13,
 145                MYRS_CTLR_DAC960PG      = 0x14,
 146                MYRS_CTLR_DAC960PJ      = 0x15,
 147                MYRS_CTLR_DAC960PTL0    = 0x16,
 148                MYRS_CTLR_DAC960PR      = 0x17,
 149                MYRS_CTLR_DAC960PRL     = 0x18,
 150                MYRS_CTLR_DAC960PT      = 0x19,
 151                MYRS_CTLR_DAC1164P      = 0x1A,
 152                MYRS_CTLR_DAC960PTL1    = 0x1B,
 153                MYRS_CTLR_EXR2000P      = 0x1C,
 154                MYRS_CTLR_EXR3000P      = 0x1D,
 155                MYRS_CTLR_ACCELERAID352 = 0x1E,
 156                MYRS_CTLR_ACCELERAID170 = 0x1F,
 157                MYRS_CTLR_ACCELERAID160 = 0x20,
 158                MYRS_CTLR_DAC960S       = 0x60,
 159                MYRS_CTLR_DAC960SU      = 0x61,
 160                MYRS_CTLR_DAC960SX      = 0x62,
 161                MYRS_CTLR_DAC960SF      = 0x63,
 162                MYRS_CTLR_DAC960SS      = 0x64,
 163                MYRS_CTLR_DAC960FL      = 0x65,
 164                MYRS_CTLR_DAC960LL      = 0x66,
 165                MYRS_CTLR_DAC960FF      = 0x67,
 166                MYRS_CTLR_DAC960HP      = 0x68,
 167                MYRS_CTLR_RAIDBRICK     = 0x69,
 168                MYRS_CTLR_METEOR_FL     = 0x6A,
 169                MYRS_CTLR_METEOR_FF     = 0x6B
 170        } __packed ctlr_type;   /* Byte 2 */
 171        unsigned char rsvd2;                    /* Byte 3 */
 172        unsigned short bus_speed_mhz;           /* Bytes 4-5 */
 173        unsigned char bus_width;                /* Byte 6 */
 174        unsigned char flash_code;               /* Byte 7 */
 175        unsigned char ports_present;            /* Byte 8 */
 176        unsigned char rsvd3[7];                 /* Bytes 9-15 */
 177        unsigned char bus_name[16];             /* Bytes 16-31 */
 178        unsigned char ctlr_name[16];            /* Bytes 32-47 */
 179        unsigned char rsvd4[16];                /* Bytes 48-63 */
 180        /* Firmware Release Information */
 181        unsigned char fw_major_version;         /* Byte 64 */
 182        unsigned char fw_minor_version;         /* Byte 65 */
 183        unsigned char fw_turn_number;           /* Byte 66 */
 184        unsigned char fw_build_number;          /* Byte 67 */
 185        unsigned char fw_release_day;           /* Byte 68 */
 186        unsigned char fw_release_month;         /* Byte 69 */
 187        unsigned char fw_release_year_hi;       /* Byte 70 */
 188        unsigned char fw_release_year_lo;       /* Byte 71 */
 189        /* Hardware Release Information */
 190        unsigned char hw_rev;                   /* Byte 72 */
 191        unsigned char rsvd5[3];                 /* Bytes 73-75 */
 192        unsigned char hw_release_day;           /* Byte 76 */
 193        unsigned char hw_release_month;         /* Byte 77 */
 194        unsigned char hw_release_year_hi;       /* Byte 78 */
 195        unsigned char hw_release_year_lo;       /* Byte 79 */
 196        /* Hardware Manufacturing Information */
 197        unsigned char manuf_batch_num;          /* Byte 80 */
 198        unsigned char rsvd6;                    /* Byte 81 */
 199        unsigned char manuf_plant_num;          /* Byte 82 */
 200        unsigned char rsvd7;                    /* Byte 83 */
 201        unsigned char hw_manuf_day;             /* Byte 84 */
 202        unsigned char hw_manuf_month;           /* Byte 85 */
 203        unsigned char hw_manuf_year_hi;         /* Byte 86 */
 204        unsigned char hw_manuf_year_lo;         /* Byte 87 */
 205        unsigned char max_pd_per_xld;           /* Byte 88 */
 206        unsigned char max_ild_per_xld;          /* Byte 89 */
 207        unsigned short nvram_size_kb;           /* Bytes 90-91 */
 208        unsigned char max_xld;                  /* Byte 92 */
 209        unsigned char rsvd8[3];                 /* Bytes 93-95 */
 210        /* Unique Information per Controller */
 211        unsigned char serial_number[16];        /* Bytes 96-111 */
 212        unsigned char rsvd9[16];                /* Bytes 112-127 */
 213        /* Vendor Information */
 214        unsigned char rsvd10[3];                /* Bytes 128-130 */
 215        unsigned char oem_code;                 /* Byte 131 */
 216        unsigned char vendor[16];               /* Bytes 132-147 */
 217        /* Other Physical/Controller/Operation Information */
 218        unsigned char bbu_present:1;            /* Byte 148 Bit 0 */
 219        unsigned char cluster_mode:1;           /* Byte 148 Bit 1 */
 220        unsigned char rsvd11:6;                 /* Byte 148 Bits 2-7 */
 221        unsigned char rsvd12[3];                /* Bytes 149-151 */
 222        /* Physical Device Scan Information */
 223        unsigned char pscan_active:1;           /* Byte 152 Bit 0 */
 224        unsigned char rsvd13:7;                 /* Byte 152 Bits 1-7 */
 225        unsigned char pscan_chan;               /* Byte 153 */
 226        unsigned char pscan_target;             /* Byte 154 */
 227        unsigned char pscan_lun;                /* Byte 155 */
 228        /* Maximum Command Data Transfer Sizes */
 229        unsigned short max_transfer_size;       /* Bytes 156-157 */
 230        unsigned short max_sge;                 /* Bytes 158-159 */
 231        /* Logical/Physical Device Counts */
 232        unsigned short ldev_present;            /* Bytes 160-161 */
 233        unsigned short ldev_critical;           /* Bytes 162-163 */
 234        unsigned short ldev_offline;            /* Bytes 164-165 */
 235        unsigned short pdev_present;            /* Bytes 166-167 */
 236        unsigned short pdisk_present;           /* Bytes 168-169 */
 237        unsigned short pdisk_critical;          /* Bytes 170-171 */
 238        unsigned short pdisk_offline;           /* Bytes 172-173 */
 239        unsigned short max_tcq;                 /* Bytes 174-175 */
 240        /* Channel and Target ID Information */
 241        unsigned char physchan_present;         /* Byte 176 */
 242        unsigned char virtchan_present;         /* Byte 177 */
 243        unsigned char physchan_max;             /* Byte 178 */
 244        unsigned char virtchan_max;             /* Byte 179 */
 245        unsigned char max_targets[16];          /* Bytes 180-195 */
 246        unsigned char rsvd14[12];               /* Bytes 196-207 */
 247        /* Memory/Cache Information */
 248        unsigned short mem_size_mb;             /* Bytes 208-209 */
 249        unsigned short cache_size_mb;           /* Bytes 210-211 */
 250        unsigned int valid_cache_bytes;         /* Bytes 212-215 */
 251        unsigned int dirty_cache_bytes;         /* Bytes 216-219 */
 252        unsigned short mem_speed_mhz;           /* Bytes 220-221 */
 253        unsigned char mem_data_width;           /* Byte 222 */
 254        struct myrs_mem_type mem_type;          /* Byte 223 */
 255        unsigned char cache_mem_type_name[16];  /* Bytes 224-239 */
 256        /* Execution Memory Information */
 257        unsigned short exec_mem_size_mb;        /* Bytes 240-241 */
 258        unsigned short exec_l2_cache_size_mb;   /* Bytes 242-243 */
 259        unsigned char rsvd15[8];                /* Bytes 244-251 */
 260        unsigned short exec_mem_speed_mhz;      /* Bytes 252-253 */
 261        unsigned char exec_mem_data_width;      /* Byte 254 */
 262        struct myrs_mem_type exec_mem_type;     /* Byte 255 */
 263        unsigned char exec_mem_type_name[16];   /* Bytes 256-271 */
 264        /* CPU Type Information */
 265        struct {                                /* Bytes 272-335 */
 266                unsigned short cpu_speed_mhz;
 267                enum myrs_cpu_type cpu_type;
 268                unsigned char cpu_count;
 269                unsigned char rsvd16[12];
 270                unsigned char cpu_name[16];
 271        } __packed cpu[2];
 272        /* Debugging/Profiling/Command Time Tracing Information */
 273        unsigned short cur_prof_page_num;       /* Bytes 336-337 */
 274        unsigned short num_prof_waiters;        /* Bytes 338-339 */
 275        unsigned short cur_trace_page_num;      /* Bytes 340-341 */
 276        unsigned short num_trace_waiters;       /* Bytes 342-343 */
 277        unsigned char rsvd18[8];                /* Bytes 344-351 */
 278        /* Error Counters on Physical Devices */
 279        unsigned short pdev_bus_resets;         /* Bytes 352-353 */
 280        unsigned short pdev_parity_errors;      /* Bytes 355-355 */
 281        unsigned short pdev_soft_errors;        /* Bytes 356-357 */
 282        unsigned short pdev_cmds_failed;        /* Bytes 358-359 */
 283        unsigned short pdev_misc_errors;        /* Bytes 360-361 */
 284        unsigned short pdev_cmd_timeouts;       /* Bytes 362-363 */
 285        unsigned short pdev_sel_timeouts;       /* Bytes 364-365 */
 286        unsigned short pdev_retries_done;       /* Bytes 366-367 */
 287        unsigned short pdev_aborts_done;        /* Bytes 368-369 */
 288        unsigned short pdev_host_aborts_done;   /* Bytes 370-371 */
 289        unsigned short pdev_predicted_failures; /* Bytes 372-373 */
 290        unsigned short pdev_host_cmds_failed;   /* Bytes 374-375 */
 291        unsigned short pdev_hard_errors;        /* Bytes 376-377 */
 292        unsigned char rsvd19[6];                /* Bytes 378-383 */
 293        /* Error Counters on Logical Devices */
 294        unsigned short ldev_soft_errors;        /* Bytes 384-385 */
 295        unsigned short ldev_cmds_failed;        /* Bytes 386-387 */
 296        unsigned short ldev_host_aborts_done;   /* Bytes 388-389 */
 297        unsigned char rsvd20[2];                /* Bytes 390-391 */
 298        /* Error Counters on Controller */
 299        unsigned short ctlr_mem_errors;         /* Bytes 392-393 */
 300        unsigned short ctlr_host_aborts_done;   /* Bytes 394-395 */
 301        unsigned char rsvd21[4];                /* Bytes 396-399 */
 302        /* Long Duration Activity Information */
 303        unsigned short bg_init_active;          /* Bytes 400-401 */
 304        unsigned short ldev_init_active;        /* Bytes 402-403 */
 305        unsigned short pdev_init_active;        /* Bytes 404-405 */
 306        unsigned short cc_active;               /* Bytes 406-407 */
 307        unsigned short rbld_active;             /* Bytes 408-409 */
 308        unsigned short exp_active;              /* Bytes 410-411 */
 309        unsigned short patrol_active;           /* Bytes 412-413 */
 310        unsigned char rsvd22[2];                /* Bytes 414-415 */
 311        /* Flash ROM Information */
 312        unsigned char flash_type;               /* Byte 416 */
 313        unsigned char rsvd23;                   /* Byte 417 */
 314        unsigned short flash_size_MB;           /* Bytes 418-419 */
 315        unsigned int flash_limit;               /* Bytes 420-423 */
 316        unsigned int flash_count;               /* Bytes 424-427 */
 317        unsigned char rsvd24[4];                /* Bytes 428-431 */
 318        unsigned char flash_type_name[16];      /* Bytes 432-447 */
 319        /* Firmware Run Time Information */
 320        unsigned char rbld_rate;                /* Byte 448 */
 321        unsigned char bg_init_rate;             /* Byte 449 */
 322        unsigned char fg_init_rate;             /* Byte 450 */
 323        unsigned char cc_rate;                  /* Byte 451 */
 324        unsigned char rsvd25[4];                /* Bytes 452-455 */
 325        unsigned int max_dp;                    /* Bytes 456-459 */
 326        unsigned int free_dp;                   /* Bytes 460-463 */
 327        unsigned int max_iop;                   /* Bytes 464-467 */
 328        unsigned int free_iop;                  /* Bytes 468-471 */
 329        unsigned short max_combined_len;        /* Bytes 472-473 */
 330        unsigned short num_cfg_groups;          /* Bytes 474-475 */
 331        unsigned installation_abort_status:1;   /* Byte 476 Bit 0 */
 332        unsigned maint_mode_status:1;           /* Byte 476 Bit 1 */
 333        unsigned rsvd26:6;                      /* Byte 476 Bits 2-7 */
 334        unsigned char rsvd27[6];                /* Bytes 477-511 */
 335        unsigned char rsvd28[512];              /* Bytes 512-1023 */
 336};
 337
 338/*
 339 * DAC960 V2 Firmware Device State type.
 340 */
 341enum myrs_devstate {
 342        MYRS_DEVICE_UNCONFIGURED        = 0x00,
 343        MYRS_DEVICE_ONLINE              = 0x01,
 344        MYRS_DEVICE_REBUILD             = 0x03,
 345        MYRS_DEVICE_MISSING             = 0x04,
 346        MYRS_DEVICE_SUSPECTED_CRITICAL  = 0x05,
 347        MYRS_DEVICE_OFFLINE             = 0x08,
 348        MYRS_DEVICE_CRITICAL            = 0x09,
 349        MYRS_DEVICE_SUSPECTED_DEAD      = 0x0C,
 350        MYRS_DEVICE_COMMANDED_OFFLINE   = 0x10,
 351        MYRS_DEVICE_STANDBY             = 0x21,
 352        MYRS_DEVICE_INVALID_STATE       = 0xFF,
 353} __packed;
 354
 355/*
 356 * DAC960 V2 RAID Levels
 357 */
 358enum myrs_raid_level {
 359        MYRS_RAID_LEVEL0        = 0x0,     /* RAID 0 */
 360        MYRS_RAID_LEVEL1        = 0x1,     /* RAID 1 */
 361        MYRS_RAID_LEVEL3        = 0x3,     /* RAID 3 right asymmetric parity */
 362        MYRS_RAID_LEVEL5        = 0x5,     /* RAID 5 right asymmetric parity */
 363        MYRS_RAID_LEVEL6        = 0x6,     /* RAID 6 (Mylex RAID 6) */
 364        MYRS_RAID_JBOD          = 0x7,     /* RAID 7 (JBOD) */
 365        MYRS_RAID_NEWSPAN       = 0x8,     /* New Mylex SPAN */
 366        MYRS_RAID_LEVEL3F       = 0x9,     /* RAID 3 fixed parity */
 367        MYRS_RAID_LEVEL3L       = 0xb,     /* RAID 3 left symmetric parity */
 368        MYRS_RAID_SPAN          = 0xc,     /* current spanning implementation */
 369        MYRS_RAID_LEVEL5L       = 0xd,     /* RAID 5 left symmetric parity */
 370        MYRS_RAID_LEVELE        = 0xe,     /* RAID E (concatenation) */
 371        MYRS_RAID_PHYSICAL      = 0xf,     /* physical device */
 372} __packed;
 373
 374enum myrs_stripe_size {
 375        MYRS_STRIPE_SIZE_0      = 0x0,  /* no stripe (RAID 1, RAID 7, etc) */
 376        MYRS_STRIPE_SIZE_512B   = 0x1,
 377        MYRS_STRIPE_SIZE_1K     = 0x2,
 378        MYRS_STRIPE_SIZE_2K     = 0x3,
 379        MYRS_STRIPE_SIZE_4K     = 0x4,
 380        MYRS_STRIPE_SIZE_8K     = 0x5,
 381        MYRS_STRIPE_SIZE_16K    = 0x6,
 382        MYRS_STRIPE_SIZE_32K    = 0x7,
 383        MYRS_STRIPE_SIZE_64K    = 0x8,
 384        MYRS_STRIPE_SIZE_128K   = 0x9,
 385        MYRS_STRIPE_SIZE_256K   = 0xa,
 386        MYRS_STRIPE_SIZE_512K   = 0xb,
 387        MYRS_STRIPE_SIZE_1M     = 0xc,
 388} __packed;
 389
 390enum myrs_cacheline_size {
 391        MYRS_CACHELINE_ZERO     = 0x0,  /* caching cannot be enabled */
 392        MYRS_CACHELINE_512B     = 0x1,
 393        MYRS_CACHELINE_1K       = 0x2,
 394        MYRS_CACHELINE_2K       = 0x3,
 395        MYRS_CACHELINE_4K       = 0x4,
 396        MYRS_CACHELINE_8K       = 0x5,
 397        MYRS_CACHELINE_16K      = 0x6,
 398        MYRS_CACHELINE_32K      = 0x7,
 399        MYRS_CACHELINE_64K      = 0x8,
 400} __packed;
 401
 402/*
 403 * DAC960 V2 Firmware Get Logical Device Info reply structure.
 404 */
 405struct myrs_ldev_info {
 406        unsigned char ctlr;                     /* Byte 0 */
 407        unsigned char channel;                  /* Byte 1 */
 408        unsigned char target;                   /* Byte 2 */
 409        unsigned char lun;                      /* Byte 3 */
 410        enum myrs_devstate dev_state;           /* Byte 4 */
 411        unsigned char raid_level;               /* Byte 5 */
 412        enum myrs_stripe_size stripe_size;      /* Byte 6 */
 413        enum myrs_cacheline_size cacheline_size; /* Byte 7 */
 414        struct {
 415                enum {
 416                        MYRS_READCACHE_DISABLED         = 0x0,
 417                        MYRS_READCACHE_ENABLED          = 0x1,
 418                        MYRS_READAHEAD_ENABLED          = 0x2,
 419                        MYRS_INTELLIGENT_READAHEAD_ENABLED = 0x3,
 420                        MYRS_READCACHE_LAST             = 0x7,
 421                } __packed rce:3; /* Byte 8 Bits 0-2 */
 422                enum {
 423                        MYRS_WRITECACHE_DISABLED        = 0x0,
 424                        MYRS_LOGICALDEVICE_RO           = 0x1,
 425                        MYRS_WRITECACHE_ENABLED         = 0x2,
 426                        MYRS_INTELLIGENT_WRITECACHE_ENABLED = 0x3,
 427                        MYRS_WRITECACHE_LAST            = 0x7,
 428                } __packed wce:3; /* Byte 8 Bits 3-5 */
 429                unsigned rsvd1:1;               /* Byte 8 Bit 6 */
 430                unsigned ldev_init_done:1;      /* Byte 8 Bit 7 */
 431        } ldev_control;                         /* Byte 8 */
 432        /* Logical Device Operations Status */
 433        unsigned char cc_active:1;              /* Byte 9 Bit 0 */
 434        unsigned char rbld_active:1;            /* Byte 9 Bit 1 */
 435        unsigned char bg_init_active:1;         /* Byte 9 Bit 2 */
 436        unsigned char fg_init_active:1;         /* Byte 9 Bit 3 */
 437        unsigned char migration_active:1;       /* Byte 9 Bit 4 */
 438        unsigned char patrol_active:1;          /* Byte 9 Bit 5 */
 439        unsigned char rsvd2:2;                  /* Byte 9 Bits 6-7 */
 440        unsigned char raid5_writeupdate;        /* Byte 10 */
 441        unsigned char raid5_algo;               /* Byte 11 */
 442        unsigned short ldev_num;                /* Bytes 12-13 */
 443        /* BIOS Info */
 444        unsigned char bios_disabled:1;          /* Byte 14 Bit 0 */
 445        unsigned char cdrom_boot:1;             /* Byte 14 Bit 1 */
 446        unsigned char drv_coercion:1;           /* Byte 14 Bit 2 */
 447        unsigned char write_same_disabled:1;    /* Byte 14 Bit 3 */
 448        unsigned char hba_mode:1;               /* Byte 14 Bit 4 */
 449        enum {
 450                MYRS_GEOMETRY_128_32    = 0x0,
 451                MYRS_GEOMETRY_255_63    = 0x1,
 452                MYRS_GEOMETRY_RSVD1     = 0x2,
 453                MYRS_GEOMETRY_RSVD2     = 0x3
 454        } __packed drv_geom:2;  /* Byte 14 Bits 5-6 */
 455        unsigned char super_ra_enabled:1;       /* Byte 14 Bit 7 */
 456        unsigned char rsvd3;                    /* Byte 15 */
 457        /* Error Counters */
 458        unsigned short soft_errs;               /* Bytes 16-17 */
 459        unsigned short cmds_failed;             /* Bytes 18-19 */
 460        unsigned short cmds_aborted;            /* Bytes 20-21 */
 461        unsigned short deferred_write_errs;     /* Bytes 22-23 */
 462        unsigned int rsvd4;                     /* Bytes 24-27 */
 463        unsigned int rsvd5;                     /* Bytes 28-31 */
 464        /* Device Size Information */
 465        unsigned short rsvd6;                   /* Bytes 32-33 */
 466        unsigned short devsize_bytes;           /* Bytes 34-35 */
 467        unsigned int orig_devsize;              /* Bytes 36-39 */
 468        unsigned int cfg_devsize;               /* Bytes 40-43 */
 469        unsigned int rsvd7;                     /* Bytes 44-47 */
 470        unsigned char ldev_name[32];            /* Bytes 48-79 */
 471        unsigned char inquiry[36];              /* Bytes 80-115 */
 472        unsigned char rsvd8[12];                /* Bytes 116-127 */
 473        u64 last_read_lba;                      /* Bytes 128-135 */
 474        u64 last_write_lba;                     /* Bytes 136-143 */
 475        u64 cc_lba;                             /* Bytes 144-151 */
 476        u64 rbld_lba;                           /* Bytes 152-159 */
 477        u64 bg_init_lba;                        /* Bytes 160-167 */
 478        u64 fg_init_lba;                        /* Bytes 168-175 */
 479        u64 migration_lba;                      /* Bytes 176-183 */
 480        u64 patrol_lba;                         /* Bytes 184-191 */
 481        unsigned char rsvd9[64];                /* Bytes 192-255 */
 482};
 483
 484/*
 485 * DAC960 V2 Firmware Get Physical Device Info reply structure.
 486 */
 487struct myrs_pdev_info {
 488        unsigned char rsvd1;                    /* Byte 0 */
 489        unsigned char channel;                  /* Byte 1 */
 490        unsigned char target;                   /* Byte 2 */
 491        unsigned char lun;                      /* Byte 3 */
 492        /* Configuration Status Bits */
 493        unsigned char pdev_fault_tolerant:1;    /* Byte 4 Bit 0 */
 494        unsigned char pdev_connected:1;         /* Byte 4 Bit 1 */
 495        unsigned char pdev_local_to_ctlr:1;     /* Byte 4 Bit 2 */
 496        unsigned char rsvd2:5;                  /* Byte 4 Bits 3-7 */
 497        /* Multiple Host/Controller Status Bits */
 498        unsigned char remote_host_dead:1;       /* Byte 5 Bit 0 */
 499        unsigned char remove_ctlr_dead:1;       /* Byte 5 Bit 1 */
 500        unsigned char rsvd3:6;                  /* Byte 5 Bits 2-7 */
 501        enum myrs_devstate dev_state;           /* Byte 6 */
 502        unsigned char nego_data_width;          /* Byte 7 */
 503        unsigned short nego_sync_rate;          /* Bytes 8-9 */
 504        /* Multiported Physical Device Information */
 505        unsigned char num_ports;                /* Byte 10 */
 506        unsigned char drv_access_bitmap;        /* Byte 11 */
 507        unsigned int rsvd4;                     /* Bytes 12-15 */
 508        unsigned char ip_address[16];           /* Bytes 16-31 */
 509        unsigned short max_tags;                /* Bytes 32-33 */
 510        /* Physical Device Operations Status */
 511        unsigned char cc_in_progress:1;         /* Byte 34 Bit 0 */
 512        unsigned char rbld_in_progress:1;       /* Byte 34 Bit 1 */
 513        unsigned char makecc_in_progress:1;     /* Byte 34 Bit 2 */
 514        unsigned char pdevinit_in_progress:1;   /* Byte 34 Bit 3 */
 515        unsigned char migration_in_progress:1;  /* Byte 34 Bit 4 */
 516        unsigned char patrol_in_progress:1;     /* Byte 34 Bit 5 */
 517        unsigned char rsvd5:2;                  /* Byte 34 Bits 6-7 */
 518        unsigned char long_op_status;           /* Byte 35 */
 519        unsigned char parity_errs;              /* Byte 36 */
 520        unsigned char soft_errs;                /* Byte 37 */
 521        unsigned char hard_errs;                /* Byte 38 */
 522        unsigned char misc_errs;                /* Byte 39 */
 523        unsigned char cmd_timeouts;             /* Byte 40 */
 524        unsigned char retries;                  /* Byte 41 */
 525        unsigned char aborts;                   /* Byte 42 */
 526        unsigned char pred_failures;            /* Byte 43 */
 527        unsigned int rsvd6;                     /* Bytes 44-47 */
 528        unsigned short rsvd7;                   /* Bytes 48-49 */
 529        unsigned short devsize_bytes;           /* Bytes 50-51 */
 530        unsigned int orig_devsize;              /* Bytes 52-55 */
 531        unsigned int cfg_devsize;               /* Bytes 56-59 */
 532        unsigned int rsvd8;                     /* Bytes 60-63 */
 533        unsigned char pdev_name[16];            /* Bytes 64-79 */
 534        unsigned char rsvd9[16];                /* Bytes 80-95 */
 535        unsigned char rsvd10[32];               /* Bytes 96-127 */
 536        unsigned char inquiry[36];              /* Bytes 128-163 */
 537        unsigned char rsvd11[20];               /* Bytes 164-183 */
 538        unsigned char rsvd12[8];                /* Bytes 184-191 */
 539        u64 last_read_lba;                      /* Bytes 192-199 */
 540        u64 last_write_lba;                     /* Bytes 200-207 */
 541        u64 cc_lba;                             /* Bytes 208-215 */
 542        u64 rbld_lba;                           /* Bytes 216-223 */
 543        u64 makecc_lba;                         /* Bytes 224-231 */
 544        u64 devinit_lba;                        /* Bytes 232-239 */
 545        u64 migration_lba;                      /* Bytes 240-247 */
 546        u64 patrol_lba;                         /* Bytes 248-255 */
 547        unsigned char rsvd13[256];              /* Bytes 256-511 */
 548};
 549
 550/*
 551 * DAC960 V2 Firmware Health Status Buffer structure.
 552 */
 553struct myrs_fwstat {
 554        unsigned int uptime_usecs;              /* Bytes 0-3 */
 555        unsigned int uptime_msecs;              /* Bytes 4-7 */
 556        unsigned int seconds;                   /* Bytes 8-11 */
 557        unsigned char rsvd1[4];                 /* Bytes 12-15 */
 558        unsigned int epoch;                     /* Bytes 16-19 */
 559        unsigned char rsvd2[4];                 /* Bytes 20-23 */
 560        unsigned int dbg_msgbuf_idx;            /* Bytes 24-27 */
 561        unsigned int coded_msgbuf_idx;          /* Bytes 28-31 */
 562        unsigned int cur_timetrace_page;        /* Bytes 32-35 */
 563        unsigned int cur_prof_page;             /* Bytes 36-39 */
 564        unsigned int next_evseq;                /* Bytes 40-43 */
 565        unsigned char rsvd3[4];                 /* Bytes 44-47 */
 566        unsigned char rsvd4[16];                /* Bytes 48-63 */
 567        unsigned char rsvd5[64];                /* Bytes 64-127 */
 568};
 569
 570/*
 571 * DAC960 V2 Firmware Get Event reply structure.
 572 */
 573struct myrs_event {
 574        unsigned int ev_seq;                    /* Bytes 0-3 */
 575        unsigned int ev_time;                   /* Bytes 4-7 */
 576        unsigned int ev_code;                   /* Bytes 8-11 */
 577        unsigned char rsvd1;                    /* Byte 12 */
 578        unsigned char channel;                  /* Byte 13 */
 579        unsigned char target;                   /* Byte 14 */
 580        unsigned char lun;                      /* Byte 15 */
 581        unsigned int rsvd2;                     /* Bytes 16-19 */
 582        unsigned int ev_parm;                   /* Bytes 20-23 */
 583        unsigned char sense_data[40];           /* Bytes 24-63 */
 584};
 585
 586/*
 587 * DAC960 V2 Firmware Command Control Bits structure.
 588 */
 589struct myrs_cmd_ctrl {
 590        unsigned char fua:1;                    /* Byte 0 Bit 0 */
 591        unsigned char disable_pgout:1;          /* Byte 0 Bit 1 */
 592        unsigned char rsvd1:1;                  /* Byte 0 Bit 2 */
 593        unsigned char add_sge_mem:1;            /* Byte 0 Bit 3 */
 594        unsigned char dma_ctrl_to_host:1;       /* Byte 0 Bit 4 */
 595        unsigned char rsvd2:1;                  /* Byte 0 Bit 5 */
 596        unsigned char no_autosense:1;           /* Byte 0 Bit 6 */
 597        unsigned char disc_prohibited:1;        /* Byte 0 Bit 7 */
 598};
 599
 600/*
 601 * DAC960 V2 Firmware Command Timeout structure.
 602 */
 603struct myrs_cmd_tmo {
 604        unsigned char tmo_val:6;                        /* Byte 0 Bits 0-5 */
 605        enum {
 606                MYRS_TMO_SCALE_SECONDS  = 0,
 607                MYRS_TMO_SCALE_MINUTES  = 1,
 608                MYRS_TMO_SCALE_HOURS    = 2,
 609                MYRS_TMO_SCALE_RESERVED = 3
 610        } __packed tmo_scale:2;         /* Byte 0 Bits 6-7 */
 611};
 612
 613/*
 614 * DAC960 V2 Firmware Physical Device structure.
 615 */
 616struct myrs_pdev {
 617        unsigned char lun;                      /* Byte 0 */
 618        unsigned char target;                   /* Byte 1 */
 619        unsigned char channel:3;                /* Byte 2 Bits 0-2 */
 620        unsigned char ctlr:5;                   /* Byte 2 Bits 3-7 */
 621} __packed;
 622
 623/*
 624 * DAC960 V2 Firmware Logical Device structure.
 625 */
 626struct myrs_ldev {
 627        unsigned short ldev_num;                /* Bytes 0-1 */
 628        unsigned char rsvd:3;                   /* Byte 2 Bits 0-2 */
 629        unsigned char ctlr:5;                   /* Byte 2 Bits 3-7 */
 630} __packed;
 631
 632/*
 633 * DAC960 V2 Firmware Operation Device type.
 634 */
 635enum myrs_opdev {
 636        MYRS_PHYSICAL_DEVICE    = 0x00,
 637        MYRS_RAID_DEVICE        = 0x01,
 638        MYRS_PHYSICAL_CHANNEL   = 0x02,
 639        MYRS_RAID_CHANNEL       = 0x03,
 640        MYRS_PHYSICAL_CONTROLLER = 0x04,
 641        MYRS_RAID_CONTROLLER    = 0x05,
 642        MYRS_CONFIGURATION_GROUP = 0x10,
 643        MYRS_ENCLOSURE          = 0x11,
 644} __packed;
 645
 646/*
 647 * DAC960 V2 Firmware Translate Physical To Logical Device structure.
 648 */
 649struct myrs_devmap {
 650        unsigned short ldev_num;                /* Bytes 0-1 */
 651        unsigned short rsvd;                    /* Bytes 2-3 */
 652        unsigned char prev_boot_ctlr;           /* Byte 4 */
 653        unsigned char prev_boot_channel;        /* Byte 5 */
 654        unsigned char prev_boot_target;         /* Byte 6 */
 655        unsigned char prev_boot_lun;            /* Byte 7 */
 656};
 657
 658/*
 659 * DAC960 V2 Firmware Scatter/Gather List Entry structure.
 660 */
 661struct myrs_sge {
 662        u64 sge_addr;                   /* Bytes 0-7 */
 663        u64 sge_count;                  /* Bytes 8-15 */
 664};
 665
 666/*
 667 * DAC960 V2 Firmware Data Transfer Memory Address structure.
 668 */
 669union myrs_sgl {
 670        struct myrs_sge sge[2]; /* Bytes 0-31 */
 671        struct {
 672                unsigned short sge0_len;        /* Bytes 0-1 */
 673                unsigned short sge1_len;        /* Bytes 2-3 */
 674                unsigned short sge2_len;        /* Bytes 4-5 */
 675                unsigned short rsvd;            /* Bytes 6-7 */
 676                u64 sge0_addr;                  /* Bytes 8-15 */
 677                u64 sge1_addr;                  /* Bytes 16-23 */
 678                u64 sge2_addr;                  /* Bytes 24-31 */
 679        } ext;
 680};
 681
 682/*
 683 * 64 Byte DAC960 V2 Firmware Command Mailbox structure.
 684 */
 685union myrs_cmd_mbox {
 686        unsigned int words[16];                         /* Words 0-15 */
 687        struct {
 688                unsigned short id;                      /* Bytes 0-1 */
 689                enum myrs_cmd_opcode opcode;            /* Byte 2 */
 690                struct myrs_cmd_ctrl control;           /* Byte 3 */
 691                u32 dma_size:24;                        /* Bytes 4-6 */
 692                unsigned char dma_num;                  /* Byte 7 */
 693                u64 sense_addr;                         /* Bytes 8-15 */
 694                unsigned int rsvd1:24;                  /* Bytes 16-18 */
 695                struct myrs_cmd_tmo tmo;                /* Byte 19 */
 696                unsigned char sense_len;                /* Byte 20 */
 697                enum myrs_ioctl_opcode ioctl_opcode;    /* Byte 21 */
 698                unsigned char rsvd2[10];                /* Bytes 22-31 */
 699                union myrs_sgl dma_addr;                /* Bytes 32-63 */
 700        } common;
 701        struct {
 702                unsigned short id;                      /* Bytes 0-1 */
 703                enum myrs_cmd_opcode opcode;            /* Byte 2 */
 704                struct myrs_cmd_ctrl control;           /* Byte 3 */
 705                u32 dma_size;                           /* Bytes 4-7 */
 706                u64 sense_addr;                         /* Bytes 8-15 */
 707                struct myrs_pdev pdev;                  /* Bytes 16-18 */
 708                struct myrs_cmd_tmo tmo;                /* Byte 19 */
 709                unsigned char sense_len;                /* Byte 20 */
 710                unsigned char cdb_len;                  /* Byte 21 */
 711                unsigned char cdb[10];                  /* Bytes 22-31 */
 712                union myrs_sgl dma_addr;                /* Bytes 32-63 */
 713        } SCSI_10;
 714        struct {
 715                unsigned short id;                      /* Bytes 0-1 */
 716                enum myrs_cmd_opcode opcode;            /* Byte 2 */
 717                struct myrs_cmd_ctrl control;           /* Byte 3 */
 718                u32 dma_size;                           /* Bytes 4-7 */
 719                u64 sense_addr;                         /* Bytes 8-15 */
 720                struct myrs_pdev pdev;                  /* Bytes 16-18 */
 721                struct myrs_cmd_tmo tmo;                /* Byte 19 */
 722                unsigned char sense_len;                /* Byte 20 */
 723                unsigned char cdb_len;                  /* Byte 21 */
 724                unsigned short rsvd;                    /* Bytes 22-23 */
 725                u64 cdb_addr;                           /* Bytes 24-31 */
 726                union myrs_sgl dma_addr;                /* Bytes 32-63 */
 727        } SCSI_255;
 728        struct {
 729                unsigned short id;                      /* Bytes 0-1 */
 730                enum myrs_cmd_opcode opcode;            /* Byte 2 */
 731                struct myrs_cmd_ctrl control;           /* Byte 3 */
 732                u32 dma_size:24;                        /* Bytes 4-6 */
 733                unsigned char dma_num;                  /* Byte 7 */
 734                u64 sense_addr;                         /* Bytes 8-15 */
 735                unsigned short rsvd1;                   /* Bytes 16-17 */
 736                unsigned char ctlr_num;                 /* Byte 18 */
 737                struct myrs_cmd_tmo tmo;                /* Byte 19 */
 738                unsigned char sense_len;                /* Byte 20 */
 739                enum myrs_ioctl_opcode ioctl_opcode;    /* Byte 21 */
 740                unsigned char rsvd2[10];                /* Bytes 22-31 */
 741                union myrs_sgl dma_addr;                /* Bytes 32-63 */
 742        } ctlr_info;
 743        struct {
 744                unsigned short id;                      /* Bytes 0-1 */
 745                enum myrs_cmd_opcode opcode;            /* Byte 2 */
 746                struct myrs_cmd_ctrl control;           /* Byte 3 */
 747                u32 dma_size:24;                        /* Bytes 4-6 */
 748                unsigned char dma_num;                  /* Byte 7 */
 749                u64 sense_addr;                         /* Bytes 8-15 */
 750                struct myrs_ldev ldev;                  /* Bytes 16-18 */
 751                struct myrs_cmd_tmo tmo;                /* Byte 19 */
 752                unsigned char sense_len;                /* Byte 20 */
 753                enum myrs_ioctl_opcode ioctl_opcode;    /* Byte 21 */
 754                unsigned char rsvd[10];                 /* Bytes 22-31 */
 755                union myrs_sgl dma_addr;                /* Bytes 32-63 */
 756        } ldev_info;
 757        struct {
 758                unsigned short id;                      /* Bytes 0-1 */
 759                enum myrs_cmd_opcode opcode;            /* Byte 2 */
 760                struct myrs_cmd_ctrl control;           /* Byte 3 */
 761                u32 dma_size:24;                        /* Bytes 4-6 */
 762                unsigned char dma_num;                  /* Byte 7 */
 763                u64 sense_addr;                         /* Bytes 8-15 */
 764                struct myrs_pdev pdev;                  /* Bytes 16-18 */
 765                struct myrs_cmd_tmo tmo;                /* Byte 19 */
 766                unsigned char sense_len;                /* Byte 20 */
 767                enum myrs_ioctl_opcode ioctl_opcode;    /* Byte 21 */
 768                unsigned char rsvd[10];                 /* Bytes 22-31 */
 769                union myrs_sgl dma_addr;                /* Bytes 32-63 */
 770        } pdev_info;
 771        struct {
 772                unsigned short id;                      /* Bytes 0-1 */
 773                enum myrs_cmd_opcode opcode;            /* Byte 2 */
 774                struct myrs_cmd_ctrl control;           /* Byte 3 */
 775                u32 dma_size:24;                        /* Bytes 4-6 */
 776                unsigned char dma_num;                  /* Byte 7 */
 777                u64 sense_addr;                         /* Bytes 8-15 */
 778                unsigned short evnum_upper;             /* Bytes 16-17 */
 779                unsigned char ctlr_num;                 /* Byte 18 */
 780                struct myrs_cmd_tmo tmo;                /* Byte 19 */
 781                unsigned char sense_len;                /* Byte 20 */
 782                enum myrs_ioctl_opcode ioctl_opcode;    /* Byte 21 */
 783                unsigned short evnum_lower;             /* Bytes 22-23 */
 784                unsigned char rsvd[8];                  /* Bytes 24-31 */
 785                union myrs_sgl dma_addr;                /* Bytes 32-63 */
 786        } get_event;
 787        struct {
 788                unsigned short id;                      /* Bytes 0-1 */
 789                enum myrs_cmd_opcode opcode;            /* Byte 2 */
 790                struct myrs_cmd_ctrl control;           /* Byte 3 */
 791                u32 dma_size:24;                        /* Bytes 4-6 */
 792                unsigned char dma_num;                  /* Byte 7 */
 793                u64 sense_addr;                         /* Bytes 8-15 */
 794                union {
 795                        struct myrs_ldev ldev;          /* Bytes 16-18 */
 796                        struct myrs_pdev pdev;          /* Bytes 16-18 */
 797                };
 798                struct myrs_cmd_tmo tmo;                /* Byte 19 */
 799                unsigned char sense_len;                /* Byte 20 */
 800                enum myrs_ioctl_opcode ioctl_opcode;    /* Byte 21 */
 801                enum myrs_devstate state;               /* Byte 22 */
 802                unsigned char rsvd[9];                  /* Bytes 23-31 */
 803                union myrs_sgl dma_addr;                /* Bytes 32-63 */
 804        } set_devstate;
 805        struct {
 806                unsigned short id;                      /* Bytes 0-1 */
 807                enum myrs_cmd_opcode opcode;            /* Byte 2 */
 808                struct myrs_cmd_ctrl control;           /* Byte 3 */
 809                u32 dma_size:24;                        /* Bytes 4-6 */
 810                unsigned char dma_num;                  /* Byte 7 */
 811                u64 sense_addr;                         /* Bytes 8-15 */
 812                struct myrs_ldev ldev;                  /* Bytes 16-18 */
 813                struct myrs_cmd_tmo tmo;                /* Byte 19 */
 814                unsigned char sense_len;                /* Byte 20 */
 815                enum myrs_ioctl_opcode ioctl_opcode;    /* Byte 21 */
 816                unsigned char restore_consistency:1;    /* Byte 22 Bit 0 */
 817                unsigned char initialized_area_only:1;  /* Byte 22 Bit 1 */
 818                unsigned char rsvd1:6;                  /* Byte 22 Bits 2-7 */
 819                unsigned char rsvd2[9];                 /* Bytes 23-31 */
 820                union myrs_sgl dma_addr;                /* Bytes 32-63 */
 821        } cc;
 822        struct {
 823                unsigned short id;                      /* Bytes 0-1 */
 824                enum myrs_cmd_opcode opcode;            /* Byte 2 */
 825                struct myrs_cmd_ctrl control;           /* Byte 3 */
 826                unsigned char first_cmd_mbox_size_kb;   /* Byte 4 */
 827                unsigned char first_stat_mbox_size_kb;  /* Byte 5 */
 828                unsigned char second_cmd_mbox_size_kb;  /* Byte 6 */
 829                unsigned char second_stat_mbox_size_kb; /* Byte 7 */
 830                u64 sense_addr;                         /* Bytes 8-15 */
 831                unsigned int rsvd1:24;                  /* Bytes 16-18 */
 832                struct myrs_cmd_tmo tmo;                /* Byte 19 */
 833                unsigned char sense_len;                /* Byte 20 */
 834                enum myrs_ioctl_opcode ioctl_opcode;    /* Byte 21 */
 835                unsigned char fwstat_buf_size_kb;       /* Byte 22 */
 836                unsigned char rsvd2;                    /* Byte 23 */
 837                u64 fwstat_buf_addr;                    /* Bytes 24-31 */
 838                u64 first_cmd_mbox_addr;                /* Bytes 32-39 */
 839                u64 first_stat_mbox_addr;               /* Bytes 40-47 */
 840                u64 second_cmd_mbox_addr;               /* Bytes 48-55 */
 841                u64 second_stat_mbox_addr;              /* Bytes 56-63 */
 842        } set_mbox;
 843        struct {
 844                unsigned short id;                      /* Bytes 0-1 */
 845                enum myrs_cmd_opcode opcode;            /* Byte 2 */
 846                struct myrs_cmd_ctrl control;           /* Byte 3 */
 847                u32 dma_size:24;                        /* Bytes 4-6 */
 848                unsigned char dma_num;                  /* Byte 7 */
 849                u64 sense_addr;                         /* Bytes 8-15 */
 850                struct myrs_pdev pdev;                  /* Bytes 16-18 */
 851                struct myrs_cmd_tmo tmo;                /* Byte 19 */
 852                unsigned char sense_len;                /* Byte 20 */
 853                enum myrs_ioctl_opcode ioctl_opcode;    /* Byte 21 */
 854                enum myrs_opdev opdev;                  /* Byte 22 */
 855                unsigned char rsvd[9];                  /* Bytes 23-31 */
 856                union myrs_sgl dma_addr;                /* Bytes 32-63 */
 857        } dev_op;
 858};
 859
 860/*
 861 * DAC960 V2 Firmware Controller Status Mailbox structure.
 862 */
 863struct myrs_stat_mbox {
 864        unsigned short id;              /* Bytes 0-1 */
 865        unsigned char status;           /* Byte 2 */
 866        unsigned char sense_len;        /* Byte 3 */
 867        int residual;                   /* Bytes 4-7 */
 868};
 869
 870struct myrs_cmdblk {
 871        union myrs_cmd_mbox mbox;
 872        unsigned char status;
 873        unsigned char sense_len;
 874        int residual;
 875        struct completion *complete;
 876        struct myrs_sge *sgl;
 877        dma_addr_t sgl_addr;
 878        unsigned char *dcdb;
 879        dma_addr_t dcdb_dma;
 880        unsigned char *sense;
 881        dma_addr_t sense_addr;
 882};
 883
 884/*
 885 * DAC960 Driver Controller structure.
 886 */
 887struct myrs_hba {
 888        void __iomem *io_base;
 889        void __iomem *mmio_base;
 890        phys_addr_t io_addr;
 891        phys_addr_t pci_addr;
 892        unsigned int irq;
 893
 894        unsigned char model_name[28];
 895        unsigned char fw_version[12];
 896
 897        struct Scsi_Host *host;
 898        struct pci_dev *pdev;
 899
 900        unsigned int epoch;
 901        unsigned int next_evseq;
 902        /* Monitor flags */
 903        bool needs_update;
 904        bool disable_enc_msg;
 905
 906        struct workqueue_struct *work_q;
 907        char work_q_name[20];
 908        struct delayed_work monitor_work;
 909        unsigned long primary_monitor_time;
 910        unsigned long secondary_monitor_time;
 911
 912        spinlock_t queue_lock;
 913
 914        struct dma_pool *sg_pool;
 915        struct dma_pool *sense_pool;
 916        struct dma_pool *dcdb_pool;
 917
 918        void (*write_cmd_mbox)(union myrs_cmd_mbox *next_mbox,
 919                               union myrs_cmd_mbox *cmd_mbox);
 920        void (*get_cmd_mbox)(void __iomem *base);
 921        void (*disable_intr)(void __iomem *base);
 922        void (*reset)(void __iomem *base);
 923
 924        dma_addr_t cmd_mbox_addr;
 925        size_t cmd_mbox_size;
 926        union myrs_cmd_mbox *first_cmd_mbox;
 927        union myrs_cmd_mbox *last_cmd_mbox;
 928        union myrs_cmd_mbox *next_cmd_mbox;
 929        union myrs_cmd_mbox *prev_cmd_mbox1;
 930        union myrs_cmd_mbox *prev_cmd_mbox2;
 931
 932        dma_addr_t stat_mbox_addr;
 933        size_t stat_mbox_size;
 934        struct myrs_stat_mbox *first_stat_mbox;
 935        struct myrs_stat_mbox *last_stat_mbox;
 936        struct myrs_stat_mbox *next_stat_mbox;
 937
 938        struct myrs_cmdblk dcmd_blk;
 939        struct myrs_cmdblk mcmd_blk;
 940        struct mutex dcmd_mutex;
 941
 942        struct myrs_fwstat *fwstat_buf;
 943        dma_addr_t fwstat_addr;
 944
 945        struct myrs_ctlr_info *ctlr_info;
 946        struct mutex cinfo_mutex;
 947
 948        struct myrs_event *event_buf;
 949};
 950
 951typedef unsigned char (*enable_mbox_t)(void __iomem *base, dma_addr_t addr);
 952typedef int (*myrs_hwinit_t)(struct pci_dev *pdev,
 953                             struct myrs_hba *c, void __iomem *base);
 954
 955struct myrs_privdata {
 956        myrs_hwinit_t           hw_init;
 957        irq_handler_t           irq_handler;
 958        unsigned int            mmio_size;
 959};
 960
 961/*
 962 * DAC960 GEM Series Controller Interface Register Offsets.
 963 */
 964
 965#define DAC960_GEM_mmio_size    0x600
 966
 967enum DAC960_GEM_reg_offset {
 968        DAC960_GEM_IDB_READ_OFFSET      = 0x214,
 969        DAC960_GEM_IDB_CLEAR_OFFSET     = 0x218,
 970        DAC960_GEM_ODB_READ_OFFSET      = 0x224,
 971        DAC960_GEM_ODB_CLEAR_OFFSET     = 0x228,
 972        DAC960_GEM_IRQSTS_OFFSET        = 0x208,
 973        DAC960_GEM_IRQMASK_READ_OFFSET  = 0x22C,
 974        DAC960_GEM_IRQMASK_CLEAR_OFFSET = 0x230,
 975        DAC960_GEM_CMDMBX_OFFSET        = 0x510,
 976        DAC960_GEM_CMDSTS_OFFSET        = 0x518,
 977        DAC960_GEM_ERRSTS_READ_OFFSET   = 0x224,
 978        DAC960_GEM_ERRSTS_CLEAR_OFFSET  = 0x228,
 979};
 980
 981/*
 982 * DAC960 GEM Series Inbound Door Bell Register.
 983 */
 984#define DAC960_GEM_IDB_HWMBOX_NEW_CMD   0x01
 985#define DAC960_GEM_IDB_HWMBOX_ACK_STS   0x02
 986#define DAC960_GEM_IDB_GEN_IRQ          0x04
 987#define DAC960_GEM_IDB_CTRL_RESET       0x08
 988#define DAC960_GEM_IDB_MMBOX_NEW_CMD    0x10
 989
 990#define DAC960_GEM_IDB_HWMBOX_FULL      0x01
 991#define DAC960_GEM_IDB_INIT_IN_PROGRESS 0x02
 992
 993/*
 994 * DAC960 GEM Series Outbound Door Bell Register.
 995 */
 996#define DAC960_GEM_ODB_HWMBOX_ACK_IRQ   0x01
 997#define DAC960_GEM_ODB_MMBOX_ACK_IRQ    0x02
 998#define DAC960_GEM_ODB_HWMBOX_STS_AVAIL 0x01
 999#define DAC960_GEM_ODB_MMBOX_STS_AVAIL  0x02
1000
1001/*
1002 * DAC960 GEM Series Interrupt Mask Register.
1003 */
1004#define DAC960_GEM_IRQMASK_HWMBOX_IRQ   0x01
1005#define DAC960_GEM_IRQMASK_MMBOX_IRQ    0x02
1006
1007/*
1008 * DAC960 GEM Series Error Status Register.
1009 */
1010#define DAC960_GEM_ERRSTS_PENDING       0x20
1011
1012/*
1013 * dma_addr_writeql is provided to write dma_addr_t types
1014 * to a 64-bit pci address space register.  The controller
1015 * will accept having the register written as two 32-bit
1016 * values.
1017 *
1018 * In HIGHMEM kernels, dma_addr_t is a 64-bit value.
1019 * without HIGHMEM,  dma_addr_t is a 32-bit value.
1020 *
1021 * The compiler should always fix up the assignment
1022 * to u.wq appropriately, depending upon the size of
1023 * dma_addr_t.
1024 */
1025static inline
1026void dma_addr_writeql(dma_addr_t addr, void __iomem *write_address)
1027{
1028        union {
1029                u64 wq;
1030                uint wl[2];
1031        } u;
1032
1033        u.wq = addr;
1034
1035        writel(u.wl[0], write_address);
1036        writel(u.wl[1], write_address + 4);
1037}
1038
1039/*
1040 * DAC960 BA Series Controller Interface Register Offsets.
1041 */
1042
1043#define DAC960_BA_mmio_size             0x80
1044
1045enum DAC960_BA_reg_offset {
1046        DAC960_BA_IRQSTS_OFFSET = 0x30,
1047        DAC960_BA_IRQMASK_OFFSET = 0x34,
1048        DAC960_BA_CMDMBX_OFFSET = 0x50,
1049        DAC960_BA_CMDSTS_OFFSET = 0x58,
1050        DAC960_BA_IDB_OFFSET    = 0x60,
1051        DAC960_BA_ODB_OFFSET    = 0x61,
1052        DAC960_BA_ERRSTS_OFFSET = 0x63,
1053};
1054
1055/*
1056 * DAC960 BA Series Inbound Door Bell Register.
1057 */
1058#define DAC960_BA_IDB_HWMBOX_NEW_CMD    0x01
1059#define DAC960_BA_IDB_HWMBOX_ACK_STS    0x02
1060#define DAC960_BA_IDB_GEN_IRQ           0x04
1061#define DAC960_BA_IDB_CTRL_RESET        0x08
1062#define DAC960_BA_IDB_MMBOX_NEW_CMD     0x10
1063
1064#define DAC960_BA_IDB_HWMBOX_EMPTY      0x01
1065#define DAC960_BA_IDB_INIT_DONE         0x02
1066
1067/*
1068 * DAC960 BA Series Outbound Door Bell Register.
1069 */
1070#define DAC960_BA_ODB_HWMBOX_ACK_IRQ    0x01
1071#define DAC960_BA_ODB_MMBOX_ACK_IRQ     0x02
1072
1073#define DAC960_BA_ODB_HWMBOX_STS_AVAIL  0x01
1074#define DAC960_BA_ODB_MMBOX_STS_AVAIL   0x02
1075
1076/*
1077 * DAC960 BA Series Interrupt Mask Register.
1078 */
1079#define DAC960_BA_IRQMASK_DISABLE_IRQ   0x04
1080#define DAC960_BA_IRQMASK_DISABLEW_I2O  0x08
1081
1082/*
1083 * DAC960 BA Series Error Status Register.
1084 */
1085#define DAC960_BA_ERRSTS_PENDING        0x04
1086
1087/*
1088 * DAC960 LP Series Controller Interface Register Offsets.
1089 */
1090
1091#define DAC960_LP_mmio_size             0x80
1092
1093enum DAC960_LP_reg_offset {
1094        DAC960_LP_CMDMBX_OFFSET = 0x10,
1095        DAC960_LP_CMDSTS_OFFSET = 0x18,
1096        DAC960_LP_IDB_OFFSET    = 0x20,
1097        DAC960_LP_ODB_OFFSET    = 0x2C,
1098        DAC960_LP_ERRSTS_OFFSET = 0x2E,
1099        DAC960_LP_IRQSTS_OFFSET = 0x30,
1100        DAC960_LP_IRQMASK_OFFSET = 0x34,
1101};
1102
1103/*
1104 * DAC960 LP Series Inbound Door Bell Register.
1105 */
1106#define DAC960_LP_IDB_HWMBOX_NEW_CMD    0x01
1107#define DAC960_LP_IDB_HWMBOX_ACK_STS    0x02
1108#define DAC960_LP_IDB_GEN_IRQ           0x04
1109#define DAC960_LP_IDB_CTRL_RESET        0x08
1110#define DAC960_LP_IDB_MMBOX_NEW_CMD     0x10
1111
1112#define DAC960_LP_IDB_HWMBOX_FULL       0x01
1113#define DAC960_LP_IDB_INIT_IN_PROGRESS  0x02
1114
1115/*
1116 * DAC960 LP Series Outbound Door Bell Register.
1117 */
1118#define DAC960_LP_ODB_HWMBOX_ACK_IRQ    0x01
1119#define DAC960_LP_ODB_MMBOX_ACK_IRQ     0x02
1120
1121#define DAC960_LP_ODB_HWMBOX_STS_AVAIL  0x01
1122#define DAC960_LP_ODB_MMBOX_STS_AVAIL   0x02
1123
1124/*
1125 * DAC960 LP Series Interrupt Mask Register.
1126 */
1127#define DAC960_LP_IRQMASK_DISABLE_IRQ   0x04
1128
1129/*
1130 * DAC960 LP Series Error Status Register.
1131 */
1132#define DAC960_LP_ERRSTS_PENDING        0x04
1133
1134#endif /* _MYRS_H */
1135