scsi: myrb: Add Mylex RAID controller (block interface)
This patch adds support for the Mylex DAC960 RAID controller, supporting the older, block-based interface only. The driver is a re-implementation of the original DAC960 driver. Signed-off-by: Hannes Reinecke <hare@suse.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
e6760cc43e
commit
081ff398c5
|
@ -9892,6 +9892,12 @@ S: Supported
|
|||
F: drivers/gpu/drm/mxsfb/
|
||||
F: Documentation/devicetree/bindings/display/mxsfb.txt
|
||||
|
||||
MYLEX DAC960 PCI RAID Controller
|
||||
M: Hannes Reinecke <hare@kernel.org>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/scsi/myrb.*
|
||||
|
||||
MYRICOM MYRI-10G 10GbE DRIVER (MYRI10GE)
|
||||
M: Chris Lee <christopher.lee@cspi.com>
|
||||
L: netdev@vger.kernel.org
|
||||
|
|
|
@ -557,6 +557,21 @@ config SCSI_FLASHPOINT
|
|||
substantial, so users of MultiMaster Host Adapters may not
|
||||
wish to include it.
|
||||
|
||||
config SCSI_MYRB
|
||||
tristate "Mylex DAC960/DAC1100 PCI RAID Controller (Block Interface)"
|
||||
depends on PCI
|
||||
select RAID_ATTRS
|
||||
help
|
||||
This driver adds support for the Mylex DAC960, AcceleRAID, and
|
||||
eXtremeRAID PCI RAID controllers. This driver supports the
|
||||
older, block based interface.
|
||||
This driver is a reimplementation of the original DAC960
|
||||
driver. If you have used the DAC960 driver you should enable
|
||||
this module.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called myrb.
|
||||
|
||||
config VMWARE_PVSCSI
|
||||
tristate "VMware PVSCSI driver support"
|
||||
depends on PCI && SCSI && X86
|
||||
|
|
|
@ -106,6 +106,7 @@ obj-$(CONFIG_SCSI_INIA100) += a100u2w.o
|
|||
obj-$(CONFIG_SCSI_QLOGICPTI) += qlogicpti.o
|
||||
obj-$(CONFIG_SCSI_MESH) += mesh.o
|
||||
obj-$(CONFIG_SCSI_MAC53C94) += mac53c94.o
|
||||
obj-$(CONFIG_SCSI_MYRB) += myrb.o
|
||||
obj-$(CONFIG_BLK_DEV_3W_XXXX_RAID) += 3w-xxxx.o
|
||||
obj-$(CONFIG_SCSI_3W_9XXX) += 3w-9xxx.o
|
||||
obj-$(CONFIG_SCSI_3W_SAS) += 3w-sas.o
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,958 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* 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 */
|
Loading…
Reference in New Issue