/* 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 */
