xref: /linux/drivers/scsi/myrs.h (revision 71e2f4dd5a65bd8dbca0b77661e75eea471168f8)
1 /* SPDX-License-Identifier: GPL-2.0
2  *
3  * Linux Driver for Mylex DAC960/AcceleRAID/eXtremeRAID PCI RAID Controllers
4  *
5  * This driver supports the newer, SCSI-based firmware interface only.
6  *
7  * Copyright 2018 Hannes Reinecke, SUSE Linux GmbH <hare@suse.com>
8  *
9  * Based on the original DAC960 driver, which has
10  * Copyright 1998-2001 by Leonard N. Zubkoff <lnz@dandelion.com>
11  * Portions Copyright 2002 by Mylex (An IBM Business Unit)
12  */
13 
14 #ifndef _MYRS_H
15 #define _MYRS_H
16 
17 #define MYRS_MAILBOX_TIMEOUT 1000000
18 
19 #define MYRS_DCMD_TAG 1
20 #define MYRS_MCMD_TAG 2
21 
22 #define MYRS_LINE_BUFFER_SIZE 128
23 
24 #define MYRS_PRIMARY_MONITOR_INTERVAL (10 * HZ)
25 #define MYRS_SECONDARY_MONITOR_INTERVAL (60 * HZ)
26 
27 /* Maximum number of Scatter/Gather Segments supported */
28 #define MYRS_SG_LIMIT		128
29 
30 /*
31  * Number of Command and Status Mailboxes used by the
32  * DAC960 V2 Firmware Memory Mailbox Interface.
33  */
34 #define MYRS_MAX_CMD_MBOX		512
35 #define MYRS_MAX_STAT_MBOX		512
36 
37 #define MYRS_DCDB_SIZE			16
38 #define MYRS_SENSE_SIZE			14
39 
40 /*
41  * DAC960 V2 Firmware Command Opcodes.
42  */
43 enum myrs_cmd_opcode {
44 	MYRS_CMD_OP_MEMCOPY		= 0x01,
45 	MYRS_CMD_OP_SCSI_10_PASSTHRU	= 0x02,
46 	MYRS_CMD_OP_SCSI_255_PASSTHRU	= 0x03,
47 	MYRS_CMD_OP_SCSI_10		= 0x04,
48 	MYRS_CMD_OP_SCSI_256		= 0x05,
49 	MYRS_CMD_OP_IOCTL		= 0x20,
50 } __packed;
51 
52 /*
53  * DAC960 V2 Firmware IOCTL Opcodes.
54  */
55 enum myrs_ioctl_opcode {
56 	MYRS_IOCTL_GET_CTLR_INFO	= 0x01,
57 	MYRS_IOCTL_GET_LDEV_INFO_VALID	= 0x03,
58 	MYRS_IOCTL_GET_PDEV_INFO_VALID	= 0x05,
59 	MYRS_IOCTL_GET_HEALTH_STATUS	= 0x11,
60 	MYRS_IOCTL_GET_EVENT		= 0x15,
61 	MYRS_IOCTL_START_DISCOVERY	= 0x81,
62 	MYRS_IOCTL_SET_DEVICE_STATE	= 0x82,
63 	MYRS_IOCTL_INIT_PDEV_START	= 0x84,
64 	MYRS_IOCTL_INIT_PDEV_STOP	= 0x85,
65 	MYRS_IOCTL_INIT_LDEV_START	= 0x86,
66 	MYRS_IOCTL_INIT_LDEV_STOP	= 0x87,
67 	MYRS_IOCTL_RBLD_DEVICE_START	= 0x88,
68 	MYRS_IOCTL_RBLD_DEVICE_STOP	= 0x89,
69 	MYRS_IOCTL_MAKE_CONSISTENT_START = 0x8A,
70 	MYRS_IOCTL_MAKE_CONSISTENT_STOP = 0x8B,
71 	MYRS_IOCTL_CC_START		= 0x8C,
72 	MYRS_IOCTL_CC_STOP		= 0x8D,
73 	MYRS_IOCTL_SET_MEM_MBOX		= 0x8E,
74 	MYRS_IOCTL_RESET_DEVICE		= 0x90,
75 	MYRS_IOCTL_FLUSH_DEVICE_DATA	= 0x91,
76 	MYRS_IOCTL_PAUSE_DEVICE		= 0x92,
77 	MYRS_IOCTL_UNPAUS_EDEVICE	= 0x93,
78 	MYRS_IOCTL_LOCATE_DEVICE	= 0x94,
79 	MYRS_IOCTL_CREATE_CONFIGURATION = 0xC0,
80 	MYRS_IOCTL_DELETE_LDEV		= 0xC1,
81 	MYRS_IOCTL_REPLACE_INTERNALDEVICE = 0xC2,
82 	MYRS_IOCTL_RENAME_LDEV		= 0xC3,
83 	MYRS_IOCTL_ADD_CONFIGURATION	= 0xC4,
84 	MYRS_IOCTL_XLATE_PDEV_TO_LDEV	= 0xC5,
85 	MYRS_IOCTL_CLEAR_CONFIGURATION	= 0xCA,
86 } __packed;
87 
88 /*
89  * DAC960 V2 Firmware Command Status Codes.
90  */
91 #define MYRS_STATUS_SUCCESS			0x00
92 #define MYRS_STATUS_FAILED			0x02
93 #define MYRS_STATUS_DEVICE_BUSY			0x08
94 #define MYRS_STATUS_DEVICE_NON_RESPONSIVE	0x0E
95 #define MYRS_STATUS_DEVICE_NON_RESPONSIVE2	0x0F
96 #define MYRS_STATUS_RESERVATION_CONFLICT	0x18
97 
98 /*
99  * DAC960 V2 Firmware Memory Type structure.
100  */
101 struct myrs_mem_type {
102 	enum {
103 		MYRS_MEMTYPE_RESERVED	= 0x00,
104 		MYRS_MEMTYPE_DRAM	= 0x01,
105 		MYRS_MEMTYPE_EDRAM	= 0x02,
106 		MYRS_MEMTYPE_EDO	= 0x03,
107 		MYRS_MEMTYPE_SDRAM	= 0x04,
108 		MYRS_MEMTYPE_LAST	= 0x1F,
109 	} __packed mem_type:5;	/* Byte 0 Bits 0-4 */
110 	unsigned rsvd:1;			/* Byte 0 Bit 5 */
111 	unsigned mem_parity:1;			/* Byte 0 Bit 6 */
112 	unsigned mem_ecc:1;			/* Byte 0 Bit 7 */
113 };
114 
115 /*
116  * DAC960 V2 Firmware Processor Type structure.
117  */
118 enum myrs_cpu_type {
119 	MYRS_CPUTYPE_i960CA	= 0x01,
120 	MYRS_CPUTYPE_i960RD	= 0x02,
121 	MYRS_CPUTYPE_i960RN	= 0x03,
122 	MYRS_CPUTYPE_i960RP	= 0x04,
123 	MYRS_CPUTYPE_NorthBay	= 0x05,
124 	MYRS_CPUTYPE_StrongArm	= 0x06,
125 	MYRS_CPUTYPE_i960RM	= 0x07,
126 } __packed;
127 
128 /*
129  * DAC960 V2 Firmware Get Controller Info reply structure.
130  */
131 struct myrs_ctlr_info {
132 	unsigned char rsvd1;				/* Byte 0 */
133 	enum {
134 		MYRS_SCSI_BUS	= 0x00,
135 		MYRS_Fibre_BUS	= 0x01,
136 		MYRS_PCI_BUS	= 0x03
137 	} __packed bus;	/* Byte 1 */
138 	enum {
139 		MYRS_CTLR_DAC960E	= 0x01,
140 		MYRS_CTLR_DAC960M	= 0x08,
141 		MYRS_CTLR_DAC960PD	= 0x10,
142 		MYRS_CTLR_DAC960PL	= 0x11,
143 		MYRS_CTLR_DAC960PU	= 0x12,
144 		MYRS_CTLR_DAC960PE	= 0x13,
145 		MYRS_CTLR_DAC960PG	= 0x14,
146 		MYRS_CTLR_DAC960PJ	= 0x15,
147 		MYRS_CTLR_DAC960PTL0	= 0x16,
148 		MYRS_CTLR_DAC960PR	= 0x17,
149 		MYRS_CTLR_DAC960PRL	= 0x18,
150 		MYRS_CTLR_DAC960PT	= 0x19,
151 		MYRS_CTLR_DAC1164P	= 0x1A,
152 		MYRS_CTLR_DAC960PTL1	= 0x1B,
153 		MYRS_CTLR_EXR2000P	= 0x1C,
154 		MYRS_CTLR_EXR3000P	= 0x1D,
155 		MYRS_CTLR_ACCELERAID352 = 0x1E,
156 		MYRS_CTLR_ACCELERAID170 = 0x1F,
157 		MYRS_CTLR_ACCELERAID160 = 0x20,
158 		MYRS_CTLR_DAC960S	= 0x60,
159 		MYRS_CTLR_DAC960SU	= 0x61,
160 		MYRS_CTLR_DAC960SX	= 0x62,
161 		MYRS_CTLR_DAC960SF	= 0x63,
162 		MYRS_CTLR_DAC960SS	= 0x64,
163 		MYRS_CTLR_DAC960FL	= 0x65,
164 		MYRS_CTLR_DAC960LL	= 0x66,
165 		MYRS_CTLR_DAC960FF	= 0x67,
166 		MYRS_CTLR_DAC960HP	= 0x68,
167 		MYRS_CTLR_RAIDBRICK	= 0x69,
168 		MYRS_CTLR_METEOR_FL	= 0x6A,
169 		MYRS_CTLR_METEOR_FF	= 0x6B
170 	} __packed ctlr_type;	/* Byte 2 */
171 	unsigned char rsvd2;			/* Byte 3 */
172 	unsigned short bus_speed_mhz;		/* Bytes 4-5 */
173 	unsigned char bus_width;		/* Byte 6 */
174 	unsigned char flash_code;		/* Byte 7 */
175 	unsigned char ports_present;		/* Byte 8 */
176 	unsigned char rsvd3[7];			/* Bytes 9-15 */
177 	unsigned char bus_name[16];		/* Bytes 16-31 */
178 	unsigned char ctlr_name[16];		/* Bytes 32-47 */
179 	unsigned char rsvd4[16];		/* Bytes 48-63 */
180 	/* Firmware Release Information */
181 	unsigned char fw_major_version;		/* Byte 64 */
182 	unsigned char fw_minor_version;		/* Byte 65 */
183 	unsigned char fw_turn_number;		/* Byte 66 */
184 	unsigned char fw_build_number;		/* Byte 67 */
185 	unsigned char fw_release_day;		/* Byte 68 */
186 	unsigned char fw_release_month;		/* Byte 69 */
187 	unsigned char fw_release_year_hi;	/* Byte 70 */
188 	unsigned char fw_release_year_lo;	/* Byte 71 */
189 	/* Hardware Release Information */
190 	unsigned char hw_rev;			/* Byte 72 */
191 	unsigned char rsvd5[3];			/* Bytes 73-75 */
192 	unsigned char hw_release_day;		/* Byte 76 */
193 	unsigned char hw_release_month;		/* Byte 77 */
194 	unsigned char hw_release_year_hi;	/* Byte 78 */
195 	unsigned char hw_release_year_lo;	/* Byte 79 */
196 	/* Hardware Manufacturing Information */
197 	unsigned char manuf_batch_num;		/* Byte 80 */
198 	unsigned char rsvd6;			/* Byte 81 */
199 	unsigned char manuf_plant_num;		/* Byte 82 */
200 	unsigned char rsvd7;			/* Byte 83 */
201 	unsigned char hw_manuf_day;		/* Byte 84 */
202 	unsigned char hw_manuf_month;		/* Byte 85 */
203 	unsigned char hw_manuf_year_hi;		/* Byte 86 */
204 	unsigned char hw_manuf_year_lo;		/* Byte 87 */
205 	unsigned char max_pd_per_xld;		/* Byte 88 */
206 	unsigned char max_ild_per_xld;		/* Byte 89 */
207 	unsigned short nvram_size_kb;		/* Bytes 90-91 */
208 	unsigned char max_xld;			/* Byte 92 */
209 	unsigned char rsvd8[3];			/* Bytes 93-95 */
210 	/* Unique Information per Controller */
211 	unsigned char serial_number[16];	/* Bytes 96-111 */
212 	unsigned char rsvd9[16];		/* Bytes 112-127 */
213 	/* Vendor Information */
214 	unsigned char rsvd10[3];		/* Bytes 128-130 */
215 	unsigned char oem_code;			/* Byte 131 */
216 	unsigned char vendor[16];		/* Bytes 132-147 */
217 	/* Other Physical/Controller/Operation Information */
218 	unsigned char bbu_present:1;		/* Byte 148 Bit 0 */
219 	unsigned char cluster_mode:1;		/* Byte 148 Bit 1 */
220 	unsigned char rsvd11:6;			/* Byte 148 Bits 2-7 */
221 	unsigned char rsvd12[3];		/* Bytes 149-151 */
222 	/* Physical Device Scan Information */
223 	unsigned char pscan_active:1;		/* Byte 152 Bit 0 */
224 	unsigned char rsvd13:7;			/* Byte 152 Bits 1-7 */
225 	unsigned char pscan_chan;		/* Byte 153 */
226 	unsigned char pscan_target;		/* Byte 154 */
227 	unsigned char pscan_lun;		/* Byte 155 */
228 	/* Maximum Command Data Transfer Sizes */
229 	unsigned short max_transfer_size;	/* Bytes 156-157 */
230 	unsigned short max_sge;			/* Bytes 158-159 */
231 	/* Logical/Physical Device Counts */
232 	unsigned short ldev_present;		/* Bytes 160-161 */
233 	unsigned short ldev_critical;		/* Bytes 162-163 */
234 	unsigned short ldev_offline;		/* Bytes 164-165 */
235 	unsigned short pdev_present;		/* Bytes 166-167 */
236 	unsigned short pdisk_present;		/* Bytes 168-169 */
237 	unsigned short pdisk_critical;		/* Bytes 170-171 */
238 	unsigned short pdisk_offline;		/* Bytes 172-173 */
239 	unsigned short max_tcq;			/* Bytes 174-175 */
240 	/* Channel and Target ID Information */
241 	unsigned char physchan_present;		/* Byte 176 */
242 	unsigned char virtchan_present;		/* Byte 177 */
243 	unsigned char physchan_max;		/* Byte 178 */
244 	unsigned char virtchan_max;		/* Byte 179 */
245 	unsigned char max_targets[16];		/* Bytes 180-195 */
246 	unsigned char rsvd14[12];		/* Bytes 196-207 */
247 	/* Memory/Cache Information */
248 	unsigned short mem_size_mb;		/* Bytes 208-209 */
249 	unsigned short cache_size_mb;		/* Bytes 210-211 */
250 	unsigned int valid_cache_bytes;		/* Bytes 212-215 */
251 	unsigned int dirty_cache_bytes;		/* Bytes 216-219 */
252 	unsigned short mem_speed_mhz;		/* Bytes 220-221 */
253 	unsigned char mem_data_width;		/* Byte 222 */
254 	struct myrs_mem_type mem_type;		/* Byte 223 */
255 	unsigned char cache_mem_type_name[16];	/* Bytes 224-239 */
256 	/* Execution Memory Information */
257 	unsigned short exec_mem_size_mb;	/* Bytes 240-241 */
258 	unsigned short exec_l2_cache_size_mb;	/* Bytes 242-243 */
259 	unsigned char rsvd15[8];		/* Bytes 244-251 */
260 	unsigned short exec_mem_speed_mhz;	/* Bytes 252-253 */
261 	unsigned char exec_mem_data_width;	/* Byte 254 */
262 	struct myrs_mem_type exec_mem_type;	/* Byte 255 */
263 	unsigned char exec_mem_type_name[16];	/* Bytes 256-271 */
264 	/* CPU Type Information */
265 	struct {				/* Bytes 272-335 */
266 		unsigned short cpu_speed_mhz;
267 		enum myrs_cpu_type cpu_type;
268 		unsigned char cpu_count;
269 		unsigned char rsvd16[12];
270 		unsigned char cpu_name[16];
271 	} __packed cpu[2];
272 	/* Debugging/Profiling/Command Time Tracing Information */
273 	unsigned short cur_prof_page_num;	/* Bytes 336-337 */
274 	unsigned short num_prof_waiters;	/* Bytes 338-339 */
275 	unsigned short cur_trace_page_num;	/* Bytes 340-341 */
276 	unsigned short num_trace_waiters;	/* Bytes 342-343 */
277 	unsigned char rsvd18[8];		/* Bytes 344-351 */
278 	/* Error Counters on Physical Devices */
279 	unsigned short pdev_bus_resets;		/* Bytes 352-353 */
280 	unsigned short pdev_parity_errors;	/* Bytes 355-355 */
281 	unsigned short pdev_soft_errors;	/* Bytes 356-357 */
282 	unsigned short pdev_cmds_failed;	/* Bytes 358-359 */
283 	unsigned short pdev_misc_errors;	/* Bytes 360-361 */
284 	unsigned short pdev_cmd_timeouts;	/* Bytes 362-363 */
285 	unsigned short pdev_sel_timeouts;	/* Bytes 364-365 */
286 	unsigned short pdev_retries_done;	/* Bytes 366-367 */
287 	unsigned short pdev_aborts_done;	/* Bytes 368-369 */
288 	unsigned short pdev_host_aborts_done;	/* Bytes 370-371 */
289 	unsigned short pdev_predicted_failures;	/* Bytes 372-373 */
290 	unsigned short pdev_host_cmds_failed;	/* Bytes 374-375 */
291 	unsigned short pdev_hard_errors;	/* Bytes 376-377 */
292 	unsigned char rsvd19[6];		/* Bytes 378-383 */
293 	/* Error Counters on Logical Devices */
294 	unsigned short ldev_soft_errors;	/* Bytes 384-385 */
295 	unsigned short ldev_cmds_failed;	/* Bytes 386-387 */
296 	unsigned short ldev_host_aborts_done;	/* Bytes 388-389 */
297 	unsigned char rsvd20[2];		/* Bytes 390-391 */
298 	/* Error Counters on Controller */
299 	unsigned short ctlr_mem_errors;		/* Bytes 392-393 */
300 	unsigned short ctlr_host_aborts_done;	/* Bytes 394-395 */
301 	unsigned char rsvd21[4];		/* Bytes 396-399 */
302 	/* Long Duration Activity Information */
303 	unsigned short bg_init_active;		/* Bytes 400-401 */
304 	unsigned short ldev_init_active;	/* Bytes 402-403 */
305 	unsigned short pdev_init_active;	/* Bytes 404-405 */
306 	unsigned short cc_active;		/* Bytes 406-407 */
307 	unsigned short rbld_active;		/* Bytes 408-409 */
308 	unsigned short exp_active;		/* Bytes 410-411 */
309 	unsigned short patrol_active;		/* Bytes 412-413 */
310 	unsigned char rsvd22[2];		/* Bytes 414-415 */
311 	/* Flash ROM Information */
312 	unsigned char flash_type;		/* Byte 416 */
313 	unsigned char rsvd23;			/* Byte 417 */
314 	unsigned short flash_size_MB;		/* Bytes 418-419 */
315 	unsigned int flash_limit;		/* Bytes 420-423 */
316 	unsigned int flash_count;		/* Bytes 424-427 */
317 	unsigned char rsvd24[4];		/* Bytes 428-431 */
318 	unsigned char flash_type_name[16];	/* Bytes 432-447 */
319 	/* Firmware Run Time Information */
320 	unsigned char rbld_rate;		/* Byte 448 */
321 	unsigned char bg_init_rate;		/* Byte 449 */
322 	unsigned char fg_init_rate;		/* Byte 450 */
323 	unsigned char cc_rate;			/* Byte 451 */
324 	unsigned char rsvd25[4];		/* Bytes 452-455 */
325 	unsigned int max_dp;			/* Bytes 456-459 */
326 	unsigned int free_dp;			/* Bytes 460-463 */
327 	unsigned int max_iop;			/* Bytes 464-467 */
328 	unsigned int free_iop;			/* Bytes 468-471 */
329 	unsigned short max_combined_len;	/* Bytes 472-473 */
330 	unsigned short num_cfg_groups;		/* Bytes 474-475 */
331 	unsigned installation_abort_status:1;	/* Byte 476 Bit 0 */
332 	unsigned maint_mode_status:1;		/* Byte 476 Bit 1 */
333 	unsigned rsvd26:6;			/* Byte 476 Bits 2-7 */
334 	unsigned char rsvd27[6];		/* Bytes 477-511 */
335 	unsigned char rsvd28[512];		/* Bytes 512-1023 */
336 };
337 
338 /*
339  * DAC960 V2 Firmware Device State type.
340  */
341 enum myrs_devstate {
342 	MYRS_DEVICE_UNCONFIGURED	= 0x00,
343 	MYRS_DEVICE_ONLINE		= 0x01,
344 	MYRS_DEVICE_REBUILD		= 0x03,
345 	MYRS_DEVICE_MISSING		= 0x04,
346 	MYRS_DEVICE_SUSPECTED_CRITICAL	= 0x05,
347 	MYRS_DEVICE_OFFLINE		= 0x08,
348 	MYRS_DEVICE_CRITICAL		= 0x09,
349 	MYRS_DEVICE_SUSPECTED_DEAD	= 0x0C,
350 	MYRS_DEVICE_COMMANDED_OFFLINE	= 0x10,
351 	MYRS_DEVICE_STANDBY		= 0x21,
352 	MYRS_DEVICE_INVALID_STATE	= 0xFF,
353 } __packed;
354 
355 /*
356  * DAC960 V2 RAID Levels
357  */
358 enum myrs_raid_level {
359 	MYRS_RAID_LEVEL0	= 0x0,     /* RAID 0 */
360 	MYRS_RAID_LEVEL1	= 0x1,     /* RAID 1 */
361 	MYRS_RAID_LEVEL3	= 0x3,     /* RAID 3 right asymmetric parity */
362 	MYRS_RAID_LEVEL5	= 0x5,     /* RAID 5 right asymmetric parity */
363 	MYRS_RAID_LEVEL6	= 0x6,     /* RAID 6 (Mylex RAID 6) */
364 	MYRS_RAID_JBOD		= 0x7,     /* RAID 7 (JBOD) */
365 	MYRS_RAID_NEWSPAN	= 0x8,     /* New Mylex SPAN */
366 	MYRS_RAID_LEVEL3F	= 0x9,     /* RAID 3 fixed parity */
367 	MYRS_RAID_LEVEL3L	= 0xb,     /* RAID 3 left symmetric parity */
368 	MYRS_RAID_SPAN		= 0xc,     /* current spanning implementation */
369 	MYRS_RAID_LEVEL5L	= 0xd,     /* RAID 5 left symmetric parity */
370 	MYRS_RAID_LEVELE	= 0xe,     /* RAID E (concatenation) */
371 	MYRS_RAID_PHYSICAL	= 0xf,     /* physical device */
372 } __packed;
373 
374 enum myrs_stripe_size {
375 	MYRS_STRIPE_SIZE_0	= 0x0,	/* no stripe (RAID 1, RAID 7, etc) */
376 	MYRS_STRIPE_SIZE_512B	= 0x1,
377 	MYRS_STRIPE_SIZE_1K	= 0x2,
378 	MYRS_STRIPE_SIZE_2K	= 0x3,
379 	MYRS_STRIPE_SIZE_4K	= 0x4,
380 	MYRS_STRIPE_SIZE_8K	= 0x5,
381 	MYRS_STRIPE_SIZE_16K	= 0x6,
382 	MYRS_STRIPE_SIZE_32K	= 0x7,
383 	MYRS_STRIPE_SIZE_64K	= 0x8,
384 	MYRS_STRIPE_SIZE_128K	= 0x9,
385 	MYRS_STRIPE_SIZE_256K	= 0xa,
386 	MYRS_STRIPE_SIZE_512K	= 0xb,
387 	MYRS_STRIPE_SIZE_1M	= 0xc,
388 } __packed;
389 
390 enum myrs_cacheline_size {
391 	MYRS_CACHELINE_ZERO	= 0x0,	/* caching cannot be enabled */
392 	MYRS_CACHELINE_512B	= 0x1,
393 	MYRS_CACHELINE_1K	= 0x2,
394 	MYRS_CACHELINE_2K	= 0x3,
395 	MYRS_CACHELINE_4K	= 0x4,
396 	MYRS_CACHELINE_8K	= 0x5,
397 	MYRS_CACHELINE_16K	= 0x6,
398 	MYRS_CACHELINE_32K	= 0x7,
399 	MYRS_CACHELINE_64K	= 0x8,
400 } __packed;
401 
402 /*
403  * DAC960 V2 Firmware Get Logical Device Info reply structure.
404  */
405 struct myrs_ldev_info {
406 	unsigned char ctlr;			/* Byte 0 */
407 	unsigned char channel;			/* Byte 1 */
408 	unsigned char target;			/* Byte 2 */
409 	unsigned char lun;			/* Byte 3 */
410 	enum myrs_devstate dev_state;		/* Byte 4 */
411 	unsigned char raid_level;		/* Byte 5 */
412 	enum myrs_stripe_size stripe_size;	/* Byte 6 */
413 	enum myrs_cacheline_size cacheline_size; /* Byte 7 */
414 	struct {
415 		enum {
416 			MYRS_READCACHE_DISABLED		= 0x0,
417 			MYRS_READCACHE_ENABLED		= 0x1,
418 			MYRS_READAHEAD_ENABLED		= 0x2,
419 			MYRS_INTELLIGENT_READAHEAD_ENABLED = 0x3,
420 			MYRS_READCACHE_LAST		= 0x7,
421 		} __packed rce:3; /* Byte 8 Bits 0-2 */
422 		enum {
423 			MYRS_WRITECACHE_DISABLED	= 0x0,
424 			MYRS_LOGICALDEVICE_RO		= 0x1,
425 			MYRS_WRITECACHE_ENABLED		= 0x2,
426 			MYRS_INTELLIGENT_WRITECACHE_ENABLED = 0x3,
427 			MYRS_WRITECACHE_LAST		= 0x7,
428 		} __packed wce:3; /* Byte 8 Bits 3-5 */
429 		unsigned rsvd1:1;		/* Byte 8 Bit 6 */
430 		unsigned ldev_init_done:1;	/* Byte 8 Bit 7 */
431 	} ldev_control;				/* Byte 8 */
432 	/* Logical Device Operations Status */
433 	unsigned char cc_active:1;		/* Byte 9 Bit 0 */
434 	unsigned char rbld_active:1;		/* Byte 9 Bit 1 */
435 	unsigned char bg_init_active:1;		/* Byte 9 Bit 2 */
436 	unsigned char fg_init_active:1;		/* Byte 9 Bit 3 */
437 	unsigned char migration_active:1;	/* Byte 9 Bit 4 */
438 	unsigned char patrol_active:1;		/* Byte 9 Bit 5 */
439 	unsigned char rsvd2:2;			/* Byte 9 Bits 6-7 */
440 	unsigned char raid5_writeupdate;	/* Byte 10 */
441 	unsigned char raid5_algo;		/* Byte 11 */
442 	unsigned short ldev_num;		/* Bytes 12-13 */
443 	/* BIOS Info */
444 	unsigned char bios_disabled:1;		/* Byte 14 Bit 0 */
445 	unsigned char cdrom_boot:1;		/* Byte 14 Bit 1 */
446 	unsigned char drv_coercion:1;		/* Byte 14 Bit 2 */
447 	unsigned char write_same_disabled:1;	/* Byte 14 Bit 3 */
448 	unsigned char hba_mode:1;		/* Byte 14 Bit 4 */
449 	enum {
450 		MYRS_GEOMETRY_128_32	= 0x0,
451 		MYRS_GEOMETRY_255_63	= 0x1,
452 		MYRS_GEOMETRY_RSVD1	= 0x2,
453 		MYRS_GEOMETRY_RSVD2	= 0x3
454 	} __packed drv_geom:2;	/* Byte 14 Bits 5-6 */
455 	unsigned char super_ra_enabled:1;	/* Byte 14 Bit 7 */
456 	unsigned char rsvd3;			/* Byte 15 */
457 	/* Error Counters */
458 	unsigned short soft_errs;		/* Bytes 16-17 */
459 	unsigned short cmds_failed;		/* Bytes 18-19 */
460 	unsigned short cmds_aborted;		/* Bytes 20-21 */
461 	unsigned short deferred_write_errs;	/* Bytes 22-23 */
462 	unsigned int rsvd4;			/* Bytes 24-27 */
463 	unsigned int rsvd5;			/* Bytes 28-31 */
464 	/* Device Size Information */
465 	unsigned short rsvd6;			/* Bytes 32-33 */
466 	unsigned short devsize_bytes;		/* Bytes 34-35 */
467 	unsigned int orig_devsize;		/* Bytes 36-39 */
468 	unsigned int cfg_devsize;		/* Bytes 40-43 */
469 	unsigned int rsvd7;			/* Bytes 44-47 */
470 	unsigned char ldev_name[32];		/* Bytes 48-79 */
471 	unsigned char inquiry[36];		/* Bytes 80-115 */
472 	unsigned char rsvd8[12];		/* Bytes 116-127 */
473 	u64 last_read_lba;			/* Bytes 128-135 */
474 	u64 last_write_lba;			/* Bytes 136-143 */
475 	u64 cc_lba;				/* Bytes 144-151 */
476 	u64 rbld_lba;				/* Bytes 152-159 */
477 	u64 bg_init_lba;			/* Bytes 160-167 */
478 	u64 fg_init_lba;			/* Bytes 168-175 */
479 	u64 migration_lba;			/* Bytes 176-183 */
480 	u64 patrol_lba;				/* Bytes 184-191 */
481 	unsigned char rsvd9[64];		/* Bytes 192-255 */
482 };
483 
484 /*
485  * DAC960 V2 Firmware Get Physical Device Info reply structure.
486  */
487 struct myrs_pdev_info {
488 	unsigned char rsvd1;			/* Byte 0 */
489 	unsigned char channel;			/* Byte 1 */
490 	unsigned char target;			/* Byte 2 */
491 	unsigned char lun;			/* Byte 3 */
492 	/* Configuration Status Bits */
493 	unsigned char pdev_fault_tolerant:1;	/* Byte 4 Bit 0 */
494 	unsigned char pdev_connected:1;		/* Byte 4 Bit 1 */
495 	unsigned char pdev_local_to_ctlr:1;	/* Byte 4 Bit 2 */
496 	unsigned char rsvd2:5;			/* Byte 4 Bits 3-7 */
497 	/* Multiple Host/Controller Status Bits */
498 	unsigned char remote_host_dead:1;	/* Byte 5 Bit 0 */
499 	unsigned char remove_ctlr_dead:1;	/* Byte 5 Bit 1 */
500 	unsigned char rsvd3:6;			/* Byte 5 Bits 2-7 */
501 	enum myrs_devstate dev_state;		/* Byte 6 */
502 	unsigned char nego_data_width;		/* Byte 7 */
503 	unsigned short nego_sync_rate;		/* Bytes 8-9 */
504 	/* Multiported Physical Device Information */
505 	unsigned char num_ports;		/* Byte 10 */
506 	unsigned char drv_access_bitmap;	/* Byte 11 */
507 	unsigned int rsvd4;			/* Bytes 12-15 */
508 	unsigned char ip_address[16];		/* Bytes 16-31 */
509 	unsigned short max_tags;		/* Bytes 32-33 */
510 	/* Physical Device Operations Status */
511 	unsigned char cc_in_progress:1;		/* Byte 34 Bit 0 */
512 	unsigned char rbld_in_progress:1;	/* Byte 34 Bit 1 */
513 	unsigned char makecc_in_progress:1;	/* Byte 34 Bit 2 */
514 	unsigned char pdevinit_in_progress:1;	/* Byte 34 Bit 3 */
515 	unsigned char migration_in_progress:1;	/* Byte 34 Bit 4 */
516 	unsigned char patrol_in_progress:1;	/* Byte 34 Bit 5 */
517 	unsigned char rsvd5:2;			/* Byte 34 Bits 6-7 */
518 	unsigned char long_op_status;		/* Byte 35 */
519 	unsigned char parity_errs;		/* Byte 36 */
520 	unsigned char soft_errs;		/* Byte 37 */
521 	unsigned char hard_errs;		/* Byte 38 */
522 	unsigned char misc_errs;		/* Byte 39 */
523 	unsigned char cmd_timeouts;		/* Byte 40 */
524 	unsigned char retries;			/* Byte 41 */
525 	unsigned char aborts;			/* Byte 42 */
526 	unsigned char pred_failures;		/* Byte 43 */
527 	unsigned int rsvd6;			/* Bytes 44-47 */
528 	unsigned short rsvd7;			/* Bytes 48-49 */
529 	unsigned short devsize_bytes;		/* Bytes 50-51 */
530 	unsigned int orig_devsize;		/* Bytes 52-55 */
531 	unsigned int cfg_devsize;		/* Bytes 56-59 */
532 	unsigned int rsvd8;			/* Bytes 60-63 */
533 	unsigned char pdev_name[16];		/* Bytes 64-79 */
534 	unsigned char rsvd9[16];		/* Bytes 80-95 */
535 	unsigned char rsvd10[32];		/* Bytes 96-127 */
536 	unsigned char inquiry[36];		/* Bytes 128-163 */
537 	unsigned char rsvd11[20];		/* Bytes 164-183 */
538 	unsigned char rsvd12[8];		/* Bytes 184-191 */
539 	u64 last_read_lba;			/* Bytes 192-199 */
540 	u64 last_write_lba;			/* Bytes 200-207 */
541 	u64 cc_lba;				/* Bytes 208-215 */
542 	u64 rbld_lba;				/* Bytes 216-223 */
543 	u64 makecc_lba;				/* Bytes 224-231 */
544 	u64 devinit_lba;			/* Bytes 232-239 */
545 	u64 migration_lba;			/* Bytes 240-247 */
546 	u64 patrol_lba;				/* Bytes 248-255 */
547 	unsigned char rsvd13[256];		/* Bytes 256-511 */
548 };
549 
550 /*
551  * DAC960 V2 Firmware Health Status Buffer structure.
552  */
553 struct myrs_fwstat {
554 	unsigned int uptime_usecs;		/* Bytes 0-3 */
555 	unsigned int uptime_msecs;		/* Bytes 4-7 */
556 	unsigned int seconds;			/* Bytes 8-11 */
557 	unsigned char rsvd1[4];			/* Bytes 12-15 */
558 	unsigned int epoch;			/* Bytes 16-19 */
559 	unsigned char rsvd2[4];			/* Bytes 20-23 */
560 	unsigned int dbg_msgbuf_idx;		/* Bytes 24-27 */
561 	unsigned int coded_msgbuf_idx;		/* Bytes 28-31 */
562 	unsigned int cur_timetrace_page;	/* Bytes 32-35 */
563 	unsigned int cur_prof_page;		/* Bytes 36-39 */
564 	unsigned int next_evseq;		/* Bytes 40-43 */
565 	unsigned char rsvd3[4];			/* Bytes 44-47 */
566 	unsigned char rsvd4[16];		/* Bytes 48-63 */
567 	unsigned char rsvd5[64];		/* Bytes 64-127 */
568 };
569 
570 /*
571  * DAC960 V2 Firmware Get Event reply structure.
572  */
573 struct myrs_event {
574 	unsigned int ev_seq;			/* Bytes 0-3 */
575 	unsigned int ev_time;			/* Bytes 4-7 */
576 	unsigned int ev_code;			/* Bytes 8-11 */
577 	unsigned char rsvd1;			/* Byte 12 */
578 	unsigned char channel;			/* Byte 13 */
579 	unsigned char target;			/* Byte 14 */
580 	unsigned char lun;			/* Byte 15 */
581 	unsigned int rsvd2;			/* Bytes 16-19 */
582 	unsigned int ev_parm;			/* Bytes 20-23 */
583 	unsigned char sense_data[40];		/* Bytes 24-63 */
584 };
585 
586 /*
587  * DAC960 V2 Firmware Command Control Bits structure.
588  */
589 struct myrs_cmd_ctrl {
590 	unsigned char fua:1;			/* Byte 0 Bit 0 */
591 	unsigned char disable_pgout:1;		/* Byte 0 Bit 1 */
592 	unsigned char rsvd1:1;			/* Byte 0 Bit 2 */
593 	unsigned char add_sge_mem:1;		/* Byte 0 Bit 3 */
594 	unsigned char dma_ctrl_to_host:1;	/* Byte 0 Bit 4 */
595 	unsigned char rsvd2:1;			/* Byte 0 Bit 5 */
596 	unsigned char no_autosense:1;		/* Byte 0 Bit 6 */
597 	unsigned char disc_prohibited:1;	/* Byte 0 Bit 7 */
598 };
599 
600 /*
601  * DAC960 V2 Firmware Command Timeout structure.
602  */
603 struct myrs_cmd_tmo {
604 	unsigned char tmo_val:6;			/* Byte 0 Bits 0-5 */
605 	enum {
606 		MYRS_TMO_SCALE_SECONDS	= 0,
607 		MYRS_TMO_SCALE_MINUTES	= 1,
608 		MYRS_TMO_SCALE_HOURS	= 2,
609 		MYRS_TMO_SCALE_RESERVED = 3
610 	} __packed tmo_scale:2;		/* Byte 0 Bits 6-7 */
611 };
612 
613 /*
614  * DAC960 V2 Firmware Physical Device structure.
615  */
616 struct myrs_pdev {
617 	unsigned char lun;			/* Byte 0 */
618 	unsigned char target;			/* Byte 1 */
619 	unsigned char channel:3;		/* Byte 2 Bits 0-2 */
620 	unsigned char ctlr:5;			/* Byte 2 Bits 3-7 */
621 } __packed;
622 
623 /*
624  * DAC960 V2 Firmware Logical Device structure.
625  */
626 struct myrs_ldev {
627 	unsigned short ldev_num;		/* Bytes 0-1 */
628 	unsigned char rsvd:3;			/* Byte 2 Bits 0-2 */
629 	unsigned char ctlr:5;			/* Byte 2 Bits 3-7 */
630 } __packed;
631 
632 /*
633  * DAC960 V2 Firmware Operation Device type.
634  */
635 enum myrs_opdev {
636 	MYRS_PHYSICAL_DEVICE	= 0x00,
637 	MYRS_RAID_DEVICE	= 0x01,
638 	MYRS_PHYSICAL_CHANNEL	= 0x02,
639 	MYRS_RAID_CHANNEL	= 0x03,
640 	MYRS_PHYSICAL_CONTROLLER = 0x04,
641 	MYRS_RAID_CONTROLLER	= 0x05,
642 	MYRS_CONFIGURATION_GROUP = 0x10,
643 	MYRS_ENCLOSURE		= 0x11,
644 } __packed;
645 
646 /*
647  * DAC960 V2 Firmware Translate Physical To Logical Device structure.
648  */
649 struct myrs_devmap {
650 	unsigned short ldev_num;		/* Bytes 0-1 */
651 	unsigned short rsvd;			/* Bytes 2-3 */
652 	unsigned char prev_boot_ctlr;		/* Byte 4 */
653 	unsigned char prev_boot_channel;	/* Byte 5 */
654 	unsigned char prev_boot_target;		/* Byte 6 */
655 	unsigned char prev_boot_lun;		/* Byte 7 */
656 };
657 
658 /*
659  * DAC960 V2 Firmware Scatter/Gather List Entry structure.
660  */
661 struct myrs_sge {
662 	u64 sge_addr;			/* Bytes 0-7 */
663 	u64 sge_count;			/* Bytes 8-15 */
664 };
665 
666 /*
667  * DAC960 V2 Firmware Data Transfer Memory Address structure.
668  */
669 union myrs_sgl {
670 	struct myrs_sge sge[2]; /* Bytes 0-31 */
671 	struct {
672 		unsigned short sge0_len;	/* Bytes 0-1 */
673 		unsigned short sge1_len;	/* Bytes 2-3 */
674 		unsigned short sge2_len;	/* Bytes 4-5 */
675 		unsigned short rsvd;		/* Bytes 6-7 */
676 		u64 sge0_addr;			/* Bytes 8-15 */
677 		u64 sge1_addr;			/* Bytes 16-23 */
678 		u64 sge2_addr;			/* Bytes 24-31 */
679 	} ext;
680 };
681 
682 /*
683  * 64 Byte DAC960 V2 Firmware Command Mailbox structure.
684  */
685 union myrs_cmd_mbox {
686 	unsigned int words[16];				/* Words 0-15 */
687 	struct {
688 		unsigned short id;			/* Bytes 0-1 */
689 		enum myrs_cmd_opcode opcode;		/* Byte 2 */
690 		struct myrs_cmd_ctrl control;		/* Byte 3 */
691 		u32 dma_size:24;			/* Bytes 4-6 */
692 		unsigned char dma_num;			/* Byte 7 */
693 		u64 sense_addr;				/* Bytes 8-15 */
694 		unsigned int rsvd1:24;			/* Bytes 16-18 */
695 		struct myrs_cmd_tmo tmo;		/* Byte 19 */
696 		unsigned char sense_len;		/* Byte 20 */
697 		enum myrs_ioctl_opcode ioctl_opcode;	/* Byte 21 */
698 		unsigned char rsvd2[10];		/* Bytes 22-31 */
699 		union myrs_sgl dma_addr;		/* Bytes 32-63 */
700 	} common;
701 	struct {
702 		unsigned short id;			/* Bytes 0-1 */
703 		enum myrs_cmd_opcode opcode;		/* Byte 2 */
704 		struct myrs_cmd_ctrl control;		/* Byte 3 */
705 		u32 dma_size;				/* Bytes 4-7 */
706 		u64 sense_addr;				/* Bytes 8-15 */
707 		struct myrs_pdev pdev;			/* Bytes 16-18 */
708 		struct myrs_cmd_tmo tmo;		/* Byte 19 */
709 		unsigned char sense_len;		/* Byte 20 */
710 		unsigned char cdb_len;			/* Byte 21 */
711 		unsigned char cdb[10];			/* Bytes 22-31 */
712 		union myrs_sgl dma_addr;		/* Bytes 32-63 */
713 	} SCSI_10;
714 	struct {
715 		unsigned short id;			/* Bytes 0-1 */
716 		enum myrs_cmd_opcode opcode;		/* Byte 2 */
717 		struct myrs_cmd_ctrl control;		/* Byte 3 */
718 		u32 dma_size;				/* Bytes 4-7 */
719 		u64 sense_addr;				/* Bytes 8-15 */
720 		struct myrs_pdev pdev;			/* Bytes 16-18 */
721 		struct myrs_cmd_tmo tmo;		/* Byte 19 */
722 		unsigned char sense_len;		/* Byte 20 */
723 		unsigned char cdb_len;			/* Byte 21 */
724 		unsigned short rsvd;			/* Bytes 22-23 */
725 		u64 cdb_addr;				/* Bytes 24-31 */
726 		union myrs_sgl dma_addr;		/* Bytes 32-63 */
727 	} SCSI_255;
728 	struct {
729 		unsigned short id;			/* Bytes 0-1 */
730 		enum myrs_cmd_opcode opcode;		/* Byte 2 */
731 		struct myrs_cmd_ctrl control;		/* Byte 3 */
732 		u32 dma_size:24;			/* Bytes 4-6 */
733 		unsigned char dma_num;			/* Byte 7 */
734 		u64 sense_addr;				/* Bytes 8-15 */
735 		unsigned short rsvd1;			/* Bytes 16-17 */
736 		unsigned char ctlr_num;			/* Byte 18 */
737 		struct myrs_cmd_tmo tmo;		/* Byte 19 */
738 		unsigned char sense_len;		/* Byte 20 */
739 		enum myrs_ioctl_opcode ioctl_opcode;	/* Byte 21 */
740 		unsigned char rsvd2[10];		/* Bytes 22-31 */
741 		union myrs_sgl dma_addr;		/* Bytes 32-63 */
742 	} ctlr_info;
743 	struct {
744 		unsigned short id;			/* Bytes 0-1 */
745 		enum myrs_cmd_opcode opcode;		/* Byte 2 */
746 		struct myrs_cmd_ctrl control;		/* Byte 3 */
747 		u32 dma_size:24;			/* Bytes 4-6 */
748 		unsigned char dma_num;			/* Byte 7 */
749 		u64 sense_addr;				/* Bytes 8-15 */
750 		struct myrs_ldev ldev;			/* Bytes 16-18 */
751 		struct myrs_cmd_tmo tmo;		/* Byte 19 */
752 		unsigned char sense_len;		/* Byte 20 */
753 		enum myrs_ioctl_opcode ioctl_opcode;	/* Byte 21 */
754 		unsigned char rsvd[10];			/* Bytes 22-31 */
755 		union myrs_sgl dma_addr;		/* Bytes 32-63 */
756 	} ldev_info;
757 	struct {
758 		unsigned short id;			/* Bytes 0-1 */
759 		enum myrs_cmd_opcode opcode;		/* Byte 2 */
760 		struct myrs_cmd_ctrl control;		/* Byte 3 */
761 		u32 dma_size:24;			/* Bytes 4-6 */
762 		unsigned char dma_num;			/* Byte 7 */
763 		u64 sense_addr;				/* Bytes 8-15 */
764 		struct myrs_pdev pdev;			/* Bytes 16-18 */
765 		struct myrs_cmd_tmo tmo;		/* Byte 19 */
766 		unsigned char sense_len;		/* Byte 20 */
767 		enum myrs_ioctl_opcode ioctl_opcode;	/* Byte 21 */
768 		unsigned char rsvd[10];			/* Bytes 22-31 */
769 		union myrs_sgl dma_addr;		/* Bytes 32-63 */
770 	} pdev_info;
771 	struct {
772 		unsigned short id;			/* Bytes 0-1 */
773 		enum myrs_cmd_opcode opcode;		/* Byte 2 */
774 		struct myrs_cmd_ctrl control;		/* Byte 3 */
775 		u32 dma_size:24;			/* Bytes 4-6 */
776 		unsigned char dma_num;			/* Byte 7 */
777 		u64 sense_addr;				/* Bytes 8-15 */
778 		unsigned short evnum_upper;		/* Bytes 16-17 */
779 		unsigned char ctlr_num;			/* Byte 18 */
780 		struct myrs_cmd_tmo tmo;		/* Byte 19 */
781 		unsigned char sense_len;		/* Byte 20 */
782 		enum myrs_ioctl_opcode ioctl_opcode;	/* Byte 21 */
783 		unsigned short evnum_lower;		/* Bytes 22-23 */
784 		unsigned char rsvd[8];			/* Bytes 24-31 */
785 		union myrs_sgl dma_addr;		/* Bytes 32-63 */
786 	} get_event;
787 	struct {
788 		unsigned short id;			/* Bytes 0-1 */
789 		enum myrs_cmd_opcode opcode;		/* Byte 2 */
790 		struct myrs_cmd_ctrl control;		/* Byte 3 */
791 		u32 dma_size:24;			/* Bytes 4-6 */
792 		unsigned char dma_num;			/* Byte 7 */
793 		u64 sense_addr;				/* Bytes 8-15 */
794 		union {
795 			struct myrs_ldev ldev;		/* Bytes 16-18 */
796 			struct myrs_pdev pdev;		/* Bytes 16-18 */
797 		};
798 		struct myrs_cmd_tmo tmo;		/* Byte 19 */
799 		unsigned char sense_len;		/* Byte 20 */
800 		enum myrs_ioctl_opcode ioctl_opcode;	/* Byte 21 */
801 		enum myrs_devstate state;		/* Byte 22 */
802 		unsigned char rsvd[9];			/* Bytes 23-31 */
803 		union myrs_sgl dma_addr;		/* Bytes 32-63 */
804 	} set_devstate;
805 	struct {
806 		unsigned short id;			/* Bytes 0-1 */
807 		enum myrs_cmd_opcode opcode;		/* Byte 2 */
808 		struct myrs_cmd_ctrl control;		/* Byte 3 */
809 		u32 dma_size:24;			/* Bytes 4-6 */
810 		unsigned char dma_num;			/* Byte 7 */
811 		u64 sense_addr;				/* Bytes 8-15 */
812 		struct myrs_ldev ldev;			/* Bytes 16-18 */
813 		struct myrs_cmd_tmo tmo;		/* Byte 19 */
814 		unsigned char sense_len;		/* Byte 20 */
815 		enum myrs_ioctl_opcode ioctl_opcode;	/* Byte 21 */
816 		unsigned char restore_consistency:1;	/* Byte 22 Bit 0 */
817 		unsigned char initialized_area_only:1;	/* Byte 22 Bit 1 */
818 		unsigned char rsvd1:6;			/* Byte 22 Bits 2-7 */
819 		unsigned char rsvd2[9];			/* Bytes 23-31 */
820 		union myrs_sgl dma_addr;		/* Bytes 32-63 */
821 	} cc;
822 	struct {
823 		unsigned short id;			/* Bytes 0-1 */
824 		enum myrs_cmd_opcode opcode;		/* Byte 2 */
825 		struct myrs_cmd_ctrl control;		/* Byte 3 */
826 		unsigned char first_cmd_mbox_size_kb;	/* Byte 4 */
827 		unsigned char first_stat_mbox_size_kb;	/* Byte 5 */
828 		unsigned char second_cmd_mbox_size_kb;	/* Byte 6 */
829 		unsigned char second_stat_mbox_size_kb;	/* Byte 7 */
830 		u64 sense_addr;				/* Bytes 8-15 */
831 		unsigned int rsvd1:24;			/* Bytes 16-18 */
832 		struct myrs_cmd_tmo tmo;		/* Byte 19 */
833 		unsigned char sense_len;		/* Byte 20 */
834 		enum myrs_ioctl_opcode ioctl_opcode;	/* Byte 21 */
835 		unsigned char fwstat_buf_size_kb;	/* Byte 22 */
836 		unsigned char rsvd2;			/* Byte 23 */
837 		u64 fwstat_buf_addr;			/* Bytes 24-31 */
838 		u64 first_cmd_mbox_addr;		/* Bytes 32-39 */
839 		u64 first_stat_mbox_addr;		/* Bytes 40-47 */
840 		u64 second_cmd_mbox_addr;		/* Bytes 48-55 */
841 		u64 second_stat_mbox_addr;		/* Bytes 56-63 */
842 	} set_mbox;
843 	struct {
844 		unsigned short id;			/* Bytes 0-1 */
845 		enum myrs_cmd_opcode opcode;		/* Byte 2 */
846 		struct myrs_cmd_ctrl control;		/* Byte 3 */
847 		u32 dma_size:24;			/* Bytes 4-6 */
848 		unsigned char dma_num;			/* Byte 7 */
849 		u64 sense_addr;				/* Bytes 8-15 */
850 		struct myrs_pdev pdev;			/* Bytes 16-18 */
851 		struct myrs_cmd_tmo tmo;		/* Byte 19 */
852 		unsigned char sense_len;		/* Byte 20 */
853 		enum myrs_ioctl_opcode ioctl_opcode;	/* Byte 21 */
854 		enum myrs_opdev opdev;			/* Byte 22 */
855 		unsigned char rsvd[9];			/* Bytes 23-31 */
856 		union myrs_sgl dma_addr;		/* Bytes 32-63 */
857 	} dev_op;
858 };
859 
860 /*
861  * DAC960 V2 Firmware Controller Status Mailbox structure.
862  */
863 struct myrs_stat_mbox {
864 	unsigned short id;		/* Bytes 0-1 */
865 	unsigned char status;		/* Byte 2 */
866 	unsigned char sense_len;	/* Byte 3 */
867 	int residual;			/* Bytes 4-7 */
868 };
869 
870 struct myrs_cmdblk {
871 	union myrs_cmd_mbox mbox;
872 	unsigned char status;
873 	unsigned char sense_len;
874 	int residual;
875 	struct completion *complete;
876 	struct myrs_sge *sgl;
877 	dma_addr_t sgl_addr;
878 	unsigned char *dcdb;
879 	dma_addr_t dcdb_dma;
880 	unsigned char *sense;
881 	dma_addr_t sense_addr;
882 };
883 
884 /*
885  * DAC960 Driver Controller structure.
886  */
887 struct myrs_hba {
888 	void __iomem *io_base;
889 	void __iomem *mmio_base;
890 	phys_addr_t io_addr;
891 	phys_addr_t pci_addr;
892 	unsigned int irq;
893 
894 	unsigned char model_name[28];
895 	unsigned char fw_version[12];
896 
897 	struct Scsi_Host *host;
898 	struct pci_dev *pdev;
899 
900 	unsigned int epoch;
901 	unsigned int next_evseq;
902 	/* Monitor flags */
903 	bool needs_update;
904 	bool disable_enc_msg;
905 
906 	struct workqueue_struct *work_q;
907 	char work_q_name[20];
908 	struct delayed_work monitor_work;
909 	unsigned long primary_monitor_time;
910 	unsigned long secondary_monitor_time;
911 
912 	spinlock_t queue_lock;
913 
914 	struct dma_pool *sg_pool;
915 	struct dma_pool *sense_pool;
916 	struct dma_pool *dcdb_pool;
917 
918 	void (*write_cmd_mbox)(union myrs_cmd_mbox *next_mbox,
919 			       union myrs_cmd_mbox *cmd_mbox);
920 	void (*get_cmd_mbox)(void __iomem *base);
921 	void (*disable_intr)(void __iomem *base);
922 	void (*reset)(void __iomem *base);
923 
924 	dma_addr_t cmd_mbox_addr;
925 	size_t cmd_mbox_size;
926 	union myrs_cmd_mbox *first_cmd_mbox;
927 	union myrs_cmd_mbox *last_cmd_mbox;
928 	union myrs_cmd_mbox *next_cmd_mbox;
929 	union myrs_cmd_mbox *prev_cmd_mbox1;
930 	union myrs_cmd_mbox *prev_cmd_mbox2;
931 
932 	dma_addr_t stat_mbox_addr;
933 	size_t stat_mbox_size;
934 	struct myrs_stat_mbox *first_stat_mbox;
935 	struct myrs_stat_mbox *last_stat_mbox;
936 	struct myrs_stat_mbox *next_stat_mbox;
937 
938 	struct myrs_cmdblk dcmd_blk;
939 	struct myrs_cmdblk mcmd_blk;
940 	struct mutex dcmd_mutex;
941 
942 	struct myrs_fwstat *fwstat_buf;
943 	dma_addr_t fwstat_addr;
944 
945 	struct myrs_ctlr_info *ctlr_info;
946 	struct mutex cinfo_mutex;
947 
948 	struct myrs_event *event_buf;
949 };
950 
951 typedef unsigned char (*enable_mbox_t)(void __iomem *base, dma_addr_t addr);
952 typedef int (*myrs_hwinit_t)(struct pci_dev *pdev,
953 			     struct myrs_hba *c, void __iomem *base);
954 
955 struct myrs_privdata {
956 	myrs_hwinit_t		hw_init;
957 	irq_handler_t		irq_handler;
958 	unsigned int		mmio_size;
959 };
960 
961 /*
962  * DAC960 GEM Series Controller Interface Register Offsets.
963  */
964 
965 #define DAC960_GEM_mmio_size	0x600
966 
967 enum DAC960_GEM_reg_offset {
968 	DAC960_GEM_IDB_READ_OFFSET	= 0x214,
969 	DAC960_GEM_IDB_CLEAR_OFFSET	= 0x218,
970 	DAC960_GEM_ODB_READ_OFFSET	= 0x224,
971 	DAC960_GEM_ODB_CLEAR_OFFSET	= 0x228,
972 	DAC960_GEM_IRQSTS_OFFSET	= 0x208,
973 	DAC960_GEM_IRQMASK_READ_OFFSET	= 0x22C,
974 	DAC960_GEM_IRQMASK_CLEAR_OFFSET	= 0x230,
975 	DAC960_GEM_CMDMBX_OFFSET	= 0x510,
976 	DAC960_GEM_CMDSTS_OFFSET	= 0x518,
977 	DAC960_GEM_ERRSTS_READ_OFFSET	= 0x224,
978 	DAC960_GEM_ERRSTS_CLEAR_OFFSET	= 0x228,
979 };
980 
981 /*
982  * DAC960 GEM Series Inbound Door Bell Register.
983  */
984 #define DAC960_GEM_IDB_HWMBOX_NEW_CMD	0x01
985 #define DAC960_GEM_IDB_HWMBOX_ACK_STS	0x02
986 #define DAC960_GEM_IDB_GEN_IRQ		0x04
987 #define DAC960_GEM_IDB_CTRL_RESET	0x08
988 #define DAC960_GEM_IDB_MMBOX_NEW_CMD	0x10
989 
990 #define DAC960_GEM_IDB_HWMBOX_FULL	0x01
991 #define DAC960_GEM_IDB_INIT_IN_PROGRESS	0x02
992 
993 /*
994  * DAC960 GEM Series Outbound Door Bell Register.
995  */
996 #define DAC960_GEM_ODB_HWMBOX_ACK_IRQ	0x01
997 #define DAC960_GEM_ODB_MMBOX_ACK_IRQ	0x02
998 #define DAC960_GEM_ODB_HWMBOX_STS_AVAIL 0x01
999 #define DAC960_GEM_ODB_MMBOX_STS_AVAIL	0x02
1000 
1001 /*
1002  * DAC960 GEM Series Interrupt Mask Register.
1003  */
1004 #define DAC960_GEM_IRQMASK_HWMBOX_IRQ	0x01
1005 #define DAC960_GEM_IRQMASK_MMBOX_IRQ	0x02
1006 
1007 /*
1008  * DAC960 GEM Series Error Status Register.
1009  */
1010 #define DAC960_GEM_ERRSTS_PENDING	0x20
1011 
1012 /*
1013  * dma_addr_writeql is provided to write dma_addr_t types
1014  * to a 64-bit pci address space register.  The controller
1015  * will accept having the register written as two 32-bit
1016  * values.
1017  *
1018  * In HIGHMEM kernels, dma_addr_t is a 64-bit value.
1019  * without HIGHMEM,  dma_addr_t is a 32-bit value.
1020  *
1021  * The compiler should always fix up the assignment
1022  * to u.wq appropriately, depending upon the size of
1023  * dma_addr_t.
1024  */
1025 static inline
1026 void dma_addr_writeql(dma_addr_t addr, void __iomem *write_address)
1027 {
1028 	union {
1029 		u64 wq;
1030 		uint wl[2];
1031 	} u;
1032 
1033 	u.wq = addr;
1034 
1035 	writel(u.wl[0], write_address);
1036 	writel(u.wl[1], write_address + 4);
1037 }
1038 
1039 /*
1040  * DAC960 BA Series Controller Interface Register Offsets.
1041  */
1042 
1043 #define DAC960_BA_mmio_size		0x80
1044 
1045 enum DAC960_BA_reg_offset {
1046 	DAC960_BA_IRQSTS_OFFSET	= 0x30,
1047 	DAC960_BA_IRQMASK_OFFSET = 0x34,
1048 	DAC960_BA_CMDMBX_OFFSET = 0x50,
1049 	DAC960_BA_CMDSTS_OFFSET = 0x58,
1050 	DAC960_BA_IDB_OFFSET	= 0x60,
1051 	DAC960_BA_ODB_OFFSET	= 0x61,
1052 	DAC960_BA_ERRSTS_OFFSET = 0x63,
1053 };
1054 
1055 /*
1056  * DAC960 BA Series Inbound Door Bell Register.
1057  */
1058 #define DAC960_BA_IDB_HWMBOX_NEW_CMD	0x01
1059 #define DAC960_BA_IDB_HWMBOX_ACK_STS	0x02
1060 #define DAC960_BA_IDB_GEN_IRQ		0x04
1061 #define DAC960_BA_IDB_CTRL_RESET	0x08
1062 #define DAC960_BA_IDB_MMBOX_NEW_CMD	0x10
1063 
1064 #define DAC960_BA_IDB_HWMBOX_EMPTY	0x01
1065 #define DAC960_BA_IDB_INIT_DONE		0x02
1066 
1067 /*
1068  * DAC960 BA Series Outbound Door Bell Register.
1069  */
1070 #define DAC960_BA_ODB_HWMBOX_ACK_IRQ	0x01
1071 #define DAC960_BA_ODB_MMBOX_ACK_IRQ	0x02
1072 
1073 #define DAC960_BA_ODB_HWMBOX_STS_AVAIL	0x01
1074 #define DAC960_BA_ODB_MMBOX_STS_AVAIL	0x02
1075 
1076 /*
1077  * DAC960 BA Series Interrupt Mask Register.
1078  */
1079 #define DAC960_BA_IRQMASK_DISABLE_IRQ	0x04
1080 #define DAC960_BA_IRQMASK_DISABLEW_I2O	0x08
1081 
1082 /*
1083  * DAC960 BA Series Error Status Register.
1084  */
1085 #define DAC960_BA_ERRSTS_PENDING	0x04
1086 
1087 /*
1088  * DAC960 LP Series Controller Interface Register Offsets.
1089  */
1090 
1091 #define DAC960_LP_mmio_size		0x80
1092 
1093 enum DAC960_LP_reg_offset {
1094 	DAC960_LP_CMDMBX_OFFSET = 0x10,
1095 	DAC960_LP_CMDSTS_OFFSET = 0x18,
1096 	DAC960_LP_IDB_OFFSET	= 0x20,
1097 	DAC960_LP_ODB_OFFSET	= 0x2C,
1098 	DAC960_LP_ERRSTS_OFFSET = 0x2E,
1099 	DAC960_LP_IRQSTS_OFFSET	= 0x30,
1100 	DAC960_LP_IRQMASK_OFFSET = 0x34,
1101 };
1102 
1103 /*
1104  * DAC960 LP Series Inbound Door Bell Register.
1105  */
1106 #define DAC960_LP_IDB_HWMBOX_NEW_CMD	0x01
1107 #define DAC960_LP_IDB_HWMBOX_ACK_STS	0x02
1108 #define DAC960_LP_IDB_GEN_IRQ		0x04
1109 #define DAC960_LP_IDB_CTRL_RESET	0x08
1110 #define DAC960_LP_IDB_MMBOX_NEW_CMD	0x10
1111 
1112 #define DAC960_LP_IDB_HWMBOX_FULL	0x01
1113 #define DAC960_LP_IDB_INIT_IN_PROGRESS	0x02
1114 
1115 /*
1116  * DAC960 LP Series Outbound Door Bell Register.
1117  */
1118 #define DAC960_LP_ODB_HWMBOX_ACK_IRQ	0x01
1119 #define DAC960_LP_ODB_MMBOX_ACK_IRQ	0x02
1120 
1121 #define DAC960_LP_ODB_HWMBOX_STS_AVAIL	0x01
1122 #define DAC960_LP_ODB_MMBOX_STS_AVAIL	0x02
1123 
1124 /*
1125  * DAC960 LP Series Interrupt Mask Register.
1126  */
1127 #define DAC960_LP_IRQMASK_DISABLE_IRQ	0x04
1128 
1129 /*
1130  * DAC960 LP Series Error Status Register.
1131  */
1132 #define DAC960_LP_ERRSTS_PENDING	0x04
1133 
1134 #endif /* _MYRS_H */
1135