xref: /OK3568_Linux_fs/kernel/drivers/scsi/myrb.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Linux Driver for Mylex DAC960/AcceleRAID/eXtremeRAID PCI RAID Controllers
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright 2017 Hannes Reinecke, SUSE Linux GmbH <hare@suse.com>
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Based on the original DAC960 driver,
8*4882a593Smuzhiyun  * Copyright 1998-2001 by Leonard N. Zubkoff <lnz@dandelion.com>
9*4882a593Smuzhiyun  * Portions Copyright 2002 by Mylex (An IBM Business Unit)
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  */
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #ifndef MYRB_H
14*4882a593Smuzhiyun #define MYRB_H
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #define MYRB_MAX_LDEVS			32
17*4882a593Smuzhiyun #define MYRB_MAX_CHANNELS		3
18*4882a593Smuzhiyun #define MYRB_MAX_TARGETS		16
19*4882a593Smuzhiyun #define MYRB_MAX_PHYSICAL_DEVICES	45
20*4882a593Smuzhiyun #define MYRB_SCATTER_GATHER_LIMIT	32
21*4882a593Smuzhiyun #define MYRB_CMD_MBOX_COUNT		256
22*4882a593Smuzhiyun #define MYRB_STAT_MBOX_COUNT		1024
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #define MYRB_BLKSIZE_BITS		9
25*4882a593Smuzhiyun #define MYRB_MAILBOX_TIMEOUT		1000000
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #define MYRB_DCMD_TAG			1
28*4882a593Smuzhiyun #define MYRB_MCMD_TAG			2
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #define MYRB_PRIMARY_MONITOR_INTERVAL (10 * HZ)
31*4882a593Smuzhiyun #define MYRB_SECONDARY_MONITOR_INTERVAL (60 * HZ)
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun /*
34*4882a593Smuzhiyun  * DAC960 V1 Firmware Command Opcodes.
35*4882a593Smuzhiyun  */
36*4882a593Smuzhiyun enum myrb_cmd_opcode {
37*4882a593Smuzhiyun 	/* I/O Commands */
38*4882a593Smuzhiyun 	MYRB_CMD_READ_EXTENDED =	0x33,
39*4882a593Smuzhiyun 	MYRB_CMD_WRITE_EXTENDED =	0x34,
40*4882a593Smuzhiyun 	MYRB_CMD_READAHEAD_EXTENDED =	0x35,
41*4882a593Smuzhiyun 	MYRB_CMD_READ_EXTENDED_SG =	0xB3,
42*4882a593Smuzhiyun 	MYRB_CMD_WRITE_EXTENDED_SG =	0xB4,
43*4882a593Smuzhiyun 	MYRB_CMD_READ =			0x36,
44*4882a593Smuzhiyun 	MYRB_CMD_READ_SG =		0xB6,
45*4882a593Smuzhiyun 	MYRB_CMD_WRITE =		0x37,
46*4882a593Smuzhiyun 	MYRB_CMD_WRITE_SG =		0xB7,
47*4882a593Smuzhiyun 	MYRB_CMD_DCDB =			0x04,
48*4882a593Smuzhiyun 	MYRB_CMD_DCDB_SG =		0x84,
49*4882a593Smuzhiyun 	MYRB_CMD_FLUSH =		0x0A,
50*4882a593Smuzhiyun 	/* Controller Status Related Commands */
51*4882a593Smuzhiyun 	MYRB_CMD_ENQUIRY =		0x53,
52*4882a593Smuzhiyun 	MYRB_CMD_ENQUIRY2 =		0x1C,
53*4882a593Smuzhiyun 	MYRB_CMD_GET_LDRV_ELEMENT =	0x55,
54*4882a593Smuzhiyun 	MYRB_CMD_GET_LDEV_INFO =	0x19,
55*4882a593Smuzhiyun 	MYRB_CMD_IOPORTREAD =		0x39,
56*4882a593Smuzhiyun 	MYRB_CMD_IOPORTWRITE =		0x3A,
57*4882a593Smuzhiyun 	MYRB_CMD_GET_SD_STATS =		0x3E,
58*4882a593Smuzhiyun 	MYRB_CMD_GET_PD_STATS =		0x3F,
59*4882a593Smuzhiyun 	MYRB_CMD_EVENT_LOG_OPERATION =	0x72,
60*4882a593Smuzhiyun 	/* Device Related Commands */
61*4882a593Smuzhiyun 	MYRB_CMD_START_DEVICE =		0x10,
62*4882a593Smuzhiyun 	MYRB_CMD_GET_DEVICE_STATE =	0x50,
63*4882a593Smuzhiyun 	MYRB_CMD_STOP_CHANNEL =		0x13,
64*4882a593Smuzhiyun 	MYRB_CMD_START_CHANNEL =	0x12,
65*4882a593Smuzhiyun 	MYRB_CMD_RESET_CHANNEL =	0x1A,
66*4882a593Smuzhiyun 	/* Commands Associated with Data Consistency and Errors */
67*4882a593Smuzhiyun 	MYRB_CMD_REBUILD =		0x09,
68*4882a593Smuzhiyun 	MYRB_CMD_REBUILD_ASYNC =	0x16,
69*4882a593Smuzhiyun 	MYRB_CMD_CHECK_CONSISTENCY =	0x0F,
70*4882a593Smuzhiyun 	MYRB_CMD_CHECK_CONSISTENCY_ASYNC = 0x1E,
71*4882a593Smuzhiyun 	MYRB_CMD_REBUILD_STAT =		0x0C,
72*4882a593Smuzhiyun 	MYRB_CMD_GET_REBUILD_PROGRESS =	0x27,
73*4882a593Smuzhiyun 	MYRB_CMD_REBUILD_CONTROL =	0x1F,
74*4882a593Smuzhiyun 	MYRB_CMD_READ_BADBLOCK_TABLE =	0x0B,
75*4882a593Smuzhiyun 	MYRB_CMD_READ_BADDATA_TABLE =	0x25,
76*4882a593Smuzhiyun 	MYRB_CMD_CLEAR_BADDATA_TABLE =	0x26,
77*4882a593Smuzhiyun 	MYRB_CMD_GET_ERROR_TABLE =	0x17,
78*4882a593Smuzhiyun 	MYRB_CMD_ADD_CAPACITY_ASYNC =	0x2A,
79*4882a593Smuzhiyun 	MYRB_CMD_BGI_CONTROL =		0x2B,
80*4882a593Smuzhiyun 	/* Configuration Related Commands */
81*4882a593Smuzhiyun 	MYRB_CMD_READ_CONFIG2 =		0x3D,
82*4882a593Smuzhiyun 	MYRB_CMD_WRITE_CONFIG2 =	0x3C,
83*4882a593Smuzhiyun 	MYRB_CMD_READ_CONFIG_ONDISK =	0x4A,
84*4882a593Smuzhiyun 	MYRB_CMD_WRITE_CONFIG_ONDISK =	0x4B,
85*4882a593Smuzhiyun 	MYRB_CMD_READ_CONFIG =		0x4E,
86*4882a593Smuzhiyun 	MYRB_CMD_READ_BACKUP_CONFIG =	0x4D,
87*4882a593Smuzhiyun 	MYRB_CMD_WRITE_CONFIG =		0x4F,
88*4882a593Smuzhiyun 	MYRB_CMD_ADD_CONFIG =		0x4C,
89*4882a593Smuzhiyun 	MYRB_CMD_READ_CONFIG_LABEL =	0x48,
90*4882a593Smuzhiyun 	MYRB_CMD_WRITE_CONFIG_LABEL =	0x49,
91*4882a593Smuzhiyun 	/* Firmware Upgrade Related Commands */
92*4882a593Smuzhiyun 	MYRB_CMD_LOAD_IMAGE =		0x20,
93*4882a593Smuzhiyun 	MYRB_CMD_STORE_IMAGE =		0x21,
94*4882a593Smuzhiyun 	MYRB_CMD_PROGRAM_IMAGE =	0x22,
95*4882a593Smuzhiyun 	/* Diagnostic Commands */
96*4882a593Smuzhiyun 	MYRB_CMD_SET_DIAGNOSTIC_MODE =	0x31,
97*4882a593Smuzhiyun 	MYRB_CMD_RUN_DIAGNOSTIC =	0x32,
98*4882a593Smuzhiyun 	/* Subsystem Service Commands */
99*4882a593Smuzhiyun 	MYRB_CMD_GET_SUBSYS_DATA =	0x70,
100*4882a593Smuzhiyun 	MYRB_CMD_SET_SUBSYS_PARAM =	0x71,
101*4882a593Smuzhiyun 	/* Version 2.xx Firmware Commands */
102*4882a593Smuzhiyun 	MYRB_CMD_ENQUIRY_OLD =		0x05,
103*4882a593Smuzhiyun 	MYRB_CMD_GET_DEVICE_STATE_OLD =	0x14,
104*4882a593Smuzhiyun 	MYRB_CMD_READ_OLD =		0x02,
105*4882a593Smuzhiyun 	MYRB_CMD_WRITE_OLD =		0x03,
106*4882a593Smuzhiyun 	MYRB_CMD_READ_SG_OLD =		0x82,
107*4882a593Smuzhiyun 	MYRB_CMD_WRITE_SG_OLD =		0x83
108*4882a593Smuzhiyun } __packed;
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun /*
111*4882a593Smuzhiyun  * DAC960 V1 Firmware Command Status Codes.
112*4882a593Smuzhiyun  */
113*4882a593Smuzhiyun #define MYRB_STATUS_SUCCESS			0x0000	/* Common */
114*4882a593Smuzhiyun #define MYRB_STATUS_CHECK_CONDITION		0x0002	/* Common */
115*4882a593Smuzhiyun #define MYRB_STATUS_NO_DEVICE			0x0102	/* Common */
116*4882a593Smuzhiyun #define MYRB_STATUS_INVALID_ADDRESS		0x0105	/* Common */
117*4882a593Smuzhiyun #define MYRB_STATUS_INVALID_PARAM		0x0105	/* Common */
118*4882a593Smuzhiyun #define MYRB_STATUS_IRRECOVERABLE_DATA_ERROR	0x0001	/* I/O */
119*4882a593Smuzhiyun #define MYRB_STATUS_LDRV_NONEXISTENT_OR_OFFLINE 0x0002	/* I/O */
120*4882a593Smuzhiyun #define MYRB_STATUS_ACCESS_BEYOND_END_OF_LDRV	0x0105	/* I/O */
121*4882a593Smuzhiyun #define MYRB_STATUS_BAD_DATA			0x010C	/* I/O */
122*4882a593Smuzhiyun #define MYRB_STATUS_DEVICE_BUSY			0x0008	/* DCDB */
123*4882a593Smuzhiyun #define MYRB_STATUS_DEVICE_NONRESPONSIVE	0x000E	/* DCDB */
124*4882a593Smuzhiyun #define MYRB_STATUS_COMMAND_TERMINATED		0x000F	/* DCDB */
125*4882a593Smuzhiyun #define MYRB_STATUS_START_DEVICE_FAILED		0x0002	/* Device */
126*4882a593Smuzhiyun #define MYRB_STATUS_INVALID_CHANNEL_OR_TARGET	0x0105	/* Device */
127*4882a593Smuzhiyun #define MYRB_STATUS_CHANNEL_BUSY		0x0106	/* Device */
128*4882a593Smuzhiyun #define MYRB_STATUS_OUT_OF_MEMORY		0x0107	/* Device */
129*4882a593Smuzhiyun #define MYRB_STATUS_CHANNEL_NOT_STOPPED		0x0002	/* Device */
130*4882a593Smuzhiyun #define MYRB_STATUS_ATTEMPT_TO_RBLD_ONLINE_DRIVE 0x0002	/* Consistency */
131*4882a593Smuzhiyun #define MYRB_STATUS_RBLD_BADBLOCKS		0x0003	/* Consistency */
132*4882a593Smuzhiyun #define MYRB_STATUS_RBLD_NEW_DISK_FAILED	0x0004	/* Consistency */
133*4882a593Smuzhiyun #define MYRB_STATUS_RBLD_OR_CHECK_INPROGRESS	0x0106	/* Consistency */
134*4882a593Smuzhiyun #define MYRB_STATUS_DEPENDENT_DISK_DEAD		0x0002	/* Consistency */
135*4882a593Smuzhiyun #define MYRB_STATUS_INCONSISTENT_BLOCKS		0x0003	/* Consistency */
136*4882a593Smuzhiyun #define MYRB_STATUS_INVALID_OR_NONREDUNDANT_LDRV 0x0105 /* Consistency */
137*4882a593Smuzhiyun #define MYRB_STATUS_NO_RBLD_OR_CHECK_INPROGRESS	0x0105	/* Consistency */
138*4882a593Smuzhiyun #define MYRB_STATUS_RBLD_IN_PROGRESS_DATA_VALID	0x0000	/* Consistency */
139*4882a593Smuzhiyun #define MYRB_STATUS_RBLD_FAILED_LDEV_FAILURE	0x0002	/* Consistency */
140*4882a593Smuzhiyun #define MYRB_STATUS_RBLD_FAILED_BADBLOCKS	0x0003	/* Consistency */
141*4882a593Smuzhiyun #define MYRB_STATUS_RBLD_FAILED_NEW_DRIVE_FAILED 0x0004	/* Consistency */
142*4882a593Smuzhiyun #define MYRB_STATUS_RBLD_SUCCESS		0x0100	/* Consistency */
143*4882a593Smuzhiyun #define MYRB_STATUS_RBLD_SUCCESS_TERMINATED	0x0107	/* Consistency */
144*4882a593Smuzhiyun #define MYRB_STATUS_RBLD_NOT_CHECKED		0x0108	/* Consistency */
145*4882a593Smuzhiyun #define MYRB_STATUS_BGI_SUCCESS			0x0100	/* Consistency */
146*4882a593Smuzhiyun #define MYRB_STATUS_BGI_ABORTED			0x0005	/* Consistency */
147*4882a593Smuzhiyun #define MYRB_STATUS_NO_BGI_INPROGRESS		0x0105	/* Consistency */
148*4882a593Smuzhiyun #define MYRB_STATUS_ADD_CAPACITY_INPROGRESS	0x0004	/* Consistency */
149*4882a593Smuzhiyun #define MYRB_STATUS_ADD_CAPACITY_FAILED_OR_SUSPENDED 0x00F4 /* Consistency */
150*4882a593Smuzhiyun #define MYRB_STATUS_CONFIG2_CSUM_ERROR		0x0002	/* Configuration */
151*4882a593Smuzhiyun #define MYRB_STATUS_CONFIGURATION_SUSPENDED	0x0106	/* Configuration */
152*4882a593Smuzhiyun #define MYRB_STATUS_FAILED_TO_CONFIGURE_NVRAM	0x0105	/* Configuration */
153*4882a593Smuzhiyun #define MYRB_STATUS_CONFIGURATION_NOT_SAVED	0x0106	/* Configuration */
154*4882a593Smuzhiyun #define MYRB_STATUS_SUBSYS_NOTINSTALLED		0x0001	/* Subsystem */
155*4882a593Smuzhiyun #define MYRB_STATUS_SUBSYS_FAILED		0x0002	/* Subsystem */
156*4882a593Smuzhiyun #define MYRB_STATUS_SUBSYS_BUSY			0x0106	/* Subsystem */
157*4882a593Smuzhiyun #define MYRB_STATUS_SUBSYS_TIMEOUT		0x0108	/* Subsystem */
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun /*
160*4882a593Smuzhiyun  * DAC960 V1 Firmware Enquiry Command reply structure.
161*4882a593Smuzhiyun  */
162*4882a593Smuzhiyun struct myrb_enquiry {
163*4882a593Smuzhiyun 	unsigned char ldev_count;			/* Byte 0 */
164*4882a593Smuzhiyun 	unsigned int rsvd1:24;				/* Bytes 1-3 */
165*4882a593Smuzhiyun 	unsigned int ldev_sizes[32];			/* Bytes 4-131 */
166*4882a593Smuzhiyun 	unsigned short flash_age;			/* Bytes 132-133 */
167*4882a593Smuzhiyun 	struct {
168*4882a593Smuzhiyun 		unsigned char deferred:1;		/* Byte 134 Bit 0 */
169*4882a593Smuzhiyun 		unsigned char low_bat:1;		/* Byte 134 Bit 1 */
170*4882a593Smuzhiyun 		unsigned char rsvd2:6;			/* Byte 134 Bits 2-7 */
171*4882a593Smuzhiyun 	} status;
172*4882a593Smuzhiyun 	unsigned char rsvd3:8;				/* Byte 135 */
173*4882a593Smuzhiyun 	unsigned char fw_minor_version;			/* Byte 136 */
174*4882a593Smuzhiyun 	unsigned char fw_major_version;			/* Byte 137 */
175*4882a593Smuzhiyun 	enum {
176*4882a593Smuzhiyun 		MYRB_NO_STDBY_RBLD_OR_CHECK_IN_PROGRESS =	0x00,
177*4882a593Smuzhiyun 		MYRB_STDBY_RBLD_IN_PROGRESS =			0x01,
178*4882a593Smuzhiyun 		MYRB_BG_RBLD_IN_PROGRESS =			0x02,
179*4882a593Smuzhiyun 		MYRB_BG_CHECK_IN_PROGRESS =			0x03,
180*4882a593Smuzhiyun 		MYRB_STDBY_RBLD_COMPLETED_WITH_ERROR =		0xFF,
181*4882a593Smuzhiyun 		MYRB_BG_RBLD_OR_CHECK_FAILED_DRIVE_FAILED =	0xF0,
182*4882a593Smuzhiyun 		MYRB_BG_RBLD_OR_CHECK_FAILED_LDEV_FAILED =	0xF1,
183*4882a593Smuzhiyun 		MYRB_BG_RBLD_OR_CHECK_FAILED_OTHER =		0xF2,
184*4882a593Smuzhiyun 		MYRB_BG_RBLD_OR_CHECK_SUCCESS_TERMINATED =	0xF3
185*4882a593Smuzhiyun 	} __packed rbld;		/* Byte 138 */
186*4882a593Smuzhiyun 	unsigned char max_tcq;				/* Byte 139 */
187*4882a593Smuzhiyun 	unsigned char ldev_offline;			/* Byte 140 */
188*4882a593Smuzhiyun 	unsigned char rsvd4:8;				/* Byte 141 */
189*4882a593Smuzhiyun 	unsigned short ev_seq;				/* Bytes 142-143 */
190*4882a593Smuzhiyun 	unsigned char ldev_critical;			/* Byte 144 */
191*4882a593Smuzhiyun 	unsigned int rsvd5:24;				/* Bytes 145-147 */
192*4882a593Smuzhiyun 	unsigned char pdev_dead;			/* Byte 148 */
193*4882a593Smuzhiyun 	unsigned char rsvd6:8;				/* Byte 149 */
194*4882a593Smuzhiyun 	unsigned char rbld_count;			/* Byte 150 */
195*4882a593Smuzhiyun 	struct {
196*4882a593Smuzhiyun 		unsigned char rsvd7:3;			/* Byte 151 Bits 0-2 */
197*4882a593Smuzhiyun 		unsigned char bbu_present:1;		/* Byte 151 Bit 3 */
198*4882a593Smuzhiyun 		unsigned char rsvd8:4;			/* Byte 151 Bits 4-7 */
199*4882a593Smuzhiyun 	} misc;
200*4882a593Smuzhiyun 	struct {
201*4882a593Smuzhiyun 		unsigned char target;
202*4882a593Smuzhiyun 		unsigned char channel;
203*4882a593Smuzhiyun 	} dead_drives[21];				/* Bytes 152-194 */
204*4882a593Smuzhiyun 	unsigned char rsvd9[62];			/* Bytes 195-255 */
205*4882a593Smuzhiyun } __packed;
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun /*
208*4882a593Smuzhiyun  * DAC960 V1 Firmware Enquiry2 Command reply structure.
209*4882a593Smuzhiyun  */
210*4882a593Smuzhiyun struct myrb_enquiry2 {
211*4882a593Smuzhiyun 	struct {
212*4882a593Smuzhiyun 		enum {
213*4882a593Smuzhiyun 			DAC960_V1_P_PD_PU =			0x01,
214*4882a593Smuzhiyun 			DAC960_V1_PL =				0x02,
215*4882a593Smuzhiyun 			DAC960_V1_PG =				0x10,
216*4882a593Smuzhiyun 			DAC960_V1_PJ =				0x11,
217*4882a593Smuzhiyun 			DAC960_V1_PR =				0x12,
218*4882a593Smuzhiyun 			DAC960_V1_PT =				0x13,
219*4882a593Smuzhiyun 			DAC960_V1_PTL0 =			0x14,
220*4882a593Smuzhiyun 			DAC960_V1_PRL =				0x15,
221*4882a593Smuzhiyun 			DAC960_V1_PTL1 =			0x16,
222*4882a593Smuzhiyun 			DAC960_V1_1164P =			0x20
223*4882a593Smuzhiyun 		} __packed sub_model;		/* Byte 0 */
224*4882a593Smuzhiyun 		unsigned char actual_channels;			/* Byte 1 */
225*4882a593Smuzhiyun 		enum {
226*4882a593Smuzhiyun 			MYRB_5_CHANNEL_BOARD =		0x01,
227*4882a593Smuzhiyun 			MYRB_3_CHANNEL_BOARD =		0x02,
228*4882a593Smuzhiyun 			MYRB_2_CHANNEL_BOARD =		0x03,
229*4882a593Smuzhiyun 			MYRB_3_CHANNEL_ASIC_DAC =	0x04
230*4882a593Smuzhiyun 		} __packed model;		/* Byte 2 */
231*4882a593Smuzhiyun 		enum {
232*4882a593Smuzhiyun 			MYRB_EISA_CONTROLLER =		0x01,
233*4882a593Smuzhiyun 			MYRB_MCA_CONTROLLER =		0x02,
234*4882a593Smuzhiyun 			MYRB_PCI_CONTROLLER =		0x03,
235*4882a593Smuzhiyun 			MYRB_SCSI_TO_SCSI =		0x08
236*4882a593Smuzhiyun 		} __packed controller;	/* Byte 3 */
237*4882a593Smuzhiyun 	} hw;						/* Bytes 0-3 */
238*4882a593Smuzhiyun 	/* MajorVersion.MinorVersion-FirmwareType-TurnID */
239*4882a593Smuzhiyun 	struct {
240*4882a593Smuzhiyun 		unsigned char major_version;		/* Byte 4 */
241*4882a593Smuzhiyun 		unsigned char minor_version;		/* Byte 5 */
242*4882a593Smuzhiyun 		unsigned char turn_id;			/* Byte 6 */
243*4882a593Smuzhiyun 		char firmware_type;			/* Byte 7 */
244*4882a593Smuzhiyun 	} fw;						/* Bytes 4-7 */
245*4882a593Smuzhiyun 	unsigned int rsvd1;				/* Byte 8-11 */
246*4882a593Smuzhiyun 	unsigned char cfg_chan;				/* Byte 12 */
247*4882a593Smuzhiyun 	unsigned char cur_chan;				/* Byte 13 */
248*4882a593Smuzhiyun 	unsigned char max_targets;			/* Byte 14 */
249*4882a593Smuzhiyun 	unsigned char max_tcq;				/* Byte 15 */
250*4882a593Smuzhiyun 	unsigned char max_ldev;				/* Byte 16 */
251*4882a593Smuzhiyun 	unsigned char max_arms;				/* Byte 17 */
252*4882a593Smuzhiyun 	unsigned char max_spans;			/* Byte 18 */
253*4882a593Smuzhiyun 	unsigned char rsvd2;				/* Byte 19 */
254*4882a593Smuzhiyun 	unsigned int rsvd3;				/* Bytes 20-23 */
255*4882a593Smuzhiyun 	unsigned int mem_size;				/* Bytes 24-27 */
256*4882a593Smuzhiyun 	unsigned int cache_size;			/* Bytes 28-31 */
257*4882a593Smuzhiyun 	unsigned int flash_size;			/* Bytes 32-35 */
258*4882a593Smuzhiyun 	unsigned int nvram_size;			/* Bytes 36-39 */
259*4882a593Smuzhiyun 	struct {
260*4882a593Smuzhiyun 		enum {
261*4882a593Smuzhiyun 			MYRB_RAM_TYPE_DRAM =		0x0,
262*4882a593Smuzhiyun 			MYRB_RAM_TYPE_EDO =			0x1,
263*4882a593Smuzhiyun 			MYRB_RAM_TYPE_SDRAM =		0x2,
264*4882a593Smuzhiyun 			MYRB_RAM_TYPE_Last =		0x7
265*4882a593Smuzhiyun 		} __packed ram:3;	/* Byte 40 Bits 0-2 */
266*4882a593Smuzhiyun 		enum {
267*4882a593Smuzhiyun 			MYRB_ERR_CORR_None =	0x0,
268*4882a593Smuzhiyun 			MYRB_ERR_CORR_Parity =	0x1,
269*4882a593Smuzhiyun 			MYRB_ERR_CORR_ECC =		0x2,
270*4882a593Smuzhiyun 			MYRB_ERR_CORR_Last =	0x7
271*4882a593Smuzhiyun 		} __packed ec:3;	/* Byte 40 Bits 3-5 */
272*4882a593Smuzhiyun 		unsigned char fast_page:1;		/* Byte 40 Bit 6 */
273*4882a593Smuzhiyun 		unsigned char low_power:1;		/* Byte 40 Bit 7 */
274*4882a593Smuzhiyun 		unsigned char rsvd4;			/* Bytes 41 */
275*4882a593Smuzhiyun 	} mem_type;
276*4882a593Smuzhiyun 	unsigned short clock_speed;			/* Bytes 42-43 */
277*4882a593Smuzhiyun 	unsigned short mem_speed;			/* Bytes 44-45 */
278*4882a593Smuzhiyun 	unsigned short hw_speed;			/* Bytes 46-47 */
279*4882a593Smuzhiyun 	unsigned char rsvd5[12];			/* Bytes 48-59 */
280*4882a593Smuzhiyun 	unsigned short max_cmds;			/* Bytes 60-61 */
281*4882a593Smuzhiyun 	unsigned short max_sge;				/* Bytes 62-63 */
282*4882a593Smuzhiyun 	unsigned short max_drv_cmds;			/* Bytes 64-65 */
283*4882a593Smuzhiyun 	unsigned short max_io_desc;			/* Bytes 66-67 */
284*4882a593Smuzhiyun 	unsigned short max_sectors;			/* Bytes 68-69 */
285*4882a593Smuzhiyun 	unsigned char latency;				/* Byte 70 */
286*4882a593Smuzhiyun 	unsigned char rsvd6;				/* Byte 71 */
287*4882a593Smuzhiyun 	unsigned char scsi_tmo;				/* Byte 72 */
288*4882a593Smuzhiyun 	unsigned char rsvd7;				/* Byte 73 */
289*4882a593Smuzhiyun 	unsigned short min_freelines;			/* Bytes 74-75 */
290*4882a593Smuzhiyun 	unsigned char rsvd8[8];				/* Bytes 76-83 */
291*4882a593Smuzhiyun 	unsigned char rbld_rate_const;			/* Byte 84 */
292*4882a593Smuzhiyun 	unsigned char rsvd9[11];			/* Byte 85-95 */
293*4882a593Smuzhiyun 	unsigned short pdrv_block_size;			/* Bytes 96-97 */
294*4882a593Smuzhiyun 	unsigned short ldev_block_size;			/* Bytes 98-99 */
295*4882a593Smuzhiyun 	unsigned short max_blocks_per_cmd;		/* Bytes 100-101 */
296*4882a593Smuzhiyun 	unsigned short block_factor;			/* Bytes 102-103 */
297*4882a593Smuzhiyun 	unsigned short cacheline_size;			/* Bytes 104-105 */
298*4882a593Smuzhiyun 	struct {
299*4882a593Smuzhiyun 		enum {
300*4882a593Smuzhiyun 			MYRB_WIDTH_NARROW_8BIT =		0x0,
301*4882a593Smuzhiyun 			MYRB_WIDTH_WIDE_16BIT =			0x1,
302*4882a593Smuzhiyun 			MYRB_WIDTH_WIDE_32BIT =			0x2
303*4882a593Smuzhiyun 		} __packed bus_width:2;	/* Byte 106 Bits 0-1 */
304*4882a593Smuzhiyun 		enum {
305*4882a593Smuzhiyun 			MYRB_SCSI_SPEED_FAST =			0x0,
306*4882a593Smuzhiyun 			MYRB_SCSI_SPEED_ULTRA =			0x1,
307*4882a593Smuzhiyun 			MYRB_SCSI_SPEED_ULTRA2 =		0x2
308*4882a593Smuzhiyun 		} __packed bus_speed:2;	/* Byte 106 Bits 2-3 */
309*4882a593Smuzhiyun 		unsigned char differential:1;		/* Byte 106 Bit 4 */
310*4882a593Smuzhiyun 		unsigned char rsvd10:3;			/* Byte 106 Bits 5-7 */
311*4882a593Smuzhiyun 	} scsi_cap;
312*4882a593Smuzhiyun 	unsigned char rsvd11[5];			/* Byte 107-111 */
313*4882a593Smuzhiyun 	unsigned short fw_build;			/* Bytes 112-113 */
314*4882a593Smuzhiyun 	enum {
315*4882a593Smuzhiyun 		MYRB_FAULT_AEMI =				0x01,
316*4882a593Smuzhiyun 		MYRB_FAULT_OEM1 =				0x02,
317*4882a593Smuzhiyun 		MYRB_FAULT_OEM2 =				0x04,
318*4882a593Smuzhiyun 		MYRB_FAULT_OEM3 =				0x08,
319*4882a593Smuzhiyun 		MYRB_FAULT_CONNER =				0x10,
320*4882a593Smuzhiyun 		MYRB_FAULT_SAFTE =				0x20
321*4882a593Smuzhiyun 	} __packed fault_mgmt;		/* Byte 114 */
322*4882a593Smuzhiyun 	unsigned char rsvd12;				/* Byte 115 */
323*4882a593Smuzhiyun 	struct {
324*4882a593Smuzhiyun 		unsigned int clustering:1;		/* Byte 116 Bit 0 */
325*4882a593Smuzhiyun 		unsigned int online_RAID_expansion:1;	/* Byte 116 Bit 1 */
326*4882a593Smuzhiyun 		unsigned int readahead:1;		/* Byte 116 Bit 2 */
327*4882a593Smuzhiyun 		unsigned int bgi:1;			/* Byte 116 Bit 3 */
328*4882a593Smuzhiyun 		unsigned int rsvd13:28;			/* Bytes 116-119 */
329*4882a593Smuzhiyun 	} fw_features;
330*4882a593Smuzhiyun 	unsigned char rsvd14[8];			/* Bytes 120-127 */
331*4882a593Smuzhiyun } __packed;
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun /*
334*4882a593Smuzhiyun  * DAC960 V1 Firmware Logical Drive State type.
335*4882a593Smuzhiyun  */
336*4882a593Smuzhiyun enum myrb_devstate {
337*4882a593Smuzhiyun 	MYRB_DEVICE_DEAD =		0x00,
338*4882a593Smuzhiyun 	MYRB_DEVICE_WO =		0x02,
339*4882a593Smuzhiyun 	MYRB_DEVICE_ONLINE =		0x03,
340*4882a593Smuzhiyun 	MYRB_DEVICE_CRITICAL =		0x04,
341*4882a593Smuzhiyun 	MYRB_DEVICE_STANDBY =		0x10,
342*4882a593Smuzhiyun 	MYRB_DEVICE_OFFLINE =		0xFF
343*4882a593Smuzhiyun } __packed;
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun /*
346*4882a593Smuzhiyun  * DAC960 V1 RAID Levels
347*4882a593Smuzhiyun  */
348*4882a593Smuzhiyun enum myrb_raidlevel {
349*4882a593Smuzhiyun 	MYRB_RAID_LEVEL0 =		0x0,     /* RAID 0 */
350*4882a593Smuzhiyun 	MYRB_RAID_LEVEL1 =		0x1,     /* RAID 1 */
351*4882a593Smuzhiyun 	MYRB_RAID_LEVEL3 =		0x3,     /* RAID 3 */
352*4882a593Smuzhiyun 	MYRB_RAID_LEVEL5 =		0x5,     /* RAID 5 */
353*4882a593Smuzhiyun 	MYRB_RAID_LEVEL6 =		0x6,     /* RAID 6 */
354*4882a593Smuzhiyun 	MYRB_RAID_JBOD =		0x7,     /* RAID 7 (JBOD) */
355*4882a593Smuzhiyun } __packed;
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun /*
358*4882a593Smuzhiyun  * DAC960 V1 Firmware Logical Drive Information structure.
359*4882a593Smuzhiyun  */
360*4882a593Smuzhiyun struct myrb_ldev_info {
361*4882a593Smuzhiyun 	unsigned int size;				/* Bytes 0-3 */
362*4882a593Smuzhiyun 	enum myrb_devstate state;			/* Byte 4 */
363*4882a593Smuzhiyun 	unsigned int raid_level:7;			/* Byte 5 Bits 0-6 */
364*4882a593Smuzhiyun 	unsigned int wb_enabled:1;			/* Byte 5 Bit 7 */
365*4882a593Smuzhiyun 	unsigned int rsvd:16;				/* Bytes 6-7 */
366*4882a593Smuzhiyun };
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun /*
369*4882a593Smuzhiyun  * DAC960 V1 Firmware Perform Event Log Operation Types.
370*4882a593Smuzhiyun  */
371*4882a593Smuzhiyun #define DAC960_V1_GetEventLogEntry		0x00
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun /*
374*4882a593Smuzhiyun  * DAC960 V1 Firmware Get Event Log Entry Command reply structure.
375*4882a593Smuzhiyun  */
376*4882a593Smuzhiyun struct myrb_log_entry {
377*4882a593Smuzhiyun 	unsigned char msg_type;			/* Byte 0 */
378*4882a593Smuzhiyun 	unsigned char msg_len;			/* Byte 1 */
379*4882a593Smuzhiyun 	unsigned char target:5;			/* Byte 2 Bits 0-4 */
380*4882a593Smuzhiyun 	unsigned char channel:3;		/* Byte 2 Bits 5-7 */
381*4882a593Smuzhiyun 	unsigned char lun:6;			/* Byte 3 Bits 0-5 */
382*4882a593Smuzhiyun 	unsigned char rsvd1:2;			/* Byte 3 Bits 6-7 */
383*4882a593Smuzhiyun 	unsigned short seq_num;			/* Bytes 4-5 */
384*4882a593Smuzhiyun 	unsigned char sense[26];		/* Bytes 6-31 */
385*4882a593Smuzhiyun };
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun /*
388*4882a593Smuzhiyun  * DAC960 V1 Firmware Get Device State Command reply structure.
389*4882a593Smuzhiyun  * The structure is padded by 2 bytes for compatibility with Version 2.xx
390*4882a593Smuzhiyun  * Firmware.
391*4882a593Smuzhiyun  */
392*4882a593Smuzhiyun struct myrb_pdev_state {
393*4882a593Smuzhiyun 	unsigned int present:1;			/* Byte 0 Bit 0 */
394*4882a593Smuzhiyun 	unsigned int :7;				/* Byte 0 Bits 1-7 */
395*4882a593Smuzhiyun 	enum {
396*4882a593Smuzhiyun 		MYRB_TYPE_OTHER =			0x0,
397*4882a593Smuzhiyun 		MYRB_TYPE_DISK =			0x1,
398*4882a593Smuzhiyun 		MYRB_TYPE_TAPE =			0x2,
399*4882a593Smuzhiyun 		MYRB_TYPE_CDROM_OR_WORM =		0x3
400*4882a593Smuzhiyun 	} __packed devtype:2;		/* Byte 1 Bits 0-1 */
401*4882a593Smuzhiyun 	unsigned int rsvd1:1;				/* Byte 1 Bit 2 */
402*4882a593Smuzhiyun 	unsigned int fast20:1;				/* Byte 1 Bit 3 */
403*4882a593Smuzhiyun 	unsigned int sync:1;				/* Byte 1 Bit 4 */
404*4882a593Smuzhiyun 	unsigned int fast:1;				/* Byte 1 Bit 5 */
405*4882a593Smuzhiyun 	unsigned int wide:1;				/* Byte 1 Bit 6 */
406*4882a593Smuzhiyun 	unsigned int tcq_supported:1;			/* Byte 1 Bit 7 */
407*4882a593Smuzhiyun 	enum myrb_devstate state;			/* Byte 2 */
408*4882a593Smuzhiyun 	unsigned int rsvd2:8;				/* Byte 3 */
409*4882a593Smuzhiyun 	unsigned int sync_multiplier;			/* Byte 4 */
410*4882a593Smuzhiyun 	unsigned int sync_offset:5;			/* Byte 5 Bits 0-4 */
411*4882a593Smuzhiyun 	unsigned int rsvd3:3;				/* Byte 5 Bits 5-7 */
412*4882a593Smuzhiyun 	unsigned int size;				/* Bytes 6-9 */
413*4882a593Smuzhiyun 	unsigned int rsvd4:16;			/* Bytes 10-11 */
414*4882a593Smuzhiyun } __packed;
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun /*
417*4882a593Smuzhiyun  * DAC960 V1 Firmware Get Rebuild Progress Command reply structure.
418*4882a593Smuzhiyun  */
419*4882a593Smuzhiyun struct myrb_rbld_progress {
420*4882a593Smuzhiyun 	unsigned int ldev_num;				/* Bytes 0-3 */
421*4882a593Smuzhiyun 	unsigned int ldev_size;				/* Bytes 4-7 */
422*4882a593Smuzhiyun 	unsigned int blocks_left;			/* Bytes 8-11 */
423*4882a593Smuzhiyun };
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun /*
426*4882a593Smuzhiyun  * DAC960 V1 Firmware Background Initialization Status Command reply structure.
427*4882a593Smuzhiyun  */
428*4882a593Smuzhiyun struct myrb_bgi_status {
429*4882a593Smuzhiyun 	unsigned int ldev_size;				/* Bytes 0-3 */
430*4882a593Smuzhiyun 	unsigned int blocks_done;			/* Bytes 4-7 */
431*4882a593Smuzhiyun 	unsigned char rsvd1[12];			/* Bytes 8-19 */
432*4882a593Smuzhiyun 	unsigned int ldev_num;				/* Bytes 20-23 */
433*4882a593Smuzhiyun 	unsigned char raid_level;			/* Byte 24 */
434*4882a593Smuzhiyun 	enum {
435*4882a593Smuzhiyun 		MYRB_BGI_INVALID =	0x00,
436*4882a593Smuzhiyun 		MYRB_BGI_STARTED =	0x02,
437*4882a593Smuzhiyun 		MYRB_BGI_INPROGRESS =	0x04,
438*4882a593Smuzhiyun 		MYRB_BGI_SUSPENDED =	0x05,
439*4882a593Smuzhiyun 		MYRB_BGI_CANCELLED =	0x06
440*4882a593Smuzhiyun 	} __packed status;		/* Byte 25 */
441*4882a593Smuzhiyun 	unsigned char rsvd2[6];				/* Bytes 26-31 */
442*4882a593Smuzhiyun };
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun /*
445*4882a593Smuzhiyun  * DAC960 V1 Firmware Error Table Entry structure.
446*4882a593Smuzhiyun  */
447*4882a593Smuzhiyun struct myrb_error_entry {
448*4882a593Smuzhiyun 	unsigned char parity_err;			/* Byte 0 */
449*4882a593Smuzhiyun 	unsigned char soft_err;				/* Byte 1 */
450*4882a593Smuzhiyun 	unsigned char hard_err;				/* Byte 2 */
451*4882a593Smuzhiyun 	unsigned char misc_err;				/* Byte 3 */
452*4882a593Smuzhiyun };
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun /*
455*4882a593Smuzhiyun  * DAC960 V1 Firmware Read Config2 Command reply structure.
456*4882a593Smuzhiyun  */
457*4882a593Smuzhiyun struct myrb_config2 {
458*4882a593Smuzhiyun 	unsigned rsvd1:1;				/* Byte 0 Bit 0 */
459*4882a593Smuzhiyun 	unsigned active_negation:1;			/* Byte 0 Bit 1 */
460*4882a593Smuzhiyun 	unsigned rsvd2:5;				/* Byte 0 Bits 2-6 */
461*4882a593Smuzhiyun 	unsigned no_rescan_on_reset_during_scan:1;	/* Byte 0 Bit 7 */
462*4882a593Smuzhiyun 	unsigned StorageWorks_support:1;		/* Byte 1 Bit 0 */
463*4882a593Smuzhiyun 	unsigned HewlettPackard_support:1;		/* Byte 1 Bit 1 */
464*4882a593Smuzhiyun 	unsigned no_disconnect_on_first_command:1;	/* Byte 1 Bit 2 */
465*4882a593Smuzhiyun 	unsigned rsvd3:2;				/* Byte 1 Bits 3-4 */
466*4882a593Smuzhiyun 	unsigned AEMI_ARM:1;				/* Byte 1 Bit 5 */
467*4882a593Smuzhiyun 	unsigned AEMI_OFM:1;				/* Byte 1 Bit 6 */
468*4882a593Smuzhiyun 	unsigned rsvd4:1;				/* Byte 1 Bit 7 */
469*4882a593Smuzhiyun 	enum {
470*4882a593Smuzhiyun 		MYRB_OEMID_MYLEX =		0x00,
471*4882a593Smuzhiyun 		MYRB_OEMID_IBM =		0x08,
472*4882a593Smuzhiyun 		MYRB_OEMID_HP =			0x0A,
473*4882a593Smuzhiyun 		MYRB_OEMID_DEC =		0x0C,
474*4882a593Smuzhiyun 		MYRB_OEMID_SIEMENS =		0x10,
475*4882a593Smuzhiyun 		MYRB_OEMID_INTEL =		0x12
476*4882a593Smuzhiyun 	} __packed OEMID;		/* Byte 2 */
477*4882a593Smuzhiyun 	unsigned char oem_model_number;			/* Byte 3 */
478*4882a593Smuzhiyun 	unsigned char physical_sector;			/* Byte 4 */
479*4882a593Smuzhiyun 	unsigned char logical_sector;			/* Byte 5 */
480*4882a593Smuzhiyun 	unsigned char block_factor;			/* Byte 6 */
481*4882a593Smuzhiyun 	unsigned readahead_enabled:1;			/* Byte 7 Bit 0 */
482*4882a593Smuzhiyun 	unsigned low_BIOS_delay:1;			/* Byte 7 Bit 1 */
483*4882a593Smuzhiyun 	unsigned rsvd5:2;				/* Byte 7 Bits 2-3 */
484*4882a593Smuzhiyun 	unsigned restrict_reassign_to_one_sector:1;	/* Byte 7 Bit 4 */
485*4882a593Smuzhiyun 	unsigned rsvd6:1;				/* Byte 7 Bit 5 */
486*4882a593Smuzhiyun 	unsigned FUA_during_write_recovery:1;		/* Byte 7 Bit 6 */
487*4882a593Smuzhiyun 	unsigned enable_LeftSymmetricRAID5Algorithm:1;	/* Byte 7 Bit 7 */
488*4882a593Smuzhiyun 	unsigned char default_rebuild_rate;		/* Byte 8 */
489*4882a593Smuzhiyun 	unsigned char rsvd7;				/* Byte 9 */
490*4882a593Smuzhiyun 	unsigned char blocks_per_cacheline;		/* Byte 10 */
491*4882a593Smuzhiyun 	unsigned char blocks_per_stripe;		/* Byte 11 */
492*4882a593Smuzhiyun 	struct {
493*4882a593Smuzhiyun 		enum {
494*4882a593Smuzhiyun 			MYRB_SPEED_ASYNC =		0x0,
495*4882a593Smuzhiyun 			MYRB_SPEED_SYNC_8MHz =		0x1,
496*4882a593Smuzhiyun 			MYRB_SPEED_SYNC_5MHz =		0x2,
497*4882a593Smuzhiyun 			MYRB_SPEED_SYNC_10_OR_20MHz =	0x3
498*4882a593Smuzhiyun 		} __packed speed:2;	/* Byte 11 Bits 0-1 */
499*4882a593Smuzhiyun 		unsigned force_8bit:1;			/* Byte 11 Bit 2 */
500*4882a593Smuzhiyun 		unsigned disable_fast20:1;		/* Byte 11 Bit 3 */
501*4882a593Smuzhiyun 		unsigned rsvd8:3;			/* Byte 11 Bits 4-6 */
502*4882a593Smuzhiyun 		unsigned enable_tcq:1;			/* Byte 11 Bit 7 */
503*4882a593Smuzhiyun 	} __packed channelparam[6];	/* Bytes 12-17 */
504*4882a593Smuzhiyun 	unsigned char SCSIInitiatorID;			/* Byte 18 */
505*4882a593Smuzhiyun 	unsigned char rsvd9;				/* Byte 19 */
506*4882a593Smuzhiyun 	enum {
507*4882a593Smuzhiyun 		MYRB_STARTUP_CONTROLLER_SPINUP =	0x00,
508*4882a593Smuzhiyun 		MYRB_STARTUP_POWERON_SPINUP =		0x01
509*4882a593Smuzhiyun 	} __packed startup;		/* Byte 20 */
510*4882a593Smuzhiyun 	unsigned char simultaneous_device_spinup_count;	/* Byte 21 */
511*4882a593Smuzhiyun 	unsigned char seconds_delay_between_spinups;	/* Byte 22 */
512*4882a593Smuzhiyun 	unsigned char rsvd10[29];			/* Bytes 23-51 */
513*4882a593Smuzhiyun 	unsigned BIOS_disabled:1;			/* Byte 52 Bit 0 */
514*4882a593Smuzhiyun 	unsigned CDROM_boot_enabled:1;			/* Byte 52 Bit 1 */
515*4882a593Smuzhiyun 	unsigned rsvd11:3;				/* Byte 52 Bits 2-4 */
516*4882a593Smuzhiyun 	enum {
517*4882a593Smuzhiyun 		MYRB_GEOM_128_32 =		0x0,
518*4882a593Smuzhiyun 		MYRB_GEOM_255_63 =		0x1,
519*4882a593Smuzhiyun 		MYRB_GEOM_RESERVED1 =		0x2,
520*4882a593Smuzhiyun 		MYRB_GEOM_RESERVED2 =		0x3
521*4882a593Smuzhiyun 	} __packed drive_geometry:2;	/* Byte 52 Bits 5-6 */
522*4882a593Smuzhiyun 	unsigned rsvd12:1;				/* Byte 52 Bit 7 */
523*4882a593Smuzhiyun 	unsigned char rsvd13[9];			/* Bytes 53-61 */
524*4882a593Smuzhiyun 	unsigned short csum;				/* Bytes 62-63 */
525*4882a593Smuzhiyun };
526*4882a593Smuzhiyun 
527*4882a593Smuzhiyun /*
528*4882a593Smuzhiyun  * DAC960 V1 Firmware DCDB request structure.
529*4882a593Smuzhiyun  */
530*4882a593Smuzhiyun struct myrb_dcdb {
531*4882a593Smuzhiyun 	unsigned target:4;				 /* Byte 0 Bits 0-3 */
532*4882a593Smuzhiyun 	unsigned channel:4;				 /* Byte 0 Bits 4-7 */
533*4882a593Smuzhiyun 	enum {
534*4882a593Smuzhiyun 		MYRB_DCDB_XFER_NONE =		0,
535*4882a593Smuzhiyun 		MYRB_DCDB_XFER_DEVICE_TO_SYSTEM = 1,
536*4882a593Smuzhiyun 		MYRB_DCDB_XFER_SYSTEM_TO_DEVICE = 2,
537*4882a593Smuzhiyun 		MYRB_DCDB_XFER_ILLEGAL =	3
538*4882a593Smuzhiyun 	} __packed data_xfer:2;				/* Byte 1 Bits 0-1 */
539*4882a593Smuzhiyun 	unsigned early_status:1;			/* Byte 1 Bit 2 */
540*4882a593Smuzhiyun 	unsigned rsvd1:1;				/* Byte 1 Bit 3 */
541*4882a593Smuzhiyun 	enum {
542*4882a593Smuzhiyun 		MYRB_DCDB_TMO_24_HRS =	0,
543*4882a593Smuzhiyun 		MYRB_DCDB_TMO_10_SECS =	1,
544*4882a593Smuzhiyun 		MYRB_DCDB_TMO_60_SECS =	2,
545*4882a593Smuzhiyun 		MYRB_DCDB_TMO_10_MINS =	3
546*4882a593Smuzhiyun 	} __packed timeout:2;				/* Byte 1 Bits 4-5 */
547*4882a593Smuzhiyun 	unsigned no_autosense:1;			/* Byte 1 Bit 6 */
548*4882a593Smuzhiyun 	unsigned allow_disconnect:1;			/* Byte 1 Bit 7 */
549*4882a593Smuzhiyun 	unsigned short xfer_len_lo;			/* Bytes 2-3 */
550*4882a593Smuzhiyun 	u32 dma_addr;					/* Bytes 4-7 */
551*4882a593Smuzhiyun 	unsigned char cdb_len:4;			/* Byte 8 Bits 0-3 */
552*4882a593Smuzhiyun 	unsigned char xfer_len_hi4:4;			/* Byte 8 Bits 4-7 */
553*4882a593Smuzhiyun 	unsigned char sense_len;			/* Byte 9 */
554*4882a593Smuzhiyun 	unsigned char cdb[12];				/* Bytes 10-21 */
555*4882a593Smuzhiyun 	unsigned char sense[64];			/* Bytes 22-85 */
556*4882a593Smuzhiyun 	unsigned char status;				/* Byte 86 */
557*4882a593Smuzhiyun 	unsigned char rsvd2;				/* Byte 87 */
558*4882a593Smuzhiyun };
559*4882a593Smuzhiyun 
560*4882a593Smuzhiyun /*
561*4882a593Smuzhiyun  * DAC960 V1 Firmware Scatter/Gather List Type 1 32 Bit Address
562*4882a593Smuzhiyun  *32 Bit Byte Count structure.
563*4882a593Smuzhiyun  */
564*4882a593Smuzhiyun struct myrb_sge {
565*4882a593Smuzhiyun 	u32 sge_addr;		/* Bytes 0-3 */
566*4882a593Smuzhiyun 	u32 sge_count;		/* Bytes 4-7 */
567*4882a593Smuzhiyun };
568*4882a593Smuzhiyun 
569*4882a593Smuzhiyun /*
570*4882a593Smuzhiyun  * 13 Byte DAC960 V1 Firmware Command Mailbox structure.
571*4882a593Smuzhiyun  * Bytes 13-15 are not used.  The structure is padded to 16 bytes for
572*4882a593Smuzhiyun  * efficient access.
573*4882a593Smuzhiyun  */
574*4882a593Smuzhiyun union myrb_cmd_mbox {
575*4882a593Smuzhiyun 	unsigned int words[4];				/* Words 0-3 */
576*4882a593Smuzhiyun 	unsigned char bytes[16];			/* Bytes 0-15 */
577*4882a593Smuzhiyun 	struct {
578*4882a593Smuzhiyun 		enum myrb_cmd_opcode opcode;		/* Byte 0 */
579*4882a593Smuzhiyun 		unsigned char id;			/* Byte 1 */
580*4882a593Smuzhiyun 		unsigned char rsvd[14];			/* Bytes 2-15 */
581*4882a593Smuzhiyun 	} __packed common;
582*4882a593Smuzhiyun 	struct {
583*4882a593Smuzhiyun 		enum myrb_cmd_opcode opcode;		/* Byte 0 */
584*4882a593Smuzhiyun 		unsigned char id;			/* Byte 1 */
585*4882a593Smuzhiyun 		unsigned char rsvd1[6];			/* Bytes 2-7 */
586*4882a593Smuzhiyun 		u32 addr;				/* Bytes 8-11 */
587*4882a593Smuzhiyun 		unsigned char rsvd2[4];			/* Bytes 12-15 */
588*4882a593Smuzhiyun 	} __packed type3;
589*4882a593Smuzhiyun 	struct {
590*4882a593Smuzhiyun 		enum myrb_cmd_opcode opcode;		/* Byte 0 */
591*4882a593Smuzhiyun 		unsigned char id;			/* Byte 1 */
592*4882a593Smuzhiyun 		unsigned char optype;			/* Byte 2 */
593*4882a593Smuzhiyun 		unsigned char rsvd1[5];			/* Bytes 3-7 */
594*4882a593Smuzhiyun 		u32 addr;				/* Bytes 8-11 */
595*4882a593Smuzhiyun 		unsigned char rsvd2[4];			/* Bytes 12-15 */
596*4882a593Smuzhiyun 	} __packed type3B;
597*4882a593Smuzhiyun 	struct {
598*4882a593Smuzhiyun 		enum myrb_cmd_opcode opcode;		/* Byte 0 */
599*4882a593Smuzhiyun 		unsigned char id;			/* Byte 1 */
600*4882a593Smuzhiyun 		unsigned char rsvd1[5];			/* Bytes 2-6 */
601*4882a593Smuzhiyun 		unsigned char ldev_num:6;		/* Byte 7 Bits 0-6 */
602*4882a593Smuzhiyun 		unsigned char auto_restore:1;		/* Byte 7 Bit 7 */
603*4882a593Smuzhiyun 		unsigned char rsvd2[8];			/* Bytes 8-15 */
604*4882a593Smuzhiyun 	} __packed type3C;
605*4882a593Smuzhiyun 	struct {
606*4882a593Smuzhiyun 		enum myrb_cmd_opcode opcode;		/* Byte 0 */
607*4882a593Smuzhiyun 		unsigned char id;			/* Byte 1 */
608*4882a593Smuzhiyun 		unsigned char channel;			/* Byte 2 */
609*4882a593Smuzhiyun 		unsigned char target;			/* Byte 3 */
610*4882a593Smuzhiyun 		enum myrb_devstate state;		/* Byte 4 */
611*4882a593Smuzhiyun 		unsigned char rsvd1[3];			/* Bytes 5-7 */
612*4882a593Smuzhiyun 		u32 addr;				/* Bytes 8-11 */
613*4882a593Smuzhiyun 		unsigned char rsvd2[4];			/* Bytes 12-15 */
614*4882a593Smuzhiyun 	} __packed type3D;
615*4882a593Smuzhiyun 	struct {
616*4882a593Smuzhiyun 		enum myrb_cmd_opcode opcode;		/* Byte 0 */
617*4882a593Smuzhiyun 		unsigned char id;			/* Byte 1 */
618*4882a593Smuzhiyun 		unsigned char optype;			/* Byte 2 */
619*4882a593Smuzhiyun 		unsigned char opqual;			/* Byte 3 */
620*4882a593Smuzhiyun 		unsigned short ev_seq;			/* Bytes 4-5 */
621*4882a593Smuzhiyun 		unsigned char rsvd1[2];			/* Bytes 6-7 */
622*4882a593Smuzhiyun 		u32 addr;				/* Bytes 8-11 */
623*4882a593Smuzhiyun 		unsigned char rsvd2[4];			/* Bytes 12-15 */
624*4882a593Smuzhiyun 	} __packed type3E;
625*4882a593Smuzhiyun 	struct {
626*4882a593Smuzhiyun 		enum myrb_cmd_opcode opcode;		/* Byte 0 */
627*4882a593Smuzhiyun 		unsigned char id;			/* Byte 1 */
628*4882a593Smuzhiyun 		unsigned char rsvd1[2];			/* Bytes 2-3 */
629*4882a593Smuzhiyun 		unsigned char rbld_rate;		/* Byte 4 */
630*4882a593Smuzhiyun 		unsigned char rsvd2[3];			/* Bytes 5-7 */
631*4882a593Smuzhiyun 		u32 addr;				/* Bytes 8-11 */
632*4882a593Smuzhiyun 		unsigned char rsvd3[4];			/* Bytes 12-15 */
633*4882a593Smuzhiyun 	} __packed type3R;
634*4882a593Smuzhiyun 	struct {
635*4882a593Smuzhiyun 		enum myrb_cmd_opcode opcode;		/* Byte 0 */
636*4882a593Smuzhiyun 		unsigned char id;			/* Byte 1 */
637*4882a593Smuzhiyun 		unsigned short xfer_len;		/* Bytes 2-3 */
638*4882a593Smuzhiyun 		unsigned int lba;			/* Bytes 4-7 */
639*4882a593Smuzhiyun 		u32 addr;				/* Bytes 8-11 */
640*4882a593Smuzhiyun 		unsigned char ldev_num;			/* Byte 12 */
641*4882a593Smuzhiyun 		unsigned char rsvd[3];			/* Bytes 13-15 */
642*4882a593Smuzhiyun 	} __packed type4;
643*4882a593Smuzhiyun 	struct {
644*4882a593Smuzhiyun 		enum myrb_cmd_opcode opcode;		/* Byte 0 */
645*4882a593Smuzhiyun 		unsigned char id;			/* Byte 1 */
646*4882a593Smuzhiyun 		struct {
647*4882a593Smuzhiyun 			unsigned short xfer_len:11;	/* Bytes 2-3 */
648*4882a593Smuzhiyun 			unsigned char ldev_num:5;	/* Byte 3 Bits 3-7 */
649*4882a593Smuzhiyun 		} __packed ld;
650*4882a593Smuzhiyun 		unsigned int lba;			/* Bytes 4-7 */
651*4882a593Smuzhiyun 		u32 addr;				/* Bytes 8-11 */
652*4882a593Smuzhiyun 		unsigned char sg_count:6;		/* Byte 12 Bits 0-5 */
653*4882a593Smuzhiyun 		enum {
654*4882a593Smuzhiyun 			MYRB_SGL_ADDR32_COUNT32 = 0x0,
655*4882a593Smuzhiyun 			MYRB_SGL_ADDR32_COUNT16 = 0x1,
656*4882a593Smuzhiyun 			MYRB_SGL_COUNT32_ADDR32 = 0x2,
657*4882a593Smuzhiyun 			MYRB_SGL_COUNT16_ADDR32 = 0x3
658*4882a593Smuzhiyun 		} __packed sg_type:2;	/* Byte 12 Bits 6-7 */
659*4882a593Smuzhiyun 		unsigned char rsvd[3];			/* Bytes 13-15 */
660*4882a593Smuzhiyun 	} __packed type5;
661*4882a593Smuzhiyun 	struct {
662*4882a593Smuzhiyun 		enum myrb_cmd_opcode opcode;		/* Byte 0 */
663*4882a593Smuzhiyun 		unsigned char id;			/* Byte 1 */
664*4882a593Smuzhiyun 		unsigned char opcode2;			/* Byte 2 */
665*4882a593Smuzhiyun 		unsigned char rsvd1:8;			/* Byte 3 */
666*4882a593Smuzhiyun 		u32 cmd_mbox_addr;			/* Bytes 4-7 */
667*4882a593Smuzhiyun 		u32 stat_mbox_addr;			/* Bytes 8-11 */
668*4882a593Smuzhiyun 		unsigned char rsvd2[4];			/* Bytes 12-15 */
669*4882a593Smuzhiyun 	} __packed typeX;
670*4882a593Smuzhiyun };
671*4882a593Smuzhiyun 
672*4882a593Smuzhiyun /*
673*4882a593Smuzhiyun  * DAC960 V1 Firmware Controller Status Mailbox structure.
674*4882a593Smuzhiyun  */
675*4882a593Smuzhiyun struct myrb_stat_mbox {
676*4882a593Smuzhiyun 	unsigned char id;		/* Byte 0 */
677*4882a593Smuzhiyun 	unsigned char rsvd:7;		/* Byte 1 Bits 0-6 */
678*4882a593Smuzhiyun 	unsigned char valid:1;			/* Byte 1 Bit 7 */
679*4882a593Smuzhiyun 	unsigned short status;		/* Bytes 2-3 */
680*4882a593Smuzhiyun };
681*4882a593Smuzhiyun 
682*4882a593Smuzhiyun struct myrb_cmdblk {
683*4882a593Smuzhiyun 	union myrb_cmd_mbox mbox;
684*4882a593Smuzhiyun 	unsigned short status;
685*4882a593Smuzhiyun 	struct completion *completion;
686*4882a593Smuzhiyun 	struct myrb_dcdb *dcdb;
687*4882a593Smuzhiyun 	dma_addr_t dcdb_addr;
688*4882a593Smuzhiyun 	struct myrb_sge *sgl;
689*4882a593Smuzhiyun 	dma_addr_t sgl_addr;
690*4882a593Smuzhiyun };
691*4882a593Smuzhiyun 
692*4882a593Smuzhiyun struct myrb_hba {
693*4882a593Smuzhiyun 	unsigned int ldev_block_size;
694*4882a593Smuzhiyun 	unsigned char ldev_geom_heads;
695*4882a593Smuzhiyun 	unsigned char ldev_geom_sectors;
696*4882a593Smuzhiyun 	unsigned char bus_width;
697*4882a593Smuzhiyun 	unsigned short stripe_size;
698*4882a593Smuzhiyun 	unsigned short segment_size;
699*4882a593Smuzhiyun 	unsigned short new_ev_seq;
700*4882a593Smuzhiyun 	unsigned short old_ev_seq;
701*4882a593Smuzhiyun 	bool dual_mode_interface;
702*4882a593Smuzhiyun 	bool bgi_status_supported;
703*4882a593Smuzhiyun 	bool safte_enabled;
704*4882a593Smuzhiyun 	bool need_ldev_info;
705*4882a593Smuzhiyun 	bool need_err_info;
706*4882a593Smuzhiyun 	bool need_rbld;
707*4882a593Smuzhiyun 	bool need_cc_status;
708*4882a593Smuzhiyun 	bool need_bgi_status;
709*4882a593Smuzhiyun 	bool rbld_first;
710*4882a593Smuzhiyun 
711*4882a593Smuzhiyun 	struct pci_dev *pdev;
712*4882a593Smuzhiyun 	struct Scsi_Host *host;
713*4882a593Smuzhiyun 
714*4882a593Smuzhiyun 	struct workqueue_struct *work_q;
715*4882a593Smuzhiyun 	char work_q_name[20];
716*4882a593Smuzhiyun 	struct delayed_work monitor_work;
717*4882a593Smuzhiyun 	unsigned long primary_monitor_time;
718*4882a593Smuzhiyun 	unsigned long secondary_monitor_time;
719*4882a593Smuzhiyun 
720*4882a593Smuzhiyun 	struct dma_pool *sg_pool;
721*4882a593Smuzhiyun 	struct dma_pool *dcdb_pool;
722*4882a593Smuzhiyun 
723*4882a593Smuzhiyun 	spinlock_t queue_lock;
724*4882a593Smuzhiyun 
725*4882a593Smuzhiyun 	void (*qcmd)(struct myrb_hba *cs, struct myrb_cmdblk *cmd_blk);
726*4882a593Smuzhiyun 	void (*write_cmd_mbox)(union myrb_cmd_mbox *next_mbox,
727*4882a593Smuzhiyun 			       union myrb_cmd_mbox *cmd_mbox);
728*4882a593Smuzhiyun 	void (*get_cmd_mbox)(void __iomem *base);
729*4882a593Smuzhiyun 	void (*disable_intr)(void __iomem *base);
730*4882a593Smuzhiyun 	void (*reset)(void __iomem *base);
731*4882a593Smuzhiyun 
732*4882a593Smuzhiyun 	unsigned int ctlr_num;
733*4882a593Smuzhiyun 	unsigned char model_name[20];
734*4882a593Smuzhiyun 	unsigned char fw_version[12];
735*4882a593Smuzhiyun 
736*4882a593Smuzhiyun 	unsigned int irq;
737*4882a593Smuzhiyun 	phys_addr_t io_addr;
738*4882a593Smuzhiyun 	phys_addr_t pci_addr;
739*4882a593Smuzhiyun 	void __iomem *io_base;
740*4882a593Smuzhiyun 	void __iomem *mmio_base;
741*4882a593Smuzhiyun 
742*4882a593Smuzhiyun 	size_t cmd_mbox_size;
743*4882a593Smuzhiyun 	dma_addr_t cmd_mbox_addr;
744*4882a593Smuzhiyun 	union myrb_cmd_mbox *first_cmd_mbox;
745*4882a593Smuzhiyun 	union myrb_cmd_mbox *last_cmd_mbox;
746*4882a593Smuzhiyun 	union myrb_cmd_mbox *next_cmd_mbox;
747*4882a593Smuzhiyun 	union myrb_cmd_mbox *prev_cmd_mbox1;
748*4882a593Smuzhiyun 	union myrb_cmd_mbox *prev_cmd_mbox2;
749*4882a593Smuzhiyun 
750*4882a593Smuzhiyun 	size_t stat_mbox_size;
751*4882a593Smuzhiyun 	dma_addr_t stat_mbox_addr;
752*4882a593Smuzhiyun 	struct myrb_stat_mbox *first_stat_mbox;
753*4882a593Smuzhiyun 	struct myrb_stat_mbox *last_stat_mbox;
754*4882a593Smuzhiyun 	struct myrb_stat_mbox *next_stat_mbox;
755*4882a593Smuzhiyun 
756*4882a593Smuzhiyun 	struct myrb_cmdblk dcmd_blk;
757*4882a593Smuzhiyun 	struct myrb_cmdblk mcmd_blk;
758*4882a593Smuzhiyun 	struct mutex dcmd_mutex;
759*4882a593Smuzhiyun 
760*4882a593Smuzhiyun 	struct myrb_enquiry *enquiry;
761*4882a593Smuzhiyun 	dma_addr_t enquiry_addr;
762*4882a593Smuzhiyun 
763*4882a593Smuzhiyun 	struct myrb_error_entry *err_table;
764*4882a593Smuzhiyun 	dma_addr_t err_table_addr;
765*4882a593Smuzhiyun 
766*4882a593Smuzhiyun 	unsigned short last_rbld_status;
767*4882a593Smuzhiyun 
768*4882a593Smuzhiyun 	struct myrb_ldev_info *ldev_info_buf;
769*4882a593Smuzhiyun 	dma_addr_t ldev_info_addr;
770*4882a593Smuzhiyun 
771*4882a593Smuzhiyun 	struct myrb_bgi_status bgi_status;
772*4882a593Smuzhiyun 
773*4882a593Smuzhiyun 	struct mutex dma_mutex;
774*4882a593Smuzhiyun };
775*4882a593Smuzhiyun 
776*4882a593Smuzhiyun /*
777*4882a593Smuzhiyun  * DAC960 LA Series Controller Interface Register Offsets.
778*4882a593Smuzhiyun  */
779*4882a593Smuzhiyun #define DAC960_LA_mmio_size		0x80
780*4882a593Smuzhiyun 
781*4882a593Smuzhiyun enum DAC960_LA_reg_offset {
782*4882a593Smuzhiyun 	DAC960_LA_IRQMASK_OFFSET	= 0x34,
783*4882a593Smuzhiyun 	DAC960_LA_CMDOP_OFFSET		= 0x50,
784*4882a593Smuzhiyun 	DAC960_LA_CMDID_OFFSET		= 0x51,
785*4882a593Smuzhiyun 	DAC960_LA_MBOX2_OFFSET		= 0x52,
786*4882a593Smuzhiyun 	DAC960_LA_MBOX3_OFFSET		= 0x53,
787*4882a593Smuzhiyun 	DAC960_LA_MBOX4_OFFSET		= 0x54,
788*4882a593Smuzhiyun 	DAC960_LA_MBOX5_OFFSET		= 0x55,
789*4882a593Smuzhiyun 	DAC960_LA_MBOX6_OFFSET		= 0x56,
790*4882a593Smuzhiyun 	DAC960_LA_MBOX7_OFFSET		= 0x57,
791*4882a593Smuzhiyun 	DAC960_LA_MBOX8_OFFSET		= 0x58,
792*4882a593Smuzhiyun 	DAC960_LA_MBOX9_OFFSET		= 0x59,
793*4882a593Smuzhiyun 	DAC960_LA_MBOX10_OFFSET		= 0x5A,
794*4882a593Smuzhiyun 	DAC960_LA_MBOX11_OFFSET		= 0x5B,
795*4882a593Smuzhiyun 	DAC960_LA_MBOX12_OFFSET		= 0x5C,
796*4882a593Smuzhiyun 	DAC960_LA_STSID_OFFSET		= 0x5D,
797*4882a593Smuzhiyun 	DAC960_LA_STS_OFFSET		= 0x5E,
798*4882a593Smuzhiyun 	DAC960_LA_IDB_OFFSET		= 0x60,
799*4882a593Smuzhiyun 	DAC960_LA_ODB_OFFSET		= 0x61,
800*4882a593Smuzhiyun 	DAC960_LA_ERRSTS_OFFSET		= 0x63,
801*4882a593Smuzhiyun };
802*4882a593Smuzhiyun 
803*4882a593Smuzhiyun /*
804*4882a593Smuzhiyun  * DAC960 LA Series Inbound Door Bell Register.
805*4882a593Smuzhiyun  */
806*4882a593Smuzhiyun #define DAC960_LA_IDB_HWMBOX_NEW_CMD 0x01
807*4882a593Smuzhiyun #define DAC960_LA_IDB_HWMBOX_ACK_STS 0x02
808*4882a593Smuzhiyun #define DAC960_LA_IDB_GEN_IRQ 0x04
809*4882a593Smuzhiyun #define DAC960_LA_IDB_CTRL_RESET 0x08
810*4882a593Smuzhiyun #define DAC960_LA_IDB_MMBOX_NEW_CMD 0x10
811*4882a593Smuzhiyun 
812*4882a593Smuzhiyun #define DAC960_LA_IDB_HWMBOX_EMPTY 0x01
813*4882a593Smuzhiyun #define DAC960_LA_IDB_INIT_DONE 0x02
814*4882a593Smuzhiyun 
815*4882a593Smuzhiyun /*
816*4882a593Smuzhiyun  * DAC960 LA Series Outbound Door Bell Register.
817*4882a593Smuzhiyun  */
818*4882a593Smuzhiyun #define DAC960_LA_ODB_HWMBOX_ACK_IRQ 0x01
819*4882a593Smuzhiyun #define DAC960_LA_ODB_MMBOX_ACK_IRQ 0x02
820*4882a593Smuzhiyun #define DAC960_LA_ODB_HWMBOX_STS_AVAIL 0x01
821*4882a593Smuzhiyun #define DAC960_LA_ODB_MMBOX_STS_AVAIL 0x02
822*4882a593Smuzhiyun 
823*4882a593Smuzhiyun /*
824*4882a593Smuzhiyun  * DAC960 LA Series Interrupt Mask Register.
825*4882a593Smuzhiyun  */
826*4882a593Smuzhiyun #define DAC960_LA_IRQMASK_DISABLE_IRQ 0x04
827*4882a593Smuzhiyun 
828*4882a593Smuzhiyun /*
829*4882a593Smuzhiyun  * DAC960 LA Series Error Status Register.
830*4882a593Smuzhiyun  */
831*4882a593Smuzhiyun #define DAC960_LA_ERRSTS_PENDING 0x02
832*4882a593Smuzhiyun 
833*4882a593Smuzhiyun /*
834*4882a593Smuzhiyun  * DAC960 PG Series Controller Interface Register Offsets.
835*4882a593Smuzhiyun  */
836*4882a593Smuzhiyun #define DAC960_PG_mmio_size		0x2000
837*4882a593Smuzhiyun 
838*4882a593Smuzhiyun enum DAC960_PG_reg_offset {
839*4882a593Smuzhiyun 	DAC960_PG_IDB_OFFSET		= 0x0020,
840*4882a593Smuzhiyun 	DAC960_PG_ODB_OFFSET		= 0x002C,
841*4882a593Smuzhiyun 	DAC960_PG_IRQMASK_OFFSET	= 0x0034,
842*4882a593Smuzhiyun 	DAC960_PG_CMDOP_OFFSET		= 0x1000,
843*4882a593Smuzhiyun 	DAC960_PG_CMDID_OFFSET		= 0x1001,
844*4882a593Smuzhiyun 	DAC960_PG_MBOX2_OFFSET		= 0x1002,
845*4882a593Smuzhiyun 	DAC960_PG_MBOX3_OFFSET		= 0x1003,
846*4882a593Smuzhiyun 	DAC960_PG_MBOX4_OFFSET		= 0x1004,
847*4882a593Smuzhiyun 	DAC960_PG_MBOX5_OFFSET		= 0x1005,
848*4882a593Smuzhiyun 	DAC960_PG_MBOX6_OFFSET		= 0x1006,
849*4882a593Smuzhiyun 	DAC960_PG_MBOX7_OFFSET		= 0x1007,
850*4882a593Smuzhiyun 	DAC960_PG_MBOX8_OFFSET		= 0x1008,
851*4882a593Smuzhiyun 	DAC960_PG_MBOX9_OFFSET		= 0x1009,
852*4882a593Smuzhiyun 	DAC960_PG_MBOX10_OFFSET		= 0x100A,
853*4882a593Smuzhiyun 	DAC960_PG_MBOX11_OFFSET		= 0x100B,
854*4882a593Smuzhiyun 	DAC960_PG_MBOX12_OFFSET		= 0x100C,
855*4882a593Smuzhiyun 	DAC960_PG_STSID_OFFSET		= 0x1018,
856*4882a593Smuzhiyun 	DAC960_PG_STS_OFFSET		= 0x101A,
857*4882a593Smuzhiyun 	DAC960_PG_ERRSTS_OFFSET		= 0x103F,
858*4882a593Smuzhiyun };
859*4882a593Smuzhiyun 
860*4882a593Smuzhiyun /*
861*4882a593Smuzhiyun  * DAC960 PG Series Inbound Door Bell Register.
862*4882a593Smuzhiyun  */
863*4882a593Smuzhiyun #define DAC960_PG_IDB_HWMBOX_NEW_CMD 0x01
864*4882a593Smuzhiyun #define DAC960_PG_IDB_HWMBOX_ACK_STS 0x02
865*4882a593Smuzhiyun #define DAC960_PG_IDB_GEN_IRQ 0x04
866*4882a593Smuzhiyun #define DAC960_PG_IDB_CTRL_RESET 0x08
867*4882a593Smuzhiyun #define DAC960_PG_IDB_MMBOX_NEW_CMD 0x10
868*4882a593Smuzhiyun 
869*4882a593Smuzhiyun #define DAC960_PG_IDB_HWMBOX_FULL 0x01
870*4882a593Smuzhiyun #define DAC960_PG_IDB_INIT_IN_PROGRESS 0x02
871*4882a593Smuzhiyun 
872*4882a593Smuzhiyun /*
873*4882a593Smuzhiyun  * DAC960 PG Series Outbound Door Bell Register.
874*4882a593Smuzhiyun  */
875*4882a593Smuzhiyun #define DAC960_PG_ODB_HWMBOX_ACK_IRQ 0x01
876*4882a593Smuzhiyun #define DAC960_PG_ODB_MMBOX_ACK_IRQ 0x02
877*4882a593Smuzhiyun #define DAC960_PG_ODB_HWMBOX_STS_AVAIL 0x01
878*4882a593Smuzhiyun #define DAC960_PG_ODB_MMBOX_STS_AVAIL 0x02
879*4882a593Smuzhiyun 
880*4882a593Smuzhiyun /*
881*4882a593Smuzhiyun  * DAC960 PG Series Interrupt Mask Register.
882*4882a593Smuzhiyun  */
883*4882a593Smuzhiyun #define DAC960_PG_IRQMASK_MSI_MASK1 0x03
884*4882a593Smuzhiyun #define DAC960_PG_IRQMASK_DISABLE_IRQ 0x04
885*4882a593Smuzhiyun #define DAC960_PG_IRQMASK_MSI_MASK2 0xF8
886*4882a593Smuzhiyun 
887*4882a593Smuzhiyun /*
888*4882a593Smuzhiyun  * DAC960 PG Series Error Status Register.
889*4882a593Smuzhiyun  */
890*4882a593Smuzhiyun #define DAC960_PG_ERRSTS_PENDING 0x04
891*4882a593Smuzhiyun 
892*4882a593Smuzhiyun /*
893*4882a593Smuzhiyun  * DAC960 PD Series Controller Interface Register Offsets.
894*4882a593Smuzhiyun  */
895*4882a593Smuzhiyun #define DAC960_PD_mmio_size		0x80
896*4882a593Smuzhiyun 
897*4882a593Smuzhiyun enum DAC960_PD_reg_offset {
898*4882a593Smuzhiyun 	DAC960_PD_CMDOP_OFFSET		= 0x00,
899*4882a593Smuzhiyun 	DAC960_PD_CMDID_OFFSET		= 0x01,
900*4882a593Smuzhiyun 	DAC960_PD_MBOX2_OFFSET		= 0x02,
901*4882a593Smuzhiyun 	DAC960_PD_MBOX3_OFFSET		= 0x03,
902*4882a593Smuzhiyun 	DAC960_PD_MBOX4_OFFSET		= 0x04,
903*4882a593Smuzhiyun 	DAC960_PD_MBOX5_OFFSET		= 0x05,
904*4882a593Smuzhiyun 	DAC960_PD_MBOX6_OFFSET		= 0x06,
905*4882a593Smuzhiyun 	DAC960_PD_MBOX7_OFFSET		= 0x07,
906*4882a593Smuzhiyun 	DAC960_PD_MBOX8_OFFSET		= 0x08,
907*4882a593Smuzhiyun 	DAC960_PD_MBOX9_OFFSET		= 0x09,
908*4882a593Smuzhiyun 	DAC960_PD_MBOX10_OFFSET		= 0x0A,
909*4882a593Smuzhiyun 	DAC960_PD_MBOX11_OFFSET		= 0x0B,
910*4882a593Smuzhiyun 	DAC960_PD_MBOX12_OFFSET		= 0x0C,
911*4882a593Smuzhiyun 	DAC960_PD_STSID_OFFSET		= 0x0D,
912*4882a593Smuzhiyun 	DAC960_PD_STS_OFFSET		= 0x0E,
913*4882a593Smuzhiyun 	DAC960_PD_ERRSTS_OFFSET		= 0x3F,
914*4882a593Smuzhiyun 	DAC960_PD_IDB_OFFSET		= 0x40,
915*4882a593Smuzhiyun 	DAC960_PD_ODB_OFFSET		= 0x41,
916*4882a593Smuzhiyun 	DAC960_PD_IRQEN_OFFSET		= 0x43,
917*4882a593Smuzhiyun };
918*4882a593Smuzhiyun 
919*4882a593Smuzhiyun /*
920*4882a593Smuzhiyun  * DAC960 PD Series Inbound Door Bell Register.
921*4882a593Smuzhiyun  */
922*4882a593Smuzhiyun #define DAC960_PD_IDB_HWMBOX_NEW_CMD 0x01
923*4882a593Smuzhiyun #define DAC960_PD_IDB_HWMBOX_ACK_STS 0x02
924*4882a593Smuzhiyun #define DAC960_PD_IDB_GEN_IRQ 0x04
925*4882a593Smuzhiyun #define DAC960_PD_IDB_CTRL_RESET 0x08
926*4882a593Smuzhiyun 
927*4882a593Smuzhiyun #define DAC960_PD_IDB_HWMBOX_FULL 0x01
928*4882a593Smuzhiyun #define DAC960_PD_IDB_INIT_IN_PROGRESS 0x02
929*4882a593Smuzhiyun 
930*4882a593Smuzhiyun /*
931*4882a593Smuzhiyun  * DAC960 PD Series Outbound Door Bell Register.
932*4882a593Smuzhiyun  */
933*4882a593Smuzhiyun #define DAC960_PD_ODB_HWMBOX_ACK_IRQ 0x01
934*4882a593Smuzhiyun #define DAC960_PD_ODB_HWMBOX_STS_AVAIL 0x01
935*4882a593Smuzhiyun 
936*4882a593Smuzhiyun /*
937*4882a593Smuzhiyun  * DAC960 PD Series Interrupt Enable Register.
938*4882a593Smuzhiyun  */
939*4882a593Smuzhiyun #define DAC960_PD_IRQMASK_ENABLE_IRQ 0x01
940*4882a593Smuzhiyun 
941*4882a593Smuzhiyun /*
942*4882a593Smuzhiyun  * DAC960 PD Series Error Status Register.
943*4882a593Smuzhiyun  */
944*4882a593Smuzhiyun #define DAC960_PD_ERRSTS_PENDING 0x04
945*4882a593Smuzhiyun 
946*4882a593Smuzhiyun typedef int (*myrb_hw_init_t)(struct pci_dev *pdev,
947*4882a593Smuzhiyun 			      struct myrb_hba *cb, void __iomem *base);
948*4882a593Smuzhiyun typedef unsigned short (*mbox_mmio_init_t)(struct pci_dev *pdev,
949*4882a593Smuzhiyun 					   void __iomem *base,
950*4882a593Smuzhiyun 					   union myrb_cmd_mbox *mbox);
951*4882a593Smuzhiyun 
952*4882a593Smuzhiyun struct myrb_privdata {
953*4882a593Smuzhiyun 	myrb_hw_init_t		hw_init;
954*4882a593Smuzhiyun 	irq_handler_t		irq_handler;
955*4882a593Smuzhiyun 	unsigned int		mmio_size;
956*4882a593Smuzhiyun };
957*4882a593Smuzhiyun 
958*4882a593Smuzhiyun #endif /* MYRB_H */
959