Pull bugzilla-7887 into release branch
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / block / DAC960.h
1 /*
2
3 Linux Driver for Mylex DAC960/AcceleRAID/eXtremeRAID PCI RAID Controllers
4
5 Copyright 1998-2001 by Leonard N. Zubkoff <lnz@dandelion.com>
6
7 This program is free software; you may redistribute and/or modify it under
8 the terms of the GNU General Public License Version 2 as published by the
9 Free Software Foundation.
10
11 This program is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for complete details.
15
16 The author respectfully requests that any modifications to this software be
17 sent directly to him for evaluation and testing.
18
19 */
20
21
22 /*
23 Define the maximum number of DAC960 Controllers supported by this driver.
24 */
25
26 #define DAC960_MaxControllers 8
27
28
29 /*
30 Define the maximum number of Controller Channels supported by DAC960
31 V1 and V2 Firmware Controllers.
32 */
33
34 #define DAC960_V1_MaxChannels 3
35 #define DAC960_V2_MaxChannels 4
36
37
38 /*
39 Define the maximum number of Targets per Channel supported by DAC960
40 V1 and V2 Firmware Controllers.
41 */
42
43 #define DAC960_V1_MaxTargets 16
44 #define DAC960_V2_MaxTargets 128
45
46
47 /*
48 Define the maximum number of Logical Drives supported by DAC960
49 V1 and V2 Firmware Controllers.
50 */
51
52 #define DAC960_MaxLogicalDrives 32
53
54
55 /*
56 Define the maximum number of Physical Devices supported by DAC960
57 V1 and V2 Firmware Controllers.
58 */
59
60 #define DAC960_V1_MaxPhysicalDevices 45
61 #define DAC960_V2_MaxPhysicalDevices 272
62
63 /*
64 Define the pci dma mask supported by DAC960 V1 and V2 Firmware Controlers
65 */
66
67 #define DAC690_V1_PciDmaMask 0xffffffff
68 #define DAC690_V2_PciDmaMask 0xffffffffffffffffULL
69
70 /*
71 Define a 32/64 bit I/O Address data type.
72 */
73
74 typedef unsigned long DAC960_IO_Address_T;
75
76
77 /*
78 Define a 32/64 bit PCI Bus Address data type.
79 */
80
81 typedef unsigned long DAC960_PCI_Address_T;
82
83
84 /*
85 Define a 32 bit Bus Address data type.
86 */
87
88 typedef unsigned int DAC960_BusAddress32_T;
89
90
91 /*
92 Define a 64 bit Bus Address data type.
93 */
94
95 typedef unsigned long long DAC960_BusAddress64_T;
96
97
98 /*
99 Define a 32 bit Byte Count data type.
100 */
101
102 typedef unsigned int DAC960_ByteCount32_T;
103
104
105 /*
106 Define a 64 bit Byte Count data type.
107 */
108
109 typedef unsigned long long DAC960_ByteCount64_T;
110
111
112 /*
113 dma_loaf is used by helper routines to divide a region of
114 dma mapped memory into smaller pieces, where those pieces
115 are not of uniform size.
116 */
117
118 struct dma_loaf {
119 void *cpu_base;
120 dma_addr_t dma_base;
121 size_t length;
122 void *cpu_free;
123 dma_addr_t dma_free;
124 };
125
126 /*
127 Define the SCSI INQUIRY Standard Data structure.
128 */
129
130 typedef struct DAC960_SCSI_Inquiry
131 {
132 unsigned char PeripheralDeviceType:5; /* Byte 0 Bits 0-4 */
133 unsigned char PeripheralQualifier:3; /* Byte 0 Bits 5-7 */
134 unsigned char DeviceTypeModifier:7; /* Byte 1 Bits 0-6 */
135 bool RMB:1; /* Byte 1 Bit 7 */
136 unsigned char ANSI_ApprovedVersion:3; /* Byte 2 Bits 0-2 */
137 unsigned char ECMA_Version:3; /* Byte 2 Bits 3-5 */
138 unsigned char ISO_Version:2; /* Byte 2 Bits 6-7 */
139 unsigned char ResponseDataFormat:4; /* Byte 3 Bits 0-3 */
140 unsigned char :2; /* Byte 3 Bits 4-5 */
141 bool TrmIOP:1; /* Byte 3 Bit 6 */
142 bool AENC:1; /* Byte 3 Bit 7 */
143 unsigned char AdditionalLength; /* Byte 4 */
144 unsigned char :8; /* Byte 5 */
145 unsigned char :8; /* Byte 6 */
146 bool SftRe:1; /* Byte 7 Bit 0 */
147 bool CmdQue:1; /* Byte 7 Bit 1 */
148 bool :1; /* Byte 7 Bit 2 */
149 bool Linked:1; /* Byte 7 Bit 3 */
150 bool Sync:1; /* Byte 7 Bit 4 */
151 bool WBus16:1; /* Byte 7 Bit 5 */
152 bool WBus32:1; /* Byte 7 Bit 6 */
153 bool RelAdr:1; /* Byte 7 Bit 7 */
154 unsigned char VendorIdentification[8]; /* Bytes 8-15 */
155 unsigned char ProductIdentification[16]; /* Bytes 16-31 */
156 unsigned char ProductRevisionLevel[4]; /* Bytes 32-35 */
157 }
158 DAC960_SCSI_Inquiry_T;
159
160
161 /*
162 Define the SCSI INQUIRY Unit Serial Number structure.
163 */
164
165 typedef struct DAC960_SCSI_Inquiry_UnitSerialNumber
166 {
167 unsigned char PeripheralDeviceType:5; /* Byte 0 Bits 0-4 */
168 unsigned char PeripheralQualifier:3; /* Byte 0 Bits 5-7 */
169 unsigned char PageCode; /* Byte 1 */
170 unsigned char :8; /* Byte 2 */
171 unsigned char PageLength; /* Byte 3 */
172 unsigned char ProductSerialNumber[28]; /* Bytes 4-31 */
173 }
174 DAC960_SCSI_Inquiry_UnitSerialNumber_T;
175
176
177 /*
178 Define the SCSI REQUEST SENSE Sense Key type.
179 */
180
181 typedef enum
182 {
183 DAC960_SenseKey_NoSense = 0x0,
184 DAC960_SenseKey_RecoveredError = 0x1,
185 DAC960_SenseKey_NotReady = 0x2,
186 DAC960_SenseKey_MediumError = 0x3,
187 DAC960_SenseKey_HardwareError = 0x4,
188 DAC960_SenseKey_IllegalRequest = 0x5,
189 DAC960_SenseKey_UnitAttention = 0x6,
190 DAC960_SenseKey_DataProtect = 0x7,
191 DAC960_SenseKey_BlankCheck = 0x8,
192 DAC960_SenseKey_VendorSpecific = 0x9,
193 DAC960_SenseKey_CopyAborted = 0xA,
194 DAC960_SenseKey_AbortedCommand = 0xB,
195 DAC960_SenseKey_Equal = 0xC,
196 DAC960_SenseKey_VolumeOverflow = 0xD,
197 DAC960_SenseKey_Miscompare = 0xE,
198 DAC960_SenseKey_Reserved = 0xF
199 }
200 __attribute__ ((packed))
201 DAC960_SCSI_RequestSenseKey_T;
202
203
204 /*
205 Define the SCSI REQUEST SENSE structure.
206 */
207
208 typedef struct DAC960_SCSI_RequestSense
209 {
210 unsigned char ErrorCode:7; /* Byte 0 Bits 0-6 */
211 bool Valid:1; /* Byte 0 Bit 7 */
212 unsigned char SegmentNumber; /* Byte 1 */
213 DAC960_SCSI_RequestSenseKey_T SenseKey:4; /* Byte 2 Bits 0-3 */
214 unsigned char :1; /* Byte 2 Bit 4 */
215 bool ILI:1; /* Byte 2 Bit 5 */
216 bool EOM:1; /* Byte 2 Bit 6 */
217 bool Filemark:1; /* Byte 2 Bit 7 */
218 unsigned char Information[4]; /* Bytes 3-6 */
219 unsigned char AdditionalSenseLength; /* Byte 7 */
220 unsigned char CommandSpecificInformation[4]; /* Bytes 8-11 */
221 unsigned char AdditionalSenseCode; /* Byte 12 */
222 unsigned char AdditionalSenseCodeQualifier; /* Byte 13 */
223 }
224 DAC960_SCSI_RequestSense_T;
225
226
227 /*
228 Define the DAC960 V1 Firmware Command Opcodes.
229 */
230
231 typedef enum
232 {
233 /* I/O Commands */
234 DAC960_V1_ReadExtended = 0x33,
235 DAC960_V1_WriteExtended = 0x34,
236 DAC960_V1_ReadAheadExtended = 0x35,
237 DAC960_V1_ReadExtendedWithScatterGather = 0xB3,
238 DAC960_V1_WriteExtendedWithScatterGather = 0xB4,
239 DAC960_V1_Read = 0x36,
240 DAC960_V1_ReadWithScatterGather = 0xB6,
241 DAC960_V1_Write = 0x37,
242 DAC960_V1_WriteWithScatterGather = 0xB7,
243 DAC960_V1_DCDB = 0x04,
244 DAC960_V1_DCDBWithScatterGather = 0x84,
245 DAC960_V1_Flush = 0x0A,
246 /* Controller Status Related Commands */
247 DAC960_V1_Enquiry = 0x53,
248 DAC960_V1_Enquiry2 = 0x1C,
249 DAC960_V1_GetLogicalDriveElement = 0x55,
250 DAC960_V1_GetLogicalDriveInformation = 0x19,
251 DAC960_V1_IOPortRead = 0x39,
252 DAC960_V1_IOPortWrite = 0x3A,
253 DAC960_V1_GetSDStats = 0x3E,
254 DAC960_V1_GetPDStats = 0x3F,
255 DAC960_V1_PerformEventLogOperation = 0x72,
256 /* Device Related Commands */
257 DAC960_V1_StartDevice = 0x10,
258 DAC960_V1_GetDeviceState = 0x50,
259 DAC960_V1_StopChannel = 0x13,
260 DAC960_V1_StartChannel = 0x12,
261 DAC960_V1_ResetChannel = 0x1A,
262 /* Commands Associated with Data Consistency and Errors */
263 DAC960_V1_Rebuild = 0x09,
264 DAC960_V1_RebuildAsync = 0x16,
265 DAC960_V1_CheckConsistency = 0x0F,
266 DAC960_V1_CheckConsistencyAsync = 0x1E,
267 DAC960_V1_RebuildStat = 0x0C,
268 DAC960_V1_GetRebuildProgress = 0x27,
269 DAC960_V1_RebuildControl = 0x1F,
270 DAC960_V1_ReadBadBlockTable = 0x0B,
271 DAC960_V1_ReadBadDataTable = 0x25,
272 DAC960_V1_ClearBadDataTable = 0x26,
273 DAC960_V1_GetErrorTable = 0x17,
274 DAC960_V1_AddCapacityAsync = 0x2A,
275 DAC960_V1_BackgroundInitializationControl = 0x2B,
276 /* Configuration Related Commands */
277 DAC960_V1_ReadConfig2 = 0x3D,
278 DAC960_V1_WriteConfig2 = 0x3C,
279 DAC960_V1_ReadConfigurationOnDisk = 0x4A,
280 DAC960_V1_WriteConfigurationOnDisk = 0x4B,
281 DAC960_V1_ReadConfiguration = 0x4E,
282 DAC960_V1_ReadBackupConfiguration = 0x4D,
283 DAC960_V1_WriteConfiguration = 0x4F,
284 DAC960_V1_AddConfiguration = 0x4C,
285 DAC960_V1_ReadConfigurationLabel = 0x48,
286 DAC960_V1_WriteConfigurationLabel = 0x49,
287 /* Firmware Upgrade Related Commands */
288 DAC960_V1_LoadImage = 0x20,
289 DAC960_V1_StoreImage = 0x21,
290 DAC960_V1_ProgramImage = 0x22,
291 /* Diagnostic Commands */
292 DAC960_V1_SetDiagnosticMode = 0x31,
293 DAC960_V1_RunDiagnostic = 0x32,
294 /* Subsystem Service Commands */
295 DAC960_V1_GetSubsystemData = 0x70,
296 DAC960_V1_SetSubsystemParameters = 0x71,
297 /* Version 2.xx Firmware Commands */
298 DAC960_V1_Enquiry_Old = 0x05,
299 DAC960_V1_GetDeviceState_Old = 0x14,
300 DAC960_V1_Read_Old = 0x02,
301 DAC960_V1_Write_Old = 0x03,
302 DAC960_V1_ReadWithScatterGather_Old = 0x82,
303 DAC960_V1_WriteWithScatterGather_Old = 0x83
304 }
305 __attribute__ ((packed))
306 DAC960_V1_CommandOpcode_T;
307
308
309 /*
310 Define the DAC960 V1 Firmware Command Identifier type.
311 */
312
313 typedef unsigned char DAC960_V1_CommandIdentifier_T;
314
315
316 /*
317 Define the DAC960 V1 Firmware Command Status Codes.
318 */
319
320 #define DAC960_V1_NormalCompletion 0x0000 /* Common */
321 #define DAC960_V1_CheckConditionReceived 0x0002 /* Common */
322 #define DAC960_V1_NoDeviceAtAddress 0x0102 /* Common */
323 #define DAC960_V1_InvalidDeviceAddress 0x0105 /* Common */
324 #define DAC960_V1_InvalidParameter 0x0105 /* Common */
325 #define DAC960_V1_IrrecoverableDataError 0x0001 /* I/O */
326 #define DAC960_V1_LogicalDriveNonexistentOrOffline 0x0002 /* I/O */
327 #define DAC960_V1_AccessBeyondEndOfLogicalDrive 0x0105 /* I/O */
328 #define DAC960_V1_BadDataEncountered 0x010C /* I/O */
329 #define DAC960_V1_DeviceBusy 0x0008 /* DCDB */
330 #define DAC960_V1_DeviceNonresponsive 0x000E /* DCDB */
331 #define DAC960_V1_CommandTerminatedAbnormally 0x000F /* DCDB */
332 #define DAC960_V1_UnableToStartDevice 0x0002 /* Device */
333 #define DAC960_V1_InvalidChannelOrTargetOrModifier 0x0105 /* Device */
334 #define DAC960_V1_ChannelBusy 0x0106 /* Device */
335 #define DAC960_V1_ChannelNotStopped 0x0002 /* Device */
336 #define DAC960_V1_AttemptToRebuildOnlineDrive 0x0002 /* Consistency */
337 #define DAC960_V1_RebuildBadBlocksEncountered 0x0003 /* Consistency */
338 #define DAC960_V1_NewDiskFailedDuringRebuild 0x0004 /* Consistency */
339 #define DAC960_V1_RebuildOrCheckAlreadyInProgress 0x0106 /* Consistency */
340 #define DAC960_V1_DependentDiskIsDead 0x0002 /* Consistency */
341 #define DAC960_V1_InconsistentBlocksFound 0x0003 /* Consistency */
342 #define DAC960_V1_InvalidOrNonredundantLogicalDrive 0x0105 /* Consistency */
343 #define DAC960_V1_NoRebuildOrCheckInProgress 0x0105 /* Consistency */
344 #define DAC960_V1_RebuildInProgress_DataValid 0x0000 /* Consistency */
345 #define DAC960_V1_RebuildFailed_LogicalDriveFailure 0x0002 /* Consistency */
346 #define DAC960_V1_RebuildFailed_BadBlocksOnOther 0x0003 /* Consistency */
347 #define DAC960_V1_RebuildFailed_NewDriveFailed 0x0004 /* Consistency */
348 #define DAC960_V1_RebuildSuccessful 0x0100 /* Consistency */
349 #define DAC960_V1_RebuildSuccessfullyTerminated 0x0107 /* Consistency */
350 #define DAC960_V1_BackgroundInitSuccessful 0x0100 /* Consistency */
351 #define DAC960_V1_BackgroundInitAborted 0x0005 /* Consistency */
352 #define DAC960_V1_NoBackgroundInitInProgress 0x0105 /* Consistency */
353 #define DAC960_V1_AddCapacityInProgress 0x0004 /* Consistency */
354 #define DAC960_V1_AddCapacityFailedOrSuspended 0x00F4 /* Consistency */
355 #define DAC960_V1_Config2ChecksumError 0x0002 /* Configuration */
356 #define DAC960_V1_ConfigurationSuspended 0x0106 /* Configuration */
357 #define DAC960_V1_FailedToConfigureNVRAM 0x0105 /* Configuration */
358 #define DAC960_V1_ConfigurationNotSavedStateChange 0x0106 /* Configuration */
359 #define DAC960_V1_SubsystemNotInstalled 0x0001 /* Subsystem */
360 #define DAC960_V1_SubsystemFailed 0x0002 /* Subsystem */
361 #define DAC960_V1_SubsystemBusy 0x0106 /* Subsystem */
362
363 typedef unsigned short DAC960_V1_CommandStatus_T;
364
365
366 /*
367 Define the DAC960 V1 Firmware Enquiry Command reply structure.
368 */
369
370 typedef struct DAC960_V1_Enquiry
371 {
372 unsigned char NumberOfLogicalDrives; /* Byte 0 */
373 unsigned int :24; /* Bytes 1-3 */
374 unsigned int LogicalDriveSizes[32]; /* Bytes 4-131 */
375 unsigned short FlashAge; /* Bytes 132-133 */
376 struct {
377 bool DeferredWriteError:1; /* Byte 134 Bit 0 */
378 bool BatteryLow:1; /* Byte 134 Bit 1 */
379 unsigned char :6; /* Byte 134 Bits 2-7 */
380 } StatusFlags;
381 unsigned char :8; /* Byte 135 */
382 unsigned char MinorFirmwareVersion; /* Byte 136 */
383 unsigned char MajorFirmwareVersion; /* Byte 137 */
384 enum {
385 DAC960_V1_NoStandbyRebuildOrCheckInProgress = 0x00,
386 DAC960_V1_StandbyRebuildInProgress = 0x01,
387 DAC960_V1_BackgroundRebuildInProgress = 0x02,
388 DAC960_V1_BackgroundCheckInProgress = 0x03,
389 DAC960_V1_StandbyRebuildCompletedWithError = 0xFF,
390 DAC960_V1_BackgroundRebuildOrCheckFailed_DriveFailed = 0xF0,
391 DAC960_V1_BackgroundRebuildOrCheckFailed_LogicalDriveFailed = 0xF1,
392 DAC960_V1_BackgroundRebuildOrCheckFailed_OtherCauses = 0xF2,
393 DAC960_V1_BackgroundRebuildOrCheckSuccessfullyTerminated = 0xF3
394 } __attribute__ ((packed)) RebuildFlag; /* Byte 138 */
395 unsigned char MaxCommands; /* Byte 139 */
396 unsigned char OfflineLogicalDriveCount; /* Byte 140 */
397 unsigned char :8; /* Byte 141 */
398 unsigned short EventLogSequenceNumber; /* Bytes 142-143 */
399 unsigned char CriticalLogicalDriveCount; /* Byte 144 */
400 unsigned int :24; /* Bytes 145-147 */
401 unsigned char DeadDriveCount; /* Byte 148 */
402 unsigned char :8; /* Byte 149 */
403 unsigned char RebuildCount; /* Byte 150 */
404 struct {
405 unsigned char :3; /* Byte 151 Bits 0-2 */
406 bool BatteryBackupUnitPresent:1; /* Byte 151 Bit 3 */
407 unsigned char :3; /* Byte 151 Bits 4-6 */
408 unsigned char :1; /* Byte 151 Bit 7 */
409 } MiscFlags;
410 struct {
411 unsigned char TargetID;
412 unsigned char Channel;
413 } DeadDrives[21]; /* Bytes 152-194 */
414 unsigned char Reserved[62]; /* Bytes 195-255 */
415 }
416 __attribute__ ((packed))
417 DAC960_V1_Enquiry_T;
418
419
420 /*
421 Define the DAC960 V1 Firmware Enquiry2 Command reply structure.
422 */
423
424 typedef struct DAC960_V1_Enquiry2
425 {
426 struct {
427 enum {
428 DAC960_V1_P_PD_PU = 0x01,
429 DAC960_V1_PL = 0x02,
430 DAC960_V1_PG = 0x10,
431 DAC960_V1_PJ = 0x11,
432 DAC960_V1_PR = 0x12,
433 DAC960_V1_PT = 0x13,
434 DAC960_V1_PTL0 = 0x14,
435 DAC960_V1_PRL = 0x15,
436 DAC960_V1_PTL1 = 0x16,
437 DAC960_V1_1164P = 0x20
438 } __attribute__ ((packed)) SubModel; /* Byte 0 */
439 unsigned char ActualChannels; /* Byte 1 */
440 enum {
441 DAC960_V1_FiveChannelBoard = 0x01,
442 DAC960_V1_ThreeChannelBoard = 0x02,
443 DAC960_V1_TwoChannelBoard = 0x03,
444 DAC960_V1_ThreeChannelASIC_DAC = 0x04
445 } __attribute__ ((packed)) Model; /* Byte 2 */
446 enum {
447 DAC960_V1_EISA_Controller = 0x01,
448 DAC960_V1_MicroChannel_Controller = 0x02,
449 DAC960_V1_PCI_Controller = 0x03,
450 DAC960_V1_SCSItoSCSI_Controller = 0x08
451 } __attribute__ ((packed)) ProductFamily; /* Byte 3 */
452 } HardwareID; /* Bytes 0-3 */
453 /* MajorVersion.MinorVersion-FirmwareType-TurnID */
454 struct {
455 unsigned char MajorVersion; /* Byte 4 */
456 unsigned char MinorVersion; /* Byte 5 */
457 unsigned char TurnID; /* Byte 6 */
458 char FirmwareType; /* Byte 7 */
459 } FirmwareID; /* Bytes 4-7 */
460 unsigned char :8; /* Byte 8 */
461 unsigned int :24; /* Bytes 9-11 */
462 unsigned char ConfiguredChannels; /* Byte 12 */
463 unsigned char ActualChannels; /* Byte 13 */
464 unsigned char MaxTargets; /* Byte 14 */
465 unsigned char MaxTags; /* Byte 15 */
466 unsigned char MaxLogicalDrives; /* Byte 16 */
467 unsigned char MaxArms; /* Byte 17 */
468 unsigned char MaxSpans; /* Byte 18 */
469 unsigned char :8; /* Byte 19 */
470 unsigned int :32; /* Bytes 20-23 */
471 unsigned int MemorySize; /* Bytes 24-27 */
472 unsigned int CacheSize; /* Bytes 28-31 */
473 unsigned int FlashMemorySize; /* Bytes 32-35 */
474 unsigned int NonVolatileMemorySize; /* Bytes 36-39 */
475 struct {
476 enum {
477 DAC960_V1_RamType_DRAM = 0x0,
478 DAC960_V1_RamType_EDO = 0x1,
479 DAC960_V1_RamType_SDRAM = 0x2,
480 DAC960_V1_RamType_Last = 0x7
481 } __attribute__ ((packed)) RamType:3; /* Byte 40 Bits 0-2 */
482 enum {
483 DAC960_V1_ErrorCorrection_None = 0x0,
484 DAC960_V1_ErrorCorrection_Parity = 0x1,
485 DAC960_V1_ErrorCorrection_ECC = 0x2,
486 DAC960_V1_ErrorCorrection_Last = 0x7
487 } __attribute__ ((packed)) ErrorCorrection:3; /* Byte 40 Bits 3-5 */
488 bool FastPageMode:1; /* Byte 40 Bit 6 */
489 bool LowPowerMemory:1; /* Byte 40 Bit 7 */
490 unsigned char :8; /* Bytes 41 */
491 } MemoryType;
492 unsigned short ClockSpeed; /* Bytes 42-43 */
493 unsigned short MemorySpeed; /* Bytes 44-45 */
494 unsigned short HardwareSpeed; /* Bytes 46-47 */
495 unsigned int :32; /* Bytes 48-51 */
496 unsigned int :32; /* Bytes 52-55 */
497 unsigned char :8; /* Byte 56 */
498 unsigned char :8; /* Byte 57 */
499 unsigned short :16; /* Bytes 58-59 */
500 unsigned short MaxCommands; /* Bytes 60-61 */
501 unsigned short MaxScatterGatherEntries; /* Bytes 62-63 */
502 unsigned short MaxDriveCommands; /* Bytes 64-65 */
503 unsigned short MaxIODescriptors; /* Bytes 66-67 */
504 unsigned short MaxCombinedSectors; /* Bytes 68-69 */
505 unsigned char Latency; /* Byte 70 */
506 unsigned char :8; /* Byte 71 */
507 unsigned char SCSITimeout; /* Byte 72 */
508 unsigned char :8; /* Byte 73 */
509 unsigned short MinFreeLines; /* Bytes 74-75 */
510 unsigned int :32; /* Bytes 76-79 */
511 unsigned int :32; /* Bytes 80-83 */
512 unsigned char RebuildRateConstant; /* Byte 84 */
513 unsigned char :8; /* Byte 85 */
514 unsigned char :8; /* Byte 86 */
515 unsigned char :8; /* Byte 87 */
516 unsigned int :32; /* Bytes 88-91 */
517 unsigned int :32; /* Bytes 92-95 */
518 unsigned short PhysicalDriveBlockSize; /* Bytes 96-97 */
519 unsigned short LogicalDriveBlockSize; /* Bytes 98-99 */
520 unsigned short MaxBlocksPerCommand; /* Bytes 100-101 */
521 unsigned short BlockFactor; /* Bytes 102-103 */
522 unsigned short CacheLineSize; /* Bytes 104-105 */
523 struct {
524 enum {
525 DAC960_V1_Narrow_8bit = 0x0,
526 DAC960_V1_Wide_16bit = 0x1,
527 DAC960_V1_Wide_32bit = 0x2
528 } __attribute__ ((packed)) BusWidth:2; /* Byte 106 Bits 0-1 */
529 enum {
530 DAC960_V1_Fast = 0x0,
531 DAC960_V1_Ultra = 0x1,
532 DAC960_V1_Ultra2 = 0x2
533 } __attribute__ ((packed)) BusSpeed:2; /* Byte 106 Bits 2-3 */
534 bool Differential:1; /* Byte 106 Bit 4 */
535 unsigned char :3; /* Byte 106 Bits 5-7 */
536 } SCSICapability;
537 unsigned char :8; /* Byte 107 */
538 unsigned int :32; /* Bytes 108-111 */
539 unsigned short FirmwareBuildNumber; /* Bytes 112-113 */
540 enum {
541 DAC960_V1_AEMI = 0x01,
542 DAC960_V1_OEM1 = 0x02,
543 DAC960_V1_OEM2 = 0x04,
544 DAC960_V1_OEM3 = 0x08,
545 DAC960_V1_Conner = 0x10,
546 DAC960_V1_SAFTE = 0x20
547 } __attribute__ ((packed)) FaultManagementType; /* Byte 114 */
548 unsigned char :8; /* Byte 115 */
549 struct {
550 bool Clustering:1; /* Byte 116 Bit 0 */
551 bool MylexOnlineRAIDExpansion:1; /* Byte 116 Bit 1 */
552 bool ReadAhead:1; /* Byte 116 Bit 2 */
553 bool BackgroundInitialization:1; /* Byte 116 Bit 3 */
554 unsigned int :28; /* Bytes 116-119 */
555 } FirmwareFeatures;
556 unsigned int :32; /* Bytes 120-123 */
557 unsigned int :32; /* Bytes 124-127 */
558 }
559 DAC960_V1_Enquiry2_T;
560
561
562 /*
563 Define the DAC960 V1 Firmware Logical Drive State type.
564 */
565
566 typedef enum
567 {
568 DAC960_V1_LogicalDrive_Online = 0x03,
569 DAC960_V1_LogicalDrive_Critical = 0x04,
570 DAC960_V1_LogicalDrive_Offline = 0xFF
571 }
572 __attribute__ ((packed))
573 DAC960_V1_LogicalDriveState_T;
574
575
576 /*
577 Define the DAC960 V1 Firmware Logical Drive Information structure.
578 */
579
580 typedef struct DAC960_V1_LogicalDriveInformation
581 {
582 unsigned int LogicalDriveSize; /* Bytes 0-3 */
583 DAC960_V1_LogicalDriveState_T LogicalDriveState; /* Byte 4 */
584 unsigned char RAIDLevel:7; /* Byte 5 Bits 0-6 */
585 bool WriteBack:1; /* Byte 5 Bit 7 */
586 unsigned short :16; /* Bytes 6-7 */
587 }
588 DAC960_V1_LogicalDriveInformation_T;
589
590
591 /*
592 Define the DAC960 V1 Firmware Get Logical Drive Information Command
593 reply structure.
594 */
595
596 typedef DAC960_V1_LogicalDriveInformation_T
597 DAC960_V1_LogicalDriveInformationArray_T[DAC960_MaxLogicalDrives];
598
599
600 /*
601 Define the DAC960 V1 Firmware Perform Event Log Operation Types.
602 */
603
604 typedef enum
605 {
606 DAC960_V1_GetEventLogEntry = 0x00
607 }
608 __attribute__ ((packed))
609 DAC960_V1_PerformEventLogOpType_T;
610
611
612 /*
613 Define the DAC960 V1 Firmware Get Event Log Entry Command reply structure.
614 */
615
616 typedef struct DAC960_V1_EventLogEntry
617 {
618 unsigned char MessageType; /* Byte 0 */
619 unsigned char MessageLength; /* Byte 1 */
620 unsigned char TargetID:5; /* Byte 2 Bits 0-4 */
621 unsigned char Channel:3; /* Byte 2 Bits 5-7 */
622 unsigned char LogicalUnit:6; /* Byte 3 Bits 0-5 */
623 unsigned char :2; /* Byte 3 Bits 6-7 */
624 unsigned short SequenceNumber; /* Bytes 4-5 */
625 unsigned char ErrorCode:7; /* Byte 6 Bits 0-6 */
626 bool Valid:1; /* Byte 6 Bit 7 */
627 unsigned char SegmentNumber; /* Byte 7 */
628 DAC960_SCSI_RequestSenseKey_T SenseKey:4; /* Byte 8 Bits 0-3 */
629 unsigned char :1; /* Byte 8 Bit 4 */
630 bool ILI:1; /* Byte 8 Bit 5 */
631 bool EOM:1; /* Byte 8 Bit 6 */
632 bool Filemark:1; /* Byte 8 Bit 7 */
633 unsigned char Information[4]; /* Bytes 9-12 */
634 unsigned char AdditionalSenseLength; /* Byte 13 */
635 unsigned char CommandSpecificInformation[4]; /* Bytes 14-17 */
636 unsigned char AdditionalSenseCode; /* Byte 18 */
637 unsigned char AdditionalSenseCodeQualifier; /* Byte 19 */
638 unsigned char Dummy[12]; /* Bytes 20-31 */
639 }
640 DAC960_V1_EventLogEntry_T;
641
642
643 /*
644 Define the DAC960 V1 Firmware Physical Device State type.
645 */
646
647 typedef enum
648 {
649 DAC960_V1_Device_Dead = 0x00,
650 DAC960_V1_Device_WriteOnly = 0x02,
651 DAC960_V1_Device_Online = 0x03,
652 DAC960_V1_Device_Standby = 0x10
653 }
654 __attribute__ ((packed))
655 DAC960_V1_PhysicalDeviceState_T;
656
657
658 /*
659 Define the DAC960 V1 Firmware Get Device State Command reply structure.
660 The structure is padded by 2 bytes for compatibility with Version 2.xx
661 Firmware.
662 */
663
664 typedef struct DAC960_V1_DeviceState
665 {
666 bool Present:1; /* Byte 0 Bit 0 */
667 unsigned char :7; /* Byte 0 Bits 1-7 */
668 enum {
669 DAC960_V1_OtherType = 0x0,
670 DAC960_V1_DiskType = 0x1,
671 DAC960_V1_SequentialType = 0x2,
672 DAC960_V1_CDROM_or_WORM_Type = 0x3
673 } __attribute__ ((packed)) DeviceType:2; /* Byte 1 Bits 0-1 */
674 bool :1; /* Byte 1 Bit 2 */
675 bool Fast20:1; /* Byte 1 Bit 3 */
676 bool Sync:1; /* Byte 1 Bit 4 */
677 bool Fast:1; /* Byte 1 Bit 5 */
678 bool Wide:1; /* Byte 1 Bit 6 */
679 bool TaggedQueuingSupported:1; /* Byte 1 Bit 7 */
680 DAC960_V1_PhysicalDeviceState_T DeviceState; /* Byte 2 */
681 unsigned char :8; /* Byte 3 */
682 unsigned char SynchronousMultiplier; /* Byte 4 */
683 unsigned char SynchronousOffset:5; /* Byte 5 Bits 0-4 */
684 unsigned char :3; /* Byte 5 Bits 5-7 */
685 unsigned int DiskSize __attribute__ ((packed)); /* Bytes 6-9 */
686 unsigned short :16; /* Bytes 10-11 */
687 }
688 DAC960_V1_DeviceState_T;
689
690
691 /*
692 Define the DAC960 V1 Firmware Get Rebuild Progress Command reply structure.
693 */
694
695 typedef struct DAC960_V1_RebuildProgress
696 {
697 unsigned int LogicalDriveNumber; /* Bytes 0-3 */
698 unsigned int LogicalDriveSize; /* Bytes 4-7 */
699 unsigned int RemainingBlocks; /* Bytes 8-11 */
700 }
701 DAC960_V1_RebuildProgress_T;
702
703
704 /*
705 Define the DAC960 V1 Firmware Background Initialization Status Command
706 reply structure.
707 */
708
709 typedef struct DAC960_V1_BackgroundInitializationStatus
710 {
711 unsigned int LogicalDriveSize; /* Bytes 0-3 */
712 unsigned int BlocksCompleted; /* Bytes 4-7 */
713 unsigned char Reserved1[12]; /* Bytes 8-19 */
714 unsigned int LogicalDriveNumber; /* Bytes 20-23 */
715 unsigned char RAIDLevel; /* Byte 24 */
716 enum {
717 DAC960_V1_BackgroundInitializationInvalid = 0x00,
718 DAC960_V1_BackgroundInitializationStarted = 0x02,
719 DAC960_V1_BackgroundInitializationInProgress = 0x04,
720 DAC960_V1_BackgroundInitializationSuspended = 0x05,
721 DAC960_V1_BackgroundInitializationCancelled = 0x06
722 } __attribute__ ((packed)) Status; /* Byte 25 */
723 unsigned char Reserved2[6]; /* Bytes 26-31 */
724 }
725 DAC960_V1_BackgroundInitializationStatus_T;
726
727
728 /*
729 Define the DAC960 V1 Firmware Error Table Entry structure.
730 */
731
732 typedef struct DAC960_V1_ErrorTableEntry
733 {
734 unsigned char ParityErrorCount; /* Byte 0 */
735 unsigned char SoftErrorCount; /* Byte 1 */
736 unsigned char HardErrorCount; /* Byte 2 */
737 unsigned char MiscErrorCount; /* Byte 3 */
738 }
739 DAC960_V1_ErrorTableEntry_T;
740
741
742 /*
743 Define the DAC960 V1 Firmware Get Error Table Command reply structure.
744 */
745
746 typedef struct DAC960_V1_ErrorTable
747 {
748 DAC960_V1_ErrorTableEntry_T
749 ErrorTableEntries[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets];
750 }
751 DAC960_V1_ErrorTable_T;
752
753
754 /*
755 Define the DAC960 V1 Firmware Read Config2 Command reply structure.
756 */
757
758 typedef struct DAC960_V1_Config2
759 {
760 unsigned char :1; /* Byte 0 Bit 0 */
761 bool ActiveNegationEnabled:1; /* Byte 0 Bit 1 */
762 unsigned char :5; /* Byte 0 Bits 2-6 */
763 bool NoRescanIfResetReceivedDuringScan:1; /* Byte 0 Bit 7 */
764 bool StorageWorksSupportEnabled:1; /* Byte 1 Bit 0 */
765 bool HewlettPackardSupportEnabled:1; /* Byte 1 Bit 1 */
766 bool NoDisconnectOnFirstCommand:1; /* Byte 1 Bit 2 */
767 unsigned char :2; /* Byte 1 Bits 3-4 */
768 bool AEMI_ARM:1; /* Byte 1 Bit 5 */
769 bool AEMI_OFM:1; /* Byte 1 Bit 6 */
770 unsigned char :1; /* Byte 1 Bit 7 */
771 enum {
772 DAC960_V1_OEMID_Mylex = 0x00,
773 DAC960_V1_OEMID_IBM = 0x08,
774 DAC960_V1_OEMID_HP = 0x0A,
775 DAC960_V1_OEMID_DEC = 0x0C,
776 DAC960_V1_OEMID_Siemens = 0x10,
777 DAC960_V1_OEMID_Intel = 0x12
778 } __attribute__ ((packed)) OEMID; /* Byte 2 */
779 unsigned char OEMModelNumber; /* Byte 3 */
780 unsigned char PhysicalSector; /* Byte 4 */
781 unsigned char LogicalSector; /* Byte 5 */
782 unsigned char BlockFactor; /* Byte 6 */
783 bool ReadAheadEnabled:1; /* Byte 7 Bit 0 */
784 bool LowBIOSDelay:1; /* Byte 7 Bit 1 */
785 unsigned char :2; /* Byte 7 Bits 2-3 */
786 bool ReassignRestrictedToOneSector:1; /* Byte 7 Bit 4 */
787 unsigned char :1; /* Byte 7 Bit 5 */
788 bool ForceUnitAccessDuringWriteRecovery:1; /* Byte 7 Bit 6 */
789 bool EnableLeftSymmetricRAID5Algorithm:1; /* Byte 7 Bit 7 */
790 unsigned char DefaultRebuildRate; /* Byte 8 */
791 unsigned char :8; /* Byte 9 */
792 unsigned char BlocksPerCacheLine; /* Byte 10 */
793 unsigned char BlocksPerStripe; /* Byte 11 */
794 struct {
795 enum {
796 DAC960_V1_Async = 0x0,
797 DAC960_V1_Sync_8MHz = 0x1,
798 DAC960_V1_Sync_5MHz = 0x2,
799 DAC960_V1_Sync_10or20MHz = 0x3 /* Byte 11 Bits 0-1 */
800 } __attribute__ ((packed)) Speed:2;
801 bool Force8Bit:1; /* Byte 11 Bit 2 */
802 bool DisableFast20:1; /* Byte 11 Bit 3 */
803 unsigned char :3; /* Byte 11 Bits 4-6 */
804 bool EnableTaggedQueuing:1; /* Byte 11 Bit 7 */
805 } __attribute__ ((packed)) ChannelParameters[6]; /* Bytes 12-17 */
806 unsigned char SCSIInitiatorID; /* Byte 18 */
807 unsigned char :8; /* Byte 19 */
808 enum {
809 DAC960_V1_StartupMode_ControllerSpinUp = 0x00,
810 DAC960_V1_StartupMode_PowerOnSpinUp = 0x01
811 } __attribute__ ((packed)) StartupMode; /* Byte 20 */
812 unsigned char SimultaneousDeviceSpinUpCount; /* Byte 21 */
813 unsigned char SecondsDelayBetweenSpinUps; /* Byte 22 */
814 unsigned char Reserved1[29]; /* Bytes 23-51 */
815 bool BIOSDisabled:1; /* Byte 52 Bit 0 */
816 bool CDROMBootEnabled:1; /* Byte 52 Bit 1 */
817 unsigned char :3; /* Byte 52 Bits 2-4 */
818 enum {
819 DAC960_V1_Geometry_128_32 = 0x0,
820 DAC960_V1_Geometry_255_63 = 0x1,
821 DAC960_V1_Geometry_Reserved1 = 0x2,
822 DAC960_V1_Geometry_Reserved2 = 0x3
823 } __attribute__ ((packed)) DriveGeometry:2; /* Byte 52 Bits 5-6 */
824 unsigned char :1; /* Byte 52 Bit 7 */
825 unsigned char Reserved2[9]; /* Bytes 53-61 */
826 unsigned short Checksum; /* Bytes 62-63 */
827 }
828 DAC960_V1_Config2_T;
829
830
831 /*
832 Define the DAC960 V1 Firmware DCDB request structure.
833 */
834
835 typedef struct DAC960_V1_DCDB
836 {
837 unsigned char TargetID:4; /* Byte 0 Bits 0-3 */
838 unsigned char Channel:4; /* Byte 0 Bits 4-7 */
839 enum {
840 DAC960_V1_DCDB_NoDataTransfer = 0,
841 DAC960_V1_DCDB_DataTransferDeviceToSystem = 1,
842 DAC960_V1_DCDB_DataTransferSystemToDevice = 2,
843 DAC960_V1_DCDB_IllegalDataTransfer = 3
844 } __attribute__ ((packed)) Direction:2; /* Byte 1 Bits 0-1 */
845 bool EarlyStatus:1; /* Byte 1 Bit 2 */
846 unsigned char :1; /* Byte 1 Bit 3 */
847 enum {
848 DAC960_V1_DCDB_Timeout_24_hours = 0,
849 DAC960_V1_DCDB_Timeout_10_seconds = 1,
850 DAC960_V1_DCDB_Timeout_60_seconds = 2,
851 DAC960_V1_DCDB_Timeout_10_minutes = 3
852 } __attribute__ ((packed)) Timeout:2; /* Byte 1 Bits 4-5 */
853 bool NoAutomaticRequestSense:1; /* Byte 1 Bit 6 */
854 bool DisconnectPermitted:1; /* Byte 1 Bit 7 */
855 unsigned short TransferLength; /* Bytes 2-3 */
856 DAC960_BusAddress32_T BusAddress; /* Bytes 4-7 */
857 unsigned char CDBLength:4; /* Byte 8 Bits 0-3 */
858 unsigned char TransferLengthHigh4:4; /* Byte 8 Bits 4-7 */
859 unsigned char SenseLength; /* Byte 9 */
860 unsigned char CDB[12]; /* Bytes 10-21 */
861 unsigned char SenseData[64]; /* Bytes 22-85 */
862 unsigned char Status; /* Byte 86 */
863 unsigned char :8; /* Byte 87 */
864 }
865 DAC960_V1_DCDB_T;
866
867
868 /*
869 Define the DAC960 V1 Firmware Scatter/Gather List Type 1 32 Bit Address
870 32 Bit Byte Count structure.
871 */
872
873 typedef struct DAC960_V1_ScatterGatherSegment
874 {
875 DAC960_BusAddress32_T SegmentDataPointer; /* Bytes 0-3 */
876 DAC960_ByteCount32_T SegmentByteCount; /* Bytes 4-7 */
877 }
878 DAC960_V1_ScatterGatherSegment_T;
879
880
881 /*
882 Define the 13 Byte DAC960 V1 Firmware Command Mailbox structure. Bytes 13-15
883 are not used. The Command Mailbox structure is padded to 16 bytes for
884 efficient access.
885 */
886
887 typedef union DAC960_V1_CommandMailbox
888 {
889 unsigned int Words[4]; /* Words 0-3 */
890 unsigned char Bytes[16]; /* Bytes 0-15 */
891 struct {
892 DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */
893 DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */
894 unsigned char Dummy[14]; /* Bytes 2-15 */
895 } __attribute__ ((packed)) Common;
896 struct {
897 DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */
898 DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */
899 unsigned char Dummy1[6]; /* Bytes 2-7 */
900 DAC960_BusAddress32_T BusAddress; /* Bytes 8-11 */
901 unsigned char Dummy2[4]; /* Bytes 12-15 */
902 } __attribute__ ((packed)) Type3;
903 struct {
904 DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */
905 DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */
906 unsigned char CommandOpcode2; /* Byte 2 */
907 unsigned char Dummy1[5]; /* Bytes 3-7 */
908 DAC960_BusAddress32_T BusAddress; /* Bytes 8-11 */
909 unsigned char Dummy2[4]; /* Bytes 12-15 */
910 } __attribute__ ((packed)) Type3B;
911 struct {
912 DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */
913 DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */
914 unsigned char Dummy1[5]; /* Bytes 2-6 */
915 unsigned char LogicalDriveNumber:6; /* Byte 7 Bits 0-6 */
916 bool AutoRestore:1; /* Byte 7 Bit 7 */
917 unsigned char Dummy2[8]; /* Bytes 8-15 */
918 } __attribute__ ((packed)) Type3C;
919 struct {
920 DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */
921 DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */
922 unsigned char Channel; /* Byte 2 */
923 unsigned char TargetID; /* Byte 3 */
924 DAC960_V1_PhysicalDeviceState_T DeviceState:5; /* Byte 4 Bits 0-4 */
925 unsigned char Modifier:3; /* Byte 4 Bits 5-7 */
926 unsigned char Dummy1[3]; /* Bytes 5-7 */
927 DAC960_BusAddress32_T BusAddress; /* Bytes 8-11 */
928 unsigned char Dummy2[4]; /* Bytes 12-15 */
929 } __attribute__ ((packed)) Type3D;
930 struct {
931 DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */
932 DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */
933 DAC960_V1_PerformEventLogOpType_T OperationType; /* Byte 2 */
934 unsigned char OperationQualifier; /* Byte 3 */
935 unsigned short SequenceNumber; /* Bytes 4-5 */
936 unsigned char Dummy1[2]; /* Bytes 6-7 */
937 DAC960_BusAddress32_T BusAddress; /* Bytes 8-11 */
938 unsigned char Dummy2[4]; /* Bytes 12-15 */
939 } __attribute__ ((packed)) Type3E;
940 struct {
941 DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */
942 DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */
943 unsigned char Dummy1[2]; /* Bytes 2-3 */
944 unsigned char RebuildRateConstant; /* Byte 4 */
945 unsigned char Dummy2[3]; /* Bytes 5-7 */
946 DAC960_BusAddress32_T BusAddress; /* Bytes 8-11 */
947 unsigned char Dummy3[4]; /* Bytes 12-15 */
948 } __attribute__ ((packed)) Type3R;
949 struct {
950 DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */
951 DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */
952 unsigned short TransferLength; /* Bytes 2-3 */
953 unsigned int LogicalBlockAddress; /* Bytes 4-7 */
954 DAC960_BusAddress32_T BusAddress; /* Bytes 8-11 */
955 unsigned char LogicalDriveNumber; /* Byte 12 */
956 unsigned char Dummy[3]; /* Bytes 13-15 */
957 } __attribute__ ((packed)) Type4;
958 struct {
959 DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */
960 DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */
961 struct {
962 unsigned short TransferLength:11; /* Bytes 2-3 */
963 unsigned char LogicalDriveNumber:5; /* Byte 3 Bits 3-7 */
964 } __attribute__ ((packed)) LD;
965 unsigned int LogicalBlockAddress; /* Bytes 4-7 */
966 DAC960_BusAddress32_T BusAddress; /* Bytes 8-11 */
967 unsigned char ScatterGatherCount:6; /* Byte 12 Bits 0-5 */
968 enum {
969 DAC960_V1_ScatterGather_32BitAddress_32BitByteCount = 0x0,
970 DAC960_V1_ScatterGather_32BitAddress_16BitByteCount = 0x1,
971 DAC960_V1_ScatterGather_32BitByteCount_32BitAddress = 0x2,
972 DAC960_V1_ScatterGather_16BitByteCount_32BitAddress = 0x3
973 } __attribute__ ((packed)) ScatterGatherType:2; /* Byte 12 Bits 6-7 */
974 unsigned char Dummy[3]; /* Bytes 13-15 */
975 } __attribute__ ((packed)) Type5;
976 struct {
977 DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */
978 DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */
979 unsigned char CommandOpcode2; /* Byte 2 */
980 unsigned char :8; /* Byte 3 */
981 DAC960_BusAddress32_T CommandMailboxesBusAddress; /* Bytes 4-7 */
982 DAC960_BusAddress32_T StatusMailboxesBusAddress; /* Bytes 8-11 */
983 unsigned char Dummy[4]; /* Bytes 12-15 */
984 } __attribute__ ((packed)) TypeX;
985 }
986 DAC960_V1_CommandMailbox_T;
987
988
989 /*
990 Define the DAC960 V2 Firmware Command Opcodes.
991 */
992
993 typedef enum
994 {
995 DAC960_V2_MemCopy = 0x01,
996 DAC960_V2_SCSI_10_Passthru = 0x02,
997 DAC960_V2_SCSI_255_Passthru = 0x03,
998 DAC960_V2_SCSI_10 = 0x04,
999 DAC960_V2_SCSI_256 = 0x05,
1000 DAC960_V2_IOCTL = 0x20
1001 }
1002 __attribute__ ((packed))
1003 DAC960_V2_CommandOpcode_T;
1004
1005
1006 /*
1007 Define the DAC960 V2 Firmware IOCTL Opcodes.
1008 */
1009
1010 typedef enum
1011 {
1012 DAC960_V2_GetControllerInfo = 0x01,
1013 DAC960_V2_GetLogicalDeviceInfoValid = 0x03,
1014 DAC960_V2_GetPhysicalDeviceInfoValid = 0x05,
1015 DAC960_V2_GetHealthStatus = 0x11,
1016 DAC960_V2_GetEvent = 0x15,
1017 DAC960_V2_StartDiscovery = 0x81,
1018 DAC960_V2_SetDeviceState = 0x82,
1019 DAC960_V2_RebuildDeviceStart = 0x88,
1020 DAC960_V2_RebuildDeviceStop = 0x89,
1021 DAC960_V2_ConsistencyCheckStart = 0x8C,
1022 DAC960_V2_ConsistencyCheckStop = 0x8D,
1023 DAC960_V2_SetMemoryMailbox = 0x8E,
1024 DAC960_V2_PauseDevice = 0x92,
1025 DAC960_V2_TranslatePhysicalToLogicalDevice = 0xC5
1026 }
1027 __attribute__ ((packed))
1028 DAC960_V2_IOCTL_Opcode_T;
1029
1030
1031 /*
1032 Define the DAC960 V2 Firmware Command Identifier type.
1033 */
1034
1035 typedef unsigned short DAC960_V2_CommandIdentifier_T;
1036
1037
1038 /*
1039 Define the DAC960 V2 Firmware Command Status Codes.
1040 */
1041
1042 #define DAC960_V2_NormalCompletion 0x00
1043 #define DAC960_V2_AbormalCompletion 0x02
1044 #define DAC960_V2_DeviceBusy 0x08
1045 #define DAC960_V2_DeviceNonresponsive 0x0E
1046 #define DAC960_V2_DeviceNonresponsive2 0x0F
1047 #define DAC960_V2_DeviceRevervationConflict 0x18
1048
1049 typedef unsigned char DAC960_V2_CommandStatus_T;
1050
1051
1052 /*
1053 Define the DAC960 V2 Firmware Memory Type structure.
1054 */
1055
1056 typedef struct DAC960_V2_MemoryType
1057 {
1058 enum {
1059 DAC960_V2_MemoryType_Reserved = 0x00,
1060 DAC960_V2_MemoryType_DRAM = 0x01,
1061 DAC960_V2_MemoryType_EDRAM = 0x02,
1062 DAC960_V2_MemoryType_EDO = 0x03,
1063 DAC960_V2_MemoryType_SDRAM = 0x04,
1064 DAC960_V2_MemoryType_Last = 0x1F
1065 } __attribute__ ((packed)) MemoryType:5; /* Byte 0 Bits 0-4 */
1066 bool :1; /* Byte 0 Bit 5 */
1067 bool MemoryParity:1; /* Byte 0 Bit 6 */
1068 bool MemoryECC:1; /* Byte 0 Bit 7 */
1069 }
1070 DAC960_V2_MemoryType_T;
1071
1072
1073 /*
1074 Define the DAC960 V2 Firmware Processor Type structure.
1075 */
1076
1077 typedef enum
1078 {
1079 DAC960_V2_ProcessorType_i960CA = 0x01,
1080 DAC960_V2_ProcessorType_i960RD = 0x02,
1081 DAC960_V2_ProcessorType_i960RN = 0x03,
1082 DAC960_V2_ProcessorType_i960RP = 0x04,
1083 DAC960_V2_ProcessorType_NorthBay = 0x05,
1084 DAC960_V2_ProcessorType_StrongArm = 0x06,
1085 DAC960_V2_ProcessorType_i960RM = 0x07
1086 }
1087 __attribute__ ((packed))
1088 DAC960_V2_ProcessorType_T;
1089
1090
1091 /*
1092 Define the DAC960 V2 Firmware Get Controller Info reply structure.
1093 */
1094
1095 typedef struct DAC960_V2_ControllerInfo
1096 {
1097 unsigned char :8; /* Byte 0 */
1098 enum {
1099 DAC960_V2_SCSI_Bus = 0x00,
1100 DAC960_V2_Fibre_Bus = 0x01,
1101 DAC960_V2_PCI_Bus = 0x03
1102 } __attribute__ ((packed)) BusInterfaceType; /* Byte 1 */
1103 enum {
1104 DAC960_V2_DAC960E = 0x01,
1105 DAC960_V2_DAC960M = 0x08,
1106 DAC960_V2_DAC960PD = 0x10,
1107 DAC960_V2_DAC960PL = 0x11,
1108 DAC960_V2_DAC960PU = 0x12,
1109 DAC960_V2_DAC960PE = 0x13,
1110 DAC960_V2_DAC960PG = 0x14,
1111 DAC960_V2_DAC960PJ = 0x15,
1112 DAC960_V2_DAC960PTL0 = 0x16,
1113 DAC960_V2_DAC960PR = 0x17,
1114 DAC960_V2_DAC960PRL = 0x18,
1115 DAC960_V2_DAC960PT = 0x19,
1116 DAC960_V2_DAC1164P = 0x1A,
1117 DAC960_V2_DAC960PTL1 = 0x1B,
1118 DAC960_V2_EXR2000P = 0x1C,
1119 DAC960_V2_EXR3000P = 0x1D,
1120 DAC960_V2_AcceleRAID352 = 0x1E,
1121 DAC960_V2_AcceleRAID170 = 0x1F,
1122 DAC960_V2_AcceleRAID160 = 0x20,
1123 DAC960_V2_DAC960S = 0x60,
1124 DAC960_V2_DAC960SU = 0x61,
1125 DAC960_V2_DAC960SX = 0x62,
1126 DAC960_V2_DAC960SF = 0x63,
1127 DAC960_V2_DAC960SS = 0x64,
1128 DAC960_V2_DAC960FL = 0x65,
1129 DAC960_V2_DAC960LL = 0x66,
1130 DAC960_V2_DAC960FF = 0x67,
1131 DAC960_V2_DAC960HP = 0x68,
1132 DAC960_V2_RAIDBRICK = 0x69,
1133 DAC960_V2_METEOR_FL = 0x6A,
1134 DAC960_V2_METEOR_FF = 0x6B
1135 } __attribute__ ((packed)) ControllerType; /* Byte 2 */
1136 unsigned char :8; /* Byte 3 */
1137 unsigned short BusInterfaceSpeedMHz; /* Bytes 4-5 */
1138 unsigned char BusWidthBits; /* Byte 6 */
1139 unsigned char FlashCodeTypeOrProductID; /* Byte 7 */
1140 unsigned char NumberOfHostPortsPresent; /* Byte 8 */
1141 unsigned char Reserved1[7]; /* Bytes 9-15 */
1142 unsigned char BusInterfaceName[16]; /* Bytes 16-31 */
1143 unsigned char ControllerName[16]; /* Bytes 32-47 */
1144 unsigned char Reserved2[16]; /* Bytes 48-63 */
1145 /* Firmware Release Information */
1146 unsigned char FirmwareMajorVersion; /* Byte 64 */
1147 unsigned char FirmwareMinorVersion; /* Byte 65 */
1148 unsigned char FirmwareTurnNumber; /* Byte 66 */
1149 unsigned char FirmwareBuildNumber; /* Byte 67 */
1150 unsigned char FirmwareReleaseDay; /* Byte 68 */
1151 unsigned char FirmwareReleaseMonth; /* Byte 69 */
1152 unsigned char FirmwareReleaseYearHigh2Digits; /* Byte 70 */
1153 unsigned char FirmwareReleaseYearLow2Digits; /* Byte 71 */
1154 /* Hardware Release Information */
1155 unsigned char HardwareRevision; /* Byte 72 */
1156 unsigned int :24; /* Bytes 73-75 */
1157 unsigned char HardwareReleaseDay; /* Byte 76 */
1158 unsigned char HardwareReleaseMonth; /* Byte 77 */
1159 unsigned char HardwareReleaseYearHigh2Digits; /* Byte 78 */
1160 unsigned char HardwareReleaseYearLow2Digits; /* Byte 79 */
1161 /* Hardware Manufacturing Information */
1162 unsigned char ManufacturingBatchNumber; /* Byte 80 */
1163 unsigned char :8; /* Byte 81 */
1164 unsigned char ManufacturingPlantNumber; /* Byte 82 */
1165 unsigned char :8; /* Byte 83 */
1166 unsigned char HardwareManufacturingDay; /* Byte 84 */
1167 unsigned char HardwareManufacturingMonth; /* Byte 85 */
1168 unsigned char HardwareManufacturingYearHigh2Digits; /* Byte 86 */
1169 unsigned char HardwareManufacturingYearLow2Digits; /* Byte 87 */
1170 unsigned char MaximumNumberOfPDDperXLD; /* Byte 88 */
1171 unsigned char MaximumNumberOfILDperXLD; /* Byte 89 */
1172 unsigned short NonvolatileMemorySizeKB; /* Bytes 90-91 */
1173 unsigned char MaximumNumberOfXLD; /* Byte 92 */
1174 unsigned int :24; /* Bytes 93-95 */
1175 /* Unique Information per Controller */
1176 unsigned char ControllerSerialNumber[16]; /* Bytes 96-111 */
1177 unsigned char Reserved3[16]; /* Bytes 112-127 */
1178 /* Vendor Information */
1179 unsigned int :24; /* Bytes 128-130 */
1180 unsigned char OEM_Code; /* Byte 131 */
1181 unsigned char VendorName[16]; /* Bytes 132-147 */
1182 /* Other Physical/Controller/Operation Information */
1183 bool BBU_Present:1; /* Byte 148 Bit 0 */
1184 bool ActiveActiveClusteringMode:1; /* Byte 148 Bit 1 */
1185 unsigned char :6; /* Byte 148 Bits 2-7 */
1186 unsigned char :8; /* Byte 149 */
1187 unsigned short :16; /* Bytes 150-151 */
1188 /* Physical Device Scan Information */
1189 bool PhysicalScanActive:1; /* Byte 152 Bit 0 */
1190 unsigned char :7; /* Byte 152 Bits 1-7 */
1191 unsigned char PhysicalDeviceChannelNumber; /* Byte 153 */
1192 unsigned char PhysicalDeviceTargetID; /* Byte 154 */
1193 unsigned char PhysicalDeviceLogicalUnit; /* Byte 155 */
1194 /* Maximum Command Data Transfer Sizes */
1195 unsigned short MaximumDataTransferSizeInBlocks; /* Bytes 156-157 */
1196 unsigned short MaximumScatterGatherEntries; /* Bytes 158-159 */
1197 /* Logical/Physical Device Counts */
1198 unsigned short LogicalDevicesPresent; /* Bytes 160-161 */
1199 unsigned short LogicalDevicesCritical; /* Bytes 162-163 */
1200 unsigned short LogicalDevicesOffline; /* Bytes 164-165 */
1201 unsigned short PhysicalDevicesPresent; /* Bytes 166-167 */
1202 unsigned short PhysicalDisksPresent; /* Bytes 168-169 */
1203 unsigned short PhysicalDisksCritical; /* Bytes 170-171 */
1204 unsigned short PhysicalDisksOffline; /* Bytes 172-173 */
1205 unsigned short MaximumParallelCommands; /* Bytes 174-175 */
1206 /* Channel and Target ID Information */
1207 unsigned char NumberOfPhysicalChannelsPresent; /* Byte 176 */
1208 unsigned char NumberOfVirtualChannelsPresent; /* Byte 177 */
1209 unsigned char NumberOfPhysicalChannelsPossible; /* Byte 178 */
1210 unsigned char NumberOfVirtualChannelsPossible; /* Byte 179 */
1211 unsigned char MaximumTargetsPerChannel[16]; /* Bytes 180-195 */
1212 unsigned char Reserved4[12]; /* Bytes 196-207 */
1213 /* Memory/Cache Information */
1214 unsigned short MemorySizeMB; /* Bytes 208-209 */
1215 unsigned short CacheSizeMB; /* Bytes 210-211 */
1216 unsigned int ValidCacheSizeInBytes; /* Bytes 212-215 */
1217 unsigned int DirtyCacheSizeInBytes; /* Bytes 216-219 */
1218 unsigned short MemorySpeedMHz; /* Bytes 220-221 */
1219 unsigned char MemoryDataWidthBits; /* Byte 222 */
1220 DAC960_V2_MemoryType_T MemoryType; /* Byte 223 */
1221 unsigned char CacheMemoryTypeName[16]; /* Bytes 224-239 */
1222 /* Execution Memory Information */
1223 unsigned short ExecutionMemorySizeMB; /* Bytes 240-241 */
1224 unsigned short ExecutionL2CacheSizeMB; /* Bytes 242-243 */
1225 unsigned char Reserved5[8]; /* Bytes 244-251 */
1226 unsigned short ExecutionMemorySpeedMHz; /* Bytes 252-253 */
1227 unsigned char ExecutionMemoryDataWidthBits; /* Byte 254 */
1228 DAC960_V2_MemoryType_T ExecutionMemoryType; /* Byte 255 */
1229 unsigned char ExecutionMemoryTypeName[16]; /* Bytes 256-271 */
1230 /* First CPU Type Information */
1231 unsigned short FirstProcessorSpeedMHz; /* Bytes 272-273 */
1232 DAC960_V2_ProcessorType_T FirstProcessorType; /* Byte 274 */
1233 unsigned char FirstProcessorCount; /* Byte 275 */
1234 unsigned char Reserved6[12]; /* Bytes 276-287 */
1235 unsigned char FirstProcessorName[16]; /* Bytes 288-303 */
1236 /* Second CPU Type Information */
1237 unsigned short SecondProcessorSpeedMHz; /* Bytes 304-305 */
1238 DAC960_V2_ProcessorType_T SecondProcessorType; /* Byte 306 */
1239 unsigned char SecondProcessorCount; /* Byte 307 */
1240 unsigned char Reserved7[12]; /* Bytes 308-319 */
1241 unsigned char SecondProcessorName[16]; /* Bytes 320-335 */
1242 /* Debugging/Profiling/Command Time Tracing Information */
1243 unsigned short CurrentProfilingDataPageNumber; /* Bytes 336-337 */
1244 unsigned short ProgramsAwaitingProfilingData; /* Bytes 338-339 */
1245 unsigned short CurrentCommandTimeTraceDataPageNumber; /* Bytes 340-341 */
1246 unsigned short ProgramsAwaitingCommandTimeTraceData; /* Bytes 342-343 */
1247 unsigned char Reserved8[8]; /* Bytes 344-351 */
1248 /* Error Counters on Physical Devices */
1249 unsigned short PhysicalDeviceBusResets; /* Bytes 352-353 */
1250 unsigned short PhysicalDeviceParityErrors; /* Bytes 355-355 */
1251 unsigned short PhysicalDeviceSoftErrors; /* Bytes 356-357 */
1252 unsigned short PhysicalDeviceCommandsFailed; /* Bytes 358-359 */
1253 unsigned short PhysicalDeviceMiscellaneousErrors; /* Bytes 360-361 */
1254 unsigned short PhysicalDeviceCommandTimeouts; /* Bytes 362-363 */
1255 unsigned short PhysicalDeviceSelectionTimeouts; /* Bytes 364-365 */
1256 unsigned short PhysicalDeviceRetriesDone; /* Bytes 366-367 */
1257 unsigned short PhysicalDeviceAbortsDone; /* Bytes 368-369 */
1258 unsigned short PhysicalDeviceHostCommandAbortsDone; /* Bytes 370-371 */
1259 unsigned short PhysicalDevicePredictedFailuresDetected; /* Bytes 372-373 */
1260 unsigned short PhysicalDeviceHostCommandsFailed; /* Bytes 374-375 */
1261 unsigned short PhysicalDeviceHardErrors; /* Bytes 376-377 */
1262 unsigned char Reserved9[6]; /* Bytes 378-383 */
1263 /* Error Counters on Logical Devices */
1264 unsigned short LogicalDeviceSoftErrors; /* Bytes 384-385 */
1265 unsigned short LogicalDeviceCommandsFailed; /* Bytes 386-387 */
1266 unsigned short LogicalDeviceHostCommandAbortsDone; /* Bytes 388-389 */
1267 unsigned short :16; /* Bytes 390-391 */
1268 /* Error Counters on Controller */
1269 unsigned short ControllerMemoryErrors; /* Bytes 392-393 */
1270 unsigned short ControllerHostCommandAbortsDone; /* Bytes 394-395 */
1271 unsigned int :32; /* Bytes 396-399 */
1272 /* Long Duration Activity Information */
1273 unsigned short BackgroundInitializationsActive; /* Bytes 400-401 */
1274 unsigned short LogicalDeviceInitializationsActive; /* Bytes 402-403 */
1275 unsigned short PhysicalDeviceInitializationsActive; /* Bytes 404-405 */
1276 unsigned short ConsistencyChecksActive; /* Bytes 406-407 */
1277 unsigned short RebuildsActive; /* Bytes 408-409 */
1278 unsigned short OnlineExpansionsActive; /* Bytes 410-411 */
1279 unsigned short PatrolActivitiesActive; /* Bytes 412-413 */
1280 unsigned short :16; /* Bytes 414-415 */
1281 /* Flash ROM Information */
1282 unsigned char FlashType; /* Byte 416 */
1283 unsigned char :8; /* Byte 417 */
1284 unsigned short FlashSizeMB; /* Bytes 418-419 */
1285 unsigned int FlashLimit; /* Bytes 420-423 */
1286 unsigned int FlashCount; /* Bytes 424-427 */
1287 unsigned int :32; /* Bytes 428-431 */
1288 unsigned char FlashTypeName[16]; /* Bytes 432-447 */
1289 /* Firmware Run Time Information */
1290 unsigned char RebuildRate; /* Byte 448 */
1291 unsigned char BackgroundInitializationRate; /* Byte 449 */
1292 unsigned char ForegroundInitializationRate; /* Byte 450 */
1293 unsigned char ConsistencyCheckRate; /* Byte 451 */
1294 unsigned int :32; /* Bytes 452-455 */
1295 unsigned int MaximumDP; /* Bytes 456-459 */
1296 unsigned int FreeDP; /* Bytes 460-463 */
1297 unsigned int MaximumIOP; /* Bytes 464-467 */
1298 unsigned int FreeIOP; /* Bytes 468-471 */
1299 unsigned short MaximumCombLengthInBlocks; /* Bytes 472-473 */
1300 unsigned short NumberOfConfigurationGroups; /* Bytes 474-475 */
1301 bool InstallationAbortStatus:1; /* Byte 476 Bit 0 */
1302 bool MaintenanceModeStatus:1; /* Byte 476 Bit 1 */
1303 unsigned int :24; /* Bytes 476-479 */
1304 unsigned char Reserved10[32]; /* Bytes 480-511 */
1305 unsigned char Reserved11[512]; /* Bytes 512-1023 */
1306 }
1307 DAC960_V2_ControllerInfo_T;
1308
1309
1310 /*
1311 Define the DAC960 V2 Firmware Logical Device State type.
1312 */
1313
1314 typedef enum
1315 {
1316 DAC960_V2_LogicalDevice_Online = 0x01,
1317 DAC960_V2_LogicalDevice_Offline = 0x08,
1318 DAC960_V2_LogicalDevice_Critical = 0x09
1319 }
1320 __attribute__ ((packed))
1321 DAC960_V2_LogicalDeviceState_T;
1322
1323
1324 /*
1325 Define the DAC960 V2 Firmware Get Logical Device Info reply structure.
1326 */
1327
1328 typedef struct DAC960_V2_LogicalDeviceInfo
1329 {
1330 unsigned char :8; /* Byte 0 */
1331 unsigned char Channel; /* Byte 1 */
1332 unsigned char TargetID; /* Byte 2 */
1333 unsigned char LogicalUnit; /* Byte 3 */
1334 DAC960_V2_LogicalDeviceState_T LogicalDeviceState; /* Byte 4 */
1335 unsigned char RAIDLevel; /* Byte 5 */
1336 unsigned char StripeSize; /* Byte 6 */
1337 unsigned char CacheLineSize; /* Byte 7 */
1338 struct {
1339 enum {
1340 DAC960_V2_ReadCacheDisabled = 0x0,
1341 DAC960_V2_ReadCacheEnabled = 0x1,
1342 DAC960_V2_ReadAheadEnabled = 0x2,
1343 DAC960_V2_IntelligentReadAheadEnabled = 0x3,
1344 DAC960_V2_ReadCache_Last = 0x7
1345 } __attribute__ ((packed)) ReadCache:3; /* Byte 8 Bits 0-2 */
1346 enum {
1347 DAC960_V2_WriteCacheDisabled = 0x0,
1348 DAC960_V2_LogicalDeviceReadOnly = 0x1,
1349 DAC960_V2_WriteCacheEnabled = 0x2,
1350 DAC960_V2_IntelligentWriteCacheEnabled = 0x3,
1351 DAC960_V2_WriteCache_Last = 0x7
1352 } __attribute__ ((packed)) WriteCache:3; /* Byte 8 Bits 3-5 */
1353 bool :1; /* Byte 8 Bit 6 */
1354 bool LogicalDeviceInitialized:1; /* Byte 8 Bit 7 */
1355 } LogicalDeviceControl; /* Byte 8 */
1356 /* Logical Device Operations Status */
1357 bool ConsistencyCheckInProgress:1; /* Byte 9 Bit 0 */
1358 bool RebuildInProgress:1; /* Byte 9 Bit 1 */
1359 bool BackgroundInitializationInProgress:1; /* Byte 9 Bit 2 */
1360 bool ForegroundInitializationInProgress:1; /* Byte 9 Bit 3 */
1361 bool DataMigrationInProgress:1; /* Byte 9 Bit 4 */
1362 bool PatrolOperationInProgress:1; /* Byte 9 Bit 5 */
1363 unsigned char :2; /* Byte 9 Bits 6-7 */
1364 unsigned char RAID5WriteUpdate; /* Byte 10 */
1365 unsigned char RAID5Algorithm; /* Byte 11 */
1366 unsigned short LogicalDeviceNumber; /* Bytes 12-13 */
1367 /* BIOS Info */
1368 bool BIOSDisabled:1; /* Byte 14 Bit 0 */
1369 bool CDROMBootEnabled:1; /* Byte 14 Bit 1 */
1370 bool DriveCoercionEnabled:1; /* Byte 14 Bit 2 */
1371 bool WriteSameDisabled:1; /* Byte 14 Bit 3 */
1372 bool HBA_ModeEnabled:1; /* Byte 14 Bit 4 */
1373 enum {
1374 DAC960_V2_Geometry_128_32 = 0x0,
1375 DAC960_V2_Geometry_255_63 = 0x1,
1376 DAC960_V2_Geometry_Reserved1 = 0x2,
1377 DAC960_V2_Geometry_Reserved2 = 0x3
1378 } __attribute__ ((packed)) DriveGeometry:2; /* Byte 14 Bits 5-6 */
1379 bool SuperReadAheadEnabled:1; /* Byte 14 Bit 7 */
1380 unsigned char :8; /* Byte 15 */
1381 /* Error Counters */
1382 unsigned short SoftErrors; /* Bytes 16-17 */
1383 unsigned short CommandsFailed; /* Bytes 18-19 */
1384 unsigned short HostCommandAbortsDone; /* Bytes 20-21 */
1385 unsigned short DeferredWriteErrors; /* Bytes 22-23 */
1386 unsigned int :32; /* Bytes 24-27 */
1387 unsigned int :32; /* Bytes 28-31 */
1388 /* Device Size Information */
1389 unsigned short :16; /* Bytes 32-33 */
1390 unsigned short DeviceBlockSizeInBytes; /* Bytes 34-35 */
1391 unsigned int OriginalDeviceSize; /* Bytes 36-39 */
1392 unsigned int ConfigurableDeviceSize; /* Bytes 40-43 */
1393 unsigned int :32; /* Bytes 44-47 */
1394 unsigned char LogicalDeviceName[32]; /* Bytes 48-79 */
1395 unsigned char SCSI_InquiryData[36]; /* Bytes 80-115 */
1396 unsigned char Reserved1[12]; /* Bytes 116-127 */
1397 DAC960_ByteCount64_T LastReadBlockNumber; /* Bytes 128-135 */
1398 DAC960_ByteCount64_T LastWrittenBlockNumber; /* Bytes 136-143 */
1399 DAC960_ByteCount64_T ConsistencyCheckBlockNumber; /* Bytes 144-151 */
1400 DAC960_ByteCount64_T RebuildBlockNumber; /* Bytes 152-159 */
1401 DAC960_ByteCount64_T BackgroundInitializationBlockNumber; /* Bytes 160-167 */
1402 DAC960_ByteCount64_T ForegroundInitializationBlockNumber; /* Bytes 168-175 */
1403 DAC960_ByteCount64_T DataMigrationBlockNumber; /* Bytes 176-183 */
1404 DAC960_ByteCount64_T PatrolOperationBlockNumber; /* Bytes 184-191 */
1405 unsigned char Reserved2[64]; /* Bytes 192-255 */
1406 }
1407 DAC960_V2_LogicalDeviceInfo_T;
1408
1409
1410 /*
1411 Define the DAC960 V2 Firmware Physical Device State type.
1412 */
1413
1414 typedef enum
1415 {
1416 DAC960_V2_Device_Unconfigured = 0x00,
1417 DAC960_V2_Device_Online = 0x01,
1418 DAC960_V2_Device_Rebuild = 0x03,
1419 DAC960_V2_Device_Missing = 0x04,
1420 DAC960_V2_Device_Critical = 0x05,
1421 DAC960_V2_Device_Dead = 0x08,
1422 DAC960_V2_Device_SuspectedDead = 0x0C,
1423 DAC960_V2_Device_CommandedOffline = 0x10,
1424 DAC960_V2_Device_Standby = 0x21,
1425 DAC960_V2_Device_InvalidState = 0xFF
1426 }
1427 __attribute__ ((packed))
1428 DAC960_V2_PhysicalDeviceState_T;
1429
1430
1431 /*
1432 Define the DAC960 V2 Firmware Get Physical Device Info reply structure.
1433 */
1434
1435 typedef struct DAC960_V2_PhysicalDeviceInfo
1436 {
1437 unsigned char :8; /* Byte 0 */
1438 unsigned char Channel; /* Byte 1 */
1439 unsigned char TargetID; /* Byte 2 */
1440 unsigned char LogicalUnit; /* Byte 3 */
1441 /* Configuration Status Bits */
1442 bool PhysicalDeviceFaultTolerant:1; /* Byte 4 Bit 0 */
1443 bool PhysicalDeviceConnected:1; /* Byte 4 Bit 1 */
1444 bool PhysicalDeviceLocalToController:1; /* Byte 4 Bit 2 */
1445 unsigned char :5; /* Byte 4 Bits 3-7 */
1446 /* Multiple Host/Controller Status Bits */
1447 bool RemoteHostSystemDead:1; /* Byte 5 Bit 0 */
1448 bool RemoteControllerDead:1; /* Byte 5 Bit 1 */
1449 unsigned char :6; /* Byte 5 Bits 2-7 */
1450 DAC960_V2_PhysicalDeviceState_T PhysicalDeviceState; /* Byte 6 */
1451 unsigned char NegotiatedDataWidthBits; /* Byte 7 */
1452 unsigned short NegotiatedSynchronousMegaTransfers; /* Bytes 8-9 */
1453 /* Multiported Physical Device Information */
1454 unsigned char NumberOfPortConnections; /* Byte 10 */
1455 unsigned char DriveAccessibilityBitmap; /* Byte 11 */
1456 unsigned int :32; /* Bytes 12-15 */
1457 unsigned char NetworkAddress[16]; /* Bytes 16-31 */
1458 unsigned short MaximumTags; /* Bytes 32-33 */
1459 /* Physical Device Operations Status */
1460 bool ConsistencyCheckInProgress:1; /* Byte 34 Bit 0 */
1461 bool RebuildInProgress:1; /* Byte 34 Bit 1 */
1462 bool MakingDataConsistentInProgress:1; /* Byte 34 Bit 2 */
1463 bool PhysicalDeviceInitializationInProgress:1; /* Byte 34 Bit 3 */
1464 bool DataMigrationInProgress:1; /* Byte 34 Bit 4 */
1465 bool PatrolOperationInProgress:1; /* Byte 34 Bit 5 */
1466 unsigned char :2; /* Byte 34 Bits 6-7 */
1467 unsigned char LongOperationStatus; /* Byte 35 */
1468 unsigned char ParityErrors; /* Byte 36 */
1469 unsigned char SoftErrors; /* Byte 37 */
1470 unsigned char HardErrors; /* Byte 38 */
1471 unsigned char MiscellaneousErrors; /* Byte 39 */
1472 unsigned char CommandTimeouts; /* Byte 40 */
1473 unsigned char Retries; /* Byte 41 */
1474 unsigned char Aborts; /* Byte 42 */
1475 unsigned char PredictedFailuresDetected; /* Byte 43 */
1476 unsigned int :32; /* Bytes 44-47 */
1477 unsigned short :16; /* Bytes 48-49 */
1478 unsigned short DeviceBlockSizeInBytes; /* Bytes 50-51 */
1479 unsigned int OriginalDeviceSize; /* Bytes 52-55 */
1480 unsigned int ConfigurableDeviceSize; /* Bytes 56-59 */
1481 unsigned int :32; /* Bytes 60-63 */
1482 unsigned char PhysicalDeviceName[16]; /* Bytes 64-79 */
1483 unsigned char Reserved1[16]; /* Bytes 80-95 */
1484 unsigned char Reserved2[32]; /* Bytes 96-127 */
1485 unsigned char SCSI_InquiryData[36]; /* Bytes 128-163 */
1486 unsigned char Reserved3[20]; /* Bytes 164-183 */
1487 unsigned char Reserved4[8]; /* Bytes 184-191 */
1488 DAC960_ByteCount64_T LastReadBlockNumber; /* Bytes 192-199 */
1489 DAC960_ByteCount64_T LastWrittenBlockNumber; /* Bytes 200-207 */
1490 DAC960_ByteCount64_T ConsistencyCheckBlockNumber; /* Bytes 208-215 */
1491 DAC960_ByteCount64_T RebuildBlockNumber; /* Bytes 216-223 */
1492 DAC960_ByteCount64_T MakingDataConsistentBlockNumber; /* Bytes 224-231 */
1493 DAC960_ByteCount64_T DeviceInitializationBlockNumber; /* Bytes 232-239 */
1494 DAC960_ByteCount64_T DataMigrationBlockNumber; /* Bytes 240-247 */
1495 DAC960_ByteCount64_T PatrolOperationBlockNumber; /* Bytes 248-255 */
1496 unsigned char Reserved5[256]; /* Bytes 256-511 */
1497 }
1498 DAC960_V2_PhysicalDeviceInfo_T;
1499
1500
1501 /*
1502 Define the DAC960 V2 Firmware Health Status Buffer structure.
1503 */
1504
1505 typedef struct DAC960_V2_HealthStatusBuffer
1506 {
1507 unsigned int MicrosecondsFromControllerStartTime; /* Bytes 0-3 */
1508 unsigned int MillisecondsFromControllerStartTime; /* Bytes 4-7 */
1509 unsigned int SecondsFrom1January1970; /* Bytes 8-11 */
1510 unsigned int :32; /* Bytes 12-15 */
1511 unsigned int StatusChangeCounter; /* Bytes 16-19 */
1512 unsigned int :32; /* Bytes 20-23 */
1513 unsigned int DebugOutputMessageBufferIndex; /* Bytes 24-27 */
1514 unsigned int CodedMessageBufferIndex; /* Bytes 28-31 */
1515 unsigned int CurrentTimeTracePageNumber; /* Bytes 32-35 */
1516 unsigned int CurrentProfilerPageNumber; /* Bytes 36-39 */
1517 unsigned int NextEventSequenceNumber; /* Bytes 40-43 */
1518 unsigned int :32; /* Bytes 44-47 */
1519 unsigned char Reserved1[16]; /* Bytes 48-63 */
1520 unsigned char Reserved2[64]; /* Bytes 64-127 */
1521 }
1522 DAC960_V2_HealthStatusBuffer_T;
1523
1524
1525 /*
1526 Define the DAC960 V2 Firmware Get Event reply structure.
1527 */
1528
1529 typedef struct DAC960_V2_Event
1530 {
1531 unsigned int EventSequenceNumber; /* Bytes 0-3 */
1532 unsigned int EventTime; /* Bytes 4-7 */
1533 unsigned int EventCode; /* Bytes 8-11 */
1534 unsigned char :8; /* Byte 12 */
1535 unsigned char Channel; /* Byte 13 */
1536 unsigned char TargetID; /* Byte 14 */
1537 unsigned char LogicalUnit; /* Byte 15 */
1538 unsigned int :32; /* Bytes 16-19 */
1539 unsigned int EventSpecificParameter; /* Bytes 20-23 */
1540 unsigned char RequestSenseData[40]; /* Bytes 24-63 */
1541 }
1542 DAC960_V2_Event_T;
1543
1544
1545 /*
1546 Define the DAC960 V2 Firmware Command Control Bits structure.
1547 */
1548
1549 typedef struct DAC960_V2_CommandControlBits
1550 {
1551 bool ForceUnitAccess:1; /* Byte 0 Bit 0 */
1552 bool DisablePageOut:1; /* Byte 0 Bit 1 */
1553 bool :1; /* Byte 0 Bit 2 */
1554 bool AdditionalScatterGatherListMemory:1; /* Byte 0 Bit 3 */
1555 bool DataTransferControllerToHost:1; /* Byte 0 Bit 4 */
1556 bool :1; /* Byte 0 Bit 5 */
1557 bool NoAutoRequestSense:1; /* Byte 0 Bit 6 */
1558 bool DisconnectProhibited:1; /* Byte 0 Bit 7 */
1559 }
1560 DAC960_V2_CommandControlBits_T;
1561
1562
1563 /*
1564 Define the DAC960 V2 Firmware Command Timeout structure.
1565 */
1566
1567 typedef struct DAC960_V2_CommandTimeout
1568 {
1569 unsigned char TimeoutValue:6; /* Byte 0 Bits 0-5 */
1570 enum {
1571 DAC960_V2_TimeoutScale_Seconds = 0,
1572 DAC960_V2_TimeoutScale_Minutes = 1,
1573 DAC960_V2_TimeoutScale_Hours = 2,
1574 DAC960_V2_TimeoutScale_Reserved = 3
1575 } __attribute__ ((packed)) TimeoutScale:2; /* Byte 0 Bits 6-7 */
1576 }
1577 DAC960_V2_CommandTimeout_T;
1578
1579
1580 /*
1581 Define the DAC960 V2 Firmware Physical Device structure.
1582 */
1583
1584 typedef struct DAC960_V2_PhysicalDevice
1585 {
1586 unsigned char LogicalUnit; /* Byte 0 */
1587 unsigned char TargetID; /* Byte 1 */
1588 unsigned char Channel:3; /* Byte 2 Bits 0-2 */
1589 unsigned char Controller:5; /* Byte 2 Bits 3-7 */
1590 }
1591 __attribute__ ((packed))
1592 DAC960_V2_PhysicalDevice_T;
1593
1594
1595 /*
1596 Define the DAC960 V2 Firmware Logical Device structure.
1597 */
1598
1599 typedef struct DAC960_V2_LogicalDevice
1600 {
1601 unsigned short LogicalDeviceNumber; /* Bytes 0-1 */
1602 unsigned char :3; /* Byte 2 Bits 0-2 */
1603 unsigned char Controller:5; /* Byte 2 Bits 3-7 */
1604 }
1605 __attribute__ ((packed))
1606 DAC960_V2_LogicalDevice_T;
1607
1608
1609 /*
1610 Define the DAC960 V2 Firmware Operation Device type.
1611 */
1612
1613 typedef enum
1614 {
1615 DAC960_V2_Physical_Device = 0x00,
1616 DAC960_V2_RAID_Device = 0x01,
1617 DAC960_V2_Physical_Channel = 0x02,
1618 DAC960_V2_RAID_Channel = 0x03,
1619 DAC960_V2_Physical_Controller = 0x04,
1620 DAC960_V2_RAID_Controller = 0x05,
1621 DAC960_V2_Configuration_Group = 0x10,
1622 DAC960_V2_Enclosure = 0x11
1623 }
1624 __attribute__ ((packed))
1625 DAC960_V2_OperationDevice_T;
1626
1627
1628 /*
1629 Define the DAC960 V2 Firmware Translate Physical To Logical Device structure.
1630 */
1631
1632 typedef struct DAC960_V2_PhysicalToLogicalDevice
1633 {
1634 unsigned short LogicalDeviceNumber; /* Bytes 0-1 */
1635 unsigned short :16; /* Bytes 2-3 */
1636 unsigned char PreviousBootController; /* Byte 4 */
1637 unsigned char PreviousBootChannel; /* Byte 5 */
1638 unsigned char PreviousBootTargetID; /* Byte 6 */
1639 unsigned char PreviousBootLogicalUnit; /* Byte 7 */
1640 }
1641 DAC960_V2_PhysicalToLogicalDevice_T;
1642
1643
1644
1645 /*
1646 Define the DAC960 V2 Firmware Scatter/Gather List Entry structure.
1647 */
1648
1649 typedef struct DAC960_V2_ScatterGatherSegment
1650 {
1651 DAC960_BusAddress64_T SegmentDataPointer; /* Bytes 0-7 */
1652 DAC960_ByteCount64_T SegmentByteCount; /* Bytes 8-15 */
1653 }
1654 DAC960_V2_ScatterGatherSegment_T;
1655
1656
1657 /*
1658 Define the DAC960 V2 Firmware Data Transfer Memory Address structure.
1659 */
1660
1661 typedef union DAC960_V2_DataTransferMemoryAddress
1662 {
1663 DAC960_V2_ScatterGatherSegment_T ScatterGatherSegments[2]; /* Bytes 0-31 */
1664 struct {
1665 unsigned short ScatterGatherList0Length; /* Bytes 0-1 */
1666 unsigned short ScatterGatherList1Length; /* Bytes 2-3 */
1667 unsigned short ScatterGatherList2Length; /* Bytes 4-5 */
1668 unsigned short :16; /* Bytes 6-7 */
1669 DAC960_BusAddress64_T ScatterGatherList0Address; /* Bytes 8-15 */
1670 DAC960_BusAddress64_T ScatterGatherList1Address; /* Bytes 16-23 */
1671 DAC960_BusAddress64_T ScatterGatherList2Address; /* Bytes 24-31 */
1672 } ExtendedScatterGather;
1673 }
1674 DAC960_V2_DataTransferMemoryAddress_T;
1675
1676
1677 /*
1678 Define the 64 Byte DAC960 V2 Firmware Command Mailbox structure.
1679 */
1680
1681 typedef union DAC960_V2_CommandMailbox
1682 {
1683 unsigned int Words[16]; /* Words 0-15 */
1684 struct {
1685 DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
1686 DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
1687 DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
1688 DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */
1689 unsigned char DataTransferPageNumber; /* Byte 7 */
1690 DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
1691 unsigned int :24; /* Bytes 16-18 */
1692 DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
1693 unsigned char RequestSenseSize; /* Byte 20 */
1694 unsigned char IOCTL_Opcode; /* Byte 21 */
1695 unsigned char Reserved[10]; /* Bytes 22-31 */
1696 DAC960_V2_DataTransferMemoryAddress_T
1697 DataTransferMemoryAddress; /* Bytes 32-63 */
1698 } Common;
1699 struct {
1700 DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
1701 DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
1702 DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
1703 DAC960_ByteCount32_T DataTransferSize; /* Bytes 4-7 */
1704 DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
1705 DAC960_V2_PhysicalDevice_T PhysicalDevice; /* Bytes 16-18 */
1706 DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
1707 unsigned char RequestSenseSize; /* Byte 20 */
1708 unsigned char CDBLength; /* Byte 21 */
1709 unsigned char SCSI_CDB[10]; /* Bytes 22-31 */
1710 DAC960_V2_DataTransferMemoryAddress_T
1711 DataTransferMemoryAddress; /* Bytes 32-63 */
1712 } SCSI_10;
1713 struct {
1714 DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
1715 DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
1716 DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
1717 DAC960_ByteCount32_T DataTransferSize; /* Bytes 4-7 */
1718 DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
1719 DAC960_V2_PhysicalDevice_T PhysicalDevice; /* Bytes 16-18 */
1720 DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
1721 unsigned char RequestSenseSize; /* Byte 20 */
1722 unsigned char CDBLength; /* Byte 21 */
1723 unsigned short :16; /* Bytes 22-23 */
1724 DAC960_BusAddress64_T SCSI_CDB_BusAddress; /* Bytes 24-31 */
1725 DAC960_V2_DataTransferMemoryAddress_T
1726 DataTransferMemoryAddress; /* Bytes 32-63 */
1727 } SCSI_255;
1728 struct {
1729 DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
1730 DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
1731 DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
1732 DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */
1733 unsigned char DataTransferPageNumber; /* Byte 7 */
1734 DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
1735 unsigned short :16; /* Bytes 16-17 */
1736 unsigned char ControllerNumber; /* Byte 18 */
1737 DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
1738 unsigned char RequestSenseSize; /* Byte 20 */
1739 unsigned char IOCTL_Opcode; /* Byte 21 */
1740 unsigned char Reserved[10]; /* Bytes 22-31 */
1741 DAC960_V2_DataTransferMemoryAddress_T
1742 DataTransferMemoryAddress; /* Bytes 32-63 */
1743 } ControllerInfo;
1744 struct {
1745 DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
1746 DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
1747 DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
1748 DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */
1749 unsigned char DataTransferPageNumber; /* Byte 7 */
1750 DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
1751 DAC960_V2_LogicalDevice_T LogicalDevice; /* Bytes 16-18 */
1752 DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
1753 unsigned char RequestSenseSize; /* Byte 20 */
1754 unsigned char IOCTL_Opcode; /* Byte 21 */
1755 unsigned char Reserved[10]; /* Bytes 22-31 */
1756 DAC960_V2_DataTransferMemoryAddress_T
1757 DataTransferMemoryAddress; /* Bytes 32-63 */
1758 } LogicalDeviceInfo;
1759 struct {
1760 DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
1761 DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
1762 DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
1763 DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */
1764 unsigned char DataTransferPageNumber; /* Byte 7 */
1765 DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
1766 DAC960_V2_PhysicalDevice_T PhysicalDevice; /* Bytes 16-18 */
1767 DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
1768 unsigned char RequestSenseSize; /* Byte 20 */
1769 unsigned char IOCTL_Opcode; /* Byte 21 */
1770 unsigned char Reserved[10]; /* Bytes 22-31 */
1771 DAC960_V2_DataTransferMemoryAddress_T
1772 DataTransferMemoryAddress; /* Bytes 32-63 */
1773 } PhysicalDeviceInfo;
1774 struct {
1775 DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
1776 DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
1777 DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
1778 DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */
1779 unsigned char DataTransferPageNumber; /* Byte 7 */
1780 DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
1781 unsigned short EventSequenceNumberHigh16; /* Bytes 16-17 */
1782 unsigned char ControllerNumber; /* Byte 18 */
1783 DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
1784 unsigned char RequestSenseSize; /* Byte 20 */
1785 unsigned char IOCTL_Opcode; /* Byte 21 */
1786 unsigned short EventSequenceNumberLow16; /* Bytes 22-23 */
1787 unsigned char Reserved[8]; /* Bytes 24-31 */
1788 DAC960_V2_DataTransferMemoryAddress_T
1789 DataTransferMemoryAddress; /* Bytes 32-63 */
1790 } GetEvent;
1791 struct {
1792 DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
1793 DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
1794 DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
1795 DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */
1796 unsigned char DataTransferPageNumber; /* Byte 7 */
1797 DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
1798 DAC960_V2_LogicalDevice_T LogicalDevice; /* Bytes 16-18 */
1799 DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
1800 unsigned char RequestSenseSize; /* Byte 20 */
1801 unsigned char IOCTL_Opcode; /* Byte 21 */
1802 union {
1803 DAC960_V2_LogicalDeviceState_T LogicalDeviceState;
1804 DAC960_V2_PhysicalDeviceState_T PhysicalDeviceState;
1805 } DeviceState; /* Byte 22 */
1806 unsigned char Reserved[9]; /* Bytes 23-31 */
1807 DAC960_V2_DataTransferMemoryAddress_T
1808 DataTransferMemoryAddress; /* Bytes 32-63 */
1809 } SetDeviceState;
1810 struct {
1811 DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
1812 DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
1813 DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
1814 DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */
1815 unsigned char DataTransferPageNumber; /* Byte 7 */
1816 DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
1817 DAC960_V2_LogicalDevice_T LogicalDevice; /* Bytes 16-18 */
1818 DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
1819 unsigned char RequestSenseSize; /* Byte 20 */
1820 unsigned char IOCTL_Opcode; /* Byte 21 */
1821 bool RestoreConsistency:1; /* Byte 22 Bit 0 */
1822 bool InitializedAreaOnly:1; /* Byte 22 Bit 1 */
1823 unsigned char :6; /* Byte 22 Bits 2-7 */
1824 unsigned char Reserved[9]; /* Bytes 23-31 */
1825 DAC960_V2_DataTransferMemoryAddress_T
1826 DataTransferMemoryAddress; /* Bytes 32-63 */
1827 } ConsistencyCheck;
1828 struct {
1829 DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
1830 DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
1831 DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
1832 unsigned char FirstCommandMailboxSizeKB; /* Byte 4 */
1833 unsigned char FirstStatusMailboxSizeKB; /* Byte 5 */
1834 unsigned char SecondCommandMailboxSizeKB; /* Byte 6 */
1835 unsigned char SecondStatusMailboxSizeKB; /* Byte 7 */
1836 DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
1837 unsigned int :24; /* Bytes 16-18 */
1838 DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
1839 unsigned char RequestSenseSize; /* Byte 20 */
1840 unsigned char IOCTL_Opcode; /* Byte 21 */
1841 unsigned char HealthStatusBufferSizeKB; /* Byte 22 */
1842 unsigned char :8; /* Byte 23 */
1843 DAC960_BusAddress64_T HealthStatusBufferBusAddress; /* Bytes 24-31 */
1844 DAC960_BusAddress64_T FirstCommandMailboxBusAddress; /* Bytes 32-39 */
1845 DAC960_BusAddress64_T FirstStatusMailboxBusAddress; /* Bytes 40-47 */
1846 DAC960_BusAddress64_T SecondCommandMailboxBusAddress; /* Bytes 48-55 */
1847 DAC960_BusAddress64_T SecondStatusMailboxBusAddress; /* Bytes 56-63 */
1848 } SetMemoryMailbox;
1849 struct {
1850 DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
1851 DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
1852 DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
1853 DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */
1854 unsigned char DataTransferPageNumber; /* Byte 7 */
1855 DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
1856 DAC960_V2_PhysicalDevice_T PhysicalDevice; /* Bytes 16-18 */
1857 DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
1858 unsigned char RequestSenseSize; /* Byte 20 */
1859 unsigned char IOCTL_Opcode; /* Byte 21 */
1860 DAC960_V2_OperationDevice_T OperationDevice; /* Byte 22 */
1861 unsigned char Reserved[9]; /* Bytes 23-31 */
1862 DAC960_V2_DataTransferMemoryAddress_T
1863 DataTransferMemoryAddress; /* Bytes 32-63 */
1864 } DeviceOperation;
1865 }
1866 DAC960_V2_CommandMailbox_T;
1867
1868
1869 /*
1870 Define the DAC960 Driver IOCTL requests.
1871 */
1872
1873 #define DAC960_IOCTL_GET_CONTROLLER_COUNT 0xDAC001
1874 #define DAC960_IOCTL_GET_CONTROLLER_INFO 0xDAC002
1875 #define DAC960_IOCTL_V1_EXECUTE_COMMAND 0xDAC003
1876 #define DAC960_IOCTL_V2_EXECUTE_COMMAND 0xDAC004
1877 #define DAC960_IOCTL_V2_GET_HEALTH_STATUS 0xDAC005
1878
1879
1880 /*
1881 Define the DAC960_IOCTL_GET_CONTROLLER_INFO reply structure.
1882 */
1883
1884 typedef struct DAC960_ControllerInfo
1885 {
1886 unsigned char ControllerNumber;
1887 unsigned char FirmwareType;
1888 unsigned char Channels;
1889 unsigned char Targets;
1890 unsigned char PCI_Bus;
1891 unsigned char PCI_Device;
1892 unsigned char PCI_Function;
1893 unsigned char IRQ_Channel;
1894 DAC960_PCI_Address_T PCI_Address;
1895 unsigned char ModelName[20];
1896 unsigned char FirmwareVersion[12];
1897 }
1898 DAC960_ControllerInfo_T;
1899
1900
1901 /*
1902 Define the User Mode DAC960_IOCTL_V1_EXECUTE_COMMAND request structure.
1903 */
1904
1905 typedef struct DAC960_V1_UserCommand
1906 {
1907 unsigned char ControllerNumber;
1908 DAC960_V1_CommandMailbox_T CommandMailbox;
1909 int DataTransferLength;
1910 void __user *DataTransferBuffer;
1911 DAC960_V1_DCDB_T __user *DCDB;
1912 }
1913 DAC960_V1_UserCommand_T;
1914
1915
1916 /*
1917 Define the Kernel Mode DAC960_IOCTL_V1_EXECUTE_COMMAND request structure.
1918 */
1919
1920 typedef struct DAC960_V1_KernelCommand
1921 {
1922 unsigned char ControllerNumber;
1923 DAC960_V1_CommandMailbox_T CommandMailbox;
1924 int DataTransferLength;
1925 void *DataTransferBuffer;
1926 DAC960_V1_DCDB_T *DCDB;
1927 DAC960_V1_CommandStatus_T CommandStatus;
1928 void (*CompletionFunction)(struct DAC960_V1_KernelCommand *);
1929 void *CompletionData;
1930 }
1931 DAC960_V1_KernelCommand_T;
1932
1933
1934 /*
1935 Define the User Mode DAC960_IOCTL_V2_EXECUTE_COMMAND request structure.
1936 */
1937
1938 typedef struct DAC960_V2_UserCommand
1939 {
1940 unsigned char ControllerNumber;
1941 DAC960_V2_CommandMailbox_T CommandMailbox;
1942 int DataTransferLength;
1943 int RequestSenseLength;
1944 void __user *DataTransferBuffer;
1945 void __user *RequestSenseBuffer;
1946 }
1947 DAC960_V2_UserCommand_T;
1948
1949
1950 /*
1951 Define the Kernel Mode DAC960_IOCTL_V2_EXECUTE_COMMAND request structure.
1952 */
1953
1954 typedef struct DAC960_V2_KernelCommand
1955 {
1956 unsigned char ControllerNumber;
1957 DAC960_V2_CommandMailbox_T CommandMailbox;
1958 int DataTransferLength;
1959 int RequestSenseLength;
1960 void *DataTransferBuffer;
1961 void *RequestSenseBuffer;
1962 DAC960_V2_CommandStatus_T CommandStatus;
1963 void (*CompletionFunction)(struct DAC960_V2_KernelCommand *);
1964 void *CompletionData;
1965 }
1966 DAC960_V2_KernelCommand_T;
1967
1968
1969 /*
1970 Define the User Mode DAC960_IOCTL_V2_GET_HEALTH_STATUS request structure.
1971 */
1972
1973 typedef struct DAC960_V2_GetHealthStatus
1974 {
1975 unsigned char ControllerNumber;
1976 DAC960_V2_HealthStatusBuffer_T __user *HealthStatusBuffer;
1977 }
1978 DAC960_V2_GetHealthStatus_T;
1979
1980
1981 /*
1982 Import the Kernel Mode IOCTL interface.
1983 */
1984
1985 extern int DAC960_KernelIOCTL(unsigned int Request, void *Argument);
1986
1987
1988 /*
1989 DAC960_DriverVersion protects the private portion of this file.
1990 */
1991
1992 #ifdef DAC960_DriverVersion
1993
1994
1995 /*
1996 Define the maximum Driver Queue Depth and Controller Queue Depth supported
1997 by DAC960 V1 and V2 Firmware Controllers.
1998 */
1999
2000 #define DAC960_MaxDriverQueueDepth 511
2001 #define DAC960_MaxControllerQueueDepth 512
2002
2003
2004 /*
2005 Define the maximum number of Scatter/Gather Segments supported for any
2006 DAC960 V1 and V2 Firmware controller.
2007 */
2008
2009 #define DAC960_V1_ScatterGatherLimit 33
2010 #define DAC960_V2_ScatterGatherLimit 128
2011
2012
2013 /*
2014 Define the number of Command Mailboxes and Status Mailboxes used by the
2015 DAC960 V1 and V2 Firmware Memory Mailbox Interface.
2016 */
2017
2018 #define DAC960_V1_CommandMailboxCount 256
2019 #define DAC960_V1_StatusMailboxCount 1024
2020 #define DAC960_V2_CommandMailboxCount 512
2021 #define DAC960_V2_StatusMailboxCount 512
2022
2023
2024 /*
2025 Define the DAC960 Controller Monitoring Timer Interval.
2026 */
2027
2028 #define DAC960_MonitoringTimerInterval (10 * HZ)
2029
2030
2031 /*
2032 Define the DAC960 Controller Secondary Monitoring Interval.
2033 */
2034
2035 #define DAC960_SecondaryMonitoringInterval (60 * HZ)
2036
2037
2038 /*
2039 Define the DAC960 Controller Health Status Monitoring Interval.
2040 */
2041
2042 #define DAC960_HealthStatusMonitoringInterval (1 * HZ)
2043
2044
2045 /*
2046 Define the DAC960 Controller Progress Reporting Interval.
2047 */
2048
2049 #define DAC960_ProgressReportingInterval (60 * HZ)
2050
2051
2052 /*
2053 Define the maximum number of Partitions allowed for each Logical Drive.
2054 */
2055
2056 #define DAC960_MaxPartitions 8
2057 #define DAC960_MaxPartitionsBits 3
2058
2059 /*
2060 Define the DAC960 Controller fixed Block Size and Block Size Bits.
2061 */
2062
2063 #define DAC960_BlockSize 512
2064 #define DAC960_BlockSizeBits 9
2065
2066
2067 /*
2068 Define the number of Command structures that should be allocated as a
2069 group to optimize kernel memory allocation.
2070 */
2071
2072 #define DAC960_V1_CommandAllocationGroupSize 11
2073 #define DAC960_V2_CommandAllocationGroupSize 29
2074
2075
2076 /*
2077 Define the Controller Line Buffer, Progress Buffer, User Message, and
2078 Initial Status Buffer sizes.
2079 */
2080
2081 #define DAC960_LineBufferSize 100
2082 #define DAC960_ProgressBufferSize 200
2083 #define DAC960_UserMessageSize 200
2084 #define DAC960_InitialStatusBufferSize (8192-32)
2085
2086
2087 /*
2088 Define the DAC960 Controller Firmware Types.
2089 */
2090
2091 typedef enum
2092 {
2093 DAC960_V1_Controller = 1,
2094 DAC960_V2_Controller = 2
2095 }
2096 DAC960_FirmwareType_T;
2097
2098
2099 /*
2100 Define the DAC960 Controller Hardware Types.
2101 */
2102
2103 typedef enum
2104 {
2105 DAC960_BA_Controller = 1, /* eXtremeRAID 2000 */
2106 DAC960_LP_Controller = 2, /* AcceleRAID 352 */
2107 DAC960_LA_Controller = 3, /* DAC1164P */
2108 DAC960_PG_Controller = 4, /* DAC960PTL/PJ/PG */
2109 DAC960_PD_Controller = 5, /* DAC960PU/PD/PL/P */
2110 DAC960_P_Controller = 6, /* DAC960PU/PD/PL/P */
2111 DAC960_GEM_Controller = 7, /* AcceleRAID 4/5/600 */
2112 }
2113 DAC960_HardwareType_T;
2114
2115
2116 /*
2117 Define the Driver Message Levels.
2118 */
2119
2120 typedef enum DAC960_MessageLevel
2121 {
2122 DAC960_AnnounceLevel = 0,
2123 DAC960_InfoLevel = 1,
2124 DAC960_NoticeLevel = 2,
2125 DAC960_WarningLevel = 3,
2126 DAC960_ErrorLevel = 4,
2127 DAC960_ProgressLevel = 5,
2128 DAC960_CriticalLevel = 6,
2129 DAC960_UserCriticalLevel = 7
2130 }
2131 DAC960_MessageLevel_T;
2132
2133 static char
2134 *DAC960_MessageLevelMap[] =
2135 { KERN_NOTICE, KERN_NOTICE, KERN_NOTICE, KERN_WARNING,
2136 KERN_ERR, KERN_CRIT, KERN_CRIT, KERN_CRIT };
2137
2138
2139 /*
2140 Define Driver Message macros.
2141 */
2142
2143 #define DAC960_Announce(Format, Arguments...) \
2144 DAC960_Message(DAC960_AnnounceLevel, Format, ##Arguments)
2145
2146 #define DAC960_Info(Format, Arguments...) \
2147 DAC960_Message(DAC960_InfoLevel, Format, ##Arguments)
2148
2149 #define DAC960_Notice(Format, Arguments...) \
2150 DAC960_Message(DAC960_NoticeLevel, Format, ##Arguments)
2151
2152 #define DAC960_Warning(Format, Arguments...) \
2153 DAC960_Message(DAC960_WarningLevel, Format, ##Arguments)
2154
2155 #define DAC960_Error(Format, Arguments...) \
2156 DAC960_Message(DAC960_ErrorLevel, Format, ##Arguments)
2157
2158 #define DAC960_Progress(Format, Arguments...) \
2159 DAC960_Message(DAC960_ProgressLevel, Format, ##Arguments)
2160
2161 #define DAC960_Critical(Format, Arguments...) \
2162 DAC960_Message(DAC960_CriticalLevel, Format, ##Arguments)
2163
2164 #define DAC960_UserCritical(Format, Arguments...) \
2165 DAC960_Message(DAC960_UserCriticalLevel, Format, ##Arguments)
2166
2167
2168 struct DAC960_privdata {
2169 DAC960_HardwareType_T HardwareType;
2170 DAC960_FirmwareType_T FirmwareType;
2171 irq_handler_t InterruptHandler;
2172 unsigned int MemoryWindowSize;
2173 };
2174
2175
2176 /*
2177 Define the DAC960 V1 Firmware Controller Status Mailbox structure.
2178 */
2179
2180 typedef union DAC960_V1_StatusMailbox
2181 {
2182 unsigned int Word; /* Word 0 */
2183 struct {
2184 DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 0 */
2185 unsigned char :7; /* Byte 1 Bits 0-6 */
2186 bool Valid:1; /* Byte 1 Bit 7 */
2187 DAC960_V1_CommandStatus_T CommandStatus; /* Bytes 2-3 */
2188 } Fields;
2189 }
2190 DAC960_V1_StatusMailbox_T;
2191
2192
2193 /*
2194 Define the DAC960 V2 Firmware Controller Status Mailbox structure.
2195 */
2196
2197 typedef union DAC960_V2_StatusMailbox
2198 {
2199 unsigned int Words[2]; /* Words 0-1 */
2200 struct {
2201 DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
2202 DAC960_V2_CommandStatus_T CommandStatus; /* Byte 2 */
2203 unsigned char RequestSenseLength; /* Byte 3 */
2204 int DataTransferResidue; /* Bytes 4-7 */
2205 } Fields;
2206 }
2207 DAC960_V2_StatusMailbox_T;
2208
2209
2210 /*
2211 Define the DAC960 Driver Command Types.
2212 */
2213
2214 typedef enum
2215 {
2216 DAC960_ReadCommand = 1,
2217 DAC960_WriteCommand = 2,
2218 DAC960_ReadRetryCommand = 3,
2219 DAC960_WriteRetryCommand = 4,
2220 DAC960_MonitoringCommand = 5,
2221 DAC960_ImmediateCommand = 6,
2222 DAC960_QueuedCommand = 7
2223 }
2224 DAC960_CommandType_T;
2225
2226
2227 /*
2228 Define the DAC960 Driver Command structure.
2229 */
2230
2231 typedef struct DAC960_Command
2232 {
2233 int CommandIdentifier;
2234 DAC960_CommandType_T CommandType;
2235 struct DAC960_Controller *Controller;
2236 struct DAC960_Command *Next;
2237 struct completion *Completion;
2238 unsigned int LogicalDriveNumber;
2239 unsigned int BlockNumber;
2240 unsigned int BlockCount;
2241 unsigned int SegmentCount;
2242 int DmaDirection;
2243 struct scatterlist *cmd_sglist;
2244 struct request *Request;
2245 union {
2246 struct {
2247 DAC960_V1_CommandMailbox_T CommandMailbox;
2248 DAC960_V1_KernelCommand_T *KernelCommand;
2249 DAC960_V1_CommandStatus_T CommandStatus;
2250 DAC960_V1_ScatterGatherSegment_T *ScatterGatherList;
2251 dma_addr_t ScatterGatherListDMA;
2252 struct scatterlist ScatterList[DAC960_V1_ScatterGatherLimit];
2253 unsigned int EndMarker[0];
2254 } V1;
2255 struct {
2256 DAC960_V2_CommandMailbox_T CommandMailbox;
2257 DAC960_V2_KernelCommand_T *KernelCommand;
2258 DAC960_V2_CommandStatus_T CommandStatus;
2259 unsigned char RequestSenseLength;
2260 int DataTransferResidue;
2261 DAC960_V2_ScatterGatherSegment_T *ScatterGatherList;
2262 dma_addr_t ScatterGatherListDMA;
2263 DAC960_SCSI_RequestSense_T *RequestSense;
2264 dma_addr_t RequestSenseDMA;
2265 struct scatterlist ScatterList[DAC960_V2_ScatterGatherLimit];
2266 unsigned int EndMarker[0];
2267 } V2;
2268 } FW;
2269 }
2270 DAC960_Command_T;
2271
2272
2273 /*
2274 Define the DAC960 Driver Controller structure.
2275 */
2276
2277 typedef struct DAC960_Controller
2278 {
2279 void __iomem *BaseAddress;
2280 void __iomem *MemoryMappedAddress;
2281 DAC960_FirmwareType_T FirmwareType;
2282 DAC960_HardwareType_T HardwareType;
2283 DAC960_IO_Address_T IO_Address;
2284 DAC960_PCI_Address_T PCI_Address;
2285 struct pci_dev *PCIDevice;
2286 unsigned char ControllerNumber;
2287 unsigned char ControllerName[4];
2288 unsigned char ModelName[20];
2289 unsigned char FullModelName[28];
2290 unsigned char FirmwareVersion[12];
2291 unsigned char Bus;
2292 unsigned char Device;
2293 unsigned char Function;
2294 unsigned char IRQ_Channel;
2295 unsigned char Channels;
2296 unsigned char Targets;
2297 unsigned char MemorySize;
2298 unsigned char LogicalDriveCount;
2299 unsigned short CommandAllocationGroupSize;
2300 unsigned short ControllerQueueDepth;
2301 unsigned short DriverQueueDepth;
2302 unsigned short MaxBlocksPerCommand;
2303 unsigned short ControllerScatterGatherLimit;
2304 unsigned short DriverScatterGatherLimit;
2305 u64 BounceBufferLimit;
2306 unsigned int CombinedStatusBufferLength;
2307 unsigned int InitialStatusLength;
2308 unsigned int CurrentStatusLength;
2309 unsigned int ProgressBufferLength;
2310 unsigned int UserStatusLength;
2311 struct dma_loaf DmaPages;
2312 unsigned long MonitoringTimerCount;
2313 unsigned long PrimaryMonitoringTime;
2314 unsigned long SecondaryMonitoringTime;
2315 unsigned long ShutdownMonitoringTimer;
2316 unsigned long LastProgressReportTime;
2317 unsigned long LastCurrentStatusTime;
2318 bool ControllerInitialized;
2319 bool MonitoringCommandDeferred;
2320 bool EphemeralProgressMessage;
2321 bool DriveSpinUpMessageDisplayed;
2322 bool MonitoringAlertMode;
2323 bool SuppressEnclosureMessages;
2324 struct timer_list MonitoringTimer;
2325 struct gendisk *disks[DAC960_MaxLogicalDrives];
2326 struct pci_pool *ScatterGatherPool;
2327 DAC960_Command_T *FreeCommands;
2328 unsigned char *CombinedStatusBuffer;
2329 unsigned char *CurrentStatusBuffer;
2330 struct request_queue *RequestQueue[DAC960_MaxLogicalDrives];
2331 int req_q_index;
2332 spinlock_t queue_lock;
2333 wait_queue_head_t CommandWaitQueue;
2334 wait_queue_head_t HealthStatusWaitQueue;
2335 DAC960_Command_T InitialCommand;
2336 DAC960_Command_T *Commands[DAC960_MaxDriverQueueDepth];
2337 struct proc_dir_entry *ControllerProcEntry;
2338 bool LogicalDriveInitiallyAccessible[DAC960_MaxLogicalDrives];
2339 void (*QueueCommand)(DAC960_Command_T *Command);
2340 bool (*ReadControllerConfiguration)(struct DAC960_Controller *);
2341 bool (*ReadDeviceConfiguration)(struct DAC960_Controller *);
2342 bool (*ReportDeviceConfiguration)(struct DAC960_Controller *);
2343 void (*QueueReadWriteCommand)(DAC960_Command_T *Command);
2344 union {
2345 struct {
2346 unsigned char GeometryTranslationHeads;
2347 unsigned char GeometryTranslationSectors;
2348 unsigned char PendingRebuildFlag;
2349 unsigned short StripeSize;
2350 unsigned short SegmentSize;
2351 unsigned short NewEventLogSequenceNumber;
2352 unsigned short OldEventLogSequenceNumber;
2353 unsigned short DeviceStateChannel;
2354 unsigned short DeviceStateTargetID;
2355 bool DualModeMemoryMailboxInterface;
2356 bool BackgroundInitializationStatusSupported;
2357 bool SAFTE_EnclosureManagementEnabled;
2358 bool NeedLogicalDriveInformation;
2359 bool NeedErrorTableInformation;
2360 bool NeedDeviceStateInformation;
2361 bool NeedDeviceInquiryInformation;
2362 bool NeedDeviceSerialNumberInformation;
2363 bool NeedRebuildProgress;
2364 bool NeedConsistencyCheckProgress;
2365 bool NeedBackgroundInitializationStatus;
2366 bool StartDeviceStateScan;
2367 bool RebuildProgressFirst;
2368 bool RebuildFlagPending;
2369 bool RebuildStatusPending;
2370
2371 dma_addr_t FirstCommandMailboxDMA;
2372 DAC960_V1_CommandMailbox_T *FirstCommandMailbox;
2373 DAC960_V1_CommandMailbox_T *LastCommandMailbox;
2374 DAC960_V1_CommandMailbox_T *NextCommandMailbox;
2375 DAC960_V1_CommandMailbox_T *PreviousCommandMailbox1;
2376 DAC960_V1_CommandMailbox_T *PreviousCommandMailbox2;
2377
2378 dma_addr_t FirstStatusMailboxDMA;
2379 DAC960_V1_StatusMailbox_T *FirstStatusMailbox;
2380 DAC960_V1_StatusMailbox_T *LastStatusMailbox;
2381 DAC960_V1_StatusMailbox_T *NextStatusMailbox;
2382
2383 DAC960_V1_DCDB_T *MonitoringDCDB;
2384 dma_addr_t MonitoringDCDB_DMA;
2385
2386 DAC960_V1_Enquiry_T Enquiry;
2387 DAC960_V1_Enquiry_T *NewEnquiry;
2388 dma_addr_t NewEnquiryDMA;
2389
2390 DAC960_V1_ErrorTable_T ErrorTable;
2391 DAC960_V1_ErrorTable_T *NewErrorTable;
2392 dma_addr_t NewErrorTableDMA;
2393
2394 DAC960_V1_EventLogEntry_T *EventLogEntry;
2395 dma_addr_t EventLogEntryDMA;
2396
2397 DAC960_V1_RebuildProgress_T *RebuildProgress;
2398 dma_addr_t RebuildProgressDMA;
2399 DAC960_V1_CommandStatus_T LastRebuildStatus;
2400 DAC960_V1_CommandStatus_T PendingRebuildStatus;
2401
2402 DAC960_V1_LogicalDriveInformationArray_T LogicalDriveInformation;
2403 DAC960_V1_LogicalDriveInformationArray_T *NewLogicalDriveInformation;
2404 dma_addr_t NewLogicalDriveInformationDMA;
2405
2406 DAC960_V1_BackgroundInitializationStatus_T
2407 *BackgroundInitializationStatus;
2408 dma_addr_t BackgroundInitializationStatusDMA;
2409 DAC960_V1_BackgroundInitializationStatus_T
2410 LastBackgroundInitializationStatus;
2411
2412 DAC960_V1_DeviceState_T
2413 DeviceState[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets];
2414 DAC960_V1_DeviceState_T *NewDeviceState;
2415 dma_addr_t NewDeviceStateDMA;
2416
2417 DAC960_SCSI_Inquiry_T
2418 InquiryStandardData[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets];
2419 DAC960_SCSI_Inquiry_T *NewInquiryStandardData;
2420 dma_addr_t NewInquiryStandardDataDMA;
2421
2422 DAC960_SCSI_Inquiry_UnitSerialNumber_T
2423 InquiryUnitSerialNumber[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets];
2424 DAC960_SCSI_Inquiry_UnitSerialNumber_T *NewInquiryUnitSerialNumber;
2425 dma_addr_t NewInquiryUnitSerialNumberDMA;
2426
2427 int DeviceResetCount[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets];
2428 bool DirectCommandActive[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets];
2429 } V1;
2430 struct {
2431 unsigned int StatusChangeCounter;
2432 unsigned int NextEventSequenceNumber;
2433 unsigned int PhysicalDeviceIndex;
2434 bool NeedLogicalDeviceInformation;
2435 bool NeedPhysicalDeviceInformation;
2436 bool NeedDeviceSerialNumberInformation;
2437 bool StartLogicalDeviceInformationScan;
2438 bool StartPhysicalDeviceInformationScan;
2439 struct pci_pool *RequestSensePool;
2440
2441 dma_addr_t FirstCommandMailboxDMA;
2442 DAC960_V2_CommandMailbox_T *FirstCommandMailbox;
2443 DAC960_V2_CommandMailbox_T *LastCommandMailbox;
2444 DAC960_V2_CommandMailbox_T *NextCommandMailbox;
2445 DAC960_V2_CommandMailbox_T *PreviousCommandMailbox1;
2446 DAC960_V2_CommandMailbox_T *PreviousCommandMailbox2;
2447
2448 dma_addr_t FirstStatusMailboxDMA;
2449 DAC960_V2_StatusMailbox_T *FirstStatusMailbox;
2450 DAC960_V2_StatusMailbox_T *LastStatusMailbox;
2451 DAC960_V2_StatusMailbox_T *NextStatusMailbox;
2452
2453 dma_addr_t HealthStatusBufferDMA;
2454 DAC960_V2_HealthStatusBuffer_T *HealthStatusBuffer;
2455
2456 DAC960_V2_ControllerInfo_T ControllerInformation;
2457 DAC960_V2_ControllerInfo_T *NewControllerInformation;
2458 dma_addr_t NewControllerInformationDMA;
2459
2460 DAC960_V2_LogicalDeviceInfo_T
2461 *LogicalDeviceInformation[DAC960_MaxLogicalDrives];
2462 DAC960_V2_LogicalDeviceInfo_T *NewLogicalDeviceInformation;
2463 dma_addr_t NewLogicalDeviceInformationDMA;
2464
2465 DAC960_V2_PhysicalDeviceInfo_T
2466 *PhysicalDeviceInformation[DAC960_V2_MaxPhysicalDevices];
2467 DAC960_V2_PhysicalDeviceInfo_T *NewPhysicalDeviceInformation;
2468 dma_addr_t NewPhysicalDeviceInformationDMA;
2469
2470 DAC960_SCSI_Inquiry_UnitSerialNumber_T *NewInquiryUnitSerialNumber;
2471 dma_addr_t NewInquiryUnitSerialNumberDMA;
2472 DAC960_SCSI_Inquiry_UnitSerialNumber_T
2473 *InquiryUnitSerialNumber[DAC960_V2_MaxPhysicalDevices];
2474
2475 DAC960_V2_Event_T *Event;
2476 dma_addr_t EventDMA;
2477
2478 DAC960_V2_PhysicalToLogicalDevice_T *PhysicalToLogicalDevice;
2479 dma_addr_t PhysicalToLogicalDeviceDMA;
2480
2481 DAC960_V2_PhysicalDevice_T
2482 LogicalDriveToVirtualDevice[DAC960_MaxLogicalDrives];
2483 bool LogicalDriveFoundDuringScan[DAC960_MaxLogicalDrives];
2484 } V2;
2485 } FW;
2486 unsigned char ProgressBuffer[DAC960_ProgressBufferSize];
2487 unsigned char UserStatusBuffer[DAC960_UserMessageSize];
2488 }
2489 DAC960_Controller_T;
2490
2491
2492 /*
2493 Simplify access to Firmware Version Dependent Data Structure Components
2494 and Functions.
2495 */
2496
2497 #define V1 FW.V1
2498 #define V2 FW.V2
2499 #define DAC960_QueueCommand(Command) \
2500 (Controller->QueueCommand)(Command)
2501 #define DAC960_ReadControllerConfiguration(Controller) \
2502 (Controller->ReadControllerConfiguration)(Controller)
2503 #define DAC960_ReadDeviceConfiguration(Controller) \
2504 (Controller->ReadDeviceConfiguration)(Controller)
2505 #define DAC960_ReportDeviceConfiguration(Controller) \
2506 (Controller->ReportDeviceConfiguration)(Controller)
2507 #define DAC960_QueueReadWriteCommand(Command) \
2508 (Controller->QueueReadWriteCommand)(Command)
2509
2510 /*
2511 * dma_addr_writeql is provided to write dma_addr_t types
2512 * to a 64-bit pci address space register. The controller
2513 * will accept having the register written as two 32-bit
2514 * values.
2515 *
2516 * In HIGHMEM kernels, dma_addr_t is a 64-bit value.
2517 * without HIGHMEM, dma_addr_t is a 32-bit value.
2518 *
2519 * The compiler should always fix up the assignment
2520 * to u.wq appropriately, depending upon the size of
2521 * dma_addr_t.
2522 */
2523 static inline
2524 void dma_addr_writeql(dma_addr_t addr, void __iomem *write_address)
2525 {
2526 union {
2527 u64 wq;
2528 uint wl[2];
2529 } u;
2530
2531 u.wq = addr;
2532
2533 writel(u.wl[0], write_address);
2534 writel(u.wl[1], write_address + 4);
2535 }
2536
2537 /*
2538 Define the DAC960 GEM Series Controller Interface Register Offsets.
2539 */
2540
2541 #define DAC960_GEM_RegisterWindowSize 0x600
2542
2543 typedef enum
2544 {
2545 DAC960_GEM_InboundDoorBellRegisterReadSetOffset = 0x214,
2546 DAC960_GEM_InboundDoorBellRegisterClearOffset = 0x218,
2547 DAC960_GEM_OutboundDoorBellRegisterReadSetOffset = 0x224,
2548 DAC960_GEM_OutboundDoorBellRegisterClearOffset = 0x228,
2549 DAC960_GEM_InterruptStatusRegisterOffset = 0x208,
2550 DAC960_GEM_InterruptMaskRegisterReadSetOffset = 0x22C,
2551 DAC960_GEM_InterruptMaskRegisterClearOffset = 0x230,
2552 DAC960_GEM_CommandMailboxBusAddressOffset = 0x510,
2553 DAC960_GEM_CommandStatusOffset = 0x518,
2554 DAC960_GEM_ErrorStatusRegisterReadSetOffset = 0x224,
2555 DAC960_GEM_ErrorStatusRegisterClearOffset = 0x228,
2556 }
2557 DAC960_GEM_RegisterOffsets_T;
2558
2559 /*
2560 Define the structure of the DAC960 GEM Series Inbound Door Bell
2561 */
2562
2563 typedef union DAC960_GEM_InboundDoorBellRegister
2564 {
2565 unsigned int All;
2566 struct {
2567 unsigned int :24;
2568 bool HardwareMailboxNewCommand:1;
2569 bool AcknowledgeHardwareMailboxStatus:1;
2570 bool GenerateInterrupt:1;
2571 bool ControllerReset:1;
2572 bool MemoryMailboxNewCommand:1;
2573 unsigned int :3;
2574 } Write;
2575 struct {
2576 unsigned int :24;
2577 bool HardwareMailboxFull:1;
2578 bool InitializationInProgress:1;
2579 unsigned int :6;
2580 } Read;
2581 }
2582 DAC960_GEM_InboundDoorBellRegister_T;
2583
2584 /*
2585 Define the structure of the DAC960 GEM Series Outbound Door Bell Register.
2586 */
2587 typedef union DAC960_GEM_OutboundDoorBellRegister
2588 {
2589 unsigned int All;
2590 struct {
2591 unsigned int :24;
2592 bool AcknowledgeHardwareMailboxInterrupt:1;
2593 bool AcknowledgeMemoryMailboxInterrupt:1;
2594 unsigned int :6;
2595 } Write;
2596 struct {
2597 unsigned int :24;
2598 bool HardwareMailboxStatusAvailable:1;
2599 bool MemoryMailboxStatusAvailable:1;
2600 unsigned int :6;
2601 } Read;
2602 }
2603 DAC960_GEM_OutboundDoorBellRegister_T;
2604
2605 /*
2606 Define the structure of the DAC960 GEM Series Interrupt Mask Register.
2607 */
2608 typedef union DAC960_GEM_InterruptMaskRegister
2609 {
2610 unsigned int All;
2611 struct {
2612 unsigned int :16;
2613 unsigned int :8;
2614 unsigned int HardwareMailboxInterrupt:1;
2615 unsigned int MemoryMailboxInterrupt:1;
2616 unsigned int :6;
2617 } Bits;
2618 }
2619 DAC960_GEM_InterruptMaskRegister_T;
2620
2621 /*
2622 Define the structure of the DAC960 GEM Series Error Status Register.
2623 */
2624
2625 typedef union DAC960_GEM_ErrorStatusRegister
2626 {
2627 unsigned int All;
2628 struct {
2629 unsigned int :24;
2630 unsigned int :5;
2631 bool ErrorStatusPending:1;
2632 unsigned int :2;
2633 } Bits;
2634 }
2635 DAC960_GEM_ErrorStatusRegister_T;
2636
2637 /*
2638 Define inline functions to provide an abstraction for reading and writing the
2639 DAC960 GEM Series Controller Interface Registers.
2640 */
2641
2642 static inline
2643 void DAC960_GEM_HardwareMailboxNewCommand(void __iomem *ControllerBaseAddress)
2644 {
2645 DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
2646 InboundDoorBellRegister.All = 0;
2647 InboundDoorBellRegister.Write.HardwareMailboxNewCommand = true;
2648 writel(InboundDoorBellRegister.All,
2649 ControllerBaseAddress + DAC960_GEM_InboundDoorBellRegisterReadSetOffset);
2650 }
2651
2652 static inline
2653 void DAC960_GEM_AcknowledgeHardwareMailboxStatus(void __iomem *ControllerBaseAddress)
2654 {
2655 DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
2656 InboundDoorBellRegister.All = 0;
2657 InboundDoorBellRegister.Write.AcknowledgeHardwareMailboxStatus = true;
2658 writel(InboundDoorBellRegister.All,
2659 ControllerBaseAddress + DAC960_GEM_InboundDoorBellRegisterClearOffset);
2660 }
2661
2662 static inline
2663 void DAC960_GEM_GenerateInterrupt(void __iomem *ControllerBaseAddress)
2664 {
2665 DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
2666 InboundDoorBellRegister.All = 0;
2667 InboundDoorBellRegister.Write.GenerateInterrupt = true;
2668 writel(InboundDoorBellRegister.All,
2669 ControllerBaseAddress + DAC960_GEM_InboundDoorBellRegisterReadSetOffset);
2670 }
2671
2672 static inline
2673 void DAC960_GEM_ControllerReset(void __iomem *ControllerBaseAddress)
2674 {
2675 DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
2676 InboundDoorBellRegister.All = 0;
2677 InboundDoorBellRegister.Write.ControllerReset = true;
2678 writel(InboundDoorBellRegister.All,
2679 ControllerBaseAddress + DAC960_GEM_InboundDoorBellRegisterReadSetOffset);
2680 }
2681
2682 static inline
2683 void DAC960_GEM_MemoryMailboxNewCommand(void __iomem *ControllerBaseAddress)
2684 {
2685 DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
2686 InboundDoorBellRegister.All = 0;
2687 InboundDoorBellRegister.Write.MemoryMailboxNewCommand = true;
2688 writel(InboundDoorBellRegister.All,
2689 ControllerBaseAddress + DAC960_GEM_InboundDoorBellRegisterReadSetOffset);
2690 }
2691
2692 static inline
2693 bool DAC960_GEM_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
2694 {
2695 DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
2696 InboundDoorBellRegister.All =
2697 readl(ControllerBaseAddress +
2698 DAC960_GEM_InboundDoorBellRegisterReadSetOffset);
2699 return InboundDoorBellRegister.Read.HardwareMailboxFull;
2700 }
2701
2702 static inline
2703 bool DAC960_GEM_InitializationInProgressP(void __iomem *ControllerBaseAddress)
2704 {
2705 DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
2706 InboundDoorBellRegister.All =
2707 readl(ControllerBaseAddress +
2708 DAC960_GEM_InboundDoorBellRegisterReadSetOffset);
2709 return InboundDoorBellRegister.Read.InitializationInProgress;
2710 }
2711
2712 static inline
2713 void DAC960_GEM_AcknowledgeHardwareMailboxInterrupt(void __iomem *ControllerBaseAddress)
2714 {
2715 DAC960_GEM_OutboundDoorBellRegister_T OutboundDoorBellRegister;
2716 OutboundDoorBellRegister.All = 0;
2717 OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
2718 writel(OutboundDoorBellRegister.All,
2719 ControllerBaseAddress + DAC960_GEM_OutboundDoorBellRegisterClearOffset);
2720 }
2721
2722 static inline
2723 void DAC960_GEM_AcknowledgeMemoryMailboxInterrupt(void __iomem *ControllerBaseAddress)
2724 {
2725 DAC960_GEM_OutboundDoorBellRegister_T OutboundDoorBellRegister;
2726 OutboundDoorBellRegister.All = 0;
2727 OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
2728 writel(OutboundDoorBellRegister.All,
2729 ControllerBaseAddress + DAC960_GEM_OutboundDoorBellRegisterClearOffset);
2730 }
2731
2732 static inline
2733 void DAC960_GEM_AcknowledgeInterrupt(void __iomem *ControllerBaseAddress)
2734 {
2735 DAC960_GEM_OutboundDoorBellRegister_T OutboundDoorBellRegister;
2736 OutboundDoorBellRegister.All = 0;
2737 OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
2738 OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
2739 writel(OutboundDoorBellRegister.All,
2740 ControllerBaseAddress + DAC960_GEM_OutboundDoorBellRegisterClearOffset);
2741 }
2742
2743 static inline
2744 bool DAC960_GEM_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
2745 {
2746 DAC960_GEM_OutboundDoorBellRegister_T OutboundDoorBellRegister;
2747 OutboundDoorBellRegister.All =
2748 readl(ControllerBaseAddress +
2749 DAC960_GEM_OutboundDoorBellRegisterReadSetOffset);
2750 return OutboundDoorBellRegister.Read.HardwareMailboxStatusAvailable;
2751 }
2752
2753 static inline
2754 bool DAC960_GEM_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
2755 {
2756 DAC960_GEM_OutboundDoorBellRegister_T OutboundDoorBellRegister;
2757 OutboundDoorBellRegister.All =
2758 readl(ControllerBaseAddress +
2759 DAC960_GEM_OutboundDoorBellRegisterReadSetOffset);
2760 return OutboundDoorBellRegister.Read.MemoryMailboxStatusAvailable;
2761 }
2762
2763 static inline
2764 void DAC960_GEM_EnableInterrupts(void __iomem *ControllerBaseAddress)
2765 {
2766 DAC960_GEM_InterruptMaskRegister_T InterruptMaskRegister;
2767 InterruptMaskRegister.All = 0;
2768 InterruptMaskRegister.Bits.HardwareMailboxInterrupt = true;
2769 InterruptMaskRegister.Bits.MemoryMailboxInterrupt = true;
2770 writel(InterruptMaskRegister.All,
2771 ControllerBaseAddress + DAC960_GEM_InterruptMaskRegisterClearOffset);
2772 }
2773
2774 static inline
2775 void DAC960_GEM_DisableInterrupts(void __iomem *ControllerBaseAddress)
2776 {
2777 DAC960_GEM_InterruptMaskRegister_T InterruptMaskRegister;
2778 InterruptMaskRegister.All = 0;
2779 InterruptMaskRegister.Bits.HardwareMailboxInterrupt = true;
2780 InterruptMaskRegister.Bits.MemoryMailboxInterrupt = true;
2781 writel(InterruptMaskRegister.All,
2782 ControllerBaseAddress + DAC960_GEM_InterruptMaskRegisterReadSetOffset);
2783 }
2784
2785 static inline
2786 bool DAC960_GEM_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
2787 {
2788 DAC960_GEM_InterruptMaskRegister_T InterruptMaskRegister;
2789 InterruptMaskRegister.All =
2790 readl(ControllerBaseAddress +
2791 DAC960_GEM_InterruptMaskRegisterReadSetOffset);
2792 return !(InterruptMaskRegister.Bits.HardwareMailboxInterrupt ||
2793 InterruptMaskRegister.Bits.MemoryMailboxInterrupt);
2794 }
2795
2796 static inline
2797 void DAC960_GEM_WriteCommandMailbox(DAC960_V2_CommandMailbox_T
2798 *MemoryCommandMailbox,
2799 DAC960_V2_CommandMailbox_T
2800 *CommandMailbox)
2801 {
2802 memcpy(&MemoryCommandMailbox->Words[1], &CommandMailbox->Words[1],
2803 sizeof(DAC960_V2_CommandMailbox_T) - sizeof(unsigned int));
2804 wmb();
2805 MemoryCommandMailbox->Words[0] = CommandMailbox->Words[0];
2806 mb();
2807 }
2808
2809 static inline
2810 void DAC960_GEM_WriteHardwareMailbox(void __iomem *ControllerBaseAddress,
2811 dma_addr_t CommandMailboxDMA)
2812 {
2813 dma_addr_writeql(CommandMailboxDMA,
2814 ControllerBaseAddress +
2815 DAC960_GEM_CommandMailboxBusAddressOffset);
2816 }
2817
2818 static inline DAC960_V2_CommandIdentifier_T
2819 DAC960_GEM_ReadCommandIdentifier(void __iomem *ControllerBaseAddress)
2820 {
2821 return readw(ControllerBaseAddress + DAC960_GEM_CommandStatusOffset);
2822 }
2823
2824 static inline DAC960_V2_CommandStatus_T
2825 DAC960_GEM_ReadCommandStatus(void __iomem *ControllerBaseAddress)
2826 {
2827 return readw(ControllerBaseAddress + DAC960_GEM_CommandStatusOffset + 2);
2828 }
2829
2830 static inline bool
2831 DAC960_GEM_ReadErrorStatus(void __iomem *ControllerBaseAddress,
2832 unsigned char *ErrorStatus,
2833 unsigned char *Parameter0,
2834 unsigned char *Parameter1)
2835 {
2836 DAC960_GEM_ErrorStatusRegister_T ErrorStatusRegister;
2837 ErrorStatusRegister.All =
2838 readl(ControllerBaseAddress + DAC960_GEM_ErrorStatusRegisterReadSetOffset);
2839 if (!ErrorStatusRegister.Bits.ErrorStatusPending) return false;
2840 ErrorStatusRegister.Bits.ErrorStatusPending = false;
2841 *ErrorStatus = ErrorStatusRegister.All;
2842 *Parameter0 =
2843 readb(ControllerBaseAddress + DAC960_GEM_CommandMailboxBusAddressOffset + 0);
2844 *Parameter1 =
2845 readb(ControllerBaseAddress + DAC960_GEM_CommandMailboxBusAddressOffset + 1);
2846 writel(0x03000000, ControllerBaseAddress +
2847 DAC960_GEM_ErrorStatusRegisterClearOffset);
2848 return true;
2849 }
2850
2851 /*
2852 Define the DAC960 BA Series Controller Interface Register Offsets.
2853 */
2854
2855 #define DAC960_BA_RegisterWindowSize 0x80
2856
2857 typedef enum
2858 {
2859 DAC960_BA_InboundDoorBellRegisterOffset = 0x60,
2860 DAC960_BA_OutboundDoorBellRegisterOffset = 0x61,
2861 DAC960_BA_InterruptStatusRegisterOffset = 0x30,
2862 DAC960_BA_InterruptMaskRegisterOffset = 0x34,
2863 DAC960_BA_CommandMailboxBusAddressOffset = 0x50,
2864 DAC960_BA_CommandStatusOffset = 0x58,
2865 DAC960_BA_ErrorStatusRegisterOffset = 0x63
2866 }
2867 DAC960_BA_RegisterOffsets_T;
2868
2869
2870 /*
2871 Define the structure of the DAC960 BA Series Inbound Door Bell Register.
2872 */
2873
2874 typedef union DAC960_BA_InboundDoorBellRegister
2875 {
2876 unsigned char All;
2877 struct {
2878 bool HardwareMailboxNewCommand:1; /* Bit 0 */
2879 bool AcknowledgeHardwareMailboxStatus:1; /* Bit 1 */
2880 bool GenerateInterrupt:1; /* Bit 2 */
2881 bool ControllerReset:1; /* Bit 3 */
2882 bool MemoryMailboxNewCommand:1; /* Bit 4 */
2883 unsigned char :3; /* Bits 5-7 */
2884 } Write;
2885 struct {
2886 bool HardwareMailboxEmpty:1; /* Bit 0 */
2887 bool InitializationNotInProgress:1; /* Bit 1 */
2888 unsigned char :6; /* Bits 2-7 */
2889 } Read;
2890 }
2891 DAC960_BA_InboundDoorBellRegister_T;
2892
2893
2894 /*
2895 Define the structure of the DAC960 BA Series Outbound Door Bell Register.
2896 */
2897
2898 typedef union DAC960_BA_OutboundDoorBellRegister
2899 {
2900 unsigned char All;
2901 struct {
2902 bool AcknowledgeHardwareMailboxInterrupt:1; /* Bit 0 */
2903 bool AcknowledgeMemoryMailboxInterrupt:1; /* Bit 1 */
2904 unsigned char :6; /* Bits 2-7 */
2905 } Write;
2906 struct {
2907 bool HardwareMailboxStatusAvailable:1; /* Bit 0 */
2908 bool MemoryMailboxStatusAvailable:1; /* Bit 1 */
2909 unsigned char :6; /* Bits 2-7 */
2910 } Read;
2911 }
2912 DAC960_BA_OutboundDoorBellRegister_T;
2913
2914
2915 /*
2916 Define the structure of the DAC960 BA Series Interrupt Mask Register.
2917 */
2918
2919 typedef union DAC960_BA_InterruptMaskRegister
2920 {
2921 unsigned char All;
2922 struct {
2923 unsigned int :2; /* Bits 0-1 */
2924 bool DisableInterrupts:1; /* Bit 2 */
2925 bool DisableInterruptsI2O:1; /* Bit 3 */
2926 unsigned int :4; /* Bits 4-7 */
2927 } Bits;
2928 }
2929 DAC960_BA_InterruptMaskRegister_T;
2930
2931
2932 /*
2933 Define the structure of the DAC960 BA Series Error Status Register.
2934 */
2935
2936 typedef union DAC960_BA_ErrorStatusRegister
2937 {
2938 unsigned char All;
2939 struct {
2940 unsigned int :2; /* Bits 0-1 */
2941 bool ErrorStatusPending:1; /* Bit 2 */
2942 unsigned int :5; /* Bits 3-7 */
2943 } Bits;
2944 }
2945 DAC960_BA_ErrorStatusRegister_T;
2946
2947
2948 /*
2949 Define inline functions to provide an abstraction for reading and writing the
2950 DAC960 BA Series Controller Interface Registers.
2951 */
2952
2953 static inline
2954 void DAC960_BA_HardwareMailboxNewCommand(void __iomem *ControllerBaseAddress)
2955 {
2956 DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister;
2957 InboundDoorBellRegister.All = 0;
2958 InboundDoorBellRegister.Write.HardwareMailboxNewCommand = true;
2959 writeb(InboundDoorBellRegister.All,
2960 ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset);
2961 }
2962
2963 static inline
2964 void DAC960_BA_AcknowledgeHardwareMailboxStatus(void __iomem *ControllerBaseAddress)
2965 {
2966 DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister;
2967 InboundDoorBellRegister.All = 0;
2968 InboundDoorBellRegister.Write.AcknowledgeHardwareMailboxStatus = true;
2969 writeb(InboundDoorBellRegister.All,
2970 ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset);
2971 }
2972
2973 static inline
2974 void DAC960_BA_GenerateInterrupt(void __iomem *ControllerBaseAddress)
2975 {
2976 DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister;
2977 InboundDoorBellRegister.All = 0;
2978 InboundDoorBellRegister.Write.GenerateInterrupt = true;
2979 writeb(InboundDoorBellRegister.All,
2980 ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset);
2981 }
2982
2983 static inline
2984 void DAC960_BA_ControllerReset(void __iomem *ControllerBaseAddress)
2985 {
2986 DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister;
2987 InboundDoorBellRegister.All = 0;
2988 InboundDoorBellRegister.Write.ControllerReset = true;
2989 writeb(InboundDoorBellRegister.All,
2990 ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset);
2991 }
2992
2993 static inline
2994 void DAC960_BA_MemoryMailboxNewCommand(void __iomem *ControllerBaseAddress)
2995 {
2996 DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister;
2997 InboundDoorBellRegister.All = 0;
2998 InboundDoorBellRegister.Write.MemoryMailboxNewCommand = true;
2999 writeb(InboundDoorBellRegister.All,
3000 ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset);
3001 }
3002
3003 static inline
3004 bool DAC960_BA_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
3005 {
3006 DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister;
3007 InboundDoorBellRegister.All =
3008 readb(ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset);
3009 return !InboundDoorBellRegister.Read.HardwareMailboxEmpty;
3010 }
3011
3012 static inline
3013 bool DAC960_BA_InitializationInProgressP(void __iomem *ControllerBaseAddress)
3014 {
3015 DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister;
3016 InboundDoorBellRegister.All =
3017 readb(ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset);
3018 return !InboundDoorBellRegister.Read.InitializationNotInProgress;
3019 }
3020
3021 static inline
3022 void DAC960_BA_AcknowledgeHardwareMailboxInterrupt(void __iomem *ControllerBaseAddress)
3023 {
3024 DAC960_BA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
3025 OutboundDoorBellRegister.All = 0;
3026 OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
3027 writeb(OutboundDoorBellRegister.All,
3028 ControllerBaseAddress + DAC960_BA_OutboundDoorBellRegisterOffset);
3029 }
3030
3031 static inline
3032 void DAC960_BA_AcknowledgeMemoryMailboxInterrupt(void __iomem *ControllerBaseAddress)
3033 {
3034 DAC960_BA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
3035 OutboundDoorBellRegister.All = 0;
3036 OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
3037 writeb(OutboundDoorBellRegister.All,
3038 ControllerBaseAddress + DAC960_BA_OutboundDoorBellRegisterOffset);
3039 }
3040
3041 static inline
3042 void DAC960_BA_AcknowledgeInterrupt(void __iomem *ControllerBaseAddress)
3043 {
3044 DAC960_BA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
3045 OutboundDoorBellRegister.All = 0;
3046 OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
3047 OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
3048 writeb(OutboundDoorBellRegister.All,
3049 ControllerBaseAddress + DAC960_BA_OutboundDoorBellRegisterOffset);
3050 }
3051
3052 static inline
3053 bool DAC960_BA_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
3054 {
3055 DAC960_BA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
3056 OutboundDoorBellRegister.All =
3057 readb(ControllerBaseAddress + DAC960_BA_OutboundDoorBellRegisterOffset);
3058 return OutboundDoorBellRegister.Read.HardwareMailboxStatusAvailable;
3059 }
3060
3061 static inline
3062 bool DAC960_BA_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
3063 {
3064 DAC960_BA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
3065 OutboundDoorBellRegister.All =
3066 readb(ControllerBaseAddress + DAC960_BA_OutboundDoorBellRegisterOffset);
3067 return OutboundDoorBellRegister.Read.MemoryMailboxStatusAvailable;
3068 }
3069
3070 static inline
3071 void DAC960_BA_EnableInterrupts(void __iomem *ControllerBaseAddress)
3072 {
3073 DAC960_BA_InterruptMaskRegister_T InterruptMaskRegister;
3074 InterruptMaskRegister.All = 0xFF;
3075 InterruptMaskRegister.Bits.DisableInterrupts = false;
3076 InterruptMaskRegister.Bits.DisableInterruptsI2O = true;
3077 writeb(InterruptMaskRegister.All,
3078 ControllerBaseAddress + DAC960_BA_InterruptMaskRegisterOffset);
3079 }
3080
3081 static inline
3082 void DAC960_BA_DisableInterrupts(void __iomem *ControllerBaseAddress)
3083 {
3084 DAC960_BA_InterruptMaskRegister_T InterruptMaskRegister;
3085 InterruptMaskRegister.All = 0xFF;
3086 InterruptMaskRegister.Bits.DisableInterrupts = true;
3087 InterruptMaskRegister.Bits.DisableInterruptsI2O = true;
3088 writeb(InterruptMaskRegister.All,
3089 ControllerBaseAddress + DAC960_BA_InterruptMaskRegisterOffset);
3090 }
3091
3092 static inline
3093 bool DAC960_BA_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
3094 {
3095 DAC960_BA_InterruptMaskRegister_T InterruptMaskRegister;
3096 InterruptMaskRegister.All =
3097 readb(ControllerBaseAddress + DAC960_BA_InterruptMaskRegisterOffset);
3098 return !InterruptMaskRegister.Bits.DisableInterrupts;
3099 }
3100
3101 static inline
3102 void DAC960_BA_WriteCommandMailbox(DAC960_V2_CommandMailbox_T
3103 *MemoryCommandMailbox,
3104 DAC960_V2_CommandMailbox_T
3105 *CommandMailbox)
3106 {
3107 memcpy(&MemoryCommandMailbox->Words[1], &CommandMailbox->Words[1],
3108 sizeof(DAC960_V2_CommandMailbox_T) - sizeof(unsigned int));
3109 wmb();
3110 MemoryCommandMailbox->Words[0] = CommandMailbox->Words[0];
3111 mb();
3112 }
3113
3114
3115 static inline
3116 void DAC960_BA_WriteHardwareMailbox(void __iomem *ControllerBaseAddress,
3117 dma_addr_t CommandMailboxDMA)
3118 {
3119 dma_addr_writeql(CommandMailboxDMA,
3120 ControllerBaseAddress +
3121 DAC960_BA_CommandMailboxBusAddressOffset);
3122 }
3123
3124 static inline DAC960_V2_CommandIdentifier_T
3125 DAC960_BA_ReadCommandIdentifier(void __iomem *ControllerBaseAddress)
3126 {
3127 return readw(ControllerBaseAddress + DAC960_BA_CommandStatusOffset);
3128 }
3129
3130 static inline DAC960_V2_CommandStatus_T
3131 DAC960_BA_ReadCommandStatus(void __iomem *ControllerBaseAddress)
3132 {
3133 return readw(ControllerBaseAddress + DAC960_BA_CommandStatusOffset + 2);
3134 }
3135
3136 static inline bool
3137 DAC960_BA_ReadErrorStatus(void __iomem *ControllerBaseAddress,
3138 unsigned char *ErrorStatus,
3139 unsigned char *Parameter0,
3140 unsigned char *Parameter1)
3141 {
3142 DAC960_BA_ErrorStatusRegister_T ErrorStatusRegister;
3143 ErrorStatusRegister.All =
3144 readb(ControllerBaseAddress + DAC960_BA_ErrorStatusRegisterOffset);
3145 if (!ErrorStatusRegister.Bits.ErrorStatusPending) return false;
3146 ErrorStatusRegister.Bits.ErrorStatusPending = false;
3147 *ErrorStatus = ErrorStatusRegister.All;
3148 *Parameter0 =
3149 readb(ControllerBaseAddress + DAC960_BA_CommandMailboxBusAddressOffset + 0);
3150 *Parameter1 =
3151 readb(ControllerBaseAddress + DAC960_BA_CommandMailboxBusAddressOffset + 1);
3152 writeb(0xFF, ControllerBaseAddress + DAC960_BA_ErrorStatusRegisterOffset);
3153 return true;
3154 }
3155
3156
3157 /*
3158 Define the DAC960 LP Series Controller Interface Register Offsets.
3159 */
3160
3161 #define DAC960_LP_RegisterWindowSize 0x80
3162
3163 typedef enum
3164 {
3165 DAC960_LP_InboundDoorBellRegisterOffset = 0x20,
3166 DAC960_LP_OutboundDoorBellRegisterOffset = 0x2C,
3167 DAC960_LP_InterruptStatusRegisterOffset = 0x30,
3168 DAC960_LP_InterruptMaskRegisterOffset = 0x34,
3169 DAC960_LP_CommandMailboxBusAddressOffset = 0x10,
3170 DAC960_LP_CommandStatusOffset = 0x18,
3171 DAC960_LP_ErrorStatusRegisterOffset = 0x2E
3172 }
3173 DAC960_LP_RegisterOffsets_T;
3174
3175
3176 /*
3177 Define the structure of the DAC960 LP Series Inbound Door Bell Register.
3178 */
3179
3180 typedef union DAC960_LP_InboundDoorBellRegister
3181 {
3182 unsigned char All;
3183 struct {
3184 bool HardwareMailboxNewCommand:1; /* Bit 0 */
3185 bool AcknowledgeHardwareMailboxStatus:1; /* Bit 1 */
3186 bool GenerateInterrupt:1; /* Bit 2 */
3187 bool ControllerReset:1; /* Bit 3 */
3188 bool MemoryMailboxNewCommand:1; /* Bit 4 */
3189 unsigned char :3; /* Bits 5-7 */
3190 } Write;
3191 struct {
3192 bool HardwareMailboxFull:1; /* Bit 0 */
3193 bool InitializationInProgress:1; /* Bit 1 */
3194 unsigned char :6; /* Bits 2-7 */
3195 } Read;
3196 }
3197 DAC960_LP_InboundDoorBellRegister_T;
3198
3199
3200 /*
3201 Define the structure of the DAC960 LP Series Outbound Door Bell Register.
3202 */
3203
3204 typedef union DAC960_LP_OutboundDoorBellRegister
3205 {
3206 unsigned char All;
3207 struct {
3208 bool AcknowledgeHardwareMailboxInterrupt:1; /* Bit 0 */
3209 bool AcknowledgeMemoryMailboxInterrupt:1; /* Bit 1 */
3210 unsigned char :6; /* Bits 2-7 */
3211 } Write;
3212 struct {
3213 bool HardwareMailboxStatusAvailable:1; /* Bit 0 */
3214 bool MemoryMailboxStatusAvailable:1; /* Bit 1 */
3215 unsigned char :6; /* Bits 2-7 */
3216 } Read;
3217 }
3218 DAC960_LP_OutboundDoorBellRegister_T;
3219
3220
3221 /*
3222 Define the structure of the DAC960 LP Series Interrupt Mask Register.
3223 */
3224
3225 typedef union DAC960_LP_InterruptMaskRegister
3226 {
3227 unsigned char All;
3228 struct {
3229 unsigned int :2; /* Bits 0-1 */
3230 bool DisableInterrupts:1; /* Bit 2 */
3231 unsigned int :5; /* Bits 3-7 */
3232 } Bits;
3233 }
3234 DAC960_LP_InterruptMaskRegister_T;
3235
3236
3237 /*
3238 Define the structure of the DAC960 LP Series Error Status Register.
3239 */
3240
3241 typedef union DAC960_LP_ErrorStatusRegister
3242 {
3243 unsigned char All;
3244 struct {
3245 unsigned int :2; /* Bits 0-1 */
3246 bool ErrorStatusPending:1; /* Bit 2 */
3247 unsigned int :5; /* Bits 3-7 */
3248 } Bits;
3249 }
3250 DAC960_LP_ErrorStatusRegister_T;
3251
3252
3253 /*
3254 Define inline functions to provide an abstraction for reading and writing the
3255 DAC960 LP Series Controller Interface Registers.
3256 */
3257
3258 static inline
3259 void DAC960_LP_HardwareMailboxNewCommand(void __iomem *ControllerBaseAddress)
3260 {
3261 DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister;
3262 InboundDoorBellRegister.All = 0;
3263 InboundDoorBellRegister.Write.HardwareMailboxNewCommand = true;
3264 writeb(InboundDoorBellRegister.All,
3265 ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset);
3266 }
3267
3268 static inline
3269 void DAC960_LP_AcknowledgeHardwareMailboxStatus(void __iomem *ControllerBaseAddress)
3270 {
3271 DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister;
3272 InboundDoorBellRegister.All = 0;
3273 InboundDoorBellRegister.Write.AcknowledgeHardwareMailboxStatus = true;
3274 writeb(InboundDoorBellRegister.All,
3275 ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset);
3276 }
3277
3278 static inline
3279 void DAC960_LP_GenerateInterrupt(void __iomem *ControllerBaseAddress)
3280 {
3281 DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister;
3282 InboundDoorBellRegister.All = 0;
3283 InboundDoorBellRegister.Write.GenerateInterrupt = true;
3284 writeb(InboundDoorBellRegister.All,
3285 ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset);
3286 }
3287
3288 static inline
3289 void DAC960_LP_ControllerReset(void __iomem *ControllerBaseAddress)
3290 {
3291 DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister;
3292 InboundDoorBellRegister.All = 0;
3293 InboundDoorBellRegister.Write.ControllerReset = true;
3294 writeb(InboundDoorBellRegister.All,
3295 ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset);
3296 }
3297
3298 static inline
3299 void DAC960_LP_MemoryMailboxNewCommand(void __iomem *ControllerBaseAddress)
3300 {
3301 DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister;
3302 InboundDoorBellRegister.All = 0;
3303 InboundDoorBellRegister.Write.MemoryMailboxNewCommand = true;
3304 writeb(InboundDoorBellRegister.All,
3305 ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset);
3306 }
3307
3308 static inline
3309 bool DAC960_LP_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
3310 {
3311 DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister;
3312 InboundDoorBellRegister.All =
3313 readb(ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset);
3314 return InboundDoorBellRegister.Read.HardwareMailboxFull;
3315 }
3316
3317 static inline
3318 bool DAC960_LP_InitializationInProgressP(void __iomem *ControllerBaseAddress)
3319 {
3320 DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister;
3321 InboundDoorBellRegister.All =
3322 readb(ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset);
3323 return InboundDoorBellRegister.Read.InitializationInProgress;
3324 }
3325
3326 static inline
3327 void DAC960_LP_AcknowledgeHardwareMailboxInterrupt(void __iomem *ControllerBaseAddress)
3328 {
3329 DAC960_LP_OutboundDoorBellRegister_T OutboundDoorBellRegister;
3330 OutboundDoorBellRegister.All = 0;
3331 OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
3332 writeb(OutboundDoorBellRegister.All,
3333 ControllerBaseAddress + DAC960_LP_OutboundDoorBellRegisterOffset);
3334 }
3335
3336 static inline
3337 void DAC960_LP_AcknowledgeMemoryMailboxInterrupt(void __iomem *ControllerBaseAddress)
3338 {
3339 DAC960_LP_OutboundDoorBellRegister_T OutboundDoorBellRegister;
3340 OutboundDoorBellRegister.All = 0;
3341 OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
3342 writeb(OutboundDoorBellRegister.All,
3343 ControllerBaseAddress + DAC960_LP_OutboundDoorBellRegisterOffset);
3344 }
3345
3346 static inline
3347 void DAC960_LP_AcknowledgeInterrupt(void __iomem *ControllerBaseAddress)
3348 {
3349 DAC960_LP_OutboundDoorBellRegister_T OutboundDoorBellRegister;
3350 OutboundDoorBellRegister.All = 0;
3351 OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
3352 OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
3353 writeb(OutboundDoorBellRegister.All,
3354 ControllerBaseAddress + DAC960_LP_OutboundDoorBellRegisterOffset);
3355 }
3356
3357 static inline
3358 bool DAC960_LP_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
3359 {
3360 DAC960_LP_OutboundDoorBellRegister_T OutboundDoorBellRegister;
3361 OutboundDoorBellRegister.All =
3362 readb(ControllerBaseAddress + DAC960_LP_OutboundDoorBellRegisterOffset);
3363 return OutboundDoorBellRegister.Read.HardwareMailboxStatusAvailable;
3364 }
3365
3366 static inline
3367 bool DAC960_LP_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
3368 {
3369 DAC960_LP_OutboundDoorBellRegister_T OutboundDoorBellRegister;
3370 OutboundDoorBellRegister.All =
3371 readb(ControllerBaseAddress + DAC960_LP_OutboundDoorBellRegisterOffset);
3372 return OutboundDoorBellRegister.Read.MemoryMailboxStatusAvailable;
3373 }
3374
3375 static inline
3376 void DAC960_LP_EnableInterrupts(void __iomem *ControllerBaseAddress)
3377 {
3378 DAC960_LP_InterruptMaskRegister_T InterruptMaskRegister;
3379 InterruptMaskRegister.All = 0xFF;
3380 InterruptMaskRegister.Bits.DisableInterrupts = false;
3381 writeb(InterruptMaskRegister.All,
3382 ControllerBaseAddress + DAC960_LP_InterruptMaskRegisterOffset);
3383 }
3384
3385 static inline
3386 void DAC960_LP_DisableInterrupts(void __iomem *ControllerBaseAddress)
3387 {
3388 DAC960_LP_InterruptMaskRegister_T InterruptMaskRegister;
3389 InterruptMaskRegister.All = 0xFF;
3390 InterruptMaskRegister.Bits.DisableInterrupts = true;
3391 writeb(InterruptMaskRegister.All,
3392 ControllerBaseAddress + DAC960_LP_InterruptMaskRegisterOffset);
3393 }
3394
3395 static inline
3396 bool DAC960_LP_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
3397 {
3398 DAC960_LP_InterruptMaskRegister_T InterruptMaskRegister;
3399 InterruptMaskRegister.All =
3400 readb(ControllerBaseAddress + DAC960_LP_InterruptMaskRegisterOffset);
3401 return !InterruptMaskRegister.Bits.DisableInterrupts;
3402 }
3403
3404 static inline
3405 void DAC960_LP_WriteCommandMailbox(DAC960_V2_CommandMailbox_T
3406 *MemoryCommandMailbox,
3407 DAC960_V2_CommandMailbox_T
3408 *CommandMailbox)
3409 {
3410 memcpy(&MemoryCommandMailbox->Words[1], &CommandMailbox->Words[1],
3411 sizeof(DAC960_V2_CommandMailbox_T) - sizeof(unsigned int));
3412 wmb();
3413 MemoryCommandMailbox->Words[0] = CommandMailbox->Words[0];
3414 mb();
3415 }
3416
3417 static inline
3418 void DAC960_LP_WriteHardwareMailbox(void __iomem *ControllerBaseAddress,
3419 dma_addr_t CommandMailboxDMA)
3420 {
3421 dma_addr_writeql(CommandMailboxDMA,
3422 ControllerBaseAddress +
3423 DAC960_LP_CommandMailboxBusAddressOffset);
3424 }
3425
3426 static inline DAC960_V2_CommandIdentifier_T
3427 DAC960_LP_ReadCommandIdentifier(void __iomem *ControllerBaseAddress)
3428 {
3429 return readw(ControllerBaseAddress + DAC960_LP_CommandStatusOffset);
3430 }
3431
3432 static inline DAC960_V2_CommandStatus_T
3433 DAC960_LP_ReadCommandStatus(void __iomem *ControllerBaseAddress)
3434 {
3435 return readw(ControllerBaseAddress + DAC960_LP_CommandStatusOffset + 2);
3436 }
3437
3438 static inline bool
3439 DAC960_LP_ReadErrorStatus(void __iomem *ControllerBaseAddress,
3440 unsigned char *ErrorStatus,
3441 unsigned char *Parameter0,
3442 unsigned char *Parameter1)
3443 {
3444 DAC960_LP_ErrorStatusRegister_T ErrorStatusRegister;
3445 ErrorStatusRegister.All =
3446 readb(ControllerBaseAddress + DAC960_LP_ErrorStatusRegisterOffset);
3447 if (!ErrorStatusRegister.Bits.ErrorStatusPending) return false;
3448 ErrorStatusRegister.Bits.ErrorStatusPending = false;
3449 *ErrorStatus = ErrorStatusRegister.All;
3450 *Parameter0 =
3451 readb(ControllerBaseAddress + DAC960_LP_CommandMailboxBusAddressOffset + 0);
3452 *Parameter1 =
3453 readb(ControllerBaseAddress + DAC960_LP_CommandMailboxBusAddressOffset + 1);
3454 writeb(0xFF, ControllerBaseAddress + DAC960_LP_ErrorStatusRegisterOffset);
3455 return true;
3456 }
3457
3458
3459 /*
3460 Define the DAC960 LA Series Controller Interface Register Offsets.
3461 */
3462
3463 #define DAC960_LA_RegisterWindowSize 0x80
3464
3465 typedef enum
3466 {
3467 DAC960_LA_InboundDoorBellRegisterOffset = 0x60,
3468 DAC960_LA_OutboundDoorBellRegisterOffset = 0x61,
3469 DAC960_LA_InterruptMaskRegisterOffset = 0x34,
3470 DAC960_LA_CommandOpcodeRegisterOffset = 0x50,
3471 DAC960_LA_CommandIdentifierRegisterOffset = 0x51,
3472 DAC960_LA_MailboxRegister2Offset = 0x52,
3473 DAC960_LA_MailboxRegister3Offset = 0x53,
3474 DAC960_LA_MailboxRegister4Offset = 0x54,
3475 DAC960_LA_MailboxRegister5Offset = 0x55,
3476 DAC960_LA_MailboxRegister6Offset = 0x56,
3477 DAC960_LA_MailboxRegister7Offset = 0x57,
3478 DAC960_LA_MailboxRegister8Offset = 0x58,
3479 DAC960_LA_MailboxRegister9Offset = 0x59,
3480 DAC960_LA_MailboxRegister10Offset = 0x5A,
3481 DAC960_LA_MailboxRegister11Offset = 0x5B,
3482 DAC960_LA_MailboxRegister12Offset = 0x5C,
3483 DAC960_LA_StatusCommandIdentifierRegOffset = 0x5D,
3484 DAC960_LA_StatusRegisterOffset = 0x5E,
3485 DAC960_LA_ErrorStatusRegisterOffset = 0x63
3486 }
3487 DAC960_LA_RegisterOffsets_T;
3488
3489
3490 /*
3491 Define the structure of the DAC960 LA Series Inbound Door Bell Register.
3492 */
3493
3494 typedef union DAC960_LA_InboundDoorBellRegister
3495 {
3496 unsigned char All;
3497 struct {
3498 bool HardwareMailboxNewCommand:1; /* Bit 0 */
3499 bool AcknowledgeHardwareMailboxStatus:1; /* Bit 1 */
3500 bool GenerateInterrupt:1; /* Bit 2 */
3501 bool ControllerReset:1; /* Bit 3 */
3502 bool MemoryMailboxNewCommand:1; /* Bit 4 */
3503 unsigned char :3; /* Bits 5-7 */
3504 } Write;
3505 struct {
3506 bool HardwareMailboxEmpty:1; /* Bit 0 */
3507 bool InitializationNotInProgress:1; /* Bit 1 */
3508 unsigned char :6; /* Bits 2-7 */
3509 } Read;
3510 }
3511 DAC960_LA_InboundDoorBellRegister_T;
3512
3513
3514 /*
3515 Define the structure of the DAC960 LA Series Outbound Door Bell Register.
3516 */
3517
3518 typedef union DAC960_LA_OutboundDoorBellRegister
3519 {
3520 unsigned char All;
3521 struct {
3522 bool AcknowledgeHardwareMailboxInterrupt:1; /* Bit 0 */
3523 bool AcknowledgeMemoryMailboxInterrupt:1; /* Bit 1 */
3524 unsigned char :6; /* Bits 2-7 */
3525 } Write;
3526 struct {
3527 bool HardwareMailboxStatusAvailable:1; /* Bit 0 */
3528 bool MemoryMailboxStatusAvailable:1; /* Bit 1 */
3529 unsigned char :6; /* Bits 2-7 */
3530 } Read;
3531 }
3532 DAC960_LA_OutboundDoorBellRegister_T;
3533
3534
3535 /*
3536 Define the structure of the DAC960 LA Series Interrupt Mask Register.
3537 */
3538
3539 typedef union DAC960_LA_InterruptMaskRegister
3540 {
3541 unsigned char All;
3542 struct {
3543 unsigned char :2; /* Bits 0-1 */
3544 bool DisableInterrupts:1; /* Bit 2 */
3545 unsigned char :5; /* Bits 3-7 */
3546 } Bits;
3547 }
3548 DAC960_LA_InterruptMaskRegister_T;
3549
3550
3551 /*
3552 Define the structure of the DAC960 LA Series Error Status Register.
3553 */
3554
3555 typedef union DAC960_LA_ErrorStatusRegister
3556 {
3557 unsigned char All;
3558 struct {
3559 unsigned int :2; /* Bits 0-1 */
3560 bool ErrorStatusPending:1; /* Bit 2 */
3561 unsigned int :5; /* Bits 3-7 */
3562 } Bits;
3563 }
3564 DAC960_LA_ErrorStatusRegister_T;
3565
3566
3567 /*
3568 Define inline functions to provide an abstraction for reading and writing the
3569 DAC960 LA Series Controller Interface Registers.
3570 */
3571
3572 static inline
3573 void DAC960_LA_HardwareMailboxNewCommand(void __iomem *ControllerBaseAddress)
3574 {
3575 DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister;
3576 InboundDoorBellRegister.All = 0;
3577 InboundDoorBellRegister.Write.HardwareMailboxNewCommand = true;
3578 writeb(InboundDoorBellRegister.All,
3579 ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset);
3580 }
3581
3582 static inline
3583 void DAC960_LA_AcknowledgeHardwareMailboxStatus(void __iomem *ControllerBaseAddress)
3584 {
3585 DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister;
3586 InboundDoorBellRegister.All = 0;
3587 InboundDoorBellRegister.Write.AcknowledgeHardwareMailboxStatus = true;
3588 writeb(InboundDoorBellRegister.All,
3589 ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset);
3590 }
3591
3592 static inline
3593 void DAC960_LA_GenerateInterrupt(void __iomem *ControllerBaseAddress)
3594 {
3595 DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister;
3596 InboundDoorBellRegister.All = 0;
3597 InboundDoorBellRegister.Write.GenerateInterrupt = true;
3598 writeb(InboundDoorBellRegister.All,
3599 ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset);
3600 }
3601
3602 static inline
3603 void DAC960_LA_ControllerReset(void __iomem *ControllerBaseAddress)
3604 {
3605 DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister;
3606 InboundDoorBellRegister.All = 0;
3607 InboundDoorBellRegister.Write.ControllerReset = true;
3608 writeb(InboundDoorBellRegister.All,
3609 ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset);
3610 }
3611
3612 static inline
3613 void DAC960_LA_MemoryMailboxNewCommand(void __iomem *ControllerBaseAddress)
3614 {
3615 DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister;
3616 InboundDoorBellRegister.All = 0;
3617 InboundDoorBellRegister.Write.MemoryMailboxNewCommand = true;
3618 writeb(InboundDoorBellRegister.All,
3619 ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset);
3620 }
3621
3622 static inline
3623 bool DAC960_LA_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
3624 {
3625 DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister;
3626 InboundDoorBellRegister.All =
3627 readb(ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset);
3628 return !InboundDoorBellRegister.Read.HardwareMailboxEmpty;
3629 }
3630
3631 static inline
3632 bool DAC960_LA_InitializationInProgressP(void __iomem *ControllerBaseAddress)
3633 {
3634 DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister;
3635 InboundDoorBellRegister.All =
3636 readb(ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset);
3637 return !InboundDoorBellRegister.Read.InitializationNotInProgress;
3638 }
3639
3640 static inline
3641 void DAC960_LA_AcknowledgeHardwareMailboxInterrupt(void __iomem *ControllerBaseAddress)
3642 {
3643 DAC960_LA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
3644 OutboundDoorBellRegister.All = 0;
3645 OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
3646 writeb(OutboundDoorBellRegister.All,
3647 ControllerBaseAddress + DAC960_LA_OutboundDoorBellRegisterOffset);
3648 }
3649
3650 static inline
3651 void DAC960_LA_AcknowledgeMemoryMailboxInterrupt(void __iomem *ControllerBaseAddress)
3652 {
3653 DAC960_LA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
3654 OutboundDoorBellRegister.All = 0;
3655 OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
3656 writeb(OutboundDoorBellRegister.All,
3657 ControllerBaseAddress + DAC960_LA_OutboundDoorBellRegisterOffset);
3658 }
3659
3660 static inline
3661 void DAC960_LA_AcknowledgeInterrupt(void __iomem *ControllerBaseAddress)
3662 {
3663 DAC960_LA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
3664 OutboundDoorBellRegister.All = 0;
3665 OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
3666 OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
3667 writeb(OutboundDoorBellRegister.All,
3668 ControllerBaseAddress + DAC960_LA_OutboundDoorBellRegisterOffset);
3669 }
3670
3671 static inline
3672 bool DAC960_LA_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
3673 {
3674 DAC960_LA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
3675 OutboundDoorBellRegister.All =
3676 readb(ControllerBaseAddress + DAC960_LA_OutboundDoorBellRegisterOffset);
3677 return OutboundDoorBellRegister.Read.HardwareMailboxStatusAvailable;
3678 }
3679
3680 static inline
3681 bool DAC960_LA_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
3682 {
3683 DAC960_LA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
3684 OutboundDoorBellRegister.All =
3685 readb(ControllerBaseAddress + DAC960_LA_OutboundDoorBellRegisterOffset);
3686 return OutboundDoorBellRegister.Read.MemoryMailboxStatusAvailable;
3687 }
3688
3689 static inline
3690 void DAC960_LA_EnableInterrupts(void __iomem *ControllerBaseAddress)
3691 {
3692 DAC960_LA_InterruptMaskRegister_T InterruptMaskRegister;
3693 InterruptMaskRegister.All = 0xFF;
3694 InterruptMaskRegister.Bits.DisableInterrupts = false;
3695 writeb(InterruptMaskRegister.All,
3696 ControllerBaseAddress + DAC960_LA_InterruptMaskRegisterOffset);
3697 }
3698
3699 static inline
3700 void DAC960_LA_DisableInterrupts(void __iomem *ControllerBaseAddress)
3701 {
3702 DAC960_LA_InterruptMaskRegister_T InterruptMaskRegister;
3703 InterruptMaskRegister.All = 0xFF;
3704 InterruptMaskRegister.Bits.DisableInterrupts = true;
3705 writeb(InterruptMaskRegister.All,
3706 ControllerBaseAddress + DAC960_LA_InterruptMaskRegisterOffset);
3707 }
3708
3709 static inline
3710 bool DAC960_LA_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
3711 {
3712 DAC960_LA_InterruptMaskRegister_T InterruptMaskRegister;
3713 InterruptMaskRegister.All =
3714 readb(ControllerBaseAddress + DAC960_LA_InterruptMaskRegisterOffset);
3715 return !InterruptMaskRegister.Bits.DisableInterrupts;
3716 }
3717
3718 static inline
3719 void DAC960_LA_WriteCommandMailbox(DAC960_V1_CommandMailbox_T
3720 *MemoryCommandMailbox,
3721 DAC960_V1_CommandMailbox_T
3722 *CommandMailbox)
3723 {
3724 MemoryCommandMailbox->Words[1] = CommandMailbox->Words[1];
3725 MemoryCommandMailbox->Words[2] = CommandMailbox->Words[2];
3726 MemoryCommandMailbox->Words[3] = CommandMailbox->Words[3];
3727 wmb();
3728 MemoryCommandMailbox->Words[0] = CommandMailbox->Words[0];
3729 mb();
3730 }
3731
3732 static inline
3733 void DAC960_LA_WriteHardwareMailbox(void __iomem *ControllerBaseAddress,
3734 DAC960_V1_CommandMailbox_T *CommandMailbox)
3735 {
3736 writel(CommandMailbox->Words[0],
3737 ControllerBaseAddress + DAC960_LA_CommandOpcodeRegisterOffset);
3738 writel(CommandMailbox->Words[1],
3739 ControllerBaseAddress + DAC960_LA_MailboxRegister4Offset);
3740 writel(CommandMailbox->Words[2],
3741 ControllerBaseAddress + DAC960_LA_MailboxRegister8Offset);
3742 writeb(CommandMailbox->Bytes[12],
3743 ControllerBaseAddress + DAC960_LA_MailboxRegister12Offset);
3744 }
3745
3746 static inline DAC960_V1_CommandIdentifier_T
3747 DAC960_LA_ReadStatusCommandIdentifier(void __iomem *ControllerBaseAddress)
3748 {
3749 return readb(ControllerBaseAddress
3750 + DAC960_LA_StatusCommandIdentifierRegOffset);
3751 }
3752
3753 static inline DAC960_V1_CommandStatus_T
3754 DAC960_LA_ReadStatusRegister(void __iomem *ControllerBaseAddress)
3755 {
3756 return readw(ControllerBaseAddress + DAC960_LA_StatusRegisterOffset);
3757 }
3758
3759 static inline bool
3760 DAC960_LA_ReadErrorStatus(void __iomem *ControllerBaseAddress,
3761 unsigned char *ErrorStatus,
3762 unsigned char *Parameter0,
3763 unsigned char *Parameter1)
3764 {
3765 DAC960_LA_ErrorStatusRegister_T ErrorStatusRegister;
3766 ErrorStatusRegister.All =
3767 readb(ControllerBaseAddress + DAC960_LA_ErrorStatusRegisterOffset);
3768 if (!ErrorStatusRegister.Bits.ErrorStatusPending) return false;
3769 ErrorStatusRegister.Bits.ErrorStatusPending = false;
3770 *ErrorStatus = ErrorStatusRegister.All;
3771 *Parameter0 =
3772 readb(ControllerBaseAddress + DAC960_LA_CommandOpcodeRegisterOffset);
3773 *Parameter1 =
3774 readb(ControllerBaseAddress + DAC960_LA_CommandIdentifierRegisterOffset);
3775 writeb(0xFF, ControllerBaseAddress + DAC960_LA_ErrorStatusRegisterOffset);
3776 return true;
3777 }
3778
3779 /*
3780 Define the DAC960 PG Series Controller Interface Register Offsets.
3781 */
3782
3783 #define DAC960_PG_RegisterWindowSize 0x2000
3784
3785 typedef enum
3786 {
3787 DAC960_PG_InboundDoorBellRegisterOffset = 0x0020,
3788 DAC960_PG_OutboundDoorBellRegisterOffset = 0x002C,
3789 DAC960_PG_InterruptMaskRegisterOffset = 0x0034,
3790 DAC960_PG_CommandOpcodeRegisterOffset = 0x1000,
3791 DAC960_PG_CommandIdentifierRegisterOffset = 0x1001,
3792 DAC960_PG_MailboxRegister2Offset = 0x1002,
3793 DAC960_PG_MailboxRegister3Offset = 0x1003,
3794 DAC960_PG_MailboxRegister4Offset = 0x1004,
3795 DAC960_PG_MailboxRegister5Offset = 0x1005,
3796 DAC960_PG_MailboxRegister6Offset = 0x1006,
3797 DAC960_PG_MailboxRegister7Offset = 0x1007,
3798 DAC960_PG_MailboxRegister8Offset = 0x1008,
3799 DAC960_PG_MailboxRegister9Offset = 0x1009,
3800 DAC960_PG_MailboxRegister10Offset = 0x100A,
3801 DAC960_PG_MailboxRegister11Offset = 0x100B,
3802 DAC960_PG_MailboxRegister12Offset = 0x100C,
3803 DAC960_PG_StatusCommandIdentifierRegOffset = 0x1018,
3804 DAC960_PG_StatusRegisterOffset = 0x101A,
3805 DAC960_PG_ErrorStatusRegisterOffset = 0x103F
3806 }
3807 DAC960_PG_RegisterOffsets_T;
3808
3809
3810 /*
3811 Define the structure of the DAC960 PG Series Inbound Door Bell Register.
3812 */
3813
3814 typedef union DAC960_PG_InboundDoorBellRegister
3815 {
3816 unsigned int All;
3817 struct {
3818 bool HardwareMailboxNewCommand:1; /* Bit 0 */
3819 bool AcknowledgeHardwareMailboxStatus:1; /* Bit 1 */
3820 bool GenerateInterrupt:1; /* Bit 2 */
3821 bool ControllerReset:1; /* Bit 3 */
3822 bool MemoryMailboxNewCommand:1; /* Bit 4 */
3823 unsigned int :27; /* Bits 5-31 */
3824 } Write;
3825 struct {
3826 bool HardwareMailboxFull:1; /* Bit 0 */
3827 bool InitializationInProgress:1; /* Bit 1 */
3828 unsigned int :30; /* Bits 2-31 */
3829 } Read;
3830 }
3831 DAC960_PG_InboundDoorBellRegister_T;
3832
3833
3834 /*
3835 Define the structure of the DAC960 PG Series Outbound Door Bell Register.
3836 */
3837
3838 typedef union DAC960_PG_OutboundDoorBellRegister
3839 {
3840 unsigned int All;
3841 struct {
3842 bool AcknowledgeHardwareMailboxInterrupt:1; /* Bit 0 */
3843 bool AcknowledgeMemoryMailboxInterrupt:1; /* Bit 1 */
3844 unsigned int :30; /* Bits 2-31 */
3845 } Write;
3846 struct {
3847 bool HardwareMailboxStatusAvailable:1; /* Bit 0 */
3848 bool MemoryMailboxStatusAvailable:1; /* Bit 1 */
3849 unsigned int :30; /* Bits 2-31 */
3850 } Read;
3851 }
3852 DAC960_PG_OutboundDoorBellRegister_T;
3853
3854
3855 /*
3856 Define the structure of the DAC960 PG Series Interrupt Mask Register.
3857 */
3858
3859 typedef union DAC960_PG_InterruptMaskRegister
3860 {
3861 unsigned int All;
3862 struct {
3863 unsigned int MessageUnitInterruptMask1:2; /* Bits 0-1 */
3864 bool DisableInterrupts:1; /* Bit 2 */
3865 unsigned int MessageUnitInterruptMask2:5; /* Bits 3-7 */
3866 unsigned int Reserved0:24; /* Bits 8-31 */
3867 } Bits;
3868 }
3869 DAC960_PG_InterruptMaskRegister_T;
3870
3871
3872 /*
3873 Define the structure of the DAC960 PG Series Error Status Register.
3874 */
3875
3876 typedef union DAC960_PG_ErrorStatusRegister
3877 {
3878 unsigned char All;
3879 struct {
3880 unsigned int :2; /* Bits 0-1 */
3881 bool ErrorStatusPending:1; /* Bit 2 */
3882 unsigned int :5; /* Bits 3-7 */
3883 } Bits;
3884 }
3885 DAC960_PG_ErrorStatusRegister_T;
3886
3887
3888 /*
3889 Define inline functions to provide an abstraction for reading and writing the
3890 DAC960 PG Series Controller Interface Registers.
3891 */
3892
3893 static inline
3894 void DAC960_PG_HardwareMailboxNewCommand(void __iomem *ControllerBaseAddress)
3895 {
3896 DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister;
3897 InboundDoorBellRegister.All = 0;
3898 InboundDoorBellRegister.Write.HardwareMailboxNewCommand = true;
3899 writel(InboundDoorBellRegister.All,
3900 ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset);
3901 }
3902
3903 static inline
3904 void DAC960_PG_AcknowledgeHardwareMailboxStatus(void __iomem *ControllerBaseAddress)
3905 {
3906 DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister;
3907 InboundDoorBellRegister.All = 0;
3908 InboundDoorBellRegister.Write.AcknowledgeHardwareMailboxStatus = true;
3909 writel(InboundDoorBellRegister.All,
3910 ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset);
3911 }
3912
3913 static inline
3914 void DAC960_PG_GenerateInterrupt(void __iomem *ControllerBaseAddress)
3915 {
3916 DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister;
3917 InboundDoorBellRegister.All = 0;
3918 InboundDoorBellRegister.Write.GenerateInterrupt = true;
3919 writel(InboundDoorBellRegister.All,
3920 ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset);
3921 }
3922
3923 static inline
3924 void DAC960_PG_ControllerReset(void __iomem *ControllerBaseAddress)
3925 {
3926 DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister;
3927 InboundDoorBellRegister.All = 0;
3928 InboundDoorBellRegister.Write.ControllerReset = true;
3929 writel(InboundDoorBellRegister.All,
3930 ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset);
3931 }
3932
3933 static inline
3934 void DAC960_PG_MemoryMailboxNewCommand(void __iomem *ControllerBaseAddress)
3935 {
3936 DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister;
3937 InboundDoorBellRegister.All = 0;
3938 InboundDoorBellRegister.Write.MemoryMailboxNewCommand = true;
3939 writel(InboundDoorBellRegister.All,
3940 ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset);
3941 }
3942
3943 static inline
3944 bool DAC960_PG_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
3945 {
3946 DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister;
3947 InboundDoorBellRegister.All =
3948 readl(ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset);
3949 return InboundDoorBellRegister.Read.HardwareMailboxFull;
3950 }
3951
3952 static inline
3953 bool DAC960_PG_InitializationInProgressP(void __iomem *ControllerBaseAddress)
3954 {
3955 DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister;
3956 InboundDoorBellRegister.All =
3957 readl(ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset);
3958 return InboundDoorBellRegister.Read.InitializationInProgress;
3959 }
3960
3961 static inline
3962 void DAC960_PG_AcknowledgeHardwareMailboxInterrupt(void __iomem *ControllerBaseAddress)
3963 {
3964 DAC960_PG_OutboundDoorBellRegister_T OutboundDoorBellRegister;
3965 OutboundDoorBellRegister.All = 0;
3966 OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
3967 writel(OutboundDoorBellRegister.All,
3968 ControllerBaseAddress + DAC960_PG_OutboundDoorBellRegisterOffset);
3969 }
3970
3971 static inline
3972 void DAC960_PG_AcknowledgeMemoryMailboxInterrupt(void __iomem *ControllerBaseAddress)
3973 {
3974 DAC960_PG_OutboundDoorBellRegister_T OutboundDoorBellRegister;
3975 OutboundDoorBellRegister.All = 0;
3976 OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
3977 writel(OutboundDoorBellRegister.All,
3978 ControllerBaseAddress + DAC960_PG_OutboundDoorBellRegisterOffset);
3979 }
3980
3981 static inline
3982 void DAC960_PG_AcknowledgeInterrupt(void __iomem *ControllerBaseAddress)
3983 {
3984 DAC960_PG_OutboundDoorBellRegister_T OutboundDoorBellRegister;
3985 OutboundDoorBellRegister.All = 0;
3986 OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
3987 OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
3988 writel(OutboundDoorBellRegister.All,
3989 ControllerBaseAddress + DAC960_PG_OutboundDoorBellRegisterOffset);
3990 }
3991
3992 static inline
3993 bool DAC960_PG_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
3994 {
3995 DAC960_PG_OutboundDoorBellRegister_T OutboundDoorBellRegister;
3996 OutboundDoorBellRegister.All =
3997 readl(ControllerBaseAddress + DAC960_PG_OutboundDoorBellRegisterOffset);
3998 return OutboundDoorBellRegister.Read.HardwareMailboxStatusAvailable;
3999 }
4000
4001 static inline
4002 bool DAC960_PG_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
4003 {
4004 DAC960_PG_OutboundDoorBellRegister_T OutboundDoorBellRegister;
4005 OutboundDoorBellRegister.All =
4006 readl(ControllerBaseAddress + DAC960_PG_OutboundDoorBellRegisterOffset);
4007 return OutboundDoorBellRegister.Read.MemoryMailboxStatusAvailable;
4008 }
4009
4010 static inline
4011 void DAC960_PG_EnableInterrupts(void __iomem *ControllerBaseAddress)
4012 {
4013 DAC960_PG_InterruptMaskRegister_T InterruptMaskRegister;
4014 InterruptMaskRegister.All = 0;
4015 InterruptMaskRegister.Bits.MessageUnitInterruptMask1 = 0x3;
4016 InterruptMaskRegister.Bits.DisableInterrupts = false;
4017 InterruptMaskRegister.Bits.MessageUnitInterruptMask2 = 0x1F;
4018 writel(InterruptMaskRegister.All,
4019 ControllerBaseAddress + DAC960_PG_InterruptMaskRegisterOffset);
4020 }
4021
4022 static inline
4023 void DAC960_PG_DisableInterrupts(void __iomem *ControllerBaseAddress)
4024 {
4025 DAC960_PG_InterruptMaskRegister_T InterruptMaskRegister;
4026 InterruptMaskRegister.All = 0;
4027 InterruptMaskRegister.Bits.MessageUnitInterruptMask1 = 0x3;
4028 InterruptMaskRegister.Bits.DisableInterrupts = true;
4029 InterruptMaskRegister.Bits.MessageUnitInterruptMask2 = 0x1F;
4030 writel(InterruptMaskRegister.All,
4031 ControllerBaseAddress + DAC960_PG_InterruptMaskRegisterOffset);
4032 }
4033
4034 static inline
4035 bool DAC960_PG_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
4036 {
4037 DAC960_PG_InterruptMaskRegister_T InterruptMaskRegister;
4038 InterruptMaskRegister.All =
4039 readl(ControllerBaseAddress + DAC960_PG_InterruptMaskRegisterOffset);
4040 return !InterruptMaskRegister.Bits.DisableInterrupts;
4041 }
4042
4043 static inline
4044 void DAC960_PG_WriteCommandMailbox(DAC960_V1_CommandMailbox_T
4045 *MemoryCommandMailbox,
4046 DAC960_V1_CommandMailbox_T
4047 *CommandMailbox)
4048 {
4049 MemoryCommandMailbox->Words[1] = CommandMailbox->Words[1];
4050 MemoryCommandMailbox->Words[2] = CommandMailbox->Words[2];
4051 MemoryCommandMailbox->Words[3] = CommandMailbox->Words[3];
4052 wmb();
4053 MemoryCommandMailbox->Words[0] = CommandMailbox->Words[0];
4054 mb();
4055 }
4056
4057 static inline
4058 void DAC960_PG_WriteHardwareMailbox(void __iomem *ControllerBaseAddress,
4059 DAC960_V1_CommandMailbox_T *CommandMailbox)
4060 {
4061 writel(CommandMailbox->Words[0],
4062 ControllerBaseAddress + DAC960_PG_CommandOpcodeRegisterOffset);
4063 writel(CommandMailbox->Words[1],
4064 ControllerBaseAddress + DAC960_PG_MailboxRegister4Offset);
4065 writel(CommandMailbox->Words[2],
4066 ControllerBaseAddress + DAC960_PG_MailboxRegister8Offset);
4067 writeb(CommandMailbox->Bytes[12],
4068 ControllerBaseAddress + DAC960_PG_MailboxRegister12Offset);
4069 }
4070
4071 static inline DAC960_V1_CommandIdentifier_T
4072 DAC960_PG_ReadStatusCommandIdentifier(void __iomem *ControllerBaseAddress)
4073 {
4074 return readb(ControllerBaseAddress
4075 + DAC960_PG_StatusCommandIdentifierRegOffset);
4076 }
4077
4078 static inline DAC960_V1_CommandStatus_T
4079 DAC960_PG_ReadStatusRegister(void __iomem *ControllerBaseAddress)
4080 {
4081 return readw(ControllerBaseAddress + DAC960_PG_StatusRegisterOffset);
4082 }
4083
4084 static inline bool
4085 DAC960_PG_ReadErrorStatus(void __iomem *ControllerBaseAddress,
4086 unsigned char *ErrorStatus,
4087 unsigned char *Parameter0,
4088 unsigned char *Parameter1)
4089 {
4090 DAC960_PG_ErrorStatusRegister_T ErrorStatusRegister;
4091 ErrorStatusRegister.All =
4092 readb(ControllerBaseAddress + DAC960_PG_ErrorStatusRegisterOffset);
4093 if (!ErrorStatusRegister.Bits.ErrorStatusPending) return false;
4094 ErrorStatusRegister.Bits.ErrorStatusPending = false;
4095 *ErrorStatus = ErrorStatusRegister.All;
4096 *Parameter0 =
4097 readb(ControllerBaseAddress + DAC960_PG_CommandOpcodeRegisterOffset);
4098 *Parameter1 =
4099 readb(ControllerBaseAddress + DAC960_PG_CommandIdentifierRegisterOffset);
4100 writeb(0, ControllerBaseAddress + DAC960_PG_ErrorStatusRegisterOffset);
4101 return true;
4102 }
4103
4104 /*
4105 Define the DAC960 PD Series Controller Interface Register Offsets.
4106 */
4107
4108 #define DAC960_PD_RegisterWindowSize 0x80
4109
4110 typedef enum
4111 {
4112 DAC960_PD_CommandOpcodeRegisterOffset = 0x00,
4113 DAC960_PD_CommandIdentifierRegisterOffset = 0x01,
4114 DAC960_PD_MailboxRegister2Offset = 0x02,
4115 DAC960_PD_MailboxRegister3Offset = 0x03,
4116 DAC960_PD_MailboxRegister4Offset = 0x04,
4117 DAC960_PD_MailboxRegister5Offset = 0x05,
4118 DAC960_PD_MailboxRegister6Offset = 0x06,
4119 DAC960_PD_MailboxRegister7Offset = 0x07,
4120 DAC960_PD_MailboxRegister8Offset = 0x08,
4121 DAC960_PD_MailboxRegister9Offset = 0x09,
4122 DAC960_PD_MailboxRegister10Offset = 0x0A,
4123 DAC960_PD_MailboxRegister11Offset = 0x0B,
4124 DAC960_PD_MailboxRegister12Offset = 0x0C,
4125 DAC960_PD_StatusCommandIdentifierRegOffset = 0x0D,
4126 DAC960_PD_StatusRegisterOffset = 0x0E,
4127 DAC960_PD_ErrorStatusRegisterOffset = 0x3F,
4128 DAC960_PD_InboundDoorBellRegisterOffset = 0x40,
4129 DAC960_PD_OutboundDoorBellRegisterOffset = 0x41,
4130 DAC960_PD_InterruptEnableRegisterOffset = 0x43
4131 }
4132 DAC960_PD_RegisterOffsets_T;
4133
4134
4135 /*
4136 Define the structure of the DAC960 PD Series Inbound Door Bell Register.
4137 */
4138
4139 typedef union DAC960_PD_InboundDoorBellRegister
4140 {
4141 unsigned char All;
4142 struct {
4143 bool NewCommand:1; /* Bit 0 */
4144 bool AcknowledgeStatus:1; /* Bit 1 */
4145 bool GenerateInterrupt:1; /* Bit 2 */
4146 bool ControllerReset:1; /* Bit 3 */
4147 unsigned char :4; /* Bits 4-7 */
4148 } Write;
4149 struct {
4150 bool MailboxFull:1; /* Bit 0 */
4151 bool InitializationInProgress:1; /* Bit 1 */
4152 unsigned char :6; /* Bits 2-7 */
4153 } Read;
4154 }
4155 DAC960_PD_InboundDoorBellRegister_T;
4156
4157
4158 /*
4159 Define the structure of the DAC960 PD Series Outbound Door Bell Register.
4160 */
4161
4162 typedef union DAC960_PD_OutboundDoorBellRegister
4163 {
4164 unsigned char All;
4165 struct {
4166 bool AcknowledgeInterrupt:1; /* Bit 0 */
4167 unsigned char :7; /* Bits 1-7 */
4168 } Write;
4169 struct {
4170 bool StatusAvailable:1; /* Bit 0 */
4171 unsigned char :7; /* Bits 1-7 */
4172 } Read;
4173 }
4174 DAC960_PD_OutboundDoorBellRegister_T;
4175
4176
4177 /*
4178 Define the structure of the DAC960 PD Series Interrupt Enable Register.
4179 */
4180
4181 typedef union DAC960_PD_InterruptEnableRegister
4182 {
4183 unsigned char All;
4184 struct {
4185 bool EnableInterrupts:1; /* Bit 0 */
4186 unsigned char :7; /* Bits 1-7 */
4187 } Bits;
4188 }
4189 DAC960_PD_InterruptEnableRegister_T;
4190
4191
4192 /*
4193 Define the structure of the DAC960 PD Series Error Status Register.
4194 */
4195
4196 typedef union DAC960_PD_ErrorStatusRegister
4197 {
4198 unsigned char All;
4199 struct {
4200 unsigned int :2; /* Bits 0-1 */
4201 bool ErrorStatusPending:1; /* Bit 2 */
4202 unsigned int :5; /* Bits 3-7 */
4203 } Bits;
4204 }
4205 DAC960_PD_ErrorStatusRegister_T;
4206
4207
4208 /*
4209 Define inline functions to provide an abstraction for reading and writing the
4210 DAC960 PD Series Controller Interface Registers.
4211 */
4212
4213 static inline
4214 void DAC960_PD_NewCommand(void __iomem *ControllerBaseAddress)
4215 {
4216 DAC960_PD_InboundDoorBellRegister_T InboundDoorBellRegister;
4217 InboundDoorBellRegister.All = 0;
4218 InboundDoorBellRegister.Write.NewCommand = true;
4219 writeb(InboundDoorBellRegister.All,
4220 ControllerBaseAddress + DAC960_PD_InboundDoorBellRegisterOffset);
4221 }
4222
4223 static inline
4224 void DAC960_PD_AcknowledgeStatus(void __iomem *ControllerBaseAddress)
4225 {
4226 DAC960_PD_InboundDoorBellRegister_T InboundDoorBellRegister;
4227 InboundDoorBellRegister.All = 0;
4228 InboundDoorBellRegister.Write.AcknowledgeStatus = true;
4229 writeb(InboundDoorBellRegister.All,
4230 ControllerBaseAddress + DAC960_PD_InboundDoorBellRegisterOffset);
4231 }
4232
4233 static inline
4234 void DAC960_PD_GenerateInterrupt(void __iomem *ControllerBaseAddress)
4235 {
4236 DAC960_PD_InboundDoorBellRegister_T InboundDoorBellRegister;
4237 InboundDoorBellRegister.All = 0;
4238 InboundDoorBellRegister.Write.GenerateInterrupt = true;
4239 writeb(InboundDoorBellRegister.All,
4240 ControllerBaseAddress + DAC960_PD_InboundDoorBellRegisterOffset);
4241 }
4242
4243 static inline
4244 void DAC960_PD_ControllerReset(void __iomem *ControllerBaseAddress)
4245 {
4246 DAC960_PD_InboundDoorBellRegister_T InboundDoorBellRegister;
4247 InboundDoorBellRegister.All = 0;
4248 InboundDoorBellRegister.Write.ControllerReset = true;
4249 writeb(InboundDoorBellRegister.All,
4250 ControllerBaseAddress + DAC960_PD_InboundDoorBellRegisterOffset);
4251 }
4252
4253 static inline
4254 bool DAC960_PD_MailboxFullP(void __iomem *ControllerBaseAddress)
4255 {
4256 DAC960_PD_InboundDoorBellRegister_T InboundDoorBellRegister;
4257 InboundDoorBellRegister.All =
4258 readb(ControllerBaseAddress + DAC960_PD_InboundDoorBellRegisterOffset);
4259 return InboundDoorBellRegister.Read.MailboxFull;
4260 }
4261
4262 static inline
4263 bool DAC960_PD_InitializationInProgressP(void __iomem *ControllerBaseAddress)
4264 {
4265 DAC960_PD_InboundDoorBellRegister_T InboundDoorBellRegister;
4266 InboundDoorBellRegister.All =
4267 readb(ControllerBaseAddress + DAC960_PD_InboundDoorBellRegisterOffset);
4268 return InboundDoorBellRegister.Read.InitializationInProgress;
4269 }
4270
4271 static inline
4272 void DAC960_PD_AcknowledgeInterrupt(void __iomem *ControllerBaseAddress)
4273 {
4274 DAC960_PD_OutboundDoorBellRegister_T OutboundDoorBellRegister;
4275 OutboundDoorBellRegister.All = 0;
4276 OutboundDoorBellRegister.Write.AcknowledgeInterrupt = true;
4277 writeb(OutboundDoorBellRegister.All,
4278 ControllerBaseAddress + DAC960_PD_OutboundDoorBellRegisterOffset);
4279 }
4280
4281 static inline
4282 bool DAC960_PD_StatusAvailableP(void __iomem *ControllerBaseAddress)
4283 {
4284 DAC960_PD_OutboundDoorBellRegister_T OutboundDoorBellRegister;
4285 OutboundDoorBellRegister.All =
4286 readb(ControllerBaseAddress + DAC960_PD_OutboundDoorBellRegisterOffset);
4287 return OutboundDoorBellRegister.Read.StatusAvailable;
4288 }
4289
4290 static inline
4291 void DAC960_PD_EnableInterrupts(void __iomem *ControllerBaseAddress)
4292 {
4293 DAC960_PD_InterruptEnableRegister_T InterruptEnableRegister;
4294 InterruptEnableRegister.All = 0;
4295 InterruptEnableRegister.Bits.EnableInterrupts = true;
4296 writeb(InterruptEnableRegister.All,
4297 ControllerBaseAddress + DAC960_PD_InterruptEnableRegisterOffset);
4298 }
4299
4300 static inline
4301 void DAC960_PD_DisableInterrupts(void __iomem *ControllerBaseAddress)
4302 {
4303 DAC960_PD_InterruptEnableRegister_T InterruptEnableRegister;
4304 InterruptEnableRegister.All = 0;
4305 InterruptEnableRegister.Bits.EnableInterrupts = false;
4306 writeb(InterruptEnableRegister.All,
4307 ControllerBaseAddress + DAC960_PD_InterruptEnableRegisterOffset);
4308 }
4309
4310 static inline
4311 bool DAC960_PD_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
4312 {
4313 DAC960_PD_InterruptEnableRegister_T InterruptEnableRegister;
4314 InterruptEnableRegister.All =
4315 readb(ControllerBaseAddress + DAC960_PD_InterruptEnableRegisterOffset);
4316 return InterruptEnableRegister.Bits.EnableInterrupts;
4317 }
4318
4319 static inline
4320 void DAC960_PD_WriteCommandMailbox(void __iomem *ControllerBaseAddress,
4321 DAC960_V1_CommandMailbox_T *CommandMailbox)
4322 {
4323 writel(CommandMailbox->Words[0],
4324 ControllerBaseAddress + DAC960_PD_CommandOpcodeRegisterOffset);
4325 writel(CommandMailbox->Words[1],
4326 ControllerBaseAddress + DAC960_PD_MailboxRegister4Offset);
4327 writel(CommandMailbox->Words[2],
4328 ControllerBaseAddress + DAC960_PD_MailboxRegister8Offset);
4329 writeb(CommandMailbox->Bytes[12],
4330 ControllerBaseAddress + DAC960_PD_MailboxRegister12Offset);
4331 }
4332
4333 static inline DAC960_V1_CommandIdentifier_T
4334 DAC960_PD_ReadStatusCommandIdentifier(void __iomem *ControllerBaseAddress)
4335 {
4336 return readb(ControllerBaseAddress
4337 + DAC960_PD_StatusCommandIdentifierRegOffset);
4338 }
4339
4340 static inline DAC960_V1_CommandStatus_T
4341 DAC960_PD_ReadStatusRegister(void __iomem *ControllerBaseAddress)
4342 {
4343 return readw(ControllerBaseAddress + DAC960_PD_StatusRegisterOffset);
4344 }
4345
4346 static inline bool
4347 DAC960_PD_ReadErrorStatus(void __iomem *ControllerBaseAddress,
4348 unsigned char *ErrorStatus,
4349 unsigned char *Parameter0,
4350 unsigned char *Parameter1)
4351 {
4352 DAC960_PD_ErrorStatusRegister_T ErrorStatusRegister;
4353 ErrorStatusRegister.All =
4354 readb(ControllerBaseAddress + DAC960_PD_ErrorStatusRegisterOffset);
4355 if (!ErrorStatusRegister.Bits.ErrorStatusPending) return false;
4356 ErrorStatusRegister.Bits.ErrorStatusPending = false;
4357 *ErrorStatus = ErrorStatusRegister.All;
4358 *Parameter0 =
4359 readb(ControllerBaseAddress + DAC960_PD_CommandOpcodeRegisterOffset);
4360 *Parameter1 =
4361 readb(ControllerBaseAddress + DAC960_PD_CommandIdentifierRegisterOffset);
4362 writeb(0, ControllerBaseAddress + DAC960_PD_ErrorStatusRegisterOffset);
4363 return true;
4364 }
4365
4366 static inline void DAC960_P_To_PD_TranslateEnquiry(void *Enquiry)
4367 {
4368 memcpy(Enquiry + 132, Enquiry + 36, 64);
4369 memset(Enquiry + 36, 0, 96);
4370 }
4371
4372 static inline void DAC960_P_To_PD_TranslateDeviceState(void *DeviceState)
4373 {
4374 memcpy(DeviceState + 2, DeviceState + 3, 1);
4375 memmove(DeviceState + 4, DeviceState + 5, 2);
4376 memmove(DeviceState + 6, DeviceState + 8, 4);
4377 }
4378
4379 static inline
4380 void DAC960_PD_To_P_TranslateReadWriteCommand(DAC960_V1_CommandMailbox_T
4381 *CommandMailbox)
4382 {
4383 int LogicalDriveNumber = CommandMailbox->Type5.LD.LogicalDriveNumber;
4384 CommandMailbox->Bytes[3] &= 0x7;
4385 CommandMailbox->Bytes[3] |= CommandMailbox->Bytes[7] << 6;
4386 CommandMailbox->Bytes[7] = LogicalDriveNumber;
4387 }
4388
4389 static inline
4390 void DAC960_P_To_PD_TranslateReadWriteCommand(DAC960_V1_CommandMailbox_T
4391 *CommandMailbox)
4392 {
4393 int LogicalDriveNumber = CommandMailbox->Bytes[7];
4394 CommandMailbox->Bytes[7] = CommandMailbox->Bytes[3] >> 6;
4395 CommandMailbox->Bytes[3] &= 0x7;
4396 CommandMailbox->Bytes[3] |= LogicalDriveNumber << 3;
4397 }
4398
4399
4400 /*
4401 Define prototypes for the forward referenced DAC960 Driver Internal Functions.
4402 */
4403
4404 static void DAC960_FinalizeController(DAC960_Controller_T *);
4405 static void DAC960_V1_QueueReadWriteCommand(DAC960_Command_T *);
4406 static void DAC960_V2_QueueReadWriteCommand(DAC960_Command_T *);
4407 static void DAC960_RequestFunction(struct request_queue *);
4408 static irqreturn_t DAC960_BA_InterruptHandler(int, void *);
4409 static irqreturn_t DAC960_LP_InterruptHandler(int, void *);
4410 static irqreturn_t DAC960_LA_InterruptHandler(int, void *);
4411 static irqreturn_t DAC960_PG_InterruptHandler(int, void *);
4412 static irqreturn_t DAC960_PD_InterruptHandler(int, void *);
4413 static irqreturn_t DAC960_P_InterruptHandler(int, void *);
4414 static void DAC960_V1_QueueMonitoringCommand(DAC960_Command_T *);
4415 static void DAC960_V2_QueueMonitoringCommand(DAC960_Command_T *);
4416 static void DAC960_MonitoringTimerFunction(unsigned long);
4417 static void DAC960_Message(DAC960_MessageLevel_T, unsigned char *,
4418 DAC960_Controller_T *, ...);
4419 static void DAC960_CreateProcEntries(DAC960_Controller_T *);
4420 static void DAC960_DestroyProcEntries(DAC960_Controller_T *);
4421
4422 #endif /* DAC960_DriverVersion */