DAC960.h
上传用户:ajay2009
上传日期:2009-05-22
资源大小:495k
文件大小:149k
源码类别:

驱动编程

开发平台:

Unix_Linux

  1. /*
  2.   Linux Driver for Mylex DAC960/AcceleRAID/eXtremeRAID PCI RAID Controllers
  3.   Copyright 1998-2001 by Leonard N. Zubkoff <lnz@dandelion.com>
  4.   This program is free software; you may redistribute and/or modify it under
  5.   the terms of the GNU General Public License Version 2 as published by the
  6.   Free Software Foundation.
  7.   This program is distributed in the hope that it will be useful, but
  8.   WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
  9.   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  10.   for complete details.
  11.   The author respectfully requests that any modifications to this software be
  12.   sent directly to him for evaluation and testing.
  13. */
  14. /*
  15.   Define the maximum number of DAC960 Controllers supported by this driver.
  16. */
  17. #define DAC960_MaxControllers 8
  18. /*
  19.   Define the maximum number of Controller Channels supported by DAC960
  20.   V1 and V2 Firmware Controllers.
  21. */
  22. #define DAC960_V1_MaxChannels 3
  23. #define DAC960_V2_MaxChannels 4
  24. /*
  25.   Define the maximum number of Targets per Channel supported by DAC960
  26.   V1 and V2 Firmware Controllers.
  27. */
  28. #define DAC960_V1_MaxTargets 16
  29. #define DAC960_V2_MaxTargets 128
  30. /*
  31.   Define the maximum number of Logical Drives supported by DAC960
  32.   V1 and V2 Firmware Controllers.
  33. */
  34. #define DAC960_MaxLogicalDrives 32
  35. /*
  36.   Define the maximum number of Physical Devices supported by DAC960
  37.   V1 and V2 Firmware Controllers.
  38. */
  39. #define DAC960_V1_MaxPhysicalDevices 45
  40. #define DAC960_V2_MaxPhysicalDevices 272
  41. /*
  42.   Define the pci dma mask supported by DAC960 V1 and V2 Firmware Controlers
  43.  */
  44. #define DAC690_V1_PciDmaMask 0xffffffff
  45. #define DAC690_V2_PciDmaMask 0xffffffffffffffffULL
  46. /*
  47.   Define a Boolean data type.
  48. */
  49. typedef enum { false, true } __attribute__ ((packed)) boolean;
  50. /*
  51.   Define a 32/64 bit I/O Address data type.
  52. */
  53. typedef unsigned long DAC960_IO_Address_T;
  54. /*
  55.   Define a 32/64 bit PCI Bus Address data type.
  56. */
  57. typedef unsigned long DAC960_PCI_Address_T;
  58. /*
  59.   Define a 32 bit Bus Address data type.
  60. */
  61. typedef unsigned int DAC960_BusAddress32_T;
  62. /*
  63.   Define a 64 bit Bus Address data type.
  64. */
  65. typedef unsigned long long DAC960_BusAddress64_T;
  66. /*
  67.   Define a 32 bit Byte Count data type.
  68. */
  69. typedef unsigned int DAC960_ByteCount32_T;
  70. /*
  71.   Define a 64 bit Byte Count data type.
  72. */
  73. typedef unsigned long long DAC960_ByteCount64_T;
  74. /*
  75.   dma_loaf is used by helper routines to divide a region of
  76.   dma mapped memory into smaller pieces, where those pieces
  77.   are not of uniform size.
  78.  */
  79. struct dma_loaf {
  80. void *cpu_base;
  81. dma_addr_t dma_base;
  82. size_t  length;
  83. void *cpu_free;
  84. dma_addr_t dma_free;
  85. };
  86. /*
  87.   Define the SCSI INQUIRY Standard Data structure.
  88. */
  89. typedef struct DAC960_SCSI_Inquiry
  90. {
  91.   unsigned char PeripheralDeviceType:5; /* Byte 0 Bits 0-4 */
  92.   unsigned char PeripheralQualifier:3; /* Byte 0 Bits 5-7 */
  93.   unsigned char DeviceTypeModifier:7; /* Byte 1 Bits 0-6 */
  94.   boolean RMB:1; /* Byte 1 Bit 7 */
  95.   unsigned char ANSI_ApprovedVersion:3; /* Byte 2 Bits 0-2 */
  96.   unsigned char ECMA_Version:3; /* Byte 2 Bits 3-5 */
  97.   unsigned char ISO_Version:2; /* Byte 2 Bits 6-7 */
  98.   unsigned char ResponseDataFormat:4; /* Byte 3 Bits 0-3 */
  99.   unsigned char :2; /* Byte 3 Bits 4-5 */
  100.   boolean TrmIOP:1; /* Byte 3 Bit 6 */
  101.   boolean AENC:1; /* Byte 3 Bit 7 */
  102.   unsigned char AdditionalLength; /* Byte 4 */
  103.   unsigned char :8; /* Byte 5 */
  104.   unsigned char :8; /* Byte 6 */
  105.   boolean SftRe:1; /* Byte 7 Bit 0 */
  106.   boolean CmdQue:1; /* Byte 7 Bit 1 */
  107.   boolean :1; /* Byte 7 Bit 2 */
  108.   boolean Linked:1; /* Byte 7 Bit 3 */
  109.   boolean Sync:1; /* Byte 7 Bit 4 */
  110.   boolean WBus16:1; /* Byte 7 Bit 5 */
  111.   boolean WBus32:1; /* Byte 7 Bit 6 */
  112.   boolean RelAdr:1; /* Byte 7 Bit 7 */
  113.   unsigned char VendorIdentification[8]; /* Bytes 8-15 */
  114.   unsigned char ProductIdentification[16]; /* Bytes 16-31 */
  115.   unsigned char ProductRevisionLevel[4]; /* Bytes 32-35 */
  116. }
  117. DAC960_SCSI_Inquiry_T;
  118. /*
  119.   Define the SCSI INQUIRY Unit Serial Number structure.
  120. */
  121. typedef struct DAC960_SCSI_Inquiry_UnitSerialNumber
  122. {
  123.   unsigned char PeripheralDeviceType:5; /* Byte 0 Bits 0-4 */
  124.   unsigned char PeripheralQualifier:3; /* Byte 0 Bits 5-7 */
  125.   unsigned char PageCode; /* Byte 1 */
  126.   unsigned char :8; /* Byte 2 */
  127.   unsigned char PageLength; /* Byte 3 */
  128.   unsigned char ProductSerialNumber[28]; /* Bytes 4-31 */
  129. }
  130. DAC960_SCSI_Inquiry_UnitSerialNumber_T;
  131. /*
  132.   Define the SCSI REQUEST SENSE Sense Key type.
  133. */
  134. typedef enum
  135. {
  136.   DAC960_SenseKey_NoSense = 0x0,
  137.   DAC960_SenseKey_RecoveredError = 0x1,
  138.   DAC960_SenseKey_NotReady = 0x2,
  139.   DAC960_SenseKey_MediumError = 0x3,
  140.   DAC960_SenseKey_HardwareError = 0x4,
  141.   DAC960_SenseKey_IllegalRequest = 0x5,
  142.   DAC960_SenseKey_UnitAttention = 0x6,
  143.   DAC960_SenseKey_DataProtect = 0x7,
  144.   DAC960_SenseKey_BlankCheck = 0x8,
  145.   DAC960_SenseKey_VendorSpecific = 0x9,
  146.   DAC960_SenseKey_CopyAborted = 0xA,
  147.   DAC960_SenseKey_AbortedCommand = 0xB,
  148.   DAC960_SenseKey_Equal = 0xC,
  149.   DAC960_SenseKey_VolumeOverflow = 0xD,
  150.   DAC960_SenseKey_Miscompare = 0xE,
  151.   DAC960_SenseKey_Reserved = 0xF
  152. }
  153. __attribute__ ((packed))
  154. DAC960_SCSI_RequestSenseKey_T;
  155. /*
  156.   Define the SCSI REQUEST SENSE structure.
  157. */
  158. typedef struct DAC960_SCSI_RequestSense
  159. {
  160.   unsigned char ErrorCode:7; /* Byte 0 Bits 0-6 */
  161.   boolean Valid:1; /* Byte 0 Bit 7 */
  162.   unsigned char SegmentNumber; /* Byte 1 */
  163.   DAC960_SCSI_RequestSenseKey_T SenseKey:4; /* Byte 2 Bits 0-3 */
  164.   unsigned char :1; /* Byte 2 Bit 4 */
  165.   boolean ILI:1; /* Byte 2 Bit 5 */
  166.   boolean EOM:1; /* Byte 2 Bit 6 */
  167.   boolean Filemark:1; /* Byte 2 Bit 7 */
  168.   unsigned char Information[4]; /* Bytes 3-6 */
  169.   unsigned char AdditionalSenseLength; /* Byte 7 */
  170.   unsigned char CommandSpecificInformation[4]; /* Bytes 8-11 */
  171.   unsigned char AdditionalSenseCode; /* Byte 12 */
  172.   unsigned char AdditionalSenseCodeQualifier; /* Byte 13 */
  173. }
  174. DAC960_SCSI_RequestSense_T;
  175. /*
  176.   Define the DAC960 V1 Firmware Command Opcodes.
  177. */
  178. typedef enum
  179. {
  180.   /* I/O Commands */
  181.   DAC960_V1_ReadExtended = 0x33,
  182.   DAC960_V1_WriteExtended = 0x34,
  183.   DAC960_V1_ReadAheadExtended = 0x35,
  184.   DAC960_V1_ReadExtendedWithScatterGather = 0xB3,
  185.   DAC960_V1_WriteExtendedWithScatterGather = 0xB4,
  186.   DAC960_V1_Read = 0x36,
  187.   DAC960_V1_ReadWithScatterGather = 0xB6,
  188.   DAC960_V1_Write = 0x37,
  189.   DAC960_V1_WriteWithScatterGather = 0xB7,
  190.   DAC960_V1_DCDB = 0x04,
  191.   DAC960_V1_DCDBWithScatterGather = 0x84,
  192.   DAC960_V1_Flush = 0x0A,
  193.   /* Controller Status Related Commands */
  194.   DAC960_V1_Enquiry = 0x53,
  195.   DAC960_V1_Enquiry2 = 0x1C,
  196.   DAC960_V1_GetLogicalDriveElement = 0x55,
  197.   DAC960_V1_GetLogicalDriveInformation = 0x19,
  198.   DAC960_V1_IOPortRead = 0x39,
  199.   DAC960_V1_IOPortWrite = 0x3A,
  200.   DAC960_V1_GetSDStats = 0x3E,
  201.   DAC960_V1_GetPDStats = 0x3F,
  202.   DAC960_V1_PerformEventLogOperation = 0x72,
  203.   /* Device Related Commands */
  204.   DAC960_V1_StartDevice = 0x10,
  205.   DAC960_V1_GetDeviceState = 0x50,
  206.   DAC960_V1_StopChannel = 0x13,
  207.   DAC960_V1_StartChannel = 0x12,
  208.   DAC960_V1_ResetChannel = 0x1A,
  209.   /* Commands Associated with Data Consistency and Errors */
  210.   DAC960_V1_Rebuild = 0x09,
  211.   DAC960_V1_RebuildAsync = 0x16,
  212.   DAC960_V1_CheckConsistency = 0x0F,
  213.   DAC960_V1_CheckConsistencyAsync = 0x1E,
  214.   DAC960_V1_RebuildStat = 0x0C,
  215.   DAC960_V1_GetRebuildProgress = 0x27,
  216.   DAC960_V1_RebuildControl = 0x1F,
  217.   DAC960_V1_ReadBadBlockTable = 0x0B,
  218.   DAC960_V1_ReadBadDataTable = 0x25,
  219.   DAC960_V1_ClearBadDataTable = 0x26,
  220.   DAC960_V1_GetErrorTable = 0x17,
  221.   DAC960_V1_AddCapacityAsync = 0x2A,
  222.   DAC960_V1_BackgroundInitializationControl = 0x2B,
  223.   /* Configuration Related Commands */
  224.   DAC960_V1_ReadConfig2 = 0x3D,
  225.   DAC960_V1_WriteConfig2 = 0x3C,
  226.   DAC960_V1_ReadConfigurationOnDisk = 0x4A,
  227.   DAC960_V1_WriteConfigurationOnDisk = 0x4B,
  228.   DAC960_V1_ReadConfiguration = 0x4E,
  229.   DAC960_V1_ReadBackupConfiguration = 0x4D,
  230.   DAC960_V1_WriteConfiguration = 0x4F,
  231.   DAC960_V1_AddConfiguration = 0x4C,
  232.   DAC960_V1_ReadConfigurationLabel = 0x48,
  233.   DAC960_V1_WriteConfigurationLabel = 0x49,
  234.   /* Firmware Upgrade Related Commands */
  235.   DAC960_V1_LoadImage = 0x20,
  236.   DAC960_V1_StoreImage = 0x21,
  237.   DAC960_V1_ProgramImage = 0x22,
  238.   /* Diagnostic Commands */
  239.   DAC960_V1_SetDiagnosticMode = 0x31,
  240.   DAC960_V1_RunDiagnostic = 0x32,
  241.   /* Subsystem Service Commands */
  242.   DAC960_V1_GetSubsystemData = 0x70,
  243.   DAC960_V1_SetSubsystemParameters = 0x71,
  244.   /* Version 2.xx Firmware Commands */
  245.   DAC960_V1_Enquiry_Old = 0x05,
  246.   DAC960_V1_GetDeviceState_Old = 0x14,
  247.   DAC960_V1_Read_Old = 0x02,
  248.   DAC960_V1_Write_Old = 0x03,
  249.   DAC960_V1_ReadWithScatterGather_Old = 0x82,
  250.   DAC960_V1_WriteWithScatterGather_Old = 0x83
  251. }
  252. __attribute__ ((packed))
  253. DAC960_V1_CommandOpcode_T;
  254. /*
  255.   Define the DAC960 V1 Firmware Command Identifier type.
  256. */
  257. typedef unsigned char DAC960_V1_CommandIdentifier_T;
  258. /*
  259.   Define the DAC960 V1 Firmware Command Status Codes.
  260. */
  261. #define DAC960_V1_NormalCompletion 0x0000 /* Common */
  262. #define DAC960_V1_CheckConditionReceived 0x0002 /* Common */
  263. #define DAC960_V1_NoDeviceAtAddress 0x0102 /* Common */
  264. #define DAC960_V1_InvalidDeviceAddress 0x0105 /* Common */
  265. #define DAC960_V1_InvalidParameter 0x0105 /* Common */
  266. #define DAC960_V1_IrrecoverableDataError 0x0001 /* I/O */
  267. #define DAC960_V1_LogicalDriveNonexistentOrOffline 0x0002 /* I/O */
  268. #define DAC960_V1_AccessBeyondEndOfLogicalDrive 0x0105 /* I/O */
  269. #define DAC960_V1_BadDataEncountered 0x010C /* I/O */
  270. #define DAC960_V1_DeviceBusy 0x0008 /* DCDB */
  271. #define DAC960_V1_DeviceNonresponsive 0x000E /* DCDB */
  272. #define DAC960_V1_CommandTerminatedAbnormally 0x000F /* DCDB */
  273. #define DAC960_V1_UnableToStartDevice 0x0002 /* Device */
  274. #define DAC960_V1_InvalidChannelOrTargetOrModifier 0x0105 /* Device */
  275. #define DAC960_V1_ChannelBusy 0x0106 /* Device */
  276. #define DAC960_V1_ChannelNotStopped 0x0002 /* Device */
  277. #define DAC960_V1_AttemptToRebuildOnlineDrive 0x0002 /* Consistency */
  278. #define DAC960_V1_RebuildBadBlocksEncountered 0x0003 /* Consistency */
  279. #define DAC960_V1_NewDiskFailedDuringRebuild 0x0004 /* Consistency */
  280. #define DAC960_V1_RebuildOrCheckAlreadyInProgress 0x0106 /* Consistency */
  281. #define DAC960_V1_DependentDiskIsDead 0x0002 /* Consistency */
  282. #define DAC960_V1_InconsistentBlocksFound 0x0003 /* Consistency */
  283. #define DAC960_V1_InvalidOrNonredundantLogicalDrive 0x0105 /* Consistency */
  284. #define DAC960_V1_NoRebuildOrCheckInProgress 0x0105 /* Consistency */
  285. #define DAC960_V1_RebuildInProgress_DataValid 0x0000 /* Consistency */
  286. #define DAC960_V1_RebuildFailed_LogicalDriveFailure 0x0002 /* Consistency */
  287. #define DAC960_V1_RebuildFailed_BadBlocksOnOther 0x0003 /* Consistency */
  288. #define DAC960_V1_RebuildFailed_NewDriveFailed 0x0004 /* Consistency */
  289. #define DAC960_V1_RebuildSuccessful 0x0100 /* Consistency */
  290. #define DAC960_V1_RebuildSuccessfullyTerminated 0x0107 /* Consistency */
  291. #define DAC960_V1_BackgroundInitSuccessful 0x0100 /* Consistency */
  292. #define DAC960_V1_BackgroundInitAborted 0x0005 /* Consistency */
  293. #define DAC960_V1_NoBackgroundInitInProgress 0x0105 /* Consistency */
  294. #define DAC960_V1_AddCapacityInProgress 0x0004 /* Consistency */
  295. #define DAC960_V1_AddCapacityFailedOrSuspended 0x00F4 /* Consistency */
  296. #define DAC960_V1_Config2ChecksumError 0x0002 /* Configuration */
  297. #define DAC960_V1_ConfigurationSuspended 0x0106 /* Configuration */
  298. #define DAC960_V1_FailedToConfigureNVRAM 0x0105 /* Configuration */
  299. #define DAC960_V1_ConfigurationNotSavedStateChange 0x0106 /* Configuration */
  300. #define DAC960_V1_SubsystemNotInstalled 0x0001 /* Subsystem */
  301. #define DAC960_V1_SubsystemFailed 0x0002 /* Subsystem */
  302. #define DAC960_V1_SubsystemBusy 0x0106 /* Subsystem */
  303. typedef unsigned short DAC960_V1_CommandStatus_T;
  304. /*
  305.   Define the DAC960 V1 Firmware Enquiry Command reply structure.
  306. */
  307. typedef struct DAC960_V1_Enquiry
  308. {
  309.   unsigned char NumberOfLogicalDrives; /* Byte 0 */
  310.   unsigned int :24; /* Bytes 1-3 */
  311.   unsigned int LogicalDriveSizes[32]; /* Bytes 4-131 */
  312.   unsigned short FlashAge; /* Bytes 132-133 */
  313.   struct {
  314.     boolean DeferredWriteError:1; /* Byte 134 Bit 0 */
  315.     boolean BatteryLow:1; /* Byte 134 Bit 1 */
  316.     unsigned char :6; /* Byte 134 Bits 2-7 */
  317.   } StatusFlags;
  318.   unsigned char :8; /* Byte 135 */
  319.   unsigned char MinorFirmwareVersion; /* Byte 136 */
  320.   unsigned char MajorFirmwareVersion; /* Byte 137 */
  321.   enum {
  322.     DAC960_V1_NoStandbyRebuildOrCheckInProgress =     0x00,
  323.     DAC960_V1_StandbyRebuildInProgress =     0x01,
  324.     DAC960_V1_BackgroundRebuildInProgress =     0x02,
  325.     DAC960_V1_BackgroundCheckInProgress =     0x03,
  326.     DAC960_V1_StandbyRebuildCompletedWithError =     0xFF,
  327.     DAC960_V1_BackgroundRebuildOrCheckFailed_DriveFailed =     0xF0,
  328.     DAC960_V1_BackgroundRebuildOrCheckFailed_LogicalDriveFailed =   0xF1,
  329.     DAC960_V1_BackgroundRebuildOrCheckFailed_OtherCauses =     0xF2,
  330.     DAC960_V1_BackgroundRebuildOrCheckSuccessfullyTerminated =     0xF3
  331.   } __attribute__ ((packed)) RebuildFlag; /* Byte 138 */
  332.   unsigned char MaxCommands; /* Byte 139 */
  333.   unsigned char OfflineLogicalDriveCount; /* Byte 140 */
  334.   unsigned char :8; /* Byte 141 */
  335.   unsigned short EventLogSequenceNumber; /* Bytes 142-143 */
  336.   unsigned char CriticalLogicalDriveCount; /* Byte 144 */
  337.   unsigned int :24; /* Bytes 145-147 */
  338.   unsigned char DeadDriveCount; /* Byte 148 */
  339.   unsigned char :8; /* Byte 149 */
  340.   unsigned char RebuildCount; /* Byte 150 */
  341.   struct {
  342.     unsigned char :3; /* Byte 151 Bits 0-2 */
  343.     boolean BatteryBackupUnitPresent:1; /* Byte 151 Bit 3 */
  344.     unsigned char :3; /* Byte 151 Bits 4-6 */
  345.     unsigned char :1; /* Byte 151 Bit 7 */
  346.   } MiscFlags;
  347.   struct {
  348.     unsigned char TargetID;
  349.     unsigned char Channel;
  350.   } DeadDrives[21]; /* Bytes 152-194 */
  351.   unsigned char Reserved[62]; /* Bytes 195-255 */
  352. }
  353. __attribute__ ((packed))
  354. DAC960_V1_Enquiry_T;
  355. /*
  356.   Define the DAC960 V1 Firmware Enquiry2 Command reply structure.
  357. */
  358. typedef struct DAC960_V1_Enquiry2
  359. {
  360.   struct {
  361.     enum {
  362.       DAC960_V1_P_PD_PU = 0x01,
  363.       DAC960_V1_PL = 0x02,
  364.       DAC960_V1_PG = 0x10,
  365.       DAC960_V1_PJ = 0x11,
  366.       DAC960_V1_PR = 0x12,
  367.       DAC960_V1_PT = 0x13,
  368.       DAC960_V1_PTL0 = 0x14,
  369.       DAC960_V1_PRL = 0x15,
  370.       DAC960_V1_PTL1 = 0x16,
  371.       DAC960_V1_1164P = 0x20
  372.     } __attribute__ ((packed)) SubModel; /* Byte 0 */
  373.     unsigned char ActualChannels; /* Byte 1 */
  374.     enum {
  375.       DAC960_V1_FiveChannelBoard = 0x01,
  376.       DAC960_V1_ThreeChannelBoard = 0x02,
  377.       DAC960_V1_TwoChannelBoard = 0x03,
  378.       DAC960_V1_ThreeChannelASIC_DAC = 0x04
  379.     } __attribute__ ((packed)) Model; /* Byte 2 */
  380.     enum {
  381.       DAC960_V1_EISA_Controller = 0x01,
  382.       DAC960_V1_MicroChannel_Controller = 0x02,
  383.       DAC960_V1_PCI_Controller = 0x03,
  384.       DAC960_V1_SCSItoSCSI_Controller = 0x08
  385.     } __attribute__ ((packed)) ProductFamily; /* Byte 3 */
  386.   } HardwareID; /* Bytes 0-3 */
  387.   /* MajorVersion.MinorVersion-FirmwareType-TurnID */
  388.   struct {
  389.     unsigned char MajorVersion; /* Byte 4 */
  390.     unsigned char MinorVersion; /* Byte 5 */
  391.     unsigned char TurnID; /* Byte 6 */
  392.     char FirmwareType; /* Byte 7 */
  393.   } FirmwareID; /* Bytes 4-7 */
  394.   unsigned char :8; /* Byte 8 */
  395.   unsigned int :24; /* Bytes 9-11 */
  396.   unsigned char ConfiguredChannels; /* Byte 12 */
  397.   unsigned char ActualChannels; /* Byte 13 */
  398.   unsigned char MaxTargets; /* Byte 14 */
  399.   unsigned char MaxTags; /* Byte 15 */
  400.   unsigned char MaxLogicalDrives; /* Byte 16 */
  401.   unsigned char MaxArms; /* Byte 17 */
  402.   unsigned char MaxSpans; /* Byte 18 */
  403.   unsigned char :8; /* Byte 19 */
  404.   unsigned int :32; /* Bytes 20-23 */
  405.   unsigned int MemorySize; /* Bytes 24-27 */
  406.   unsigned int CacheSize; /* Bytes 28-31 */
  407.   unsigned int FlashMemorySize; /* Bytes 32-35 */
  408.   unsigned int NonVolatileMemorySize; /* Bytes 36-39 */
  409.   struct {
  410.     enum {
  411.       DAC960_V1_RamType_DRAM = 0x0,
  412.       DAC960_V1_RamType_EDO = 0x1,
  413.       DAC960_V1_RamType_SDRAM = 0x2,
  414.       DAC960_V1_RamType_Last = 0x7
  415.     } __attribute__ ((packed)) RamType:3; /* Byte 40 Bits 0-2 */
  416.     enum {
  417.       DAC960_V1_ErrorCorrection_None = 0x0,
  418.       DAC960_V1_ErrorCorrection_Parity = 0x1,
  419.       DAC960_V1_ErrorCorrection_ECC = 0x2,
  420.       DAC960_V1_ErrorCorrection_Last = 0x7
  421.     } __attribute__ ((packed)) ErrorCorrection:3; /* Byte 40 Bits 3-5 */
  422.     boolean FastPageMode:1; /* Byte 40 Bit 6 */
  423.     boolean LowPowerMemory:1; /* Byte 40 Bit 7 */
  424.     unsigned char :8; /* Bytes 41 */
  425.   } MemoryType;
  426.   unsigned short ClockSpeed; /* Bytes 42-43 */
  427.   unsigned short MemorySpeed; /* Bytes 44-45 */
  428.   unsigned short HardwareSpeed; /* Bytes 46-47 */
  429.   unsigned int :32; /* Bytes 48-51 */
  430.   unsigned int :32; /* Bytes 52-55 */
  431.   unsigned char :8; /* Byte 56 */
  432.   unsigned char :8; /* Byte 57 */
  433.   unsigned short :16; /* Bytes 58-59 */
  434.   unsigned short MaxCommands; /* Bytes 60-61 */
  435.   unsigned short MaxScatterGatherEntries; /* Bytes 62-63 */
  436.   unsigned short MaxDriveCommands; /* Bytes 64-65 */
  437.   unsigned short MaxIODescriptors; /* Bytes 66-67 */
  438.   unsigned short MaxCombinedSectors; /* Bytes 68-69 */
  439.   unsigned char Latency; /* Byte 70 */
  440.   unsigned char :8; /* Byte 71 */
  441.   unsigned char SCSITimeout; /* Byte 72 */
  442.   unsigned char :8; /* Byte 73 */
  443.   unsigned short MinFreeLines; /* Bytes 74-75 */
  444.   unsigned int :32; /* Bytes 76-79 */
  445.   unsigned int :32; /* Bytes 80-83 */
  446.   unsigned char RebuildRateConstant; /* Byte 84 */
  447.   unsigned char :8; /* Byte 85 */
  448.   unsigned char :8; /* Byte 86 */
  449.   unsigned char :8; /* Byte 87 */
  450.   unsigned int :32; /* Bytes 88-91 */
  451.   unsigned int :32; /* Bytes 92-95 */
  452.   unsigned short PhysicalDriveBlockSize; /* Bytes 96-97 */
  453.   unsigned short LogicalDriveBlockSize; /* Bytes 98-99 */
  454.   unsigned short MaxBlocksPerCommand; /* Bytes 100-101 */
  455.   unsigned short BlockFactor; /* Bytes 102-103 */
  456.   unsigned short CacheLineSize; /* Bytes 104-105 */
  457.   struct {
  458.     enum {
  459.       DAC960_V1_Narrow_8bit = 0x0,
  460.       DAC960_V1_Wide_16bit = 0x1,
  461.       DAC960_V1_Wide_32bit = 0x2
  462.     } __attribute__ ((packed)) BusWidth:2; /* Byte 106 Bits 0-1 */
  463.     enum {
  464.       DAC960_V1_Fast = 0x0,
  465.       DAC960_V1_Ultra = 0x1,
  466.       DAC960_V1_Ultra2 = 0x2
  467.     } __attribute__ ((packed)) BusSpeed:2; /* Byte 106 Bits 2-3 */
  468.     boolean Differential:1; /* Byte 106 Bit 4 */
  469.     unsigned char :3; /* Byte 106 Bits 5-7 */
  470.   } SCSICapability;
  471.   unsigned char :8; /* Byte 107 */
  472.   unsigned int :32; /* Bytes 108-111 */
  473.   unsigned short FirmwareBuildNumber; /* Bytes 112-113 */
  474.   enum {
  475.     DAC960_V1_AEMI = 0x01,
  476.     DAC960_V1_OEM1 = 0x02,
  477.     DAC960_V1_OEM2 = 0x04,
  478.     DAC960_V1_OEM3 = 0x08,
  479.     DAC960_V1_Conner = 0x10,
  480.     DAC960_V1_SAFTE = 0x20
  481.   } __attribute__ ((packed)) FaultManagementType; /* Byte 114 */
  482.   unsigned char :8; /* Byte 115 */
  483.   struct {
  484.     boolean Clustering:1; /* Byte 116 Bit 0 */
  485.     boolean MylexOnlineRAIDExpansion:1; /* Byte 116 Bit 1 */
  486.     boolean ReadAhead:1; /* Byte 116 Bit 2 */
  487.     boolean BackgroundInitialization:1; /* Byte 116 Bit 3 */
  488.     unsigned int :28; /* Bytes 116-119 */
  489.   } FirmwareFeatures;
  490.   unsigned int :32; /* Bytes 120-123 */
  491.   unsigned int :32; /* Bytes 124-127 */
  492. }
  493. DAC960_V1_Enquiry2_T;
  494. /*
  495.   Define the DAC960 V1 Firmware Logical Drive State type.
  496. */
  497. typedef enum
  498. {
  499.   DAC960_V1_LogicalDrive_Online = 0x03,
  500.   DAC960_V1_LogicalDrive_Critical = 0x04,
  501.   DAC960_V1_LogicalDrive_Offline = 0xFF
  502. }
  503. __attribute__ ((packed))
  504. DAC960_V1_LogicalDriveState_T;
  505. /*
  506.   Define the DAC960 V1 Firmware Logical Drive Information structure.
  507. */
  508. typedef struct DAC960_V1_LogicalDriveInformation
  509. {
  510.   unsigned int LogicalDriveSize; /* Bytes 0-3 */
  511.   DAC960_V1_LogicalDriveState_T LogicalDriveState; /* Byte 4 */
  512.   unsigned char RAIDLevel:7; /* Byte 5 Bits 0-6 */
  513.   boolean WriteBack:1; /* Byte 5 Bit 7 */
  514.   unsigned short :16; /* Bytes 6-7 */
  515. }
  516. DAC960_V1_LogicalDriveInformation_T;
  517. /*
  518.   Define the DAC960 V1 Firmware Get Logical Drive Information Command
  519.   reply structure.
  520. */
  521. typedef DAC960_V1_LogicalDriveInformation_T
  522. DAC960_V1_LogicalDriveInformationArray_T[DAC960_MaxLogicalDrives];
  523. /*
  524.   Define the DAC960 V1 Firmware Perform Event Log Operation Types.
  525. */
  526. typedef enum
  527. {
  528.   DAC960_V1_GetEventLogEntry = 0x00
  529. }
  530. __attribute__ ((packed))
  531. DAC960_V1_PerformEventLogOpType_T;
  532. /*
  533.   Define the DAC960 V1 Firmware Get Event Log Entry Command reply structure.
  534. */
  535. typedef struct DAC960_V1_EventLogEntry
  536. {
  537.   unsigned char MessageType; /* Byte 0 */
  538.   unsigned char MessageLength; /* Byte 1 */
  539.   unsigned char TargetID:5; /* Byte 2 Bits 0-4 */
  540.   unsigned char Channel:3; /* Byte 2 Bits 5-7 */
  541.   unsigned char LogicalUnit:6; /* Byte 3 Bits 0-5 */
  542.   unsigned char :2; /* Byte 3 Bits 6-7 */
  543.   unsigned short SequenceNumber; /* Bytes 4-5 */
  544.   unsigned char ErrorCode:7; /* Byte 6 Bits 0-6 */
  545.   boolean Valid:1; /* Byte 6 Bit 7 */
  546.   unsigned char SegmentNumber; /* Byte 7 */
  547.   DAC960_SCSI_RequestSenseKey_T SenseKey:4; /* Byte 8 Bits 0-3 */
  548.   unsigned char :1; /* Byte 8 Bit 4 */
  549.   boolean ILI:1; /* Byte 8 Bit 5 */
  550.   boolean EOM:1; /* Byte 8 Bit 6 */
  551.   boolean Filemark:1; /* Byte 8 Bit 7 */
  552.   unsigned char Information[4]; /* Bytes 9-12 */
  553.   unsigned char AdditionalSenseLength; /* Byte 13 */
  554.   unsigned char CommandSpecificInformation[4]; /* Bytes 14-17 */
  555.   unsigned char AdditionalSenseCode; /* Byte 18 */
  556.   unsigned char AdditionalSenseCodeQualifier; /* Byte 19 */
  557.   unsigned char Dummy[12]; /* Bytes 20-31 */
  558. }
  559. DAC960_V1_EventLogEntry_T;
  560. /*
  561.   Define the DAC960 V1 Firmware Physical Device State type.
  562. */
  563. typedef enum
  564. {
  565.     DAC960_V1_Device_Dead = 0x00,
  566.     DAC960_V1_Device_WriteOnly = 0x02,
  567.     DAC960_V1_Device_Online = 0x03,
  568.     DAC960_V1_Device_Standby = 0x10
  569. }
  570. __attribute__ ((packed))
  571. DAC960_V1_PhysicalDeviceState_T;
  572. /*
  573.   Define the DAC960 V1 Firmware Get Device State Command reply structure.
  574.   The structure is padded by 2 bytes for compatibility with Version 2.xx
  575.   Firmware.
  576. */
  577. typedef struct DAC960_V1_DeviceState
  578. {
  579.   boolean Present:1; /* Byte 0 Bit 0 */
  580.   unsigned char :7; /* Byte 0 Bits 1-7 */
  581.   enum {
  582.     DAC960_V1_OtherType = 0x0,
  583.     DAC960_V1_DiskType = 0x1,
  584.     DAC960_V1_SequentialType = 0x2,
  585.     DAC960_V1_CDROM_or_WORM_Type = 0x3
  586.     } __attribute__ ((packed)) DeviceType:2; /* Byte 1 Bits 0-1 */
  587.   boolean :1; /* Byte 1 Bit 2 */
  588.   boolean Fast20:1; /* Byte 1 Bit 3 */
  589.   boolean Sync:1; /* Byte 1 Bit 4 */
  590.   boolean Fast:1; /* Byte 1 Bit 5 */
  591.   boolean Wide:1; /* Byte 1 Bit 6 */
  592.   boolean TaggedQueuingSupported:1; /* Byte 1 Bit 7 */
  593.   DAC960_V1_PhysicalDeviceState_T DeviceState; /* Byte 2 */
  594.   unsigned char :8; /* Byte 3 */
  595.   unsigned char SynchronousMultiplier; /* Byte 4 */
  596.   unsigned char SynchronousOffset:5; /* Byte 5 Bits 0-4 */
  597.   unsigned char :3; /* Byte 5 Bits 5-7 */
  598.   unsigned int DiskSize __attribute__ ((packed)); /* Bytes 6-9 */
  599.   unsigned short :16; /* Bytes 10-11 */
  600. }
  601. DAC960_V1_DeviceState_T;
  602. /*
  603.   Define the DAC960 V1 Firmware Get Rebuild Progress Command reply structure.
  604. */
  605. typedef struct DAC960_V1_RebuildProgress
  606. {
  607.   unsigned int LogicalDriveNumber; /* Bytes 0-3 */
  608.   unsigned int LogicalDriveSize; /* Bytes 4-7 */
  609.   unsigned int RemainingBlocks; /* Bytes 8-11 */
  610. }
  611. DAC960_V1_RebuildProgress_T;
  612. /*
  613.   Define the DAC960 V1 Firmware Background Initialization Status Command
  614.   reply structure.
  615. */
  616. typedef struct DAC960_V1_BackgroundInitializationStatus
  617. {
  618.   unsigned int LogicalDriveSize; /* Bytes 0-3 */
  619.   unsigned int BlocksCompleted; /* Bytes 4-7 */
  620.   unsigned char Reserved1[12]; /* Bytes 8-19 */
  621.   unsigned int LogicalDriveNumber; /* Bytes 20-23 */
  622.   unsigned char RAIDLevel; /* Byte 24 */
  623.   enum {
  624.     DAC960_V1_BackgroundInitializationInvalid =     0x00,
  625.     DAC960_V1_BackgroundInitializationStarted =     0x02,
  626.     DAC960_V1_BackgroundInitializationInProgress =  0x04,
  627.     DAC960_V1_BackgroundInitializationSuspended =   0x05,
  628.     DAC960_V1_BackgroundInitializationCancelled =   0x06
  629.   } __attribute__ ((packed)) Status; /* Byte 25 */
  630.   unsigned char Reserved2[6]; /* Bytes 26-31 */
  631. }
  632. DAC960_V1_BackgroundInitializationStatus_T;
  633. /*
  634.   Define the DAC960 V1 Firmware Error Table Entry structure.
  635. */
  636. typedef struct DAC960_V1_ErrorTableEntry
  637. {
  638.   unsigned char ParityErrorCount; /* Byte 0 */
  639.   unsigned char SoftErrorCount; /* Byte 1 */
  640.   unsigned char HardErrorCount; /* Byte 2 */
  641.   unsigned char MiscErrorCount; /* Byte 3 */
  642. }
  643. DAC960_V1_ErrorTableEntry_T;
  644. /*
  645.   Define the DAC960 V1 Firmware Get Error Table Command reply structure.
  646. */
  647. typedef struct DAC960_V1_ErrorTable
  648. {
  649.   DAC960_V1_ErrorTableEntry_T
  650.     ErrorTableEntries[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets];
  651. }
  652. DAC960_V1_ErrorTable_T;
  653. /*
  654.   Define the DAC960 V1 Firmware Read Config2 Command reply structure.
  655. */
  656. typedef struct DAC960_V1_Config2
  657. {
  658.   unsigned char :1; /* Byte 0 Bit 0 */
  659.   boolean ActiveNegationEnabled:1; /* Byte 0 Bit 1 */
  660.   unsigned char :5; /* Byte 0 Bits 2-6 */
  661.   boolean NoRescanIfResetReceivedDuringScan:1; /* Byte 0 Bit 7 */
  662.   boolean StorageWorksSupportEnabled:1; /* Byte 1 Bit 0 */
  663.   boolean HewlettPackardSupportEnabled:1; /* Byte 1 Bit 1 */
  664.   boolean NoDisconnectOnFirstCommand:1; /* Byte 1 Bit 2 */
  665.   unsigned char :2; /* Byte 1 Bits 3-4 */
  666.   boolean AEMI_ARM:1; /* Byte 1 Bit 5 */
  667.   boolean AEMI_OFM:1; /* Byte 1 Bit 6 */
  668.   unsigned char :1; /* Byte 1 Bit 7 */
  669.   enum {
  670.     DAC960_V1_OEMID_Mylex = 0x00,
  671.     DAC960_V1_OEMID_IBM = 0x08,
  672.     DAC960_V1_OEMID_HP = 0x0A,
  673.     DAC960_V1_OEMID_DEC = 0x0C,
  674.     DAC960_V1_OEMID_Siemens = 0x10,
  675.     DAC960_V1_OEMID_Intel = 0x12
  676.   } __attribute__ ((packed)) OEMID; /* Byte 2 */
  677.   unsigned char OEMModelNumber; /* Byte 3 */
  678.   unsigned char PhysicalSector; /* Byte 4 */
  679.   unsigned char LogicalSector; /* Byte 5 */
  680.   unsigned char BlockFactor; /* Byte 6 */
  681.   boolean ReadAheadEnabled:1; /* Byte 7 Bit 0 */
  682.   boolean LowBIOSDelay:1; /* Byte 7 Bit 1 */
  683.   unsigned char :2; /* Byte 7 Bits 2-3 */
  684.   boolean ReassignRestrictedToOneSector:1; /* Byte 7 Bit 4 */
  685.   unsigned char :1; /* Byte 7 Bit 5 */
  686.   boolean ForceUnitAccessDuringWriteRecovery:1; /* Byte 7 Bit 6 */
  687.   boolean EnableLeftSymmetricRAID5Algorithm:1; /* Byte 7 Bit 7 */
  688.   unsigned char DefaultRebuildRate; /* Byte 8 */
  689.   unsigned char :8; /* Byte 9 */
  690.   unsigned char BlocksPerCacheLine; /* Byte 10 */
  691.   unsigned char BlocksPerStripe; /* Byte 11 */
  692.   struct {
  693.     enum {
  694.       DAC960_V1_Async = 0x0,
  695.       DAC960_V1_Sync_8MHz = 0x1,
  696.       DAC960_V1_Sync_5MHz = 0x2,
  697.       DAC960_V1_Sync_10or20MHz = 0x3 /* Byte 11 Bits 0-1 */
  698.     } __attribute__ ((packed)) Speed:2;
  699.     boolean Force8Bit:1; /* Byte 11 Bit 2 */
  700.     boolean DisableFast20:1; /* Byte 11 Bit 3 */
  701.     unsigned char :3; /* Byte 11 Bits 4-6 */
  702.     boolean EnableTaggedQueuing:1; /* Byte 11 Bit 7 */
  703.   } __attribute__ ((packed)) ChannelParameters[6]; /* Bytes 12-17 */
  704.   unsigned char SCSIInitiatorID; /* Byte 18 */
  705.   unsigned char :8; /* Byte 19 */
  706.   enum {
  707.     DAC960_V1_StartupMode_ControllerSpinUp = 0x00,
  708.     DAC960_V1_StartupMode_PowerOnSpinUp = 0x01
  709.   } __attribute__ ((packed)) StartupMode; /* Byte 20 */
  710.   unsigned char SimultaneousDeviceSpinUpCount; /* Byte 21 */
  711.   unsigned char SecondsDelayBetweenSpinUps; /* Byte 22 */
  712.   unsigned char Reserved1[29]; /* Bytes 23-51 */
  713.   boolean BIOSDisabled:1; /* Byte 52 Bit 0 */
  714.   boolean CDROMBootEnabled:1; /* Byte 52 Bit 1 */
  715.   unsigned char :3; /* Byte 52 Bits 2-4 */
  716.   enum {
  717.     DAC960_V1_Geometry_128_32 = 0x0,
  718.     DAC960_V1_Geometry_255_63 = 0x1,
  719.     DAC960_V1_Geometry_Reserved1 = 0x2,
  720.     DAC960_V1_Geometry_Reserved2 = 0x3
  721.   } __attribute__ ((packed)) DriveGeometry:2; /* Byte 52 Bits 5-6 */
  722.   unsigned char :1; /* Byte 52 Bit 7 */
  723.   unsigned char Reserved2[9]; /* Bytes 53-61 */
  724.   unsigned short Checksum; /* Bytes 62-63 */
  725. }
  726. DAC960_V1_Config2_T;
  727. /*
  728.   Define the DAC960 V1 Firmware DCDB request structure.
  729. */
  730. typedef struct DAC960_V1_DCDB
  731. {
  732.   unsigned char TargetID:4;  /* Byte 0 Bits 0-3 */
  733.   unsigned char Channel:4;  /* Byte 0 Bits 4-7 */
  734.   enum {
  735.     DAC960_V1_DCDB_NoDataTransfer = 0,
  736.     DAC960_V1_DCDB_DataTransferDeviceToSystem = 1,
  737.     DAC960_V1_DCDB_DataTransferSystemToDevice = 2,
  738.     DAC960_V1_DCDB_IllegalDataTransfer = 3
  739.   } __attribute__ ((packed)) Direction:2;  /* Byte 1 Bits 0-1 */
  740.   boolean EarlyStatus:1;  /* Byte 1 Bit 2 */
  741.   unsigned char :1;  /* Byte 1 Bit 3 */
  742.   enum {
  743.     DAC960_V1_DCDB_Timeout_24_hours = 0,
  744.     DAC960_V1_DCDB_Timeout_10_seconds = 1,
  745.     DAC960_V1_DCDB_Timeout_60_seconds = 2,
  746.     DAC960_V1_DCDB_Timeout_10_minutes = 3
  747.   } __attribute__ ((packed)) Timeout:2;  /* Byte 1 Bits 4-5 */
  748.   boolean NoAutomaticRequestSense:1;  /* Byte 1 Bit 6 */
  749.   boolean DisconnectPermitted:1;  /* Byte 1 Bit 7 */
  750.   unsigned short TransferLength;  /* Bytes 2-3 */
  751.   DAC960_BusAddress32_T BusAddress;  /* Bytes 4-7 */
  752.   unsigned char CDBLength:4;  /* Byte 8 Bits 0-3 */
  753.   unsigned char TransferLengthHigh4:4;  /* Byte 8 Bits 4-7 */
  754.   unsigned char SenseLength;  /* Byte 9 */
  755.   unsigned char CDB[12];  /* Bytes 10-21 */
  756.   unsigned char SenseData[64];  /* Bytes 22-85 */
  757.   unsigned char Status;  /* Byte 86 */
  758.   unsigned char :8;  /* Byte 87 */
  759. }
  760. DAC960_V1_DCDB_T;
  761. /*
  762.   Define the DAC960 V1 Firmware Scatter/Gather List Type 1 32 Bit Address
  763.   32 Bit Byte Count structure.
  764. */
  765. typedef struct DAC960_V1_ScatterGatherSegment
  766. {
  767.   DAC960_BusAddress32_T SegmentDataPointer; /* Bytes 0-3 */
  768.   DAC960_ByteCount32_T SegmentByteCount; /* Bytes 4-7 */
  769. }
  770. DAC960_V1_ScatterGatherSegment_T;
  771. /*
  772.   Define the 13 Byte DAC960 V1 Firmware Command Mailbox structure.  Bytes 13-15
  773.   are not used.  The Command Mailbox structure is padded to 16 bytes for
  774.   efficient access.
  775. */
  776. typedef union DAC960_V1_CommandMailbox
  777. {
  778.   unsigned int Words[4]; /* Words 0-3 */
  779.   unsigned char Bytes[16]; /* Bytes 0-15 */
  780.   struct {
  781.     DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */
  782.     DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */
  783.     unsigned char Dummy[14]; /* Bytes 2-15 */
  784.   } __attribute__ ((packed)) Common;
  785.   struct {
  786.     DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */
  787.     DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */
  788.     unsigned char Dummy1[6]; /* Bytes 2-7 */
  789.     DAC960_BusAddress32_T BusAddress; /* Bytes 8-11 */
  790.     unsigned char Dummy2[4]; /* Bytes 12-15 */
  791.   } __attribute__ ((packed)) Type3;
  792.   struct {
  793.     DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */
  794.     DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */
  795.     unsigned char CommandOpcode2; /* Byte 2 */
  796.     unsigned char Dummy1[5]; /* Bytes 3-7 */
  797.     DAC960_BusAddress32_T BusAddress; /* Bytes 8-11 */
  798.     unsigned char Dummy2[4]; /* Bytes 12-15 */
  799.   } __attribute__ ((packed)) Type3B;
  800.   struct {
  801.     DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */
  802.     DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */
  803.     unsigned char Dummy1[5]; /* Bytes 2-6 */
  804.     unsigned char LogicalDriveNumber:6; /* Byte 7 Bits 0-6 */
  805.     boolean AutoRestore:1; /* Byte 7 Bit 7 */
  806.     unsigned char Dummy2[8]; /* Bytes 8-15 */
  807.   } __attribute__ ((packed)) Type3C;
  808.   struct {
  809.     DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */
  810.     DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */
  811.     unsigned char Channel; /* Byte 2 */
  812.     unsigned char TargetID; /* Byte 3 */
  813.     DAC960_V1_PhysicalDeviceState_T DeviceState:5; /* Byte 4 Bits 0-4 */
  814.     unsigned char Modifier:3; /* Byte 4 Bits 5-7 */
  815.     unsigned char Dummy1[3]; /* Bytes 5-7 */
  816.     DAC960_BusAddress32_T BusAddress; /* Bytes 8-11 */
  817.     unsigned char Dummy2[4]; /* Bytes 12-15 */
  818.   } __attribute__ ((packed)) Type3D;
  819.   struct {
  820.     DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */
  821.     DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */
  822.     DAC960_V1_PerformEventLogOpType_T OperationType; /* Byte 2 */
  823.     unsigned char OperationQualifier; /* Byte 3 */
  824.     unsigned short SequenceNumber; /* Bytes 4-5 */
  825.     unsigned char Dummy1[2]; /* Bytes 6-7 */
  826.     DAC960_BusAddress32_T BusAddress; /* Bytes 8-11 */
  827.     unsigned char Dummy2[4]; /* Bytes 12-15 */
  828.   } __attribute__ ((packed)) Type3E;
  829.   struct {
  830.     DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */
  831.     DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */
  832.     unsigned char Dummy1[2]; /* Bytes 2-3 */
  833.     unsigned char RebuildRateConstant; /* Byte 4 */
  834.     unsigned char Dummy2[3]; /* Bytes 5-7 */
  835.     DAC960_BusAddress32_T BusAddress; /* Bytes 8-11 */
  836.     unsigned char Dummy3[4]; /* Bytes 12-15 */
  837.   } __attribute__ ((packed)) Type3R;
  838.   struct {
  839.     DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */
  840.     DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */
  841.     unsigned short TransferLength; /* Bytes 2-3 */
  842.     unsigned int LogicalBlockAddress; /* Bytes 4-7 */
  843.     DAC960_BusAddress32_T BusAddress; /* Bytes 8-11 */
  844.     unsigned char LogicalDriveNumber; /* Byte 12 */
  845.     unsigned char Dummy[3]; /* Bytes 13-15 */
  846.   } __attribute__ ((packed)) Type4;
  847.   struct {
  848.     DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */
  849.     DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */
  850.     struct {
  851.       unsigned short TransferLength:11; /* Bytes 2-3 */
  852.       unsigned char LogicalDriveNumber:5; /* Byte 3 Bits 3-7 */
  853.     } __attribute__ ((packed)) LD;
  854.     unsigned int LogicalBlockAddress; /* Bytes 4-7 */
  855.     DAC960_BusAddress32_T BusAddress; /* Bytes 8-11 */
  856.     unsigned char ScatterGatherCount:6; /* Byte 12 Bits 0-5 */
  857.     enum {
  858.       DAC960_V1_ScatterGather_32BitAddress_32BitByteCount = 0x0,
  859.       DAC960_V1_ScatterGather_32BitAddress_16BitByteCount = 0x1,
  860.       DAC960_V1_ScatterGather_32BitByteCount_32BitAddress = 0x2,
  861.       DAC960_V1_ScatterGather_16BitByteCount_32BitAddress = 0x3
  862.     } __attribute__ ((packed)) ScatterGatherType:2; /* Byte 12 Bits 6-7 */
  863.     unsigned char Dummy[3]; /* Bytes 13-15 */
  864.   } __attribute__ ((packed)) Type5;
  865.   struct {
  866.     DAC960_V1_CommandOpcode_T CommandOpcode; /* Byte 0 */
  867.     DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 1 */
  868.     unsigned char CommandOpcode2; /* Byte 2 */
  869.     unsigned char :8; /* Byte 3 */
  870.     DAC960_BusAddress32_T CommandMailboxesBusAddress; /* Bytes 4-7 */
  871.     DAC960_BusAddress32_T StatusMailboxesBusAddress; /* Bytes 8-11 */
  872.     unsigned char Dummy[4]; /* Bytes 12-15 */
  873.   } __attribute__ ((packed)) TypeX;
  874. }
  875. DAC960_V1_CommandMailbox_T;
  876. /*
  877.   Define the DAC960 V2 Firmware Command Opcodes.
  878. */
  879. typedef enum
  880. {
  881.   DAC960_V2_MemCopy = 0x01,
  882.   DAC960_V2_SCSI_10_Passthru = 0x02,
  883.   DAC960_V2_SCSI_255_Passthru = 0x03,
  884.   DAC960_V2_SCSI_10 = 0x04,
  885.   DAC960_V2_SCSI_256 = 0x05,
  886.   DAC960_V2_IOCTL = 0x20
  887. }
  888. __attribute__ ((packed))
  889. DAC960_V2_CommandOpcode_T;
  890. /*
  891.   Define the DAC960 V2 Firmware IOCTL Opcodes.
  892. */
  893. typedef enum
  894. {
  895.   DAC960_V2_GetControllerInfo = 0x01,
  896.   DAC960_V2_GetLogicalDeviceInfoValid = 0x03,
  897.   DAC960_V2_GetPhysicalDeviceInfoValid = 0x05,
  898.   DAC960_V2_GetHealthStatus = 0x11,
  899.   DAC960_V2_GetEvent = 0x15,
  900.   DAC960_V2_StartDiscovery = 0x81,
  901.   DAC960_V2_SetDeviceState = 0x82,
  902.   DAC960_V2_RebuildDeviceStart = 0x88,
  903.   DAC960_V2_RebuildDeviceStop = 0x89,
  904.   DAC960_V2_ConsistencyCheckStart = 0x8C,
  905.   DAC960_V2_ConsistencyCheckStop = 0x8D,
  906.   DAC960_V2_SetMemoryMailbox = 0x8E,
  907.   DAC960_V2_PauseDevice = 0x92,
  908.   DAC960_V2_TranslatePhysicalToLogicalDevice = 0xC5
  909. }
  910. __attribute__ ((packed))
  911. DAC960_V2_IOCTL_Opcode_T;
  912. /*
  913.   Define the DAC960 V2 Firmware Command Identifier type.
  914. */
  915. typedef unsigned short DAC960_V2_CommandIdentifier_T;
  916. /*
  917.   Define the DAC960 V2 Firmware Command Status Codes.
  918. */
  919. #define DAC960_V2_NormalCompletion 0x00
  920. #define DAC960_V2_AbormalCompletion 0x02
  921. #define DAC960_V2_DeviceBusy 0x08
  922. #define DAC960_V2_DeviceNonresponsive 0x0E
  923. #define DAC960_V2_DeviceNonresponsive2 0x0F
  924. #define DAC960_V2_DeviceRevervationConflict 0x18
  925. typedef unsigned char DAC960_V2_CommandStatus_T;
  926. /*
  927.   Define the DAC960 V2 Firmware Memory Type structure.
  928. */
  929. typedef struct DAC960_V2_MemoryType
  930. {
  931.   enum {
  932.     DAC960_V2_MemoryType_Reserved = 0x00,
  933.     DAC960_V2_MemoryType_DRAM = 0x01,
  934.     DAC960_V2_MemoryType_EDRAM = 0x02,
  935.     DAC960_V2_MemoryType_EDO = 0x03,
  936.     DAC960_V2_MemoryType_SDRAM = 0x04,
  937.     DAC960_V2_MemoryType_Last = 0x1F
  938.   } __attribute__ ((packed)) MemoryType:5; /* Byte 0 Bits 0-4 */
  939.   boolean :1; /* Byte 0 Bit 5 */
  940.   boolean MemoryParity:1; /* Byte 0 Bit 6 */
  941.   boolean MemoryECC:1; /* Byte 0 Bit 7 */
  942. }
  943. DAC960_V2_MemoryType_T;
  944. /*
  945.   Define the DAC960 V2 Firmware Processor Type structure.
  946. */
  947. typedef enum
  948. {
  949.   DAC960_V2_ProcessorType_i960CA = 0x01,
  950.   DAC960_V2_ProcessorType_i960RD = 0x02,
  951.   DAC960_V2_ProcessorType_i960RN = 0x03,
  952.   DAC960_V2_ProcessorType_i960RP = 0x04,
  953.   DAC960_V2_ProcessorType_NorthBay = 0x05,
  954.   DAC960_V2_ProcessorType_StrongArm = 0x06,
  955.   DAC960_V2_ProcessorType_i960RM = 0x07
  956. }
  957. __attribute__ ((packed))
  958. DAC960_V2_ProcessorType_T;
  959. /*
  960.   Define the DAC960 V2 Firmware Get Controller Info reply structure.
  961. */
  962. typedef struct DAC960_V2_ControllerInfo
  963. {
  964.   unsigned char :8; /* Byte 0 */
  965.   enum {
  966.     DAC960_V2_SCSI_Bus = 0x00,
  967.     DAC960_V2_Fibre_Bus = 0x01,
  968.     DAC960_V2_PCI_Bus = 0x03
  969.   } __attribute__ ((packed)) BusInterfaceType; /* Byte 1 */
  970.   enum {
  971.     DAC960_V2_DAC960E = 0x01,
  972.     DAC960_V2_DAC960M = 0x08,
  973.     DAC960_V2_DAC960PD = 0x10,
  974.     DAC960_V2_DAC960PL = 0x11,
  975.     DAC960_V2_DAC960PU = 0x12,
  976.     DAC960_V2_DAC960PE = 0x13,
  977.     DAC960_V2_DAC960PG = 0x14,
  978.     DAC960_V2_DAC960PJ = 0x15,
  979.     DAC960_V2_DAC960PTL0 = 0x16,
  980.     DAC960_V2_DAC960PR = 0x17,
  981.     DAC960_V2_DAC960PRL = 0x18,
  982.     DAC960_V2_DAC960PT = 0x19,
  983.     DAC960_V2_DAC1164P = 0x1A,
  984.     DAC960_V2_DAC960PTL1 = 0x1B,
  985.     DAC960_V2_EXR2000P = 0x1C,
  986.     DAC960_V2_EXR3000P = 0x1D,
  987.     DAC960_V2_AcceleRAID352 = 0x1E,
  988.     DAC960_V2_AcceleRAID170 = 0x1F,
  989.     DAC960_V2_AcceleRAID160 = 0x20,
  990.     DAC960_V2_DAC960S = 0x60,
  991.     DAC960_V2_DAC960SU = 0x61,
  992.     DAC960_V2_DAC960SX = 0x62,
  993.     DAC960_V2_DAC960SF = 0x63,
  994.     DAC960_V2_DAC960SS = 0x64,
  995.     DAC960_V2_DAC960FL = 0x65,
  996.     DAC960_V2_DAC960LL = 0x66,
  997.     DAC960_V2_DAC960FF = 0x67,
  998.     DAC960_V2_DAC960HP = 0x68,
  999.     DAC960_V2_RAIDBRICK = 0x69,
  1000.     DAC960_V2_METEOR_FL = 0x6A,
  1001.     DAC960_V2_METEOR_FF = 0x6B
  1002.   } __attribute__ ((packed)) ControllerType; /* Byte 2 */
  1003.   unsigned char :8; /* Byte 3 */
  1004.   unsigned short BusInterfaceSpeedMHz; /* Bytes 4-5 */
  1005.   unsigned char BusWidthBits; /* Byte 6 */
  1006.   unsigned char FlashCodeTypeOrProductID; /* Byte 7 */
  1007.   unsigned char NumberOfHostPortsPresent; /* Byte 8 */
  1008.   unsigned char Reserved1[7]; /* Bytes 9-15 */
  1009.   unsigned char BusInterfaceName[16]; /* Bytes 16-31 */
  1010.   unsigned char ControllerName[16]; /* Bytes 32-47 */
  1011.   unsigned char Reserved2[16]; /* Bytes 48-63 */
  1012.   /* Firmware Release Information */
  1013.   unsigned char FirmwareMajorVersion; /* Byte 64 */
  1014.   unsigned char FirmwareMinorVersion; /* Byte 65 */
  1015.   unsigned char FirmwareTurnNumber; /* Byte 66 */
  1016.   unsigned char FirmwareBuildNumber; /* Byte 67 */
  1017.   unsigned char FirmwareReleaseDay; /* Byte 68 */
  1018.   unsigned char FirmwareReleaseMonth; /* Byte 69 */
  1019.   unsigned char FirmwareReleaseYearHigh2Digits; /* Byte 70 */
  1020.   unsigned char FirmwareReleaseYearLow2Digits; /* Byte 71 */
  1021.   /* Hardware Release Information */
  1022.   unsigned char HardwareRevision; /* Byte 72 */
  1023.   unsigned int :24; /* Bytes 73-75 */
  1024.   unsigned char HardwareReleaseDay; /* Byte 76 */
  1025.   unsigned char HardwareReleaseMonth; /* Byte 77 */
  1026.   unsigned char HardwareReleaseYearHigh2Digits; /* Byte 78 */
  1027.   unsigned char HardwareReleaseYearLow2Digits; /* Byte 79 */
  1028.   /* Hardware Manufacturing Information */
  1029.   unsigned char ManufacturingBatchNumber; /* Byte 80 */
  1030.   unsigned char :8; /* Byte 81 */
  1031.   unsigned char ManufacturingPlantNumber; /* Byte 82 */
  1032.   unsigned char :8; /* Byte 83 */
  1033.   unsigned char HardwareManufacturingDay; /* Byte 84 */
  1034.   unsigned char HardwareManufacturingMonth; /* Byte 85 */
  1035.   unsigned char HardwareManufacturingYearHigh2Digits; /* Byte 86 */
  1036.   unsigned char HardwareManufacturingYearLow2Digits; /* Byte 87 */
  1037.   unsigned char MaximumNumberOfPDDperXLD; /* Byte 88 */
  1038.   unsigned char MaximumNumberOfILDperXLD; /* Byte 89 */
  1039.   unsigned short NonvolatileMemorySizeKB; /* Bytes 90-91 */
  1040.   unsigned char MaximumNumberOfXLD; /* Byte 92 */
  1041.   unsigned int :24; /* Bytes 93-95 */
  1042.   /* Unique Information per Controller */
  1043.   unsigned char ControllerSerialNumber[16]; /* Bytes 96-111 */
  1044.   unsigned char Reserved3[16]; /* Bytes 112-127 */
  1045.   /* Vendor Information */
  1046.   unsigned int :24; /* Bytes 128-130 */
  1047.   unsigned char OEM_Code; /* Byte 131 */
  1048.   unsigned char VendorName[16]; /* Bytes 132-147 */
  1049.   /* Other Physical/Controller/Operation Information */
  1050.   boolean BBU_Present:1; /* Byte 148 Bit 0 */
  1051.   boolean ActiveActiveClusteringMode:1; /* Byte 148 Bit 1 */
  1052.   unsigned char :6; /* Byte 148 Bits 2-7 */
  1053.   unsigned char :8; /* Byte 149 */
  1054.   unsigned short :16; /* Bytes 150-151 */
  1055.   /* Physical Device Scan Information */
  1056.   boolean PhysicalScanActive:1; /* Byte 152 Bit 0 */
  1057.   unsigned char :7; /* Byte 152 Bits 1-7 */
  1058.   unsigned char PhysicalDeviceChannelNumber; /* Byte 153 */
  1059.   unsigned char PhysicalDeviceTargetID; /* Byte 154 */
  1060.   unsigned char PhysicalDeviceLogicalUnit; /* Byte 155 */
  1061.   /* Maximum Command Data Transfer Sizes */
  1062.   unsigned short MaximumDataTransferSizeInBlocks; /* Bytes 156-157 */
  1063.   unsigned short MaximumScatterGatherEntries; /* Bytes 158-159 */
  1064.   /* Logical/Physical Device Counts */
  1065.   unsigned short LogicalDevicesPresent; /* Bytes 160-161 */
  1066.   unsigned short LogicalDevicesCritical; /* Bytes 162-163 */
  1067.   unsigned short LogicalDevicesOffline; /* Bytes 164-165 */
  1068.   unsigned short PhysicalDevicesPresent; /* Bytes 166-167 */
  1069.   unsigned short PhysicalDisksPresent; /* Bytes 168-169 */
  1070.   unsigned short PhysicalDisksCritical; /* Bytes 170-171 */
  1071.   unsigned short PhysicalDisksOffline; /* Bytes 172-173 */
  1072.   unsigned short MaximumParallelCommands; /* Bytes 174-175 */
  1073.   /* Channel and Target ID Information */
  1074.   unsigned char NumberOfPhysicalChannelsPresent; /* Byte 176 */
  1075.   unsigned char NumberOfVirtualChannelsPresent; /* Byte 177 */
  1076.   unsigned char NumberOfPhysicalChannelsPossible; /* Byte 178 */
  1077.   unsigned char NumberOfVirtualChannelsPossible; /* Byte 179 */
  1078.   unsigned char MaximumTargetsPerChannel[16]; /* Bytes 180-195 */
  1079.   unsigned char Reserved4[12]; /* Bytes 196-207 */
  1080.   /* Memory/Cache Information */
  1081.   unsigned short MemorySizeMB; /* Bytes 208-209 */
  1082.   unsigned short CacheSizeMB; /* Bytes 210-211 */
  1083.   unsigned int ValidCacheSizeInBytes; /* Bytes 212-215 */
  1084.   unsigned int DirtyCacheSizeInBytes; /* Bytes 216-219 */
  1085.   unsigned short MemorySpeedMHz; /* Bytes 220-221 */
  1086.   unsigned char MemoryDataWidthBits; /* Byte 222 */
  1087.   DAC960_V2_MemoryType_T MemoryType; /* Byte 223 */
  1088.   unsigned char CacheMemoryTypeName[16]; /* Bytes 224-239 */
  1089.   /* Execution Memory Information */
  1090.   unsigned short ExecutionMemorySizeMB; /* Bytes 240-241 */
  1091.   unsigned short ExecutionL2CacheSizeMB; /* Bytes 242-243 */
  1092.   unsigned char Reserved5[8]; /* Bytes 244-251 */
  1093.   unsigned short ExecutionMemorySpeedMHz; /* Bytes 252-253 */
  1094.   unsigned char ExecutionMemoryDataWidthBits; /* Byte 254 */
  1095.   DAC960_V2_MemoryType_T ExecutionMemoryType; /* Byte 255 */
  1096.   unsigned char ExecutionMemoryTypeName[16]; /* Bytes 256-271 */
  1097.   /* First CPU Type Information */
  1098.   unsigned short FirstProcessorSpeedMHz; /* Bytes 272-273 */
  1099.   DAC960_V2_ProcessorType_T FirstProcessorType; /* Byte 274 */
  1100.   unsigned char FirstProcessorCount; /* Byte 275 */
  1101.   unsigned char Reserved6[12]; /* Bytes 276-287 */
  1102.   unsigned char FirstProcessorName[16]; /* Bytes 288-303 */
  1103.   /* Second CPU Type Information */
  1104.   unsigned short SecondProcessorSpeedMHz; /* Bytes 304-305 */
  1105.   DAC960_V2_ProcessorType_T SecondProcessorType; /* Byte 306 */
  1106.   unsigned char SecondProcessorCount; /* Byte 307 */
  1107.   unsigned char Reserved7[12]; /* Bytes 308-319 */
  1108.   unsigned char SecondProcessorName[16]; /* Bytes 320-335 */
  1109.   /* Debugging/Profiling/Command Time Tracing Information */
  1110.   unsigned short CurrentProfilingDataPageNumber; /* Bytes 336-337 */
  1111.   unsigned short ProgramsAwaitingProfilingData; /* Bytes 338-339 */
  1112.   unsigned short CurrentCommandTimeTraceDataPageNumber; /* Bytes 340-341 */
  1113.   unsigned short ProgramsAwaitingCommandTimeTraceData; /* Bytes 342-343 */
  1114.   unsigned char Reserved8[8]; /* Bytes 344-351 */
  1115.   /* Error Counters on Physical Devices */
  1116.   unsigned short PhysicalDeviceBusResets; /* Bytes 352-353 */
  1117.   unsigned short PhysicalDeviceParityErrors; /* Bytes 355-355 */
  1118.   unsigned short PhysicalDeviceSoftErrors; /* Bytes 356-357 */
  1119.   unsigned short PhysicalDeviceCommandsFailed; /* Bytes 358-359 */
  1120.   unsigned short PhysicalDeviceMiscellaneousErrors; /* Bytes 360-361 */
  1121.   unsigned short PhysicalDeviceCommandTimeouts; /* Bytes 362-363 */
  1122.   unsigned short PhysicalDeviceSelectionTimeouts; /* Bytes 364-365 */
  1123.   unsigned short PhysicalDeviceRetriesDone; /* Bytes 366-367 */
  1124.   unsigned short PhysicalDeviceAbortsDone; /* Bytes 368-369 */
  1125.   unsigned short PhysicalDeviceHostCommandAbortsDone; /* Bytes 370-371 */
  1126.   unsigned short PhysicalDevicePredictedFailuresDetected; /* Bytes 372-373 */
  1127.   unsigned short PhysicalDeviceHostCommandsFailed; /* Bytes 374-375 */
  1128.   unsigned short PhysicalDeviceHardErrors; /* Bytes 376-377 */
  1129.   unsigned char Reserved9[6]; /* Bytes 378-383 */
  1130.   /* Error Counters on Logical Devices */
  1131.   unsigned short LogicalDeviceSoftErrors; /* Bytes 384-385 */
  1132.   unsigned short LogicalDeviceCommandsFailed; /* Bytes 386-387 */
  1133.   unsigned short LogicalDeviceHostCommandAbortsDone; /* Bytes 388-389 */
  1134.   unsigned short :16; /* Bytes 390-391 */
  1135.   /* Error Counters on Controller */
  1136.   unsigned short ControllerMemoryErrors; /* Bytes 392-393 */
  1137.   unsigned short ControllerHostCommandAbortsDone; /* Bytes 394-395 */
  1138.   unsigned int :32; /* Bytes 396-399 */
  1139.   /* Long Duration Activity Information */
  1140.   unsigned short BackgroundInitializationsActive; /* Bytes 400-401 */
  1141.   unsigned short LogicalDeviceInitializationsActive; /* Bytes 402-403 */
  1142.   unsigned short PhysicalDeviceInitializationsActive; /* Bytes 404-405 */
  1143.   unsigned short ConsistencyChecksActive; /* Bytes 406-407 */
  1144.   unsigned short RebuildsActive; /* Bytes 408-409 */
  1145.   unsigned short OnlineExpansionsActive; /* Bytes 410-411 */
  1146.   unsigned short PatrolActivitiesActive; /* Bytes 412-413 */
  1147.   unsigned short :16; /* Bytes 414-415 */
  1148.   /* Flash ROM Information */
  1149.   unsigned char FlashType; /* Byte 416 */
  1150.   unsigned char :8; /* Byte 417 */
  1151.   unsigned short FlashSizeMB; /* Bytes 418-419 */
  1152.   unsigned int FlashLimit; /* Bytes 420-423 */
  1153.   unsigned int FlashCount; /* Bytes 424-427 */
  1154.   unsigned int :32; /* Bytes 428-431 */
  1155.   unsigned char FlashTypeName[16]; /* Bytes 432-447 */
  1156.   /* Firmware Run Time Information */
  1157.   unsigned char RebuildRate; /* Byte 448 */
  1158.   unsigned char BackgroundInitializationRate; /* Byte 449 */
  1159.   unsigned char ForegroundInitializationRate; /* Byte 450 */
  1160.   unsigned char ConsistencyCheckRate; /* Byte 451 */
  1161.   unsigned int :32; /* Bytes 452-455 */
  1162.   unsigned int MaximumDP; /* Bytes 456-459 */
  1163.   unsigned int FreeDP; /* Bytes 460-463 */
  1164.   unsigned int MaximumIOP; /* Bytes 464-467 */
  1165.   unsigned int FreeIOP; /* Bytes 468-471 */
  1166.   unsigned short MaximumCombLengthInBlocks; /* Bytes 472-473 */
  1167.   unsigned short NumberOfConfigurationGroups; /* Bytes 474-475 */
  1168.   boolean InstallationAbortStatus:1; /* Byte 476 Bit 0 */
  1169.   boolean MaintenanceModeStatus:1; /* Byte 476 Bit 1 */
  1170.   unsigned int :24; /* Bytes 476-479 */
  1171.   unsigned char Reserved10[32]; /* Bytes 480-511 */
  1172.   unsigned char Reserved11[512]; /* Bytes 512-1023 */
  1173. }
  1174. DAC960_V2_ControllerInfo_T;
  1175. /*
  1176.   Define the DAC960 V2 Firmware Logical Device State type.
  1177. */
  1178. typedef enum
  1179. {
  1180.   DAC960_V2_LogicalDevice_Online = 0x01,
  1181.   DAC960_V2_LogicalDevice_Offline = 0x08,
  1182.   DAC960_V2_LogicalDevice_Critical = 0x09
  1183. }
  1184. __attribute__ ((packed))
  1185. DAC960_V2_LogicalDeviceState_T;
  1186. /*
  1187.   Define the DAC960 V2 Firmware Get Logical Device Info reply structure.
  1188. */
  1189. typedef struct DAC960_V2_LogicalDeviceInfo
  1190. {
  1191.   unsigned char :8; /* Byte 0 */
  1192.   unsigned char Channel; /* Byte 1 */
  1193.   unsigned char TargetID; /* Byte 2 */
  1194.   unsigned char LogicalUnit; /* Byte 3 */
  1195.   DAC960_V2_LogicalDeviceState_T LogicalDeviceState; /* Byte 4 */
  1196.   unsigned char RAIDLevel; /* Byte 5 */
  1197.   unsigned char StripeSize; /* Byte 6 */
  1198.   unsigned char CacheLineSize; /* Byte 7 */
  1199.   struct {
  1200.     enum {
  1201.       DAC960_V2_ReadCacheDisabled = 0x0,
  1202.       DAC960_V2_ReadCacheEnabled = 0x1,
  1203.       DAC960_V2_ReadAheadEnabled = 0x2,
  1204.       DAC960_V2_IntelligentReadAheadEnabled = 0x3,
  1205.       DAC960_V2_ReadCache_Last = 0x7
  1206.     } __attribute__ ((packed)) ReadCache:3; /* Byte 8 Bits 0-2 */
  1207.     enum {
  1208.       DAC960_V2_WriteCacheDisabled = 0x0,
  1209.       DAC960_V2_LogicalDeviceReadOnly = 0x1,
  1210.       DAC960_V2_WriteCacheEnabled = 0x2,
  1211.       DAC960_V2_IntelligentWriteCacheEnabled = 0x3,
  1212.       DAC960_V2_WriteCache_Last = 0x7
  1213.     } __attribute__ ((packed)) WriteCache:3; /* Byte 8 Bits 3-5 */
  1214.     boolean :1; /* Byte 8 Bit 6 */
  1215.     boolean LogicalDeviceInitialized:1; /* Byte 8 Bit 7 */
  1216.   } LogicalDeviceControl; /* Byte 8 */
  1217.   /* Logical Device Operations Status */
  1218.   boolean ConsistencyCheckInProgress:1; /* Byte 9 Bit 0 */
  1219.   boolean RebuildInProgress:1; /* Byte 9 Bit 1 */
  1220.   boolean BackgroundInitializationInProgress:1; /* Byte 9 Bit 2 */
  1221.   boolean ForegroundInitializationInProgress:1; /* Byte 9 Bit 3 */
  1222.   boolean DataMigrationInProgress:1; /* Byte 9 Bit 4 */
  1223.   boolean PatrolOperationInProgress:1; /* Byte 9 Bit 5 */
  1224.   unsigned char :2; /* Byte 9 Bits 6-7 */
  1225.   unsigned char RAID5WriteUpdate; /* Byte 10 */
  1226.   unsigned char RAID5Algorithm; /* Byte 11 */
  1227.   unsigned short LogicalDeviceNumber; /* Bytes 12-13 */
  1228.   /* BIOS Info */
  1229.   boolean BIOSDisabled:1; /* Byte 14 Bit 0 */
  1230.   boolean CDROMBootEnabled:1; /* Byte 14 Bit 1 */
  1231.   boolean DriveCoercionEnabled:1; /* Byte 14 Bit 2 */
  1232.   boolean WriteSameDisabled:1; /* Byte 14 Bit 3 */
  1233.   boolean HBA_ModeEnabled:1; /* Byte 14 Bit 4 */
  1234.   enum {
  1235.     DAC960_V2_Geometry_128_32 = 0x0,
  1236.     DAC960_V2_Geometry_255_63 = 0x1,
  1237.     DAC960_V2_Geometry_Reserved1 = 0x2,
  1238.     DAC960_V2_Geometry_Reserved2 = 0x3
  1239.   } __attribute__ ((packed)) DriveGeometry:2; /* Byte 14 Bits 5-6 */
  1240.   boolean SuperReadAheadEnabled:1; /* Byte 14 Bit 7 */
  1241.   unsigned char :8; /* Byte 15 */
  1242.   /* Error Counters */
  1243.   unsigned short SoftErrors; /* Bytes 16-17 */
  1244.   unsigned short CommandsFailed; /* Bytes 18-19 */
  1245.   unsigned short HostCommandAbortsDone; /* Bytes 20-21 */
  1246.   unsigned short DeferredWriteErrors; /* Bytes 22-23 */
  1247.   unsigned int :32; /* Bytes 24-27 */
  1248.   unsigned int :32; /* Bytes 28-31 */
  1249.   /* Device Size Information */
  1250.   unsigned short :16; /* Bytes 32-33 */
  1251.   unsigned short DeviceBlockSizeInBytes; /* Bytes 34-35 */
  1252.   unsigned int OriginalDeviceSize; /* Bytes 36-39 */
  1253.   unsigned int ConfigurableDeviceSize; /* Bytes 40-43 */
  1254.   unsigned int :32; /* Bytes 44-47 */
  1255.   unsigned char LogicalDeviceName[32]; /* Bytes 48-79 */
  1256.   unsigned char SCSI_InquiryData[36]; /* Bytes 80-115 */
  1257.   unsigned char Reserved1[12]; /* Bytes 116-127 */
  1258.   DAC960_ByteCount64_T LastReadBlockNumber; /* Bytes 128-135 */
  1259.   DAC960_ByteCount64_T LastWrittenBlockNumber; /* Bytes 136-143 */
  1260.   DAC960_ByteCount64_T ConsistencyCheckBlockNumber; /* Bytes 144-151 */
  1261.   DAC960_ByteCount64_T RebuildBlockNumber; /* Bytes 152-159 */
  1262.   DAC960_ByteCount64_T BackgroundInitializationBlockNumber; /* Bytes 160-167 */
  1263.   DAC960_ByteCount64_T ForegroundInitializationBlockNumber; /* Bytes 168-175 */
  1264.   DAC960_ByteCount64_T DataMigrationBlockNumber; /* Bytes 176-183 */
  1265.   DAC960_ByteCount64_T PatrolOperationBlockNumber; /* Bytes 184-191 */
  1266.   unsigned char Reserved2[64]; /* Bytes 192-255 */
  1267. }
  1268. DAC960_V2_LogicalDeviceInfo_T;
  1269. /*
  1270.   Define the DAC960 V2 Firmware Physical Device State type.
  1271. */
  1272. typedef enum
  1273. {
  1274.     DAC960_V2_Device_Unconfigured = 0x00,
  1275.     DAC960_V2_Device_Online = 0x01,
  1276.     DAC960_V2_Device_Rebuild = 0x03,
  1277.     DAC960_V2_Device_Missing = 0x04,
  1278.     DAC960_V2_Device_Critical = 0x05,
  1279.     DAC960_V2_Device_Dead = 0x08,
  1280.     DAC960_V2_Device_SuspectedDead = 0x0C,
  1281.     DAC960_V2_Device_CommandedOffline = 0x10,
  1282.     DAC960_V2_Device_Standby = 0x21,
  1283.     DAC960_V2_Device_InvalidState = 0xFF
  1284. }
  1285. __attribute__ ((packed))
  1286. DAC960_V2_PhysicalDeviceState_T;
  1287. /*
  1288.   Define the DAC960 V2 Firmware Get Physical Device Info reply structure.
  1289. */
  1290. typedef struct DAC960_V2_PhysicalDeviceInfo
  1291. {
  1292.   unsigned char :8; /* Byte 0 */
  1293.   unsigned char Channel; /* Byte 1 */
  1294.   unsigned char TargetID; /* Byte 2 */
  1295.   unsigned char LogicalUnit; /* Byte 3 */
  1296.   /* Configuration Status Bits */
  1297.   boolean PhysicalDeviceFaultTolerant:1; /* Byte 4 Bit 0 */
  1298.   boolean PhysicalDeviceConnected:1; /* Byte 4 Bit 1 */
  1299.   boolean PhysicalDeviceLocalToController:1; /* Byte 4 Bit 2 */
  1300.   unsigned char :5; /* Byte 4 Bits 3-7 */
  1301.   /* Multiple Host/Controller Status Bits */
  1302.   boolean RemoteHostSystemDead:1; /* Byte 5 Bit 0 */
  1303.   boolean RemoteControllerDead:1; /* Byte 5 Bit 1 */
  1304.   unsigned char :6; /* Byte 5 Bits 2-7 */
  1305.   DAC960_V2_PhysicalDeviceState_T PhysicalDeviceState; /* Byte 6 */
  1306.   unsigned char NegotiatedDataWidthBits; /* Byte 7 */
  1307.   unsigned short NegotiatedSynchronousMegaTransfers; /* Bytes 8-9 */
  1308.   /* Multiported Physical Device Information */
  1309.   unsigned char NumberOfPortConnections; /* Byte 10 */
  1310.   unsigned char DriveAccessibilityBitmap; /* Byte 11 */
  1311.   unsigned int :32; /* Bytes 12-15 */
  1312.   unsigned char NetworkAddress[16]; /* Bytes 16-31 */
  1313.   unsigned short MaximumTags; /* Bytes 32-33 */
  1314.   /* Physical Device Operations Status */
  1315.   boolean ConsistencyCheckInProgress:1; /* Byte 34 Bit 0 */
  1316.   boolean RebuildInProgress:1; /* Byte 34 Bit 1 */
  1317.   boolean MakingDataConsistentInProgress:1; /* Byte 34 Bit 2 */
  1318.   boolean PhysicalDeviceInitializationInProgress:1; /* Byte 34 Bit 3 */
  1319.   boolean DataMigrationInProgress:1; /* Byte 34 Bit 4 */
  1320.   boolean PatrolOperationInProgress:1; /* Byte 34 Bit 5 */
  1321.   unsigned char :2; /* Byte 34 Bits 6-7 */
  1322.   unsigned char LongOperationStatus; /* Byte 35 */
  1323.   unsigned char ParityErrors; /* Byte 36 */
  1324.   unsigned char SoftErrors; /* Byte 37 */
  1325.   unsigned char HardErrors; /* Byte 38 */
  1326.   unsigned char MiscellaneousErrors; /* Byte 39 */
  1327.   unsigned char CommandTimeouts; /* Byte 40 */
  1328.   unsigned char Retries; /* Byte 41 */
  1329.   unsigned char Aborts; /* Byte 42 */
  1330.   unsigned char PredictedFailuresDetected; /* Byte 43 */
  1331.   unsigned int :32; /* Bytes 44-47 */
  1332.   unsigned short :16; /* Bytes 48-49 */
  1333.   unsigned short DeviceBlockSizeInBytes; /* Bytes 50-51 */
  1334.   unsigned int OriginalDeviceSize; /* Bytes 52-55 */
  1335.   unsigned int ConfigurableDeviceSize; /* Bytes 56-59 */
  1336.   unsigned int :32; /* Bytes 60-63 */
  1337.   unsigned char PhysicalDeviceName[16]; /* Bytes 64-79 */
  1338.   unsigned char Reserved1[16]; /* Bytes 80-95 */
  1339.   unsigned char Reserved2[32]; /* Bytes 96-127 */
  1340.   unsigned char SCSI_InquiryData[36]; /* Bytes 128-163 */
  1341.   unsigned char Reserved3[20]; /* Bytes 164-183 */
  1342.   unsigned char Reserved4[8]; /* Bytes 184-191 */
  1343.   DAC960_ByteCount64_T LastReadBlockNumber; /* Bytes 192-199 */
  1344.   DAC960_ByteCount64_T LastWrittenBlockNumber; /* Bytes 200-207 */
  1345.   DAC960_ByteCount64_T ConsistencyCheckBlockNumber; /* Bytes 208-215 */
  1346.   DAC960_ByteCount64_T RebuildBlockNumber; /* Bytes 216-223 */
  1347.   DAC960_ByteCount64_T MakingDataConsistentBlockNumber; /* Bytes 224-231 */
  1348.   DAC960_ByteCount64_T DeviceInitializationBlockNumber; /* Bytes 232-239 */
  1349.   DAC960_ByteCount64_T DataMigrationBlockNumber; /* Bytes 240-247 */
  1350.   DAC960_ByteCount64_T PatrolOperationBlockNumber; /* Bytes 248-255 */
  1351.   unsigned char Reserved5[256]; /* Bytes 256-511 */
  1352. }
  1353. DAC960_V2_PhysicalDeviceInfo_T;
  1354. /*
  1355.   Define the DAC960 V2 Firmware Health Status Buffer structure.
  1356. */
  1357. typedef struct DAC960_V2_HealthStatusBuffer
  1358. {
  1359.   unsigned int MicrosecondsFromControllerStartTime; /* Bytes 0-3 */
  1360.   unsigned int MillisecondsFromControllerStartTime; /* Bytes 4-7 */
  1361.   unsigned int SecondsFrom1January1970; /* Bytes 8-11 */
  1362.   unsigned int :32; /* Bytes 12-15 */
  1363.   unsigned int StatusChangeCounter; /* Bytes 16-19 */
  1364.   unsigned int :32; /* Bytes 20-23 */
  1365.   unsigned int DebugOutputMessageBufferIndex; /* Bytes 24-27 */
  1366.   unsigned int CodedMessageBufferIndex; /* Bytes 28-31 */
  1367.   unsigned int CurrentTimeTracePageNumber; /* Bytes 32-35 */
  1368.   unsigned int CurrentProfilerPageNumber; /* Bytes 36-39 */
  1369.   unsigned int NextEventSequenceNumber; /* Bytes 40-43 */
  1370.   unsigned int :32; /* Bytes 44-47 */
  1371.   unsigned char Reserved1[16]; /* Bytes 48-63 */
  1372.   unsigned char Reserved2[64]; /* Bytes 64-127 */
  1373. }
  1374. DAC960_V2_HealthStatusBuffer_T;
  1375. /*
  1376.   Define the DAC960 V2 Firmware Get Event reply structure.
  1377. */
  1378. typedef struct DAC960_V2_Event
  1379. {
  1380.   unsigned int EventSequenceNumber; /* Bytes 0-3 */
  1381.   unsigned int EventTime; /* Bytes 4-7 */
  1382.   unsigned int EventCode; /* Bytes 8-11 */
  1383.   unsigned char :8; /* Byte 12 */
  1384.   unsigned char Channel; /* Byte 13 */
  1385.   unsigned char TargetID; /* Byte 14 */
  1386.   unsigned char LogicalUnit; /* Byte 15 */
  1387.   unsigned int :32; /* Bytes 16-19 */
  1388.   unsigned int EventSpecificParameter; /* Bytes 20-23 */
  1389.   unsigned char RequestSenseData[40]; /* Bytes 24-63 */
  1390. }
  1391. DAC960_V2_Event_T;
  1392. /*
  1393.   Define the DAC960 V2 Firmware Command Control Bits structure.
  1394. */
  1395. typedef struct DAC960_V2_CommandControlBits
  1396. {
  1397.   boolean ForceUnitAccess:1; /* Byte 0 Bit 0 */
  1398.   boolean DisablePageOut:1; /* Byte 0 Bit 1 */
  1399.   boolean :1; /* Byte 0 Bit 2 */
  1400.   boolean AdditionalScatterGatherListMemory:1; /* Byte 0 Bit 3 */
  1401.   boolean DataTransferControllerToHost:1; /* Byte 0 Bit 4 */
  1402.   boolean :1; /* Byte 0 Bit 5 */
  1403.   boolean NoAutoRequestSense:1; /* Byte 0 Bit 6 */
  1404.   boolean DisconnectProhibited:1; /* Byte 0 Bit 7 */
  1405. }
  1406. DAC960_V2_CommandControlBits_T;
  1407. /*
  1408.   Define the DAC960 V2 Firmware Command Timeout structure.
  1409. */
  1410. typedef struct DAC960_V2_CommandTimeout
  1411. {
  1412.   unsigned char TimeoutValue:6; /* Byte 0 Bits 0-5 */
  1413.   enum {
  1414.     DAC960_V2_TimeoutScale_Seconds = 0,
  1415.     DAC960_V2_TimeoutScale_Minutes = 1,
  1416.     DAC960_V2_TimeoutScale_Hours = 2,
  1417.     DAC960_V2_TimeoutScale_Reserved = 3
  1418.   } __attribute__ ((packed)) TimeoutScale:2; /* Byte 0 Bits 6-7 */
  1419. }
  1420. DAC960_V2_CommandTimeout_T;
  1421. /*
  1422.   Define the DAC960 V2 Firmware Physical Device structure.
  1423. */
  1424. typedef struct DAC960_V2_PhysicalDevice
  1425. {
  1426.   unsigned char LogicalUnit; /* Byte 0 */
  1427.   unsigned char TargetID; /* Byte 1 */
  1428.   unsigned char Channel:3; /* Byte 2 Bits 0-2 */
  1429.   unsigned char Controller:5; /* Byte 2 Bits 3-7 */
  1430. }
  1431. __attribute__ ((packed))
  1432. DAC960_V2_PhysicalDevice_T;
  1433. /*
  1434.   Define the DAC960 V2 Firmware Logical Device structure.
  1435. */
  1436. typedef struct DAC960_V2_LogicalDevice
  1437. {
  1438.   unsigned short LogicalDeviceNumber; /* Bytes 0-1 */
  1439.   unsigned char :3; /* Byte 2 Bits 0-2 */
  1440.   unsigned char Controller:5; /* Byte 2 Bits 3-7 */
  1441. }
  1442. __attribute__ ((packed))
  1443. DAC960_V2_LogicalDevice_T;
  1444. /*
  1445.   Define the DAC960 V2 Firmware Operation Device type.
  1446. */
  1447. typedef enum
  1448. {
  1449.   DAC960_V2_Physical_Device = 0x00,
  1450.   DAC960_V2_RAID_Device = 0x01,
  1451.   DAC960_V2_Physical_Channel = 0x02,
  1452.   DAC960_V2_RAID_Channel = 0x03,
  1453.   DAC960_V2_Physical_Controller = 0x04,
  1454.   DAC960_V2_RAID_Controller = 0x05,
  1455.   DAC960_V2_Configuration_Group = 0x10,
  1456.   DAC960_V2_Enclosure = 0x11
  1457. }
  1458. __attribute__ ((packed))
  1459. DAC960_V2_OperationDevice_T;
  1460. /*
  1461.   Define the DAC960 V2 Firmware Translate Physical To Logical Device structure.
  1462. */
  1463. typedef struct DAC960_V2_PhysicalToLogicalDevice
  1464. {
  1465.   unsigned short LogicalDeviceNumber; /* Bytes 0-1 */
  1466.   unsigned short :16; /* Bytes 2-3 */
  1467.   unsigned char PreviousBootController; /* Byte 4 */
  1468.   unsigned char PreviousBootChannel; /* Byte 5 */
  1469.   unsigned char PreviousBootTargetID; /* Byte 6 */
  1470.   unsigned char PreviousBootLogicalUnit; /* Byte 7 */
  1471. }
  1472. DAC960_V2_PhysicalToLogicalDevice_T;
  1473. /*
  1474.   Define the DAC960 V2 Firmware Scatter/Gather List Entry structure.
  1475. */
  1476. typedef struct DAC960_V2_ScatterGatherSegment
  1477. {
  1478.   DAC960_BusAddress64_T SegmentDataPointer; /* Bytes 0-7 */
  1479.   DAC960_ByteCount64_T SegmentByteCount; /* Bytes 8-15 */
  1480. }
  1481. DAC960_V2_ScatterGatherSegment_T;
  1482. /*
  1483.   Define the DAC960 V2 Firmware Data Transfer Memory Address structure.
  1484. */
  1485. typedef union DAC960_V2_DataTransferMemoryAddress
  1486. {
  1487.   DAC960_V2_ScatterGatherSegment_T ScatterGatherSegments[2]; /* Bytes 0-31 */
  1488.   struct {
  1489.     unsigned short ScatterGatherList0Length; /* Bytes 0-1 */
  1490.     unsigned short ScatterGatherList1Length; /* Bytes 2-3 */
  1491.     unsigned short ScatterGatherList2Length; /* Bytes 4-5 */
  1492.     unsigned short :16; /* Bytes 6-7 */
  1493.     DAC960_BusAddress64_T ScatterGatherList0Address; /* Bytes 8-15 */
  1494.     DAC960_BusAddress64_T ScatterGatherList1Address; /* Bytes 16-23 */
  1495.     DAC960_BusAddress64_T ScatterGatherList2Address; /* Bytes 24-31 */
  1496.   } ExtendedScatterGather;
  1497. }
  1498. DAC960_V2_DataTransferMemoryAddress_T;
  1499. /*
  1500.   Define the 64 Byte DAC960 V2 Firmware Command Mailbox structure.
  1501. */
  1502. typedef union DAC960_V2_CommandMailbox
  1503. {
  1504.   unsigned int Words[16]; /* Words 0-15 */
  1505.   struct {
  1506.     DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
  1507.     DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
  1508.     DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
  1509.     DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */
  1510.     unsigned char DataTransferPageNumber; /* Byte 7 */
  1511.     DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
  1512.     unsigned int :24; /* Bytes 16-18 */
  1513.     DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
  1514.     unsigned char RequestSenseSize; /* Byte 20 */
  1515.     unsigned char IOCTL_Opcode; /* Byte 21 */
  1516.     unsigned char Reserved[10]; /* Bytes 22-31 */
  1517.     DAC960_V2_DataTransferMemoryAddress_T
  1518.       DataTransferMemoryAddress; /* Bytes 32-63 */
  1519.   } Common;
  1520.   struct {
  1521.     DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
  1522.     DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
  1523.     DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
  1524.     DAC960_ByteCount32_T DataTransferSize; /* Bytes 4-7 */
  1525.     DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
  1526.     DAC960_V2_PhysicalDevice_T PhysicalDevice; /* Bytes 16-18 */
  1527.     DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
  1528.     unsigned char RequestSenseSize; /* Byte 20 */
  1529.     unsigned char CDBLength; /* Byte 21 */
  1530.     unsigned char SCSI_CDB[10]; /* Bytes 22-31 */
  1531.     DAC960_V2_DataTransferMemoryAddress_T
  1532.       DataTransferMemoryAddress; /* Bytes 32-63 */
  1533.   } SCSI_10;
  1534.   struct {
  1535.     DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
  1536.     DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
  1537.     DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
  1538.     DAC960_ByteCount32_T DataTransferSize; /* Bytes 4-7 */
  1539.     DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
  1540.     DAC960_V2_PhysicalDevice_T PhysicalDevice; /* Bytes 16-18 */
  1541.     DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
  1542.     unsigned char RequestSenseSize; /* Byte 20 */
  1543.     unsigned char CDBLength; /* Byte 21 */
  1544.     unsigned short :16; /* Bytes 22-23 */
  1545.     DAC960_BusAddress64_T SCSI_CDB_BusAddress; /* Bytes 24-31 */
  1546.     DAC960_V2_DataTransferMemoryAddress_T
  1547.       DataTransferMemoryAddress; /* Bytes 32-63 */
  1548.   } SCSI_255;
  1549.   struct {
  1550.     DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
  1551.     DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
  1552.     DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
  1553.     DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */
  1554.     unsigned char DataTransferPageNumber; /* Byte 7 */
  1555.     DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
  1556.     unsigned short :16; /* Bytes 16-17 */
  1557.     unsigned char ControllerNumber; /* Byte 18 */
  1558.     DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
  1559.     unsigned char RequestSenseSize; /* Byte 20 */
  1560.     unsigned char IOCTL_Opcode; /* Byte 21 */
  1561.     unsigned char Reserved[10]; /* Bytes 22-31 */
  1562.     DAC960_V2_DataTransferMemoryAddress_T
  1563.       DataTransferMemoryAddress; /* Bytes 32-63 */
  1564.   } ControllerInfo;
  1565.   struct {
  1566.     DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
  1567.     DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
  1568.     DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
  1569.     DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */
  1570.     unsigned char DataTransferPageNumber; /* Byte 7 */
  1571.     DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
  1572.     DAC960_V2_LogicalDevice_T LogicalDevice; /* Bytes 16-18 */
  1573.     DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
  1574.     unsigned char RequestSenseSize; /* Byte 20 */
  1575.     unsigned char IOCTL_Opcode; /* Byte 21 */
  1576.     unsigned char Reserved[10]; /* Bytes 22-31 */
  1577.     DAC960_V2_DataTransferMemoryAddress_T
  1578.       DataTransferMemoryAddress; /* Bytes 32-63 */
  1579.   } LogicalDeviceInfo;
  1580.   struct {
  1581.     DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
  1582.     DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
  1583.     DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
  1584.     DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */
  1585.     unsigned char DataTransferPageNumber; /* Byte 7 */
  1586.     DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
  1587.     DAC960_V2_PhysicalDevice_T PhysicalDevice; /* Bytes 16-18 */
  1588.     DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
  1589.     unsigned char RequestSenseSize; /* Byte 20 */
  1590.     unsigned char IOCTL_Opcode; /* Byte 21 */
  1591.     unsigned char Reserved[10]; /* Bytes 22-31 */
  1592.     DAC960_V2_DataTransferMemoryAddress_T
  1593.       DataTransferMemoryAddress; /* Bytes 32-63 */
  1594.   } PhysicalDeviceInfo;
  1595.   struct {
  1596.     DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
  1597.     DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
  1598.     DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
  1599.     DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */
  1600.     unsigned char DataTransferPageNumber; /* Byte 7 */
  1601.     DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
  1602.     unsigned short EventSequenceNumberHigh16; /* Bytes 16-17 */
  1603.     unsigned char ControllerNumber; /* Byte 18 */
  1604.     DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
  1605.     unsigned char RequestSenseSize; /* Byte 20 */
  1606.     unsigned char IOCTL_Opcode; /* Byte 21 */
  1607.     unsigned short EventSequenceNumberLow16; /* Bytes 22-23 */
  1608.     unsigned char Reserved[8]; /* Bytes 24-31 */
  1609.     DAC960_V2_DataTransferMemoryAddress_T
  1610.       DataTransferMemoryAddress; /* Bytes 32-63 */
  1611.   } GetEvent;
  1612.   struct {
  1613.     DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
  1614.     DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
  1615.     DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
  1616.     DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */
  1617.     unsigned char DataTransferPageNumber; /* Byte 7 */
  1618.     DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
  1619.     DAC960_V2_LogicalDevice_T LogicalDevice; /* Bytes 16-18 */
  1620.     DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
  1621.     unsigned char RequestSenseSize; /* Byte 20 */
  1622.     unsigned char IOCTL_Opcode; /* Byte 21 */
  1623.     union {
  1624.       DAC960_V2_LogicalDeviceState_T LogicalDeviceState;
  1625.       DAC960_V2_PhysicalDeviceState_T PhysicalDeviceState;
  1626.     } DeviceState; /* Byte 22 */
  1627.     unsigned char Reserved[9]; /* Bytes 23-31 */
  1628.     DAC960_V2_DataTransferMemoryAddress_T
  1629.       DataTransferMemoryAddress; /* Bytes 32-63 */
  1630.   } SetDeviceState;
  1631.   struct {
  1632.     DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
  1633.     DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
  1634.     DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
  1635.     DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */
  1636.     unsigned char DataTransferPageNumber; /* Byte 7 */
  1637.     DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
  1638.     DAC960_V2_LogicalDevice_T LogicalDevice; /* Bytes 16-18 */
  1639.     DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
  1640.     unsigned char RequestSenseSize; /* Byte 20 */
  1641.     unsigned char IOCTL_Opcode; /* Byte 21 */
  1642.     boolean RestoreConsistency:1; /* Byte 22 Bit 0 */
  1643.     boolean InitializedAreaOnly:1; /* Byte 22 Bit 1 */
  1644.     unsigned char :6; /* Byte 22 Bits 2-7 */
  1645.     unsigned char Reserved[9]; /* Bytes 23-31 */
  1646.     DAC960_V2_DataTransferMemoryAddress_T
  1647.       DataTransferMemoryAddress; /* Bytes 32-63 */
  1648.   } ConsistencyCheck;
  1649.   struct {
  1650.     DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
  1651.     DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
  1652.     DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
  1653.     unsigned char FirstCommandMailboxSizeKB; /* Byte 4 */
  1654.     unsigned char FirstStatusMailboxSizeKB; /* Byte 5 */
  1655.     unsigned char SecondCommandMailboxSizeKB; /* Byte 6 */
  1656.     unsigned char SecondStatusMailboxSizeKB; /* Byte 7 */
  1657.     DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
  1658.     unsigned int :24; /* Bytes 16-18 */
  1659.     DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
  1660.     unsigned char RequestSenseSize; /* Byte 20 */
  1661.     unsigned char IOCTL_Opcode; /* Byte 21 */
  1662.     unsigned char HealthStatusBufferSizeKB; /* Byte 22 */
  1663.     unsigned char :8; /* Byte 23 */
  1664.     DAC960_BusAddress64_T HealthStatusBufferBusAddress; /* Bytes 24-31 */
  1665.     DAC960_BusAddress64_T FirstCommandMailboxBusAddress; /* Bytes 32-39 */
  1666.     DAC960_BusAddress64_T FirstStatusMailboxBusAddress; /* Bytes 40-47 */
  1667.     DAC960_BusAddress64_T SecondCommandMailboxBusAddress; /* Bytes 48-55 */
  1668.     DAC960_BusAddress64_T SecondStatusMailboxBusAddress; /* Bytes 56-63 */
  1669.   } SetMemoryMailbox;
  1670.   struct {
  1671.     DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
  1672.     DAC960_V2_CommandOpcode_T CommandOpcode; /* Byte 2 */
  1673.     DAC960_V2_CommandControlBits_T CommandControlBits; /* Byte 3 */
  1674.     DAC960_ByteCount32_T DataTransferSize:24; /* Bytes 4-6 */
  1675.     unsigned char DataTransferPageNumber; /* Byte 7 */
  1676.     DAC960_BusAddress64_T RequestSenseBusAddress; /* Bytes 8-15 */
  1677.     DAC960_V2_PhysicalDevice_T PhysicalDevice; /* Bytes 16-18 */
  1678.     DAC960_V2_CommandTimeout_T CommandTimeout; /* Byte 19 */
  1679.     unsigned char RequestSenseSize; /* Byte 20 */
  1680.     unsigned char IOCTL_Opcode; /* Byte 21 */
  1681.     DAC960_V2_OperationDevice_T OperationDevice; /* Byte 22 */
  1682.     unsigned char Reserved[9]; /* Bytes 23-31 */
  1683.     DAC960_V2_DataTransferMemoryAddress_T
  1684.       DataTransferMemoryAddress; /* Bytes 32-63 */
  1685.   } DeviceOperation;
  1686. }
  1687. DAC960_V2_CommandMailbox_T;
  1688. /*
  1689.   Define the DAC960 Driver IOCTL requests.
  1690. */
  1691. #define DAC960_IOCTL_GET_CONTROLLER_COUNT 0xDAC001
  1692. #define DAC960_IOCTL_GET_CONTROLLER_INFO 0xDAC002
  1693. #define DAC960_IOCTL_V1_EXECUTE_COMMAND 0xDAC003
  1694. #define DAC960_IOCTL_V2_EXECUTE_COMMAND 0xDAC004
  1695. #define DAC960_IOCTL_V2_GET_HEALTH_STATUS 0xDAC005
  1696. /*
  1697.   Define the DAC960_IOCTL_GET_CONTROLLER_INFO reply structure.
  1698. */
  1699. typedef struct DAC960_ControllerInfo
  1700. {
  1701.   unsigned char ControllerNumber;
  1702.   unsigned char FirmwareType;
  1703.   unsigned char Channels;
  1704.   unsigned char Targets;
  1705.   unsigned char PCI_Bus;
  1706.   unsigned char PCI_Device;
  1707.   unsigned char PCI_Function;
  1708.   unsigned char IRQ_Channel;
  1709.   DAC960_PCI_Address_T PCI_Address;
  1710.   unsigned char ModelName[20];
  1711.   unsigned char FirmwareVersion[12];
  1712. }
  1713. DAC960_ControllerInfo_T;
  1714. /*
  1715.   Define the User Mode DAC960_IOCTL_V1_EXECUTE_COMMAND request structure.
  1716. */
  1717. typedef struct DAC960_V1_UserCommand
  1718. {
  1719.   unsigned char ControllerNumber;
  1720.   DAC960_V1_CommandMailbox_T CommandMailbox;
  1721.   int DataTransferLength;
  1722.   void __user *DataTransferBuffer;
  1723.   DAC960_V1_DCDB_T __user *DCDB;
  1724. }
  1725. DAC960_V1_UserCommand_T;
  1726. /*
  1727.   Define the Kernel Mode DAC960_IOCTL_V1_EXECUTE_COMMAND request structure.
  1728. */
  1729. typedef struct DAC960_V1_KernelCommand
  1730. {
  1731.   unsigned char ControllerNumber;
  1732.   DAC960_V1_CommandMailbox_T CommandMailbox;
  1733.   int DataTransferLength;
  1734.   void *DataTransferBuffer;
  1735.   DAC960_V1_DCDB_T *DCDB;
  1736.   DAC960_V1_CommandStatus_T CommandStatus;
  1737.   void (*CompletionFunction)(struct DAC960_V1_KernelCommand *);
  1738.   void *CompletionData;
  1739. }
  1740. DAC960_V1_KernelCommand_T;
  1741. /*
  1742.   Define the User Mode DAC960_IOCTL_V2_EXECUTE_COMMAND request structure.
  1743. */
  1744. typedef struct DAC960_V2_UserCommand
  1745. {
  1746.   unsigned char ControllerNumber;
  1747.   DAC960_V2_CommandMailbox_T CommandMailbox;
  1748.   int DataTransferLength;
  1749.   int RequestSenseLength;
  1750.   void __user *DataTransferBuffer;
  1751.   void __user *RequestSenseBuffer;
  1752. }
  1753. DAC960_V2_UserCommand_T;
  1754. /*
  1755.   Define the Kernel Mode DAC960_IOCTL_V2_EXECUTE_COMMAND request structure.
  1756. */
  1757. typedef struct DAC960_V2_KernelCommand
  1758. {
  1759.   unsigned char ControllerNumber;
  1760.   DAC960_V2_CommandMailbox_T CommandMailbox;
  1761.   int DataTransferLength;
  1762.   int RequestSenseLength;
  1763.   void *DataTransferBuffer;
  1764.   void *RequestSenseBuffer;
  1765.   DAC960_V2_CommandStatus_T CommandStatus;
  1766.   void (*CompletionFunction)(struct DAC960_V2_KernelCommand *);
  1767.   void *CompletionData;
  1768. }
  1769. DAC960_V2_KernelCommand_T;
  1770. /*
  1771.   Define the User Mode DAC960_IOCTL_V2_GET_HEALTH_STATUS request structure.
  1772. */
  1773. typedef struct DAC960_V2_GetHealthStatus
  1774. {
  1775.   unsigned char ControllerNumber;
  1776.   DAC960_V2_HealthStatusBuffer_T __user *HealthStatusBuffer;
  1777. }
  1778. DAC960_V2_GetHealthStatus_T;
  1779. /*
  1780.   Import the Kernel Mode IOCTL interface.
  1781. */
  1782. extern int DAC960_KernelIOCTL(unsigned int Request, void *Argument);
  1783. /*
  1784.   DAC960_DriverVersion protects the private portion of this file.
  1785. */
  1786. #ifdef DAC960_DriverVersion
  1787. /*
  1788.   Define the maximum Driver Queue Depth and Controller Queue Depth supported
  1789.   by DAC960 V1 and V2 Firmware Controllers.
  1790. */
  1791. #define DAC960_MaxDriverQueueDepth 511
  1792. #define DAC960_MaxControllerQueueDepth 512
  1793. /*
  1794.   Define the maximum number of Scatter/Gather Segments supported for any
  1795.   DAC960 V1 and V2 Firmware controller.
  1796. */
  1797. #define DAC960_V1_ScatterGatherLimit 33
  1798. #define DAC960_V2_ScatterGatherLimit 128
  1799. /*
  1800.   Define the number of Command Mailboxes and Status Mailboxes used by the
  1801.   DAC960 V1 and V2 Firmware Memory Mailbox Interface.
  1802. */
  1803. #define DAC960_V1_CommandMailboxCount 256
  1804. #define DAC960_V1_StatusMailboxCount 1024
  1805. #define DAC960_V2_CommandMailboxCount 512
  1806. #define DAC960_V2_StatusMailboxCount 512
  1807. /*
  1808.   Define the DAC960 Controller Monitoring Timer Interval.
  1809. */
  1810. #define DAC960_MonitoringTimerInterval (10 * HZ)
  1811. /*
  1812.   Define the DAC960 Controller Secondary Monitoring Interval.
  1813. */
  1814. #define DAC960_SecondaryMonitoringInterval (60 * HZ)
  1815. /*
  1816.   Define the DAC960 Controller Health Status Monitoring Interval.
  1817. */
  1818. #define DAC960_HealthStatusMonitoringInterval (1 * HZ)
  1819. /*
  1820.   Define the DAC960 Controller Progress Reporting Interval.
  1821. */
  1822. #define DAC960_ProgressReportingInterval (60 * HZ)
  1823. /*
  1824.   Define the maximum number of Partitions allowed for each Logical Drive.
  1825. */
  1826. #define DAC960_MaxPartitions 8
  1827. #define DAC960_MaxPartitionsBits 3
  1828. /*
  1829.   Define the DAC960 Controller fixed Block Size and Block Size Bits.
  1830. */
  1831. #define DAC960_BlockSize 512
  1832. #define DAC960_BlockSizeBits 9
  1833. /*
  1834.   Define the number of Command structures that should be allocated as a
  1835.   group to optimize kernel memory allocation.
  1836. */
  1837. #define DAC960_V1_CommandAllocationGroupSize 11
  1838. #define DAC960_V2_CommandAllocationGroupSize 29
  1839. /*
  1840.   Define the Controller Line Buffer, Progress Buffer, User Message, and
  1841.   Initial Status Buffer sizes.
  1842. */
  1843. #define DAC960_LineBufferSize 100
  1844. #define DAC960_ProgressBufferSize 200
  1845. #define DAC960_UserMessageSize 200
  1846. #define DAC960_InitialStatusBufferSize (8192-32)
  1847. /*
  1848.   Define the DAC960 Controller Firmware Types.
  1849. */
  1850. typedef enum
  1851. {
  1852.   DAC960_V1_Controller = 1,
  1853.   DAC960_V2_Controller = 2
  1854. }
  1855. DAC960_FirmwareType_T;
  1856. /*
  1857.   Define the DAC960 Controller Hardware Types.
  1858. */
  1859. typedef enum
  1860. {
  1861.   DAC960_BA_Controller = 1, /* eXtremeRAID 2000 */
  1862.   DAC960_LP_Controller = 2, /* AcceleRAID 352 */
  1863.   DAC960_LA_Controller = 3, /* DAC1164P */
  1864.   DAC960_PG_Controller = 4, /* DAC960PTL/PJ/PG */
  1865.   DAC960_PD_Controller = 5, /* DAC960PU/PD/PL/P */
  1866.   DAC960_P_Controller = 6, /* DAC960PU/PD/PL/P */
  1867.   DAC960_GEM_Controller = 7, /* AcceleRAID 4/5/600 */
  1868. }
  1869. DAC960_HardwareType_T;
  1870. /*
  1871.   Define the Driver Message Levels.
  1872. */
  1873. typedef enum DAC960_MessageLevel
  1874. {
  1875.   DAC960_AnnounceLevel = 0,
  1876.   DAC960_InfoLevel = 1,
  1877.   DAC960_NoticeLevel = 2,
  1878.   DAC960_WarningLevel = 3,
  1879.   DAC960_ErrorLevel = 4,
  1880.   DAC960_ProgressLevel = 5,
  1881.   DAC960_CriticalLevel = 6,
  1882.   DAC960_UserCriticalLevel = 7
  1883. }
  1884. DAC960_MessageLevel_T;
  1885. static char
  1886.   *DAC960_MessageLevelMap[] =
  1887.     { KERN_NOTICE, KERN_NOTICE, KERN_NOTICE, KERN_WARNING,
  1888.       KERN_ERR, KERN_CRIT, KERN_CRIT, KERN_CRIT };
  1889. /*
  1890.   Define Driver Message macros.
  1891. */
  1892. #define DAC960_Announce(Format, Arguments...) 
  1893.   DAC960_Message(DAC960_AnnounceLevel, Format, ##Arguments)
  1894. #define DAC960_Info(Format, Arguments...) 
  1895.   DAC960_Message(DAC960_InfoLevel, Format, ##Arguments)
  1896. #define DAC960_Notice(Format, Arguments...) 
  1897.   DAC960_Message(DAC960_NoticeLevel, Format, ##Arguments)
  1898. #define DAC960_Warning(Format, Arguments...) 
  1899.   DAC960_Message(DAC960_WarningLevel, Format, ##Arguments)
  1900. #define DAC960_Error(Format, Arguments...) 
  1901.   DAC960_Message(DAC960_ErrorLevel, Format, ##Arguments)
  1902. #define DAC960_Progress(Format, Arguments...) 
  1903.   DAC960_Message(DAC960_ProgressLevel, Format, ##Arguments)
  1904. #define DAC960_Critical(Format, Arguments...) 
  1905.   DAC960_Message(DAC960_CriticalLevel, Format, ##Arguments)
  1906. #define DAC960_UserCritical(Format, Arguments...) 
  1907.   DAC960_Message(DAC960_UserCriticalLevel, Format, ##Arguments)
  1908. struct DAC960_privdata {
  1909. DAC960_HardwareType_T HardwareType;
  1910. DAC960_FirmwareType_T FirmwareType;
  1911. irqreturn_t (*InterruptHandler)(int, void *, struct pt_regs *);
  1912. unsigned int MemoryWindowSize;
  1913. };
  1914. /*
  1915.   Define the DAC960 V1 Firmware Controller Status Mailbox structure.
  1916. */
  1917. typedef union DAC960_V1_StatusMailbox
  1918. {
  1919.   unsigned int Word; /* Word 0 */
  1920.   struct {
  1921.     DAC960_V1_CommandIdentifier_T CommandIdentifier; /* Byte 0 */
  1922.     unsigned char :7; /* Byte 1 Bits 0-6 */
  1923.     boolean Valid:1; /* Byte 1 Bit 7 */
  1924.     DAC960_V1_CommandStatus_T CommandStatus; /* Bytes 2-3 */
  1925.   } Fields;
  1926. }
  1927. DAC960_V1_StatusMailbox_T;
  1928. /*
  1929.   Define the DAC960 V2 Firmware Controller Status Mailbox structure.
  1930. */
  1931. typedef union DAC960_V2_StatusMailbox
  1932. {
  1933.   unsigned int Words[2]; /* Words 0-1 */
  1934.   struct {
  1935.     DAC960_V2_CommandIdentifier_T CommandIdentifier; /* Bytes 0-1 */
  1936.     DAC960_V2_CommandStatus_T CommandStatus; /* Byte 2 */
  1937.     unsigned char RequestSenseLength; /* Byte 3 */
  1938.     int DataTransferResidue; /* Bytes 4-7 */
  1939.   } Fields;
  1940. }
  1941. DAC960_V2_StatusMailbox_T;