0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef MYRB_H
0014 #define MYRB_H
0015
0016 #define MYRB_MAX_LDEVS 32
0017 #define MYRB_MAX_CHANNELS 3
0018 #define MYRB_MAX_TARGETS 16
0019 #define MYRB_MAX_PHYSICAL_DEVICES 45
0020 #define MYRB_SCATTER_GATHER_LIMIT 32
0021 #define MYRB_CMD_MBOX_COUNT 256
0022 #define MYRB_STAT_MBOX_COUNT 1024
0023
0024 #define MYRB_BLKSIZE_BITS 9
0025 #define MYRB_MAILBOX_TIMEOUT 1000000
0026
0027 #define MYRB_DCMD_TAG 1
0028 #define MYRB_MCMD_TAG 2
0029
0030 #define MYRB_PRIMARY_MONITOR_INTERVAL (10 * HZ)
0031 #define MYRB_SECONDARY_MONITOR_INTERVAL (60 * HZ)
0032
0033
0034
0035
0036 enum myrb_cmd_opcode {
0037
0038 MYRB_CMD_READ_EXTENDED = 0x33,
0039 MYRB_CMD_WRITE_EXTENDED = 0x34,
0040 MYRB_CMD_READAHEAD_EXTENDED = 0x35,
0041 MYRB_CMD_READ_EXTENDED_SG = 0xB3,
0042 MYRB_CMD_WRITE_EXTENDED_SG = 0xB4,
0043 MYRB_CMD_READ = 0x36,
0044 MYRB_CMD_READ_SG = 0xB6,
0045 MYRB_CMD_WRITE = 0x37,
0046 MYRB_CMD_WRITE_SG = 0xB7,
0047 MYRB_CMD_DCDB = 0x04,
0048 MYRB_CMD_DCDB_SG = 0x84,
0049 MYRB_CMD_FLUSH = 0x0A,
0050
0051 MYRB_CMD_ENQUIRY = 0x53,
0052 MYRB_CMD_ENQUIRY2 = 0x1C,
0053 MYRB_CMD_GET_LDRV_ELEMENT = 0x55,
0054 MYRB_CMD_GET_LDEV_INFO = 0x19,
0055 MYRB_CMD_IOPORTREAD = 0x39,
0056 MYRB_CMD_IOPORTWRITE = 0x3A,
0057 MYRB_CMD_GET_SD_STATS = 0x3E,
0058 MYRB_CMD_GET_PD_STATS = 0x3F,
0059 MYRB_CMD_EVENT_LOG_OPERATION = 0x72,
0060
0061 MYRB_CMD_START_DEVICE = 0x10,
0062 MYRB_CMD_GET_DEVICE_STATE = 0x50,
0063 MYRB_CMD_STOP_CHANNEL = 0x13,
0064 MYRB_CMD_START_CHANNEL = 0x12,
0065 MYRB_CMD_RESET_CHANNEL = 0x1A,
0066
0067 MYRB_CMD_REBUILD = 0x09,
0068 MYRB_CMD_REBUILD_ASYNC = 0x16,
0069 MYRB_CMD_CHECK_CONSISTENCY = 0x0F,
0070 MYRB_CMD_CHECK_CONSISTENCY_ASYNC = 0x1E,
0071 MYRB_CMD_REBUILD_STAT = 0x0C,
0072 MYRB_CMD_GET_REBUILD_PROGRESS = 0x27,
0073 MYRB_CMD_REBUILD_CONTROL = 0x1F,
0074 MYRB_CMD_READ_BADBLOCK_TABLE = 0x0B,
0075 MYRB_CMD_READ_BADDATA_TABLE = 0x25,
0076 MYRB_CMD_CLEAR_BADDATA_TABLE = 0x26,
0077 MYRB_CMD_GET_ERROR_TABLE = 0x17,
0078 MYRB_CMD_ADD_CAPACITY_ASYNC = 0x2A,
0079 MYRB_CMD_BGI_CONTROL = 0x2B,
0080
0081 MYRB_CMD_READ_CONFIG2 = 0x3D,
0082 MYRB_CMD_WRITE_CONFIG2 = 0x3C,
0083 MYRB_CMD_READ_CONFIG_ONDISK = 0x4A,
0084 MYRB_CMD_WRITE_CONFIG_ONDISK = 0x4B,
0085 MYRB_CMD_READ_CONFIG = 0x4E,
0086 MYRB_CMD_READ_BACKUP_CONFIG = 0x4D,
0087 MYRB_CMD_WRITE_CONFIG = 0x4F,
0088 MYRB_CMD_ADD_CONFIG = 0x4C,
0089 MYRB_CMD_READ_CONFIG_LABEL = 0x48,
0090 MYRB_CMD_WRITE_CONFIG_LABEL = 0x49,
0091
0092 MYRB_CMD_LOAD_IMAGE = 0x20,
0093 MYRB_CMD_STORE_IMAGE = 0x21,
0094 MYRB_CMD_PROGRAM_IMAGE = 0x22,
0095
0096 MYRB_CMD_SET_DIAGNOSTIC_MODE = 0x31,
0097 MYRB_CMD_RUN_DIAGNOSTIC = 0x32,
0098
0099 MYRB_CMD_GET_SUBSYS_DATA = 0x70,
0100 MYRB_CMD_SET_SUBSYS_PARAM = 0x71,
0101
0102 MYRB_CMD_ENQUIRY_OLD = 0x05,
0103 MYRB_CMD_GET_DEVICE_STATE_OLD = 0x14,
0104 MYRB_CMD_READ_OLD = 0x02,
0105 MYRB_CMD_WRITE_OLD = 0x03,
0106 MYRB_CMD_READ_SG_OLD = 0x82,
0107 MYRB_CMD_WRITE_SG_OLD = 0x83
0108 } __packed;
0109
0110
0111
0112
0113 #define MYRB_STATUS_SUCCESS 0x0000
0114 #define MYRB_STATUS_CHECK_CONDITION 0x0002
0115 #define MYRB_STATUS_NO_DEVICE 0x0102
0116 #define MYRB_STATUS_INVALID_ADDRESS 0x0105
0117 #define MYRB_STATUS_INVALID_PARAM 0x0105
0118 #define MYRB_STATUS_IRRECOVERABLE_DATA_ERROR 0x0001
0119 #define MYRB_STATUS_LDRV_NONEXISTENT_OR_OFFLINE 0x0002
0120 #define MYRB_STATUS_ACCESS_BEYOND_END_OF_LDRV 0x0105
0121 #define MYRB_STATUS_BAD_DATA 0x010C
0122 #define MYRB_STATUS_DEVICE_BUSY 0x0008
0123 #define MYRB_STATUS_DEVICE_NONRESPONSIVE 0x000E
0124 #define MYRB_STATUS_COMMAND_TERMINATED 0x000F
0125 #define MYRB_STATUS_START_DEVICE_FAILED 0x0002
0126 #define MYRB_STATUS_INVALID_CHANNEL_OR_TARGET 0x0105
0127 #define MYRB_STATUS_CHANNEL_BUSY 0x0106
0128 #define MYRB_STATUS_OUT_OF_MEMORY 0x0107
0129 #define MYRB_STATUS_CHANNEL_NOT_STOPPED 0x0002
0130 #define MYRB_STATUS_ATTEMPT_TO_RBLD_ONLINE_DRIVE 0x0002
0131 #define MYRB_STATUS_RBLD_BADBLOCKS 0x0003
0132 #define MYRB_STATUS_RBLD_NEW_DISK_FAILED 0x0004
0133 #define MYRB_STATUS_RBLD_OR_CHECK_INPROGRESS 0x0106
0134 #define MYRB_STATUS_DEPENDENT_DISK_DEAD 0x0002
0135 #define MYRB_STATUS_INCONSISTENT_BLOCKS 0x0003
0136 #define MYRB_STATUS_INVALID_OR_NONREDUNDANT_LDRV 0x0105
0137 #define MYRB_STATUS_NO_RBLD_OR_CHECK_INPROGRESS 0x0105
0138 #define MYRB_STATUS_RBLD_IN_PROGRESS_DATA_VALID 0x0000
0139 #define MYRB_STATUS_RBLD_FAILED_LDEV_FAILURE 0x0002
0140 #define MYRB_STATUS_RBLD_FAILED_BADBLOCKS 0x0003
0141 #define MYRB_STATUS_RBLD_FAILED_NEW_DRIVE_FAILED 0x0004
0142 #define MYRB_STATUS_RBLD_SUCCESS 0x0100
0143 #define MYRB_STATUS_RBLD_SUCCESS_TERMINATED 0x0107
0144 #define MYRB_STATUS_RBLD_NOT_CHECKED 0x0108
0145 #define MYRB_STATUS_BGI_SUCCESS 0x0100
0146 #define MYRB_STATUS_BGI_ABORTED 0x0005
0147 #define MYRB_STATUS_NO_BGI_INPROGRESS 0x0105
0148 #define MYRB_STATUS_ADD_CAPACITY_INPROGRESS 0x0004
0149 #define MYRB_STATUS_ADD_CAPACITY_FAILED_OR_SUSPENDED 0x00F4
0150 #define MYRB_STATUS_CONFIG2_CSUM_ERROR 0x0002
0151 #define MYRB_STATUS_CONFIGURATION_SUSPENDED 0x0106
0152 #define MYRB_STATUS_FAILED_TO_CONFIGURE_NVRAM 0x0105
0153 #define MYRB_STATUS_CONFIGURATION_NOT_SAVED 0x0106
0154 #define MYRB_STATUS_SUBSYS_NOTINSTALLED 0x0001
0155 #define MYRB_STATUS_SUBSYS_FAILED 0x0002
0156 #define MYRB_STATUS_SUBSYS_BUSY 0x0106
0157 #define MYRB_STATUS_SUBSYS_TIMEOUT 0x0108
0158
0159
0160
0161
0162 struct myrb_enquiry {
0163 unsigned char ldev_count;
0164 unsigned int rsvd1:24;
0165 unsigned int ldev_sizes[32];
0166 unsigned short flash_age;
0167 struct {
0168 unsigned char deferred:1;
0169 unsigned char low_bat:1;
0170 unsigned char rsvd2:6;
0171 } status;
0172 unsigned char rsvd3:8;
0173 unsigned char fw_minor_version;
0174 unsigned char fw_major_version;
0175 enum {
0176 MYRB_NO_STDBY_RBLD_OR_CHECK_IN_PROGRESS = 0x00,
0177 MYRB_STDBY_RBLD_IN_PROGRESS = 0x01,
0178 MYRB_BG_RBLD_IN_PROGRESS = 0x02,
0179 MYRB_BG_CHECK_IN_PROGRESS = 0x03,
0180 MYRB_STDBY_RBLD_COMPLETED_WITH_ERROR = 0xFF,
0181 MYRB_BG_RBLD_OR_CHECK_FAILED_DRIVE_FAILED = 0xF0,
0182 MYRB_BG_RBLD_OR_CHECK_FAILED_LDEV_FAILED = 0xF1,
0183 MYRB_BG_RBLD_OR_CHECK_FAILED_OTHER = 0xF2,
0184 MYRB_BG_RBLD_OR_CHECK_SUCCESS_TERMINATED = 0xF3
0185 } __packed rbld;
0186 unsigned char max_tcq;
0187 unsigned char ldev_offline;
0188 unsigned char rsvd4:8;
0189 unsigned short ev_seq;
0190 unsigned char ldev_critical;
0191 unsigned int rsvd5:24;
0192 unsigned char pdev_dead;
0193 unsigned char rsvd6:8;
0194 unsigned char rbld_count;
0195 struct {
0196 unsigned char rsvd7:3;
0197 unsigned char bbu_present:1;
0198 unsigned char rsvd8:4;
0199 } misc;
0200 struct {
0201 unsigned char target;
0202 unsigned char channel;
0203 } dead_drives[21];
0204 unsigned char rsvd9[62];
0205 } __packed;
0206
0207
0208
0209
0210 struct myrb_enquiry2 {
0211 struct {
0212 enum {
0213 DAC960_V1_P_PD_PU = 0x01,
0214 DAC960_V1_PL = 0x02,
0215 DAC960_V1_PG = 0x10,
0216 DAC960_V1_PJ = 0x11,
0217 DAC960_V1_PR = 0x12,
0218 DAC960_V1_PT = 0x13,
0219 DAC960_V1_PTL0 = 0x14,
0220 DAC960_V1_PRL = 0x15,
0221 DAC960_V1_PTL1 = 0x16,
0222 DAC960_V1_1164P = 0x20
0223 } __packed sub_model;
0224 unsigned char actual_channels;
0225 enum {
0226 MYRB_5_CHANNEL_BOARD = 0x01,
0227 MYRB_3_CHANNEL_BOARD = 0x02,
0228 MYRB_2_CHANNEL_BOARD = 0x03,
0229 MYRB_3_CHANNEL_ASIC_DAC = 0x04
0230 } __packed model;
0231 enum {
0232 MYRB_EISA_CONTROLLER = 0x01,
0233 MYRB_MCA_CONTROLLER = 0x02,
0234 MYRB_PCI_CONTROLLER = 0x03,
0235 MYRB_SCSI_TO_SCSI = 0x08
0236 } __packed controller;
0237 } hw;
0238
0239 struct {
0240 unsigned char major_version;
0241 unsigned char minor_version;
0242 unsigned char turn_id;
0243 char firmware_type;
0244 } fw;
0245 unsigned int rsvd1;
0246 unsigned char cfg_chan;
0247 unsigned char cur_chan;
0248 unsigned char max_targets;
0249 unsigned char max_tcq;
0250 unsigned char max_ldev;
0251 unsigned char max_arms;
0252 unsigned char max_spans;
0253 unsigned char rsvd2;
0254 unsigned int rsvd3;
0255 unsigned int mem_size;
0256 unsigned int cache_size;
0257 unsigned int flash_size;
0258 unsigned int nvram_size;
0259 struct {
0260 enum {
0261 MYRB_RAM_TYPE_DRAM = 0x0,
0262 MYRB_RAM_TYPE_EDO = 0x1,
0263 MYRB_RAM_TYPE_SDRAM = 0x2,
0264 MYRB_RAM_TYPE_Last = 0x7
0265 } __packed ram:3;
0266 enum {
0267 MYRB_ERR_CORR_None = 0x0,
0268 MYRB_ERR_CORR_Parity = 0x1,
0269 MYRB_ERR_CORR_ECC = 0x2,
0270 MYRB_ERR_CORR_Last = 0x7
0271 } __packed ec:3;
0272 unsigned char fast_page:1;
0273 unsigned char low_power:1;
0274 unsigned char rsvd4;
0275 } mem_type;
0276 unsigned short clock_speed;
0277 unsigned short mem_speed;
0278 unsigned short hw_speed;
0279 unsigned char rsvd5[12];
0280 unsigned short max_cmds;
0281 unsigned short max_sge;
0282 unsigned short max_drv_cmds;
0283 unsigned short max_io_desc;
0284 unsigned short max_sectors;
0285 unsigned char latency;
0286 unsigned char rsvd6;
0287 unsigned char scsi_tmo;
0288 unsigned char rsvd7;
0289 unsigned short min_freelines;
0290 unsigned char rsvd8[8];
0291 unsigned char rbld_rate_const;
0292 unsigned char rsvd9[11];
0293 unsigned short pdrv_block_size;
0294 unsigned short ldev_block_size;
0295 unsigned short max_blocks_per_cmd;
0296 unsigned short block_factor;
0297 unsigned short cacheline_size;
0298 struct {
0299 enum {
0300 MYRB_WIDTH_NARROW_8BIT = 0x0,
0301 MYRB_WIDTH_WIDE_16BIT = 0x1,
0302 MYRB_WIDTH_WIDE_32BIT = 0x2
0303 } __packed bus_width:2;
0304 enum {
0305 MYRB_SCSI_SPEED_FAST = 0x0,
0306 MYRB_SCSI_SPEED_ULTRA = 0x1,
0307 MYRB_SCSI_SPEED_ULTRA2 = 0x2
0308 } __packed bus_speed:2;
0309 unsigned char differential:1;
0310 unsigned char rsvd10:3;
0311 } scsi_cap;
0312 unsigned char rsvd11[5];
0313 unsigned short fw_build;
0314 enum {
0315 MYRB_FAULT_AEMI = 0x01,
0316 MYRB_FAULT_OEM1 = 0x02,
0317 MYRB_FAULT_OEM2 = 0x04,
0318 MYRB_FAULT_OEM3 = 0x08,
0319 MYRB_FAULT_CONNER = 0x10,
0320 MYRB_FAULT_SAFTE = 0x20
0321 } __packed fault_mgmt;
0322 unsigned char rsvd12;
0323 struct {
0324 unsigned int clustering:1;
0325 unsigned int online_RAID_expansion:1;
0326 unsigned int readahead:1;
0327 unsigned int bgi:1;
0328 unsigned int rsvd13:28;
0329 } fw_features;
0330 unsigned char rsvd14[8];
0331 } __packed;
0332
0333
0334
0335
0336 enum myrb_devstate {
0337 MYRB_DEVICE_DEAD = 0x00,
0338 MYRB_DEVICE_WO = 0x02,
0339 MYRB_DEVICE_ONLINE = 0x03,
0340 MYRB_DEVICE_CRITICAL = 0x04,
0341 MYRB_DEVICE_STANDBY = 0x10,
0342 MYRB_DEVICE_OFFLINE = 0xFF
0343 } __packed;
0344
0345
0346
0347
0348 enum myrb_raidlevel {
0349 MYRB_RAID_LEVEL0 = 0x0,
0350 MYRB_RAID_LEVEL1 = 0x1,
0351 MYRB_RAID_LEVEL3 = 0x3,
0352 MYRB_RAID_LEVEL5 = 0x5,
0353 MYRB_RAID_LEVEL6 = 0x6,
0354 MYRB_RAID_JBOD = 0x7,
0355 } __packed;
0356
0357
0358
0359
0360 struct myrb_ldev_info {
0361 unsigned int size;
0362 enum myrb_devstate state;
0363 unsigned int raid_level:7;
0364 unsigned int wb_enabled:1;
0365 unsigned int rsvd:16;
0366 };
0367
0368
0369
0370
0371 #define DAC960_V1_GetEventLogEntry 0x00
0372
0373
0374
0375
0376 struct myrb_log_entry {
0377 unsigned char msg_type;
0378 unsigned char msg_len;
0379 unsigned char target:5;
0380 unsigned char channel:3;
0381 unsigned char lun:6;
0382 unsigned char rsvd1:2;
0383 unsigned short seq_num;
0384 unsigned char sense[26];
0385 };
0386
0387
0388
0389
0390
0391
0392 struct myrb_pdev_state {
0393 unsigned int present:1;
0394 unsigned int :7;
0395 enum {
0396 MYRB_TYPE_OTHER = 0x0,
0397 MYRB_TYPE_DISK = 0x1,
0398 MYRB_TYPE_TAPE = 0x2,
0399 MYRB_TYPE_CDROM_OR_WORM = 0x3
0400 } __packed devtype:2;
0401 unsigned int rsvd1:1;
0402 unsigned int fast20:1;
0403 unsigned int sync:1;
0404 unsigned int fast:1;
0405 unsigned int wide:1;
0406 unsigned int tcq_supported:1;
0407 enum myrb_devstate state;
0408 unsigned int rsvd2:8;
0409 unsigned int sync_multiplier;
0410 unsigned int sync_offset:5;
0411 unsigned int rsvd3:3;
0412 unsigned int size;
0413 unsigned int rsvd4:16;
0414 } __packed;
0415
0416
0417
0418
0419 struct myrb_rbld_progress {
0420 unsigned int ldev_num;
0421 unsigned int ldev_size;
0422 unsigned int blocks_left;
0423 };
0424
0425
0426
0427
0428 struct myrb_bgi_status {
0429 unsigned int ldev_size;
0430 unsigned int blocks_done;
0431 unsigned char rsvd1[12];
0432 unsigned int ldev_num;
0433 unsigned char raid_level;
0434 enum {
0435 MYRB_BGI_INVALID = 0x00,
0436 MYRB_BGI_STARTED = 0x02,
0437 MYRB_BGI_INPROGRESS = 0x04,
0438 MYRB_BGI_SUSPENDED = 0x05,
0439 MYRB_BGI_CANCELLED = 0x06
0440 } __packed status;
0441 unsigned char rsvd2[6];
0442 };
0443
0444
0445
0446
0447 struct myrb_error_entry {
0448 unsigned char parity_err;
0449 unsigned char soft_err;
0450 unsigned char hard_err;
0451 unsigned char misc_err;
0452 };
0453
0454
0455
0456
0457 struct myrb_config2 {
0458 unsigned rsvd1:1;
0459 unsigned active_negation:1;
0460 unsigned rsvd2:5;
0461 unsigned no_rescan_on_reset_during_scan:1;
0462 unsigned StorageWorks_support:1;
0463 unsigned HewlettPackard_support:1;
0464 unsigned no_disconnect_on_first_command:1;
0465 unsigned rsvd3:2;
0466 unsigned AEMI_ARM:1;
0467 unsigned AEMI_OFM:1;
0468 unsigned rsvd4:1;
0469 enum {
0470 MYRB_OEMID_MYLEX = 0x00,
0471 MYRB_OEMID_IBM = 0x08,
0472 MYRB_OEMID_HP = 0x0A,
0473 MYRB_OEMID_DEC = 0x0C,
0474 MYRB_OEMID_SIEMENS = 0x10,
0475 MYRB_OEMID_INTEL = 0x12
0476 } __packed OEMID;
0477 unsigned char oem_model_number;
0478 unsigned char physical_sector;
0479 unsigned char logical_sector;
0480 unsigned char block_factor;
0481 unsigned readahead_enabled:1;
0482 unsigned low_BIOS_delay:1;
0483 unsigned rsvd5:2;
0484 unsigned restrict_reassign_to_one_sector:1;
0485 unsigned rsvd6:1;
0486 unsigned FUA_during_write_recovery:1;
0487 unsigned enable_LeftSymmetricRAID5Algorithm:1;
0488 unsigned char default_rebuild_rate;
0489 unsigned char rsvd7;
0490 unsigned char blocks_per_cacheline;
0491 unsigned char blocks_per_stripe;
0492 struct {
0493 enum {
0494 MYRB_SPEED_ASYNC = 0x0,
0495 MYRB_SPEED_SYNC_8MHz = 0x1,
0496 MYRB_SPEED_SYNC_5MHz = 0x2,
0497 MYRB_SPEED_SYNC_10_OR_20MHz = 0x3
0498 } __packed speed:2;
0499 unsigned force_8bit:1;
0500 unsigned disable_fast20:1;
0501 unsigned rsvd8:3;
0502 unsigned enable_tcq:1;
0503 } __packed channelparam[6];
0504 unsigned char SCSIInitiatorID;
0505 unsigned char rsvd9;
0506 enum {
0507 MYRB_STARTUP_CONTROLLER_SPINUP = 0x00,
0508 MYRB_STARTUP_POWERON_SPINUP = 0x01
0509 } __packed startup;
0510 unsigned char simultaneous_device_spinup_count;
0511 unsigned char seconds_delay_between_spinups;
0512 unsigned char rsvd10[29];
0513 unsigned BIOS_disabled:1;
0514 unsigned CDROM_boot_enabled:1;
0515 unsigned rsvd11:3;
0516 enum {
0517 MYRB_GEOM_128_32 = 0x0,
0518 MYRB_GEOM_255_63 = 0x1,
0519 MYRB_GEOM_RESERVED1 = 0x2,
0520 MYRB_GEOM_RESERVED2 = 0x3
0521 } __packed drive_geometry:2;
0522 unsigned rsvd12:1;
0523 unsigned char rsvd13[9];
0524 unsigned short csum;
0525 };
0526
0527
0528
0529
0530 struct myrb_dcdb {
0531 unsigned target:4;
0532 unsigned channel:4;
0533 enum {
0534 MYRB_DCDB_XFER_NONE = 0,
0535 MYRB_DCDB_XFER_DEVICE_TO_SYSTEM = 1,
0536 MYRB_DCDB_XFER_SYSTEM_TO_DEVICE = 2,
0537 MYRB_DCDB_XFER_ILLEGAL = 3
0538 } __packed data_xfer:2;
0539 unsigned early_status:1;
0540 unsigned rsvd1:1;
0541 enum {
0542 MYRB_DCDB_TMO_24_HRS = 0,
0543 MYRB_DCDB_TMO_10_SECS = 1,
0544 MYRB_DCDB_TMO_60_SECS = 2,
0545 MYRB_DCDB_TMO_10_MINS = 3
0546 } __packed timeout:2;
0547 unsigned no_autosense:1;
0548 unsigned allow_disconnect:1;
0549 unsigned short xfer_len_lo;
0550 u32 dma_addr;
0551 unsigned char cdb_len:4;
0552 unsigned char xfer_len_hi4:4;
0553 unsigned char sense_len;
0554 unsigned char cdb[12];
0555 unsigned char sense[64];
0556 unsigned char status;
0557 unsigned char rsvd2;
0558 };
0559
0560
0561
0562
0563
0564 struct myrb_sge {
0565 u32 sge_addr;
0566 u32 sge_count;
0567 };
0568
0569
0570
0571
0572
0573
0574 union myrb_cmd_mbox {
0575 unsigned int words[4];
0576 unsigned char bytes[16];
0577 struct {
0578 enum myrb_cmd_opcode opcode;
0579 unsigned char id;
0580 unsigned char rsvd[14];
0581 } __packed common;
0582 struct {
0583 enum myrb_cmd_opcode opcode;
0584 unsigned char id;
0585 unsigned char rsvd1[6];
0586 u32 addr;
0587 unsigned char rsvd2[4];
0588 } __packed type3;
0589 struct {
0590 enum myrb_cmd_opcode opcode;
0591 unsigned char id;
0592 unsigned char optype;
0593 unsigned char rsvd1[5];
0594 u32 addr;
0595 unsigned char rsvd2[4];
0596 } __packed type3B;
0597 struct {
0598 enum myrb_cmd_opcode opcode;
0599 unsigned char id;
0600 unsigned char rsvd1[5];
0601 unsigned char ldev_num:6;
0602 unsigned char auto_restore:1;
0603 unsigned char rsvd2[8];
0604 } __packed type3C;
0605 struct {
0606 enum myrb_cmd_opcode opcode;
0607 unsigned char id;
0608 unsigned char channel;
0609 unsigned char target;
0610 enum myrb_devstate state;
0611 unsigned char rsvd1[3];
0612 u32 addr;
0613 unsigned char rsvd2[4];
0614 } __packed type3D;
0615 struct {
0616 enum myrb_cmd_opcode opcode;
0617 unsigned char id;
0618 unsigned char optype;
0619 unsigned char opqual;
0620 unsigned short ev_seq;
0621 unsigned char rsvd1[2];
0622 u32 addr;
0623 unsigned char rsvd2[4];
0624 } __packed type3E;
0625 struct {
0626 enum myrb_cmd_opcode opcode;
0627 unsigned char id;
0628 unsigned char rsvd1[2];
0629 unsigned char rbld_rate;
0630 unsigned char rsvd2[3];
0631 u32 addr;
0632 unsigned char rsvd3[4];
0633 } __packed type3R;
0634 struct {
0635 enum myrb_cmd_opcode opcode;
0636 unsigned char id;
0637 unsigned short xfer_len;
0638 unsigned int lba;
0639 u32 addr;
0640 unsigned char ldev_num;
0641 unsigned char rsvd[3];
0642 } __packed type4;
0643 struct {
0644 enum myrb_cmd_opcode opcode;
0645 unsigned char id;
0646 struct {
0647 unsigned short xfer_len:11;
0648 unsigned char ldev_num:5;
0649 } __packed ld;
0650 unsigned int lba;
0651 u32 addr;
0652 unsigned char sg_count:6;
0653 enum {
0654 MYRB_SGL_ADDR32_COUNT32 = 0x0,
0655 MYRB_SGL_ADDR32_COUNT16 = 0x1,
0656 MYRB_SGL_COUNT32_ADDR32 = 0x2,
0657 MYRB_SGL_COUNT16_ADDR32 = 0x3
0658 } __packed sg_type:2;
0659 unsigned char rsvd[3];
0660 } __packed type5;
0661 struct {
0662 enum myrb_cmd_opcode opcode;
0663 unsigned char id;
0664 unsigned char opcode2;
0665 unsigned char rsvd1:8;
0666 u32 cmd_mbox_addr;
0667 u32 stat_mbox_addr;
0668 unsigned char rsvd2[4];
0669 } __packed typeX;
0670 };
0671
0672
0673
0674
0675 struct myrb_stat_mbox {
0676 unsigned char id;
0677 unsigned char rsvd:7;
0678 unsigned char valid:1;
0679 unsigned short status;
0680 };
0681
0682 struct myrb_cmdblk {
0683 union myrb_cmd_mbox mbox;
0684 unsigned short status;
0685 struct completion *completion;
0686 struct myrb_dcdb *dcdb;
0687 dma_addr_t dcdb_addr;
0688 struct myrb_sge *sgl;
0689 dma_addr_t sgl_addr;
0690 };
0691
0692 struct myrb_hba {
0693 unsigned int ldev_block_size;
0694 unsigned char ldev_geom_heads;
0695 unsigned char ldev_geom_sectors;
0696 unsigned char bus_width;
0697 unsigned short stripe_size;
0698 unsigned short segment_size;
0699 unsigned short new_ev_seq;
0700 unsigned short old_ev_seq;
0701 bool dual_mode_interface;
0702 bool bgi_status_supported;
0703 bool safte_enabled;
0704 bool need_ldev_info;
0705 bool need_err_info;
0706 bool need_rbld;
0707 bool need_cc_status;
0708 bool need_bgi_status;
0709 bool rbld_first;
0710
0711 struct pci_dev *pdev;
0712 struct Scsi_Host *host;
0713
0714 struct workqueue_struct *work_q;
0715 char work_q_name[20];
0716 struct delayed_work monitor_work;
0717 unsigned long primary_monitor_time;
0718 unsigned long secondary_monitor_time;
0719
0720 struct dma_pool *sg_pool;
0721 struct dma_pool *dcdb_pool;
0722
0723 spinlock_t queue_lock;
0724
0725 void (*qcmd)(struct myrb_hba *cs, struct myrb_cmdblk *cmd_blk);
0726 void (*write_cmd_mbox)(union myrb_cmd_mbox *next_mbox,
0727 union myrb_cmd_mbox *cmd_mbox);
0728 void (*get_cmd_mbox)(void __iomem *base);
0729 void (*disable_intr)(void __iomem *base);
0730 void (*reset)(void __iomem *base);
0731
0732 unsigned int ctlr_num;
0733 unsigned char model_name[20];
0734 unsigned char fw_version[12];
0735
0736 unsigned int irq;
0737 phys_addr_t io_addr;
0738 phys_addr_t pci_addr;
0739 void __iomem *io_base;
0740 void __iomem *mmio_base;
0741
0742 size_t cmd_mbox_size;
0743 dma_addr_t cmd_mbox_addr;
0744 union myrb_cmd_mbox *first_cmd_mbox;
0745 union myrb_cmd_mbox *last_cmd_mbox;
0746 union myrb_cmd_mbox *next_cmd_mbox;
0747 union myrb_cmd_mbox *prev_cmd_mbox1;
0748 union myrb_cmd_mbox *prev_cmd_mbox2;
0749
0750 size_t stat_mbox_size;
0751 dma_addr_t stat_mbox_addr;
0752 struct myrb_stat_mbox *first_stat_mbox;
0753 struct myrb_stat_mbox *last_stat_mbox;
0754 struct myrb_stat_mbox *next_stat_mbox;
0755
0756 struct myrb_cmdblk dcmd_blk;
0757 struct myrb_cmdblk mcmd_blk;
0758 struct mutex dcmd_mutex;
0759
0760 struct myrb_enquiry *enquiry;
0761 dma_addr_t enquiry_addr;
0762
0763 struct myrb_error_entry *err_table;
0764 dma_addr_t err_table_addr;
0765
0766 unsigned short last_rbld_status;
0767
0768 struct myrb_ldev_info *ldev_info_buf;
0769 dma_addr_t ldev_info_addr;
0770
0771 struct myrb_bgi_status bgi_status;
0772
0773 struct mutex dma_mutex;
0774 };
0775
0776
0777
0778
0779 #define DAC960_LA_mmio_size 0x80
0780
0781 enum DAC960_LA_reg_offset {
0782 DAC960_LA_IRQMASK_OFFSET = 0x34,
0783 DAC960_LA_CMDOP_OFFSET = 0x50,
0784 DAC960_LA_CMDID_OFFSET = 0x51,
0785 DAC960_LA_MBOX2_OFFSET = 0x52,
0786 DAC960_LA_MBOX3_OFFSET = 0x53,
0787 DAC960_LA_MBOX4_OFFSET = 0x54,
0788 DAC960_LA_MBOX5_OFFSET = 0x55,
0789 DAC960_LA_MBOX6_OFFSET = 0x56,
0790 DAC960_LA_MBOX7_OFFSET = 0x57,
0791 DAC960_LA_MBOX8_OFFSET = 0x58,
0792 DAC960_LA_MBOX9_OFFSET = 0x59,
0793 DAC960_LA_MBOX10_OFFSET = 0x5A,
0794 DAC960_LA_MBOX11_OFFSET = 0x5B,
0795 DAC960_LA_MBOX12_OFFSET = 0x5C,
0796 DAC960_LA_STSID_OFFSET = 0x5D,
0797 DAC960_LA_STS_OFFSET = 0x5E,
0798 DAC960_LA_IDB_OFFSET = 0x60,
0799 DAC960_LA_ODB_OFFSET = 0x61,
0800 DAC960_LA_ERRSTS_OFFSET = 0x63,
0801 };
0802
0803
0804
0805
0806 #define DAC960_LA_IDB_HWMBOX_NEW_CMD 0x01
0807 #define DAC960_LA_IDB_HWMBOX_ACK_STS 0x02
0808 #define DAC960_LA_IDB_GEN_IRQ 0x04
0809 #define DAC960_LA_IDB_CTRL_RESET 0x08
0810 #define DAC960_LA_IDB_MMBOX_NEW_CMD 0x10
0811
0812 #define DAC960_LA_IDB_HWMBOX_EMPTY 0x01
0813 #define DAC960_LA_IDB_INIT_DONE 0x02
0814
0815
0816
0817
0818 #define DAC960_LA_ODB_HWMBOX_ACK_IRQ 0x01
0819 #define DAC960_LA_ODB_MMBOX_ACK_IRQ 0x02
0820 #define DAC960_LA_ODB_HWMBOX_STS_AVAIL 0x01
0821 #define DAC960_LA_ODB_MMBOX_STS_AVAIL 0x02
0822
0823
0824
0825
0826 #define DAC960_LA_IRQMASK_DISABLE_IRQ 0x04
0827
0828
0829
0830
0831 #define DAC960_LA_ERRSTS_PENDING 0x02
0832
0833
0834
0835
0836 #define DAC960_PG_mmio_size 0x2000
0837
0838 enum DAC960_PG_reg_offset {
0839 DAC960_PG_IDB_OFFSET = 0x0020,
0840 DAC960_PG_ODB_OFFSET = 0x002C,
0841 DAC960_PG_IRQMASK_OFFSET = 0x0034,
0842 DAC960_PG_CMDOP_OFFSET = 0x1000,
0843 DAC960_PG_CMDID_OFFSET = 0x1001,
0844 DAC960_PG_MBOX2_OFFSET = 0x1002,
0845 DAC960_PG_MBOX3_OFFSET = 0x1003,
0846 DAC960_PG_MBOX4_OFFSET = 0x1004,
0847 DAC960_PG_MBOX5_OFFSET = 0x1005,
0848 DAC960_PG_MBOX6_OFFSET = 0x1006,
0849 DAC960_PG_MBOX7_OFFSET = 0x1007,
0850 DAC960_PG_MBOX8_OFFSET = 0x1008,
0851 DAC960_PG_MBOX9_OFFSET = 0x1009,
0852 DAC960_PG_MBOX10_OFFSET = 0x100A,
0853 DAC960_PG_MBOX11_OFFSET = 0x100B,
0854 DAC960_PG_MBOX12_OFFSET = 0x100C,
0855 DAC960_PG_STSID_OFFSET = 0x1018,
0856 DAC960_PG_STS_OFFSET = 0x101A,
0857 DAC960_PG_ERRSTS_OFFSET = 0x103F,
0858 };
0859
0860
0861
0862
0863 #define DAC960_PG_IDB_HWMBOX_NEW_CMD 0x01
0864 #define DAC960_PG_IDB_HWMBOX_ACK_STS 0x02
0865 #define DAC960_PG_IDB_GEN_IRQ 0x04
0866 #define DAC960_PG_IDB_CTRL_RESET 0x08
0867 #define DAC960_PG_IDB_MMBOX_NEW_CMD 0x10
0868
0869 #define DAC960_PG_IDB_HWMBOX_FULL 0x01
0870 #define DAC960_PG_IDB_INIT_IN_PROGRESS 0x02
0871
0872
0873
0874
0875 #define DAC960_PG_ODB_HWMBOX_ACK_IRQ 0x01
0876 #define DAC960_PG_ODB_MMBOX_ACK_IRQ 0x02
0877 #define DAC960_PG_ODB_HWMBOX_STS_AVAIL 0x01
0878 #define DAC960_PG_ODB_MMBOX_STS_AVAIL 0x02
0879
0880
0881
0882
0883 #define DAC960_PG_IRQMASK_MSI_MASK1 0x03
0884 #define DAC960_PG_IRQMASK_DISABLE_IRQ 0x04
0885 #define DAC960_PG_IRQMASK_MSI_MASK2 0xF8
0886
0887
0888
0889
0890 #define DAC960_PG_ERRSTS_PENDING 0x04
0891
0892
0893
0894
0895 #define DAC960_PD_mmio_size 0x80
0896
0897 enum DAC960_PD_reg_offset {
0898 DAC960_PD_CMDOP_OFFSET = 0x00,
0899 DAC960_PD_CMDID_OFFSET = 0x01,
0900 DAC960_PD_MBOX2_OFFSET = 0x02,
0901 DAC960_PD_MBOX3_OFFSET = 0x03,
0902 DAC960_PD_MBOX4_OFFSET = 0x04,
0903 DAC960_PD_MBOX5_OFFSET = 0x05,
0904 DAC960_PD_MBOX6_OFFSET = 0x06,
0905 DAC960_PD_MBOX7_OFFSET = 0x07,
0906 DAC960_PD_MBOX8_OFFSET = 0x08,
0907 DAC960_PD_MBOX9_OFFSET = 0x09,
0908 DAC960_PD_MBOX10_OFFSET = 0x0A,
0909 DAC960_PD_MBOX11_OFFSET = 0x0B,
0910 DAC960_PD_MBOX12_OFFSET = 0x0C,
0911 DAC960_PD_STSID_OFFSET = 0x0D,
0912 DAC960_PD_STS_OFFSET = 0x0E,
0913 DAC960_PD_ERRSTS_OFFSET = 0x3F,
0914 DAC960_PD_IDB_OFFSET = 0x40,
0915 DAC960_PD_ODB_OFFSET = 0x41,
0916 DAC960_PD_IRQEN_OFFSET = 0x43,
0917 };
0918
0919
0920
0921
0922 #define DAC960_PD_IDB_HWMBOX_NEW_CMD 0x01
0923 #define DAC960_PD_IDB_HWMBOX_ACK_STS 0x02
0924 #define DAC960_PD_IDB_GEN_IRQ 0x04
0925 #define DAC960_PD_IDB_CTRL_RESET 0x08
0926
0927 #define DAC960_PD_IDB_HWMBOX_FULL 0x01
0928 #define DAC960_PD_IDB_INIT_IN_PROGRESS 0x02
0929
0930
0931
0932
0933 #define DAC960_PD_ODB_HWMBOX_ACK_IRQ 0x01
0934 #define DAC960_PD_ODB_HWMBOX_STS_AVAIL 0x01
0935
0936
0937
0938
0939 #define DAC960_PD_IRQMASK_ENABLE_IRQ 0x01
0940
0941
0942
0943
0944 #define DAC960_PD_ERRSTS_PENDING 0x04
0945
0946 typedef int (*myrb_hw_init_t)(struct pci_dev *pdev,
0947 struct myrb_hba *cb, void __iomem *base);
0948 typedef unsigned short (*mbox_mmio_init_t)(struct pci_dev *pdev,
0949 void __iomem *base,
0950 union myrb_cmd_mbox *mbox);
0951
0952 struct myrb_privdata {
0953 myrb_hw_init_t hw_init;
0954 irq_handler_t irq_handler;
0955 unsigned int mmio_size;
0956 };
0957
0958 #endif