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