1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Linux Driver for Mylex DAC960/AcceleRAID/eXtremeRAID PCI RAID Controllers
5 * Copyright 2017 Hannes Reinecke, SUSE Linux GmbH <hare@suse.com>
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)
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
24 #define MYRB_BLKSIZE_BITS 9
25 #define MYRB_MAILBOX_TIMEOUT 1000000
27 #define MYRB_DCMD_TAG 1
28 #define MYRB_MCMD_TAG 2
30 #define MYRB_PRIMARY_MONITOR_INTERVAL (10 * HZ)
31 #define MYRB_SECONDARY_MONITOR_INTERVAL (60 * HZ)
34 * DAC960 V1 Firmware Command Opcodes.
36 enum myrb_cmd_opcode
{
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,
44 MYRB_CMD_READ_SG
= 0xB6,
45 MYRB_CMD_WRITE
= 0x37,
46 MYRB_CMD_WRITE_SG
= 0xB7,
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
111 * DAC960 V1 Firmware Command Status Codes.
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 */
160 * DAC960 V1 Firmware Enquiry Command reply structure.
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 */
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 */
172 unsigned char rsvd3
:8; /* Byte 135 */
173 unsigned char fw_minor_version
; /* Byte 136 */
174 unsigned char fw_major_version
; /* Byte 137 */
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 */
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 */
201 unsigned char target
;
202 unsigned char channel
;
203 } dead_drives
[21]; /* Bytes 152-194 */
204 unsigned char rsvd9
[62]; /* Bytes 195-255 */
208 * DAC960 V1 Firmware Enquiry2 Command reply structure.
210 struct myrb_enquiry2
{
213 DAC960_V1_P_PD_PU
= 0x01,
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
312 unsigned char rsvd11
[5]; /* Byte 107-111 */
313 unsigned short fw_build
; /* Bytes 112-113 */
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 */
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 */
330 unsigned char rsvd14
[8]; /* Bytes 120-127 */
334 * DAC960 V1 Firmware Logical Drive State type.
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
346 * DAC960 V1 RAID Levels
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) */
358 * DAC960 V1 Firmware Logical Drive Information structure.
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 */
369 * DAC960 V1 Firmware Perform Event Log Operation Types.
371 #define DAC960_V1_GetEventLogEntry 0x00
374 * DAC960 V1 Firmware Get Event Log Entry Command reply structure.
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 */
388 * DAC960 V1 Firmware Get Device State Command reply structure.
389 * The structure is padded by 2 bytes for compatibility with Version 2.xx
392 struct myrb_pdev_state
{
393 unsigned int present
:1; /* Byte 0 Bit 0 */
394 unsigned int :7; /* Byte 0 Bits 1-7 */
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 */
417 * DAC960 V1 Firmware Get Rebuild Progress Command reply structure.
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 */
426 * DAC960 V1 Firmware Background Initialization Status Command reply structure.
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 */
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 */
445 * DAC960 V1 Firmware Error Table Entry structure.
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 */
455 * DAC960 V1 Firmware Read Config2 Command reply structure.
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 */
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 */
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 */
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 */
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 */
528 * DAC960 V1 Firmware DCDB request structure.
531 unsigned target
:4; /* Byte 0 Bits 0-3 */
532 unsigned channel
:4; /* Byte 0 Bits 4-7 */
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 */
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 */
561 * DAC960 V1 Firmware Scatter/Gather List Type 1 32 Bit Address
562 *32 Bit Byte Count structure.
565 u32 sge_addr
; /* Bytes 0-3 */
566 u32 sge_count
; /* Bytes 4-7 */
570 * 13 Byte DAC960 V1 Firmware Command Mailbox structure.
571 * Bytes 13-15 are not used. The structure is padded to 16 bytes for
574 union myrb_cmd_mbox
{
575 unsigned int words
[4]; /* Words 0-3 */
576 unsigned char bytes
[16]; /* Bytes 0-15 */
578 enum myrb_cmd_opcode opcode
; /* Byte 0 */
579 unsigned char id
; /* Byte 1 */
580 unsigned char rsvd
[14]; /* Bytes 2-15 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
644 enum myrb_cmd_opcode opcode
; /* Byte 0 */
645 unsigned char id
; /* Byte 1 */
647 unsigned short xfer_len
:11; /* Bytes 2-3 */
648 unsigned char ldev_num
:5; /* Byte 3 Bits 3-7 */
650 unsigned int lba
; /* Bytes 4-7 */
651 u32 addr
; /* Bytes 8-11 */
652 unsigned char sg_count
:6; /* Byte 12 Bits 0-5 */
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 */
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 */
673 * DAC960 V1 Firmware Controller Status Mailbox structure.
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 */
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
;
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
;
708 bool need_bgi_status
;
711 struct pci_dev
*pdev
;
712 struct Scsi_Host
*host
;
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
;
720 struct dma_pool
*sg_pool
;
721 struct dma_pool
*dcdb_pool
;
723 spinlock_t queue_lock
;
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
);
732 unsigned int ctlr_num
;
733 unsigned char model_name
[20];
734 unsigned char fw_version
[12];
738 phys_addr_t pci_addr
;
739 void __iomem
*io_base
;
740 void __iomem
*mmio_base
;
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
;
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
;
756 struct myrb_cmdblk dcmd_blk
;
757 struct myrb_cmdblk mcmd_blk
;
758 struct mutex dcmd_mutex
;
760 struct myrb_enquiry
*enquiry
;
761 dma_addr_t enquiry_addr
;
763 struct myrb_error_entry
*err_table
;
764 dma_addr_t err_table_addr
;
766 unsigned short last_rbld_status
;
768 struct myrb_ldev_info
*ldev_info_buf
;
769 dma_addr_t ldev_info_addr
;
771 struct myrb_bgi_status bgi_status
;
773 struct mutex dma_mutex
;
777 * DAC960 LA Series Controller Interface Register Offsets.
779 #define DAC960_LA_mmio_size 0x80
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,
804 * DAC960 LA Series Inbound Door Bell Register.
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
812 #define DAC960_LA_IDB_HWMBOX_EMPTY 0x01
813 #define DAC960_LA_IDB_INIT_DONE 0x02
816 * DAC960 LA Series Outbound Door Bell Register.
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
824 * DAC960 LA Series Interrupt Mask Register.
826 #define DAC960_LA_IRQMASK_DISABLE_IRQ 0x04
829 * DAC960 LA Series Error Status Register.
831 #define DAC960_LA_ERRSTS_PENDING 0x02
834 * DAC960 PG Series Controller Interface Register Offsets.
836 #define DAC960_PG_mmio_size 0x2000
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,
861 * DAC960 PG Series Inbound Door Bell Register.
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
869 #define DAC960_PG_IDB_HWMBOX_FULL 0x01
870 #define DAC960_PG_IDB_INIT_IN_PROGRESS 0x02
873 * DAC960 PG Series Outbound Door Bell Register.
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
881 * DAC960 PG Series Interrupt Mask Register.
883 #define DAC960_PG_IRQMASK_MSI_MASK1 0x03
884 #define DAC960_PG_IRQMASK_DISABLE_IRQ 0x04
885 #define DAC960_PG_IRQMASK_MSI_MASK2 0xF8
888 * DAC960 PG Series Error Status Register.
890 #define DAC960_PG_ERRSTS_PENDING 0x04
893 * DAC960 PD Series Controller Interface Register Offsets.
895 #define DAC960_PD_mmio_size 0x80
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,
920 * DAC960 PD Series Inbound Door Bell Register.
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
927 #define DAC960_PD_IDB_HWMBOX_FULL 0x01
928 #define DAC960_PD_IDB_INIT_IN_PROGRESS 0x02
931 * DAC960 PD Series Outbound Door Bell Register.
933 #define DAC960_PD_ODB_HWMBOX_ACK_IRQ 0x01
934 #define DAC960_PD_ODB_HWMBOX_STS_AVAIL 0x01
937 * DAC960 PD Series Interrupt Enable Register.
939 #define DAC960_PD_IRQMASK_ENABLE_IRQ 0x01
942 * DAC960 PD Series Error Status Register.
944 #define DAC960_PD_ERRSTS_PENDING 0x04
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
,
950 union myrb_cmd_mbox
*mbox
);
952 struct myrb_privdata
{
953 myrb_hw_init_t hw_init
;
954 irq_handler_t irq_handler
;
955 unsigned int mmio_size
;