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