Merge tag 'for-linus-4.20a-rc5-tag' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / drivers / scsi / myrs.h
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 */