2019-12-28 08:55:38 +03:00
/* SPDX-License-Identifier: GPL-2.0 */
/*
2018-10-17 18:25:11 +03:00
* Linux Driver for Mylex DAC960 / AcceleRAID / eXtremeRAID PCI RAID Controllers
*
* Copyright 2017 Hannes Reinecke , SUSE Linux GmbH < hare @ suse . com >
*
* Based on the original DAC960 driver ,
* Copyright 1998 - 2001 by Leonard N . Zubkoff < lnz @ dandelion . com >
* Portions Copyright 2002 by Mylex ( An IBM Business Unit )
*
*/
# ifndef MYRB_H
# define MYRB_H
# define MYRB_MAX_LDEVS 32
# define MYRB_MAX_CHANNELS 3
# define MYRB_MAX_TARGETS 16
# define MYRB_MAX_PHYSICAL_DEVICES 45
# define MYRB_SCATTER_GATHER_LIMIT 32
# define MYRB_CMD_MBOX_COUNT 256
# define MYRB_STAT_MBOX_COUNT 1024
# define MYRB_BLKSIZE_BITS 9
# define MYRB_MAILBOX_TIMEOUT 1000000
# define MYRB_DCMD_TAG 1
# define MYRB_MCMD_TAG 2
# define MYRB_PRIMARY_MONITOR_INTERVAL (10 * HZ)
# define MYRB_SECONDARY_MONITOR_INTERVAL (60 * HZ)
/*
* DAC960 V1 Firmware Command Opcodes .
*/
enum myrb_cmd_opcode {
/* I/O Commands */
MYRB_CMD_READ_EXTENDED = 0x33 ,
MYRB_CMD_WRITE_EXTENDED = 0x34 ,
MYRB_CMD_READAHEAD_EXTENDED = 0x35 ,
MYRB_CMD_READ_EXTENDED_SG = 0xB3 ,
MYRB_CMD_WRITE_EXTENDED_SG = 0xB4 ,
MYRB_CMD_READ = 0x36 ,
MYRB_CMD_READ_SG = 0xB6 ,
MYRB_CMD_WRITE = 0x37 ,
MYRB_CMD_WRITE_SG = 0xB7 ,
MYRB_CMD_DCDB = 0x04 ,
MYRB_CMD_DCDB_SG = 0x84 ,
MYRB_CMD_FLUSH = 0x0A ,
/* Controller Status Related Commands */
MYRB_CMD_ENQUIRY = 0x53 ,
MYRB_CMD_ENQUIRY2 = 0x1C ,
MYRB_CMD_GET_LDRV_ELEMENT = 0x55 ,
MYRB_CMD_GET_LDEV_INFO = 0x19 ,
MYRB_CMD_IOPORTREAD = 0x39 ,
MYRB_CMD_IOPORTWRITE = 0x3A ,
MYRB_CMD_GET_SD_STATS = 0x3E ,
MYRB_CMD_GET_PD_STATS = 0x3F ,
MYRB_CMD_EVENT_LOG_OPERATION = 0x72 ,
/* Device Related Commands */
MYRB_CMD_START_DEVICE = 0x10 ,
MYRB_CMD_GET_DEVICE_STATE = 0x50 ,
MYRB_CMD_STOP_CHANNEL = 0x13 ,
MYRB_CMD_START_CHANNEL = 0x12 ,
MYRB_CMD_RESET_CHANNEL = 0x1A ,
/* Commands Associated with Data Consistency and Errors */
MYRB_CMD_REBUILD = 0x09 ,
MYRB_CMD_REBUILD_ASYNC = 0x16 ,
MYRB_CMD_CHECK_CONSISTENCY = 0x0F ,
MYRB_CMD_CHECK_CONSISTENCY_ASYNC = 0x1E ,
MYRB_CMD_REBUILD_STAT = 0x0C ,
MYRB_CMD_GET_REBUILD_PROGRESS = 0x27 ,
MYRB_CMD_REBUILD_CONTROL = 0x1F ,
MYRB_CMD_READ_BADBLOCK_TABLE = 0x0B ,
MYRB_CMD_READ_BADDATA_TABLE = 0x25 ,
MYRB_CMD_CLEAR_BADDATA_TABLE = 0x26 ,
MYRB_CMD_GET_ERROR_TABLE = 0x17 ,
MYRB_CMD_ADD_CAPACITY_ASYNC = 0x2A ,
MYRB_CMD_BGI_CONTROL = 0x2B ,
/* Configuration Related Commands */
MYRB_CMD_READ_CONFIG2 = 0x3D ,
MYRB_CMD_WRITE_CONFIG2 = 0x3C ,
MYRB_CMD_READ_CONFIG_ONDISK = 0x4A ,
MYRB_CMD_WRITE_CONFIG_ONDISK = 0x4B ,
MYRB_CMD_READ_CONFIG = 0x4E ,
MYRB_CMD_READ_BACKUP_CONFIG = 0x4D ,
MYRB_CMD_WRITE_CONFIG = 0x4F ,
MYRB_CMD_ADD_CONFIG = 0x4C ,
MYRB_CMD_READ_CONFIG_LABEL = 0x48 ,
MYRB_CMD_WRITE_CONFIG_LABEL = 0x49 ,
/* Firmware Upgrade Related Commands */
MYRB_CMD_LOAD_IMAGE = 0x20 ,
MYRB_CMD_STORE_IMAGE = 0x21 ,
MYRB_CMD_PROGRAM_IMAGE = 0x22 ,
/* Diagnostic Commands */
MYRB_CMD_SET_DIAGNOSTIC_MODE = 0x31 ,
MYRB_CMD_RUN_DIAGNOSTIC = 0x32 ,
/* Subsystem Service Commands */
MYRB_CMD_GET_SUBSYS_DATA = 0x70 ,
MYRB_CMD_SET_SUBSYS_PARAM = 0x71 ,
/* Version 2.xx Firmware Commands */
MYRB_CMD_ENQUIRY_OLD = 0x05 ,
MYRB_CMD_GET_DEVICE_STATE_OLD = 0x14 ,
MYRB_CMD_READ_OLD = 0x02 ,
MYRB_CMD_WRITE_OLD = 0x03 ,
MYRB_CMD_READ_SG_OLD = 0x82 ,
MYRB_CMD_WRITE_SG_OLD = 0x83
} __packed ;
/*
* DAC960 V1 Firmware Command Status Codes .
*/
# define MYRB_STATUS_SUCCESS 0x0000 /* Common */
# define MYRB_STATUS_CHECK_CONDITION 0x0002 /* Common */
# define MYRB_STATUS_NO_DEVICE 0x0102 /* Common */
# define MYRB_STATUS_INVALID_ADDRESS 0x0105 /* Common */
# define MYRB_STATUS_INVALID_PARAM 0x0105 /* Common */
# define MYRB_STATUS_IRRECOVERABLE_DATA_ERROR 0x0001 /* I/O */
# define MYRB_STATUS_LDRV_NONEXISTENT_OR_OFFLINE 0x0002 /* I/O */
# define MYRB_STATUS_ACCESS_BEYOND_END_OF_LDRV 0x0105 /* I/O */
# define MYRB_STATUS_BAD_DATA 0x010C /* I/O */
# define MYRB_STATUS_DEVICE_BUSY 0x0008 /* DCDB */
# define MYRB_STATUS_DEVICE_NONRESPONSIVE 0x000E /* DCDB */
# define MYRB_STATUS_COMMAND_TERMINATED 0x000F /* DCDB */
# define MYRB_STATUS_START_DEVICE_FAILED 0x0002 /* Device */
# define MYRB_STATUS_INVALID_CHANNEL_OR_TARGET 0x0105 /* Device */
# define MYRB_STATUS_CHANNEL_BUSY 0x0106 /* Device */
# define MYRB_STATUS_OUT_OF_MEMORY 0x0107 /* Device */
# define MYRB_STATUS_CHANNEL_NOT_STOPPED 0x0002 /* Device */
# define MYRB_STATUS_ATTEMPT_TO_RBLD_ONLINE_DRIVE 0x0002 /* Consistency */
# define MYRB_STATUS_RBLD_BADBLOCKS 0x0003 /* Consistency */
# define MYRB_STATUS_RBLD_NEW_DISK_FAILED 0x0004 /* Consistency */
# define MYRB_STATUS_RBLD_OR_CHECK_INPROGRESS 0x0106 /* Consistency */
# define MYRB_STATUS_DEPENDENT_DISK_DEAD 0x0002 /* Consistency */
# define MYRB_STATUS_INCONSISTENT_BLOCKS 0x0003 /* Consistency */
# define MYRB_STATUS_INVALID_OR_NONREDUNDANT_LDRV 0x0105 /* Consistency */
# define MYRB_STATUS_NO_RBLD_OR_CHECK_INPROGRESS 0x0105 /* Consistency */
# define MYRB_STATUS_RBLD_IN_PROGRESS_DATA_VALID 0x0000 /* Consistency */
# define MYRB_STATUS_RBLD_FAILED_LDEV_FAILURE 0x0002 /* Consistency */
# define MYRB_STATUS_RBLD_FAILED_BADBLOCKS 0x0003 /* Consistency */
# define MYRB_STATUS_RBLD_FAILED_NEW_DRIVE_FAILED 0x0004 /* Consistency */
# define MYRB_STATUS_RBLD_SUCCESS 0x0100 /* Consistency */
# define MYRB_STATUS_RBLD_SUCCESS_TERMINATED 0x0107 /* Consistency */
# define MYRB_STATUS_RBLD_NOT_CHECKED 0x0108 /* Consistency */
# define MYRB_STATUS_BGI_SUCCESS 0x0100 /* Consistency */
# define MYRB_STATUS_BGI_ABORTED 0x0005 /* Consistency */
# define MYRB_STATUS_NO_BGI_INPROGRESS 0x0105 /* Consistency */
# define MYRB_STATUS_ADD_CAPACITY_INPROGRESS 0x0004 /* Consistency */
# define MYRB_STATUS_ADD_CAPACITY_FAILED_OR_SUSPENDED 0x00F4 /* Consistency */
# define MYRB_STATUS_CONFIG2_CSUM_ERROR 0x0002 /* Configuration */
# define MYRB_STATUS_CONFIGURATION_SUSPENDED 0x0106 /* Configuration */
# define MYRB_STATUS_FAILED_TO_CONFIGURE_NVRAM 0x0105 /* Configuration */
# define MYRB_STATUS_CONFIGURATION_NOT_SAVED 0x0106 /* Configuration */
# define MYRB_STATUS_SUBSYS_NOTINSTALLED 0x0001 /* Subsystem */
# define MYRB_STATUS_SUBSYS_FAILED 0x0002 /* Subsystem */
# define MYRB_STATUS_SUBSYS_BUSY 0x0106 /* Subsystem */
# define MYRB_STATUS_SUBSYS_TIMEOUT 0x0108 /* Subsystem */
/*
* DAC960 V1 Firmware Enquiry Command reply structure .
*/
struct myrb_enquiry {
unsigned char ldev_count ; /* Byte 0 */
unsigned int rsvd1 : 24 ; /* Bytes 1-3 */
unsigned int ldev_sizes [ 32 ] ; /* Bytes 4-131 */
unsigned short flash_age ; /* Bytes 132-133 */
struct {
unsigned char deferred : 1 ; /* Byte 134 Bit 0 */
unsigned char low_bat : 1 ; /* Byte 134 Bit 1 */
unsigned char rsvd2 : 6 ; /* Byte 134 Bits 2-7 */
} status ;
unsigned char rsvd3 : 8 ; /* Byte 135 */
unsigned char fw_minor_version ; /* Byte 136 */
unsigned char fw_major_version ; /* Byte 137 */
enum {
MYRB_NO_STDBY_RBLD_OR_CHECK_IN_PROGRESS = 0x00 ,
MYRB_STDBY_RBLD_IN_PROGRESS = 0x01 ,
MYRB_BG_RBLD_IN_PROGRESS = 0x02 ,
MYRB_BG_CHECK_IN_PROGRESS = 0x03 ,
MYRB_STDBY_RBLD_COMPLETED_WITH_ERROR = 0xFF ,
MYRB_BG_RBLD_OR_CHECK_FAILED_DRIVE_FAILED = 0xF0 ,
MYRB_BG_RBLD_OR_CHECK_FAILED_LDEV_FAILED = 0xF1 ,
MYRB_BG_RBLD_OR_CHECK_FAILED_OTHER = 0xF2 ,
MYRB_BG_RBLD_OR_CHECK_SUCCESS_TERMINATED = 0xF3
} __packed rbld ; /* Byte 138 */
unsigned char max_tcq ; /* Byte 139 */
unsigned char ldev_offline ; /* Byte 140 */
unsigned char rsvd4 : 8 ; /* Byte 141 */
unsigned short ev_seq ; /* Bytes 142-143 */
unsigned char ldev_critical ; /* Byte 144 */
unsigned int rsvd5 : 24 ; /* Bytes 145-147 */
unsigned char pdev_dead ; /* Byte 148 */
unsigned char rsvd6 : 8 ; /* Byte 149 */
unsigned char rbld_count ; /* Byte 150 */
struct {
unsigned char rsvd7 : 3 ; /* Byte 151 Bits 0-2 */
unsigned char bbu_present : 1 ; /* Byte 151 Bit 3 */
unsigned char rsvd8 : 4 ; /* Byte 151 Bits 4-7 */
} misc ;
struct {
unsigned char target ;
unsigned char channel ;
} dead_drives [ 21 ] ; /* Bytes 152-194 */
unsigned char rsvd9 [ 62 ] ; /* Bytes 195-255 */
} __packed ;
/*
* DAC960 V1 Firmware Enquiry2 Command reply structure .
*/
struct myrb_enquiry2 {
struct {
enum {
DAC960_V1_P_PD_PU = 0x01 ,
DAC960_V1_PL = 0x02 ,
DAC960_V1_PG = 0x10 ,
DAC960_V1_PJ = 0x11 ,
DAC960_V1_PR = 0x12 ,
DAC960_V1_PT = 0x13 ,
DAC960_V1_PTL0 = 0x14 ,
DAC960_V1_PRL = 0x15 ,
DAC960_V1_PTL1 = 0x16 ,
DAC960_V1_1164P = 0x20
} __packed sub_model ; /* Byte 0 */
unsigned char actual_channels ; /* Byte 1 */
enum {
MYRB_5_CHANNEL_BOARD = 0x01 ,
MYRB_3_CHANNEL_BOARD = 0x02 ,
MYRB_2_CHANNEL_BOARD = 0x03 ,
MYRB_3_CHANNEL_ASIC_DAC = 0x04
} __packed model ; /* Byte 2 */
enum {
MYRB_EISA_CONTROLLER = 0x01 ,
MYRB_MCA_CONTROLLER = 0x02 ,
MYRB_PCI_CONTROLLER = 0x03 ,
MYRB_SCSI_TO_SCSI = 0x08
} __packed controller ; /* Byte 3 */
} hw ; /* Bytes 0-3 */
/* MajorVersion.MinorVersion-FirmwareType-TurnID */
struct {
unsigned char major_version ; /* Byte 4 */
unsigned char minor_version ; /* Byte 5 */
unsigned char turn_id ; /* Byte 6 */
char firmware_type ; /* Byte 7 */
} fw ; /* Bytes 4-7 */
unsigned int rsvd1 ; /* Byte 8-11 */
unsigned char cfg_chan ; /* Byte 12 */
unsigned char cur_chan ; /* Byte 13 */
unsigned char max_targets ; /* Byte 14 */
unsigned char max_tcq ; /* Byte 15 */
unsigned char max_ldev ; /* Byte 16 */
unsigned char max_arms ; /* Byte 17 */
unsigned char max_spans ; /* Byte 18 */
unsigned char rsvd2 ; /* Byte 19 */
unsigned int rsvd3 ; /* Bytes 20-23 */
unsigned int mem_size ; /* Bytes 24-27 */
unsigned int cache_size ; /* Bytes 28-31 */
unsigned int flash_size ; /* Bytes 32-35 */
unsigned int nvram_size ; /* Bytes 36-39 */
struct {
enum {
MYRB_RAM_TYPE_DRAM = 0x0 ,
MYRB_RAM_TYPE_EDO = 0x1 ,
MYRB_RAM_TYPE_SDRAM = 0x2 ,
MYRB_RAM_TYPE_Last = 0x7
} __packed ram : 3 ; /* Byte 40 Bits 0-2 */
enum {
MYRB_ERR_CORR_None = 0x0 ,
MYRB_ERR_CORR_Parity = 0x1 ,
MYRB_ERR_CORR_ECC = 0x2 ,
MYRB_ERR_CORR_Last = 0x7
} __packed ec : 3 ; /* Byte 40 Bits 3-5 */
unsigned char fast_page : 1 ; /* Byte 40 Bit 6 */
unsigned char low_power : 1 ; /* Byte 40 Bit 7 */
unsigned char rsvd4 ; /* Bytes 41 */
} mem_type ;
unsigned short clock_speed ; /* Bytes 42-43 */
unsigned short mem_speed ; /* Bytes 44-45 */
unsigned short hw_speed ; /* Bytes 46-47 */
unsigned char rsvd5 [ 12 ] ; /* Bytes 48-59 */
unsigned short max_cmds ; /* Bytes 60-61 */
unsigned short max_sge ; /* Bytes 62-63 */
unsigned short max_drv_cmds ; /* Bytes 64-65 */
unsigned short max_io_desc ; /* Bytes 66-67 */
unsigned short max_sectors ; /* Bytes 68-69 */
unsigned char latency ; /* Byte 70 */
unsigned char rsvd6 ; /* Byte 71 */
unsigned char scsi_tmo ; /* Byte 72 */
unsigned char rsvd7 ; /* Byte 73 */
unsigned short min_freelines ; /* Bytes 74-75 */
unsigned char rsvd8 [ 8 ] ; /* Bytes 76-83 */
unsigned char rbld_rate_const ; /* Byte 84 */
unsigned char rsvd9 [ 11 ] ; /* Byte 85-95 */
unsigned short pdrv_block_size ; /* Bytes 96-97 */
unsigned short ldev_block_size ; /* Bytes 98-99 */
unsigned short max_blocks_per_cmd ; /* Bytes 100-101 */
unsigned short block_factor ; /* Bytes 102-103 */
unsigned short cacheline_size ; /* Bytes 104-105 */
struct {
enum {
MYRB_WIDTH_NARROW_8BIT = 0x0 ,
MYRB_WIDTH_WIDE_16BIT = 0x1 ,
MYRB_WIDTH_WIDE_32BIT = 0x2
} __packed bus_width : 2 ; /* Byte 106 Bits 0-1 */
enum {
MYRB_SCSI_SPEED_FAST = 0x0 ,
MYRB_SCSI_SPEED_ULTRA = 0x1 ,
MYRB_SCSI_SPEED_ULTRA2 = 0x2
} __packed bus_speed : 2 ; /* Byte 106 Bits 2-3 */
unsigned char differential : 1 ; /* Byte 106 Bit 4 */
unsigned char rsvd10 : 3 ; /* Byte 106 Bits 5-7 */
} scsi_cap ;
unsigned char rsvd11 [ 5 ] ; /* Byte 107-111 */
unsigned short fw_build ; /* Bytes 112-113 */
enum {
MYRB_FAULT_AEMI = 0x01 ,
MYRB_FAULT_OEM1 = 0x02 ,
MYRB_FAULT_OEM2 = 0x04 ,
MYRB_FAULT_OEM3 = 0x08 ,
MYRB_FAULT_CONNER = 0x10 ,
MYRB_FAULT_SAFTE = 0x20
} __packed fault_mgmt ; /* Byte 114 */
unsigned char rsvd12 ; /* Byte 115 */
struct {
unsigned int clustering : 1 ; /* Byte 116 Bit 0 */
unsigned int online_RAID_expansion : 1 ; /* Byte 116 Bit 1 */
unsigned int readahead : 1 ; /* Byte 116 Bit 2 */
unsigned int bgi : 1 ; /* Byte 116 Bit 3 */
unsigned int rsvd13 : 28 ; /* Bytes 116-119 */
} fw_features ;
unsigned char rsvd14 [ 8 ] ; /* Bytes 120-127 */
} __packed ;
/*
* DAC960 V1 Firmware Logical Drive State type .
*/
enum myrb_devstate {
MYRB_DEVICE_DEAD = 0x00 ,
MYRB_DEVICE_WO = 0x02 ,
MYRB_DEVICE_ONLINE = 0x03 ,
MYRB_DEVICE_CRITICAL = 0x04 ,
MYRB_DEVICE_STANDBY = 0x10 ,
MYRB_DEVICE_OFFLINE = 0xFF
} __packed ;
/*
* DAC960 V1 RAID Levels
*/
enum myrb_raidlevel {
MYRB_RAID_LEVEL0 = 0x0 , /* RAID 0 */
MYRB_RAID_LEVEL1 = 0x1 , /* RAID 1 */
MYRB_RAID_LEVEL3 = 0x3 , /* RAID 3 */
MYRB_RAID_LEVEL5 = 0x5 , /* RAID 5 */
MYRB_RAID_LEVEL6 = 0x6 , /* RAID 6 */
MYRB_RAID_JBOD = 0x7 , /* RAID 7 (JBOD) */
} __packed ;
/*
* DAC960 V1 Firmware Logical Drive Information structure .
*/
struct myrb_ldev_info {
unsigned int size ; /* Bytes 0-3 */
enum myrb_devstate state ; /* Byte 4 */
unsigned int raid_level : 7 ; /* Byte 5 Bits 0-6 */
unsigned int wb_enabled : 1 ; /* Byte 5 Bit 7 */
unsigned int rsvd : 16 ; /* Bytes 6-7 */
} ;
/*
* DAC960 V1 Firmware Perform Event Log Operation Types .
*/
# define DAC960_V1_GetEventLogEntry 0x00
/*
* DAC960 V1 Firmware Get Event Log Entry Command reply structure .
*/
struct myrb_log_entry {
unsigned char msg_type ; /* Byte 0 */
unsigned char msg_len ; /* Byte 1 */
unsigned char target : 5 ; /* Byte 2 Bits 0-4 */
unsigned char channel : 3 ; /* Byte 2 Bits 5-7 */
unsigned char lun : 6 ; /* Byte 3 Bits 0-5 */
unsigned char rsvd1 : 2 ; /* Byte 3 Bits 6-7 */
unsigned short seq_num ; /* Bytes 4-5 */
unsigned char sense [ 26 ] ; /* Bytes 6-31 */
} ;
/*
* DAC960 V1 Firmware Get Device State Command reply structure .
* The structure is padded by 2 bytes for compatibility with Version 2. xx
* Firmware .
*/
struct myrb_pdev_state {
unsigned int present : 1 ; /* Byte 0 Bit 0 */
unsigned int : 7 ; /* Byte 0 Bits 1-7 */
enum {
MYRB_TYPE_OTHER = 0x0 ,
MYRB_TYPE_DISK = 0x1 ,
MYRB_TYPE_TAPE = 0x2 ,
MYRB_TYPE_CDROM_OR_WORM = 0x3
} __packed devtype : 2 ; /* Byte 1 Bits 0-1 */
unsigned int rsvd1 : 1 ; /* Byte 1 Bit 2 */
unsigned int fast20 : 1 ; /* Byte 1 Bit 3 */
unsigned int sync : 1 ; /* Byte 1 Bit 4 */
unsigned int fast : 1 ; /* Byte 1 Bit 5 */
unsigned int wide : 1 ; /* Byte 1 Bit 6 */
unsigned int tcq_supported : 1 ; /* Byte 1 Bit 7 */
enum myrb_devstate state ; /* Byte 2 */
unsigned int rsvd2 : 8 ; /* Byte 3 */
unsigned int sync_multiplier ; /* Byte 4 */
unsigned int sync_offset : 5 ; /* Byte 5 Bits 0-4 */
unsigned int rsvd3 : 3 ; /* Byte 5 Bits 5-7 */
unsigned int size ; /* Bytes 6-9 */
unsigned int rsvd4 : 16 ; /* Bytes 10-11 */
} __packed ;
/*
* DAC960 V1 Firmware Get Rebuild Progress Command reply structure .
*/
struct myrb_rbld_progress {
unsigned int ldev_num ; /* Bytes 0-3 */
unsigned int ldev_size ; /* Bytes 4-7 */
unsigned int blocks_left ; /* Bytes 8-11 */
} ;
/*
* DAC960 V1 Firmware Background Initialization Status Command reply structure .
*/
struct myrb_bgi_status {
unsigned int ldev_size ; /* Bytes 0-3 */
unsigned int blocks_done ; /* Bytes 4-7 */
unsigned char rsvd1 [ 12 ] ; /* Bytes 8-19 */
unsigned int ldev_num ; /* Bytes 20-23 */
unsigned char raid_level ; /* Byte 24 */
enum {
MYRB_BGI_INVALID = 0x00 ,
MYRB_BGI_STARTED = 0x02 ,
MYRB_BGI_INPROGRESS = 0x04 ,
MYRB_BGI_SUSPENDED = 0x05 ,
MYRB_BGI_CANCELLED = 0x06
} __packed status ; /* Byte 25 */
unsigned char rsvd2 [ 6 ] ; /* Bytes 26-31 */
} ;
/*
* DAC960 V1 Firmware Error Table Entry structure .
*/
struct myrb_error_entry {
unsigned char parity_err ; /* Byte 0 */
unsigned char soft_err ; /* Byte 1 */
unsigned char hard_err ; /* Byte 2 */
unsigned char misc_err ; /* Byte 3 */
} ;
/*
* DAC960 V1 Firmware Read Config2 Command reply structure .
*/
struct myrb_config2 {
unsigned rsvd1 : 1 ; /* Byte 0 Bit 0 */
unsigned active_negation : 1 ; /* Byte 0 Bit 1 */
unsigned rsvd2 : 5 ; /* Byte 0 Bits 2-6 */
unsigned no_rescan_on_reset_during_scan : 1 ; /* Byte 0 Bit 7 */
unsigned StorageWorks_support : 1 ; /* Byte 1 Bit 0 */
unsigned HewlettPackard_support : 1 ; /* Byte 1 Bit 1 */
unsigned no_disconnect_on_first_command : 1 ; /* Byte 1 Bit 2 */
unsigned rsvd3 : 2 ; /* Byte 1 Bits 3-4 */
unsigned AEMI_ARM : 1 ; /* Byte 1 Bit 5 */
unsigned AEMI_OFM : 1 ; /* Byte 1 Bit 6 */
unsigned rsvd4 : 1 ; /* Byte 1 Bit 7 */
enum {
MYRB_OEMID_MYLEX = 0x00 ,
MYRB_OEMID_IBM = 0x08 ,
MYRB_OEMID_HP = 0x0A ,
MYRB_OEMID_DEC = 0x0C ,
MYRB_OEMID_SIEMENS = 0x10 ,
MYRB_OEMID_INTEL = 0x12
} __packed OEMID ; /* Byte 2 */
unsigned char oem_model_number ; /* Byte 3 */
unsigned char physical_sector ; /* Byte 4 */
unsigned char logical_sector ; /* Byte 5 */
unsigned char block_factor ; /* Byte 6 */
unsigned readahead_enabled : 1 ; /* Byte 7 Bit 0 */
unsigned low_BIOS_delay : 1 ; /* Byte 7 Bit 1 */
unsigned rsvd5 : 2 ; /* Byte 7 Bits 2-3 */
unsigned restrict_reassign_to_one_sector : 1 ; /* Byte 7 Bit 4 */
unsigned rsvd6 : 1 ; /* Byte 7 Bit 5 */
unsigned FUA_during_write_recovery : 1 ; /* Byte 7 Bit 6 */
unsigned enable_LeftSymmetricRAID5Algorithm : 1 ; /* Byte 7 Bit 7 */
unsigned char default_rebuild_rate ; /* Byte 8 */
unsigned char rsvd7 ; /* Byte 9 */
unsigned char blocks_per_cacheline ; /* Byte 10 */
unsigned char blocks_per_stripe ; /* Byte 11 */
struct {
enum {
MYRB_SPEED_ASYNC = 0x0 ,
MYRB_SPEED_SYNC_8MHz = 0x1 ,
MYRB_SPEED_SYNC_5MHz = 0x2 ,
MYRB_SPEED_SYNC_10_OR_20MHz = 0x3
} __packed speed : 2 ; /* Byte 11 Bits 0-1 */
unsigned force_8bit : 1 ; /* Byte 11 Bit 2 */
unsigned disable_fast20 : 1 ; /* Byte 11 Bit 3 */
unsigned rsvd8 : 3 ; /* Byte 11 Bits 4-6 */
unsigned enable_tcq : 1 ; /* Byte 11 Bit 7 */
} __packed channelparam [ 6 ] ; /* Bytes 12-17 */
unsigned char SCSIInitiatorID ; /* Byte 18 */
unsigned char rsvd9 ; /* Byte 19 */
enum {
MYRB_STARTUP_CONTROLLER_SPINUP = 0x00 ,
MYRB_STARTUP_POWERON_SPINUP = 0x01
} __packed startup ; /* Byte 20 */
unsigned char simultaneous_device_spinup_count ; /* Byte 21 */
unsigned char seconds_delay_between_spinups ; /* Byte 22 */
unsigned char rsvd10 [ 29 ] ; /* Bytes 23-51 */
unsigned BIOS_disabled : 1 ; /* Byte 52 Bit 0 */
unsigned CDROM_boot_enabled : 1 ; /* Byte 52 Bit 1 */
unsigned rsvd11 : 3 ; /* Byte 52 Bits 2-4 */
enum {
MYRB_GEOM_128_32 = 0x0 ,
MYRB_GEOM_255_63 = 0x1 ,
MYRB_GEOM_RESERVED1 = 0x2 ,
MYRB_GEOM_RESERVED2 = 0x3
} __packed drive_geometry : 2 ; /* Byte 52 Bits 5-6 */
unsigned rsvd12 : 1 ; /* Byte 52 Bit 7 */
unsigned char rsvd13 [ 9 ] ; /* Bytes 53-61 */
unsigned short csum ; /* Bytes 62-63 */
} ;
/*
* DAC960 V1 Firmware DCDB request structure .
*/
struct myrb_dcdb {
unsigned target : 4 ; /* Byte 0 Bits 0-3 */
unsigned channel : 4 ; /* Byte 0 Bits 4-7 */
enum {
MYRB_DCDB_XFER_NONE = 0 ,
MYRB_DCDB_XFER_DEVICE_TO_SYSTEM = 1 ,
MYRB_DCDB_XFER_SYSTEM_TO_DEVICE = 2 ,
MYRB_DCDB_XFER_ILLEGAL = 3
} __packed data_xfer : 2 ; /* Byte 1 Bits 0-1 */
unsigned early_status : 1 ; /* Byte 1 Bit 2 */
unsigned rsvd1 : 1 ; /* Byte 1 Bit 3 */
enum {
MYRB_DCDB_TMO_24_HRS = 0 ,
MYRB_DCDB_TMO_10_SECS = 1 ,
MYRB_DCDB_TMO_60_SECS = 2 ,
MYRB_DCDB_TMO_10_MINS = 3
} __packed timeout : 2 ; /* Byte 1 Bits 4-5 */
unsigned no_autosense : 1 ; /* Byte 1 Bit 6 */
unsigned allow_disconnect : 1 ; /* Byte 1 Bit 7 */
unsigned short xfer_len_lo ; /* Bytes 2-3 */
u32 dma_addr ; /* Bytes 4-7 */
unsigned char cdb_len : 4 ; /* Byte 8 Bits 0-3 */
unsigned char xfer_len_hi4 : 4 ; /* Byte 8 Bits 4-7 */
unsigned char sense_len ; /* Byte 9 */
unsigned char cdb [ 12 ] ; /* Bytes 10-21 */
unsigned char sense [ 64 ] ; /* Bytes 22-85 */
unsigned char status ; /* Byte 86 */
unsigned char rsvd2 ; /* Byte 87 */
} ;
/*
* DAC960 V1 Firmware Scatter / Gather List Type 1 32 Bit Address
* 32 Bit Byte Count structure .
*/
struct myrb_sge {
u32 sge_addr ; /* Bytes 0-3 */
u32 sge_count ; /* Bytes 4-7 */
} ;
/*
* 13 Byte DAC960 V1 Firmware Command Mailbox structure .
* Bytes 13 - 15 are not used . The structure is padded to 16 bytes for
* efficient access .
*/
union myrb_cmd_mbox {
unsigned int words [ 4 ] ; /* Words 0-3 */
unsigned char bytes [ 16 ] ; /* Bytes 0-15 */
struct {
enum myrb_cmd_opcode opcode ; /* Byte 0 */
unsigned char id ; /* Byte 1 */
unsigned char rsvd [ 14 ] ; /* Bytes 2-15 */
} __packed common ;
struct {
enum myrb_cmd_opcode opcode ; /* Byte 0 */
unsigned char id ; /* Byte 1 */
unsigned char rsvd1 [ 6 ] ; /* Bytes 2-7 */
u32 addr ; /* Bytes 8-11 */
unsigned char rsvd2 [ 4 ] ; /* Bytes 12-15 */
} __packed type3 ;
struct {
enum myrb_cmd_opcode opcode ; /* Byte 0 */
unsigned char id ; /* Byte 1 */
unsigned char optype ; /* Byte 2 */
unsigned char rsvd1 [ 5 ] ; /* Bytes 3-7 */
u32 addr ; /* Bytes 8-11 */
unsigned char rsvd2 [ 4 ] ; /* Bytes 12-15 */
} __packed type3B ;
struct {
enum myrb_cmd_opcode opcode ; /* Byte 0 */
unsigned char id ; /* Byte 1 */
unsigned char rsvd1 [ 5 ] ; /* Bytes 2-6 */
unsigned char ldev_num : 6 ; /* Byte 7 Bits 0-6 */
unsigned char auto_restore : 1 ; /* Byte 7 Bit 7 */
unsigned char rsvd2 [ 8 ] ; /* Bytes 8-15 */
} __packed type3C ;
struct {
enum myrb_cmd_opcode opcode ; /* Byte 0 */
unsigned char id ; /* Byte 1 */
unsigned char channel ; /* Byte 2 */
unsigned char target ; /* Byte 3 */
enum myrb_devstate state ; /* Byte 4 */
unsigned char rsvd1 [ 3 ] ; /* Bytes 5-7 */
u32 addr ; /* Bytes 8-11 */
unsigned char rsvd2 [ 4 ] ; /* Bytes 12-15 */
} __packed type3D ;
struct {
enum myrb_cmd_opcode opcode ; /* Byte 0 */
unsigned char id ; /* Byte 1 */
unsigned char optype ; /* Byte 2 */
unsigned char opqual ; /* Byte 3 */
unsigned short ev_seq ; /* Bytes 4-5 */
unsigned char rsvd1 [ 2 ] ; /* Bytes 6-7 */
u32 addr ; /* Bytes 8-11 */
unsigned char rsvd2 [ 4 ] ; /* Bytes 12-15 */
} __packed type3E ;
struct {
enum myrb_cmd_opcode opcode ; /* Byte 0 */
unsigned char id ; /* Byte 1 */
unsigned char rsvd1 [ 2 ] ; /* Bytes 2-3 */
unsigned char rbld_rate ; /* Byte 4 */
unsigned char rsvd2 [ 3 ] ; /* Bytes 5-7 */
u32 addr ; /* Bytes 8-11 */
unsigned char rsvd3 [ 4 ] ; /* Bytes 12-15 */
} __packed type3R ;
struct {
enum myrb_cmd_opcode opcode ; /* Byte 0 */
unsigned char id ; /* Byte 1 */
unsigned short xfer_len ; /* Bytes 2-3 */
unsigned int lba ; /* Bytes 4-7 */
u32 addr ; /* Bytes 8-11 */
unsigned char ldev_num ; /* Byte 12 */
unsigned char rsvd [ 3 ] ; /* Bytes 13-15 */
} __packed type4 ;
struct {
enum myrb_cmd_opcode opcode ; /* Byte 0 */
unsigned char id ; /* Byte 1 */
struct {
unsigned short xfer_len : 11 ; /* Bytes 2-3 */
unsigned char ldev_num : 5 ; /* Byte 3 Bits 3-7 */
} __packed ld ;
unsigned int lba ; /* Bytes 4-7 */
u32 addr ; /* Bytes 8-11 */
unsigned char sg_count : 6 ; /* Byte 12 Bits 0-5 */
enum {
MYRB_SGL_ADDR32_COUNT32 = 0x0 ,
MYRB_SGL_ADDR32_COUNT16 = 0x1 ,
MYRB_SGL_COUNT32_ADDR32 = 0x2 ,
MYRB_SGL_COUNT16_ADDR32 = 0x3
} __packed sg_type : 2 ; /* Byte 12 Bits 6-7 */
unsigned char rsvd [ 3 ] ; /* Bytes 13-15 */
} __packed type5 ;
struct {
enum myrb_cmd_opcode opcode ; /* Byte 0 */
unsigned char id ; /* Byte 1 */
unsigned char opcode2 ; /* Byte 2 */
unsigned char rsvd1 : 8 ; /* Byte 3 */
u32 cmd_mbox_addr ; /* Bytes 4-7 */
u32 stat_mbox_addr ; /* Bytes 8-11 */
unsigned char rsvd2 [ 4 ] ; /* Bytes 12-15 */
} __packed typeX ;
} ;
/*
* DAC960 V1 Firmware Controller Status Mailbox structure .
*/
struct myrb_stat_mbox {
unsigned char id ; /* Byte 0 */
unsigned char rsvd : 7 ; /* Byte 1 Bits 0-6 */
unsigned char valid : 1 ; /* Byte 1 Bit 7 */
unsigned short status ; /* Bytes 2-3 */
} ;
struct myrb_cmdblk {
union myrb_cmd_mbox mbox ;
unsigned short status ;
struct completion * completion ;
struct myrb_dcdb * dcdb ;
dma_addr_t dcdb_addr ;
struct myrb_sge * sgl ;
dma_addr_t sgl_addr ;
} ;
struct myrb_hba {
unsigned int ldev_block_size ;
unsigned char ldev_geom_heads ;
unsigned char ldev_geom_sectors ;
unsigned char bus_width ;
unsigned short stripe_size ;
unsigned short segment_size ;
unsigned short new_ev_seq ;
unsigned short old_ev_seq ;
bool dual_mode_interface ;
bool bgi_status_supported ;
bool safte_enabled ;
bool need_ldev_info ;
bool need_err_info ;
bool need_rbld ;
bool need_cc_status ;
bool need_bgi_status ;
bool rbld_first ;
struct pci_dev * pdev ;
struct Scsi_Host * host ;
struct workqueue_struct * work_q ;
char work_q_name [ 20 ] ;
struct delayed_work monitor_work ;
unsigned long primary_monitor_time ;
unsigned long secondary_monitor_time ;
struct dma_pool * sg_pool ;
struct dma_pool * dcdb_pool ;
spinlock_t queue_lock ;
void ( * qcmd ) ( struct myrb_hba * cs , struct myrb_cmdblk * cmd_blk ) ;
void ( * write_cmd_mbox ) ( union myrb_cmd_mbox * next_mbox ,
union myrb_cmd_mbox * cmd_mbox ) ;
void ( * get_cmd_mbox ) ( void __iomem * base ) ;
void ( * disable_intr ) ( void __iomem * base ) ;
void ( * reset ) ( void __iomem * base ) ;
unsigned int ctlr_num ;
unsigned char model_name [ 20 ] ;
unsigned char fw_version [ 12 ] ;
unsigned int irq ;
phys_addr_t io_addr ;
phys_addr_t pci_addr ;
void __iomem * io_base ;
void __iomem * mmio_base ;
size_t cmd_mbox_size ;
dma_addr_t cmd_mbox_addr ;
union myrb_cmd_mbox * first_cmd_mbox ;
union myrb_cmd_mbox * last_cmd_mbox ;
union myrb_cmd_mbox * next_cmd_mbox ;
union myrb_cmd_mbox * prev_cmd_mbox1 ;
union myrb_cmd_mbox * prev_cmd_mbox2 ;
size_t stat_mbox_size ;
dma_addr_t stat_mbox_addr ;
struct myrb_stat_mbox * first_stat_mbox ;
struct myrb_stat_mbox * last_stat_mbox ;
struct myrb_stat_mbox * next_stat_mbox ;
struct myrb_cmdblk dcmd_blk ;
struct myrb_cmdblk mcmd_blk ;
struct mutex dcmd_mutex ;
struct myrb_enquiry * enquiry ;
dma_addr_t enquiry_addr ;
struct myrb_error_entry * err_table ;
dma_addr_t err_table_addr ;
unsigned short last_rbld_status ;
struct myrb_ldev_info * ldev_info_buf ;
dma_addr_t ldev_info_addr ;
struct myrb_bgi_status bgi_status ;
struct mutex dma_mutex ;
} ;
/*
* DAC960 LA Series Controller Interface Register Offsets .
*/
# define DAC960_LA_mmio_size 0x80
enum DAC960_LA_reg_offset {
DAC960_LA_IRQMASK_OFFSET = 0x34 ,
DAC960_LA_CMDOP_OFFSET = 0x50 ,
DAC960_LA_CMDID_OFFSET = 0x51 ,
DAC960_LA_MBOX2_OFFSET = 0x52 ,
DAC960_LA_MBOX3_OFFSET = 0x53 ,
DAC960_LA_MBOX4_OFFSET = 0x54 ,
DAC960_LA_MBOX5_OFFSET = 0x55 ,
DAC960_LA_MBOX6_OFFSET = 0x56 ,
DAC960_LA_MBOX7_OFFSET = 0x57 ,
DAC960_LA_MBOX8_OFFSET = 0x58 ,
DAC960_LA_MBOX9_OFFSET = 0x59 ,
DAC960_LA_MBOX10_OFFSET = 0x5A ,
DAC960_LA_MBOX11_OFFSET = 0x5B ,
DAC960_LA_MBOX12_OFFSET = 0x5C ,
DAC960_LA_STSID_OFFSET = 0x5D ,
DAC960_LA_STS_OFFSET = 0x5E ,
DAC960_LA_IDB_OFFSET = 0x60 ,
DAC960_LA_ODB_OFFSET = 0x61 ,
DAC960_LA_ERRSTS_OFFSET = 0x63 ,
} ;
/*
* DAC960 LA Series Inbound Door Bell Register .
*/
# define DAC960_LA_IDB_HWMBOX_NEW_CMD 0x01
# define DAC960_LA_IDB_HWMBOX_ACK_STS 0x02
# define DAC960_LA_IDB_GEN_IRQ 0x04
# define DAC960_LA_IDB_CTRL_RESET 0x08
# define DAC960_LA_IDB_MMBOX_NEW_CMD 0x10
# define DAC960_LA_IDB_HWMBOX_EMPTY 0x01
# define DAC960_LA_IDB_INIT_DONE 0x02
/*
* DAC960 LA Series Outbound Door Bell Register .
*/
# define DAC960_LA_ODB_HWMBOX_ACK_IRQ 0x01
# define DAC960_LA_ODB_MMBOX_ACK_IRQ 0x02
# define DAC960_LA_ODB_HWMBOX_STS_AVAIL 0x01
# define DAC960_LA_ODB_MMBOX_STS_AVAIL 0x02
/*
* DAC960 LA Series Interrupt Mask Register .
*/
# define DAC960_LA_IRQMASK_DISABLE_IRQ 0x04
/*
* DAC960 LA Series Error Status Register .
*/
# define DAC960_LA_ERRSTS_PENDING 0x02
/*
* DAC960 PG Series Controller Interface Register Offsets .
*/
# define DAC960_PG_mmio_size 0x2000
enum DAC960_PG_reg_offset {
DAC960_PG_IDB_OFFSET = 0x0020 ,
DAC960_PG_ODB_OFFSET = 0x002C ,
DAC960_PG_IRQMASK_OFFSET = 0x0034 ,
DAC960_PG_CMDOP_OFFSET = 0x1000 ,
DAC960_PG_CMDID_OFFSET = 0x1001 ,
DAC960_PG_MBOX2_OFFSET = 0x1002 ,
DAC960_PG_MBOX3_OFFSET = 0x1003 ,
DAC960_PG_MBOX4_OFFSET = 0x1004 ,
DAC960_PG_MBOX5_OFFSET = 0x1005 ,
DAC960_PG_MBOX6_OFFSET = 0x1006 ,
DAC960_PG_MBOX7_OFFSET = 0x1007 ,
DAC960_PG_MBOX8_OFFSET = 0x1008 ,
DAC960_PG_MBOX9_OFFSET = 0x1009 ,
DAC960_PG_MBOX10_OFFSET = 0x100A ,
DAC960_PG_MBOX11_OFFSET = 0x100B ,
DAC960_PG_MBOX12_OFFSET = 0x100C ,
DAC960_PG_STSID_OFFSET = 0x1018 ,
DAC960_PG_STS_OFFSET = 0x101A ,
DAC960_PG_ERRSTS_OFFSET = 0x103F ,
} ;
/*
* DAC960 PG Series Inbound Door Bell Register .
*/
# define DAC960_PG_IDB_HWMBOX_NEW_CMD 0x01
# define DAC960_PG_IDB_HWMBOX_ACK_STS 0x02
# define DAC960_PG_IDB_GEN_IRQ 0x04
# define DAC960_PG_IDB_CTRL_RESET 0x08
# define DAC960_PG_IDB_MMBOX_NEW_CMD 0x10
# define DAC960_PG_IDB_HWMBOX_FULL 0x01
# define DAC960_PG_IDB_INIT_IN_PROGRESS 0x02
/*
* DAC960 PG Series Outbound Door Bell Register .
*/
# define DAC960_PG_ODB_HWMBOX_ACK_IRQ 0x01
# define DAC960_PG_ODB_MMBOX_ACK_IRQ 0x02
# define DAC960_PG_ODB_HWMBOX_STS_AVAIL 0x01
# define DAC960_PG_ODB_MMBOX_STS_AVAIL 0x02
/*
* DAC960 PG Series Interrupt Mask Register .
*/
# define DAC960_PG_IRQMASK_MSI_MASK1 0x03
# define DAC960_PG_IRQMASK_DISABLE_IRQ 0x04
# define DAC960_PG_IRQMASK_MSI_MASK2 0xF8
/*
* DAC960 PG Series Error Status Register .
*/
# define DAC960_PG_ERRSTS_PENDING 0x04
/*
* DAC960 PD Series Controller Interface Register Offsets .
*/
# define DAC960_PD_mmio_size 0x80
enum DAC960_PD_reg_offset {
DAC960_PD_CMDOP_OFFSET = 0x00 ,
DAC960_PD_CMDID_OFFSET = 0x01 ,
DAC960_PD_MBOX2_OFFSET = 0x02 ,
DAC960_PD_MBOX3_OFFSET = 0x03 ,
DAC960_PD_MBOX4_OFFSET = 0x04 ,
DAC960_PD_MBOX5_OFFSET = 0x05 ,
DAC960_PD_MBOX6_OFFSET = 0x06 ,
DAC960_PD_MBOX7_OFFSET = 0x07 ,
DAC960_PD_MBOX8_OFFSET = 0x08 ,
DAC960_PD_MBOX9_OFFSET = 0x09 ,
DAC960_PD_MBOX10_OFFSET = 0x0A ,
DAC960_PD_MBOX11_OFFSET = 0x0B ,
DAC960_PD_MBOX12_OFFSET = 0x0C ,
DAC960_PD_STSID_OFFSET = 0x0D ,
DAC960_PD_STS_OFFSET = 0x0E ,
DAC960_PD_ERRSTS_OFFSET = 0x3F ,
DAC960_PD_IDB_OFFSET = 0x40 ,
DAC960_PD_ODB_OFFSET = 0x41 ,
DAC960_PD_IRQEN_OFFSET = 0x43 ,
} ;
/*
* DAC960 PD Series Inbound Door Bell Register .
*/
# define DAC960_PD_IDB_HWMBOX_NEW_CMD 0x01
# define DAC960_PD_IDB_HWMBOX_ACK_STS 0x02
# define DAC960_PD_IDB_GEN_IRQ 0x04
# define DAC960_PD_IDB_CTRL_RESET 0x08
# define DAC960_PD_IDB_HWMBOX_FULL 0x01
# define DAC960_PD_IDB_INIT_IN_PROGRESS 0x02
/*
* DAC960 PD Series Outbound Door Bell Register .
*/
# define DAC960_PD_ODB_HWMBOX_ACK_IRQ 0x01
# define DAC960_PD_ODB_HWMBOX_STS_AVAIL 0x01
/*
* DAC960 PD Series Interrupt Enable Register .
*/
# define DAC960_PD_IRQMASK_ENABLE_IRQ 0x01
/*
* DAC960 PD Series Error Status Register .
*/
# define DAC960_PD_ERRSTS_PENDING 0x04
typedef int ( * myrb_hw_init_t ) ( struct pci_dev * pdev ,
struct myrb_hba * cb , void __iomem * base ) ;
typedef unsigned short ( * mbox_mmio_init_t ) ( struct pci_dev * pdev ,
void __iomem * base ,
union myrb_cmd_mbox * mbox ) ;
struct myrb_privdata {
myrb_hw_init_t hw_init ;
irq_handler_t irq_handler ;
unsigned int mmio_size ;
} ;
# endif /* MYRB_H */