mirror of
				https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux
				synced 2025-11-04 08:34:47 +10:00 
			
		
		
		
	Addresses http://bugzilla.kernel.org/show_bug.cgi?id=8942 Use PCI_DMA_* constants instead of own private definitions Fall back to 32-bit DMA mask if a 64-bit one fails Signed-off-by: Matthew Wilcox <matthew@wil.cx> Acked-by: Jeff Garzik <jeff@garzik.org> Tested-by: Lars <polynomial-c@gmx.de> Cc: Alessandro Polverini <alex@nibbles.it> Cc: <dac@conglom-o.org> Cc: <stable@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			4416 lines
		
	
	
		
			148 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			4416 lines
		
	
	
		
			148 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 | 
						|
  Linux Driver for Mylex DAC960/AcceleRAID/eXtremeRAID PCI RAID Controllers
 | 
						|
 | 
						|
  Copyright 1998-2001 by Leonard N. Zubkoff <lnz@dandelion.com>
 | 
						|
 | 
						|
  This program is free software; you may redistribute and/or modify it under
 | 
						|
  the terms of the GNU General Public License Version 2 as published by the
 | 
						|
  Free Software Foundation.
 | 
						|
 | 
						|
  This program is distributed in the hope that it will be useful, but
 | 
						|
  WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
 | 
						|
  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 | 
						|
  for complete details.
 | 
						|
 | 
						|
  The author respectfully requests that any modifications to this software be
 | 
						|
  sent directly to him for evaluation and testing.
 | 
						|
 | 
						|
*/
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the maximum number of DAC960 Controllers supported by this driver.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_MaxControllers			8
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the maximum number of Controller Channels supported by DAC960
 | 
						|
  V1 and V2 Firmware Controllers.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_V1_MaxChannels			3
 | 
						|
#define DAC960_V2_MaxChannels			4
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the maximum number of Targets per Channel supported by DAC960
 | 
						|
  V1 and V2 Firmware Controllers.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_V1_MaxTargets			16
 | 
						|
#define DAC960_V2_MaxTargets			128
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the maximum number of Logical Drives supported by DAC960
 | 
						|
  V1 and V2 Firmware Controllers.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_MaxLogicalDrives			32
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the maximum number of Physical Devices supported by DAC960
 | 
						|
  V1 and V2 Firmware Controllers.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_V1_MaxPhysicalDevices		45
 | 
						|
#define DAC960_V2_MaxPhysicalDevices		272
 | 
						|
 | 
						|
/*
 | 
						|
  Define a 32/64 bit I/O Address data type.
 | 
						|
*/
 | 
						|
 | 
						|
typedef unsigned long DAC960_IO_Address_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define a 32/64 bit PCI Bus Address data type.
 | 
						|
*/
 | 
						|
 | 
						|
typedef unsigned long DAC960_PCI_Address_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define a 32 bit Bus Address data type.
 | 
						|
*/
 | 
						|
 | 
						|
typedef unsigned int DAC960_BusAddress32_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define a 64 bit Bus Address data type.
 | 
						|
*/
 | 
						|
 | 
						|
typedef unsigned long long DAC960_BusAddress64_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define a 32 bit Byte Count data type.
 | 
						|
*/
 | 
						|
 | 
						|
typedef unsigned int DAC960_ByteCount32_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define a 64 bit Byte Count data type.
 | 
						|
*/
 | 
						|
 | 
						|
typedef unsigned long long DAC960_ByteCount64_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  dma_loaf is used by helper routines to divide a region of
 | 
						|
  dma mapped memory into smaller pieces, where those pieces
 | 
						|
  are not of uniform size.
 | 
						|
 */
 | 
						|
 | 
						|
struct dma_loaf {
 | 
						|
	void	*cpu_base;
 | 
						|
	dma_addr_t dma_base;
 | 
						|
	size_t  length;
 | 
						|
	void	*cpu_free;
 | 
						|
	dma_addr_t dma_free;
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
  Define the SCSI INQUIRY Standard Data structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_SCSI_Inquiry
 | 
						|
{
 | 
						|
  unsigned char PeripheralDeviceType:5;			/* Byte 0 Bits 0-4 */
 | 
						|
  unsigned char PeripheralQualifier:3;			/* Byte 0 Bits 5-7 */
 | 
						|
  unsigned char DeviceTypeModifier:7;			/* Byte 1 Bits 0-6 */
 | 
						|
  bool RMB:1;						/* Byte 1 Bit 7 */
 | 
						|
  unsigned char ANSI_ApprovedVersion:3;			/* Byte 2 Bits 0-2 */
 | 
						|
  unsigned char ECMA_Version:3;				/* Byte 2 Bits 3-5 */
 | 
						|
  unsigned char ISO_Version:2;				/* Byte 2 Bits 6-7 */
 | 
						|
  unsigned char ResponseDataFormat:4;			/* Byte 3 Bits 0-3 */
 | 
						|
  unsigned char :2;					/* Byte 3 Bits 4-5 */
 | 
						|
  bool TrmIOP:1;					/* Byte 3 Bit 6 */
 | 
						|
  bool AENC:1;						/* Byte 3 Bit 7 */
 | 
						|
  unsigned char AdditionalLength;			/* Byte 4 */
 | 
						|
  unsigned char :8;					/* Byte 5 */
 | 
						|
  unsigned char :8;					/* Byte 6 */
 | 
						|
  bool SftRe:1;						/* Byte 7 Bit 0 */
 | 
						|
  bool CmdQue:1;					/* Byte 7 Bit 1 */
 | 
						|
  bool :1;						/* Byte 7 Bit 2 */
 | 
						|
  bool Linked:1;					/* Byte 7 Bit 3 */
 | 
						|
  bool Sync:1;						/* Byte 7 Bit 4 */
 | 
						|
  bool WBus16:1;					/* Byte 7 Bit 5 */
 | 
						|
  bool WBus32:1;					/* Byte 7 Bit 6 */
 | 
						|
  bool RelAdr:1;					/* Byte 7 Bit 7 */
 | 
						|
  unsigned char VendorIdentification[8];		/* Bytes 8-15 */
 | 
						|
  unsigned char ProductIdentification[16];		/* Bytes 16-31 */
 | 
						|
  unsigned char ProductRevisionLevel[4];		/* Bytes 32-35 */
 | 
						|
}
 | 
						|
DAC960_SCSI_Inquiry_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the SCSI INQUIRY Unit Serial Number structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_SCSI_Inquiry_UnitSerialNumber
 | 
						|
{
 | 
						|
  unsigned char PeripheralDeviceType:5;			/* Byte 0 Bits 0-4 */
 | 
						|
  unsigned char PeripheralQualifier:3;			/* Byte 0 Bits 5-7 */
 | 
						|
  unsigned char PageCode;				/* Byte 1 */
 | 
						|
  unsigned char :8;					/* Byte 2 */
 | 
						|
  unsigned char PageLength;				/* Byte 3 */
 | 
						|
  unsigned char ProductSerialNumber[28];		/* Bytes 4-31 */
 | 
						|
}
 | 
						|
DAC960_SCSI_Inquiry_UnitSerialNumber_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the SCSI REQUEST SENSE Sense Key type.
 | 
						|
*/
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
  DAC960_SenseKey_NoSense =			0x0,
 | 
						|
  DAC960_SenseKey_RecoveredError =		0x1,
 | 
						|
  DAC960_SenseKey_NotReady =			0x2,
 | 
						|
  DAC960_SenseKey_MediumError =			0x3,
 | 
						|
  DAC960_SenseKey_HardwareError =		0x4,
 | 
						|
  DAC960_SenseKey_IllegalRequest =		0x5,
 | 
						|
  DAC960_SenseKey_UnitAttention =		0x6,
 | 
						|
  DAC960_SenseKey_DataProtect =			0x7,
 | 
						|
  DAC960_SenseKey_BlankCheck =			0x8,
 | 
						|
  DAC960_SenseKey_VendorSpecific =		0x9,
 | 
						|
  DAC960_SenseKey_CopyAborted =			0xA,
 | 
						|
  DAC960_SenseKey_AbortedCommand =		0xB,
 | 
						|
  DAC960_SenseKey_Equal =			0xC,
 | 
						|
  DAC960_SenseKey_VolumeOverflow =		0xD,
 | 
						|
  DAC960_SenseKey_Miscompare =			0xE,
 | 
						|
  DAC960_SenseKey_Reserved =			0xF
 | 
						|
}
 | 
						|
__attribute__ ((packed))
 | 
						|
DAC960_SCSI_RequestSenseKey_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the SCSI REQUEST SENSE structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_SCSI_RequestSense
 | 
						|
{
 | 
						|
  unsigned char ErrorCode:7;				/* Byte 0 Bits 0-6 */
 | 
						|
  bool Valid:1;						/* Byte 0 Bit 7 */
 | 
						|
  unsigned char SegmentNumber;				/* Byte 1 */
 | 
						|
  DAC960_SCSI_RequestSenseKey_T SenseKey:4;		/* Byte 2 Bits 0-3 */
 | 
						|
  unsigned char :1;					/* Byte 2 Bit 4 */
 | 
						|
  bool ILI:1;						/* Byte 2 Bit 5 */
 | 
						|
  bool EOM:1;						/* Byte 2 Bit 6 */
 | 
						|
  bool Filemark:1;					/* Byte 2 Bit 7 */
 | 
						|
  unsigned char Information[4];				/* Bytes 3-6 */
 | 
						|
  unsigned char AdditionalSenseLength;			/* Byte 7 */
 | 
						|
  unsigned char CommandSpecificInformation[4];		/* Bytes 8-11 */
 | 
						|
  unsigned char AdditionalSenseCode;			/* Byte 12 */
 | 
						|
  unsigned char AdditionalSenseCodeQualifier;		/* Byte 13 */
 | 
						|
}
 | 
						|
DAC960_SCSI_RequestSense_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V1 Firmware Command Opcodes.
 | 
						|
*/
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
  /* I/O Commands */
 | 
						|
  DAC960_V1_ReadExtended =			0x33,
 | 
						|
  DAC960_V1_WriteExtended =			0x34,
 | 
						|
  DAC960_V1_ReadAheadExtended =			0x35,
 | 
						|
  DAC960_V1_ReadExtendedWithScatterGather =	0xB3,
 | 
						|
  DAC960_V1_WriteExtendedWithScatterGather =	0xB4,
 | 
						|
  DAC960_V1_Read =				0x36,
 | 
						|
  DAC960_V1_ReadWithScatterGather =		0xB6,
 | 
						|
  DAC960_V1_Write =				0x37,
 | 
						|
  DAC960_V1_WriteWithScatterGather =		0xB7,
 | 
						|
  DAC960_V1_DCDB =				0x04,
 | 
						|
  DAC960_V1_DCDBWithScatterGather =		0x84,
 | 
						|
  DAC960_V1_Flush =				0x0A,
 | 
						|
  /* Controller Status Related Commands */
 | 
						|
  DAC960_V1_Enquiry =				0x53,
 | 
						|
  DAC960_V1_Enquiry2 =				0x1C,
 | 
						|
  DAC960_V1_GetLogicalDriveElement =		0x55,
 | 
						|
  DAC960_V1_GetLogicalDriveInformation =	0x19,
 | 
						|
  DAC960_V1_IOPortRead =			0x39,
 | 
						|
  DAC960_V1_IOPortWrite =			0x3A,
 | 
						|
  DAC960_V1_GetSDStats =			0x3E,
 | 
						|
  DAC960_V1_GetPDStats =			0x3F,
 | 
						|
  DAC960_V1_PerformEventLogOperation =		0x72,
 | 
						|
  /* Device Related Commands */
 | 
						|
  DAC960_V1_StartDevice =			0x10,
 | 
						|
  DAC960_V1_GetDeviceState =			0x50,
 | 
						|
  DAC960_V1_StopChannel =			0x13,
 | 
						|
  DAC960_V1_StartChannel =			0x12,
 | 
						|
  DAC960_V1_ResetChannel =			0x1A,
 | 
						|
  /* Commands Associated with Data Consistency and Errors */
 | 
						|
  DAC960_V1_Rebuild =				0x09,
 | 
						|
  DAC960_V1_RebuildAsync =			0x16,
 | 
						|
  DAC960_V1_CheckConsistency =			0x0F,
 | 
						|
  DAC960_V1_CheckConsistencyAsync =		0x1E,
 | 
						|
  DAC960_V1_RebuildStat =			0x0C,
 | 
						|
  DAC960_V1_GetRebuildProgress =		0x27,
 | 
						|
  DAC960_V1_RebuildControl =			0x1F,
 | 
						|
  DAC960_V1_ReadBadBlockTable =			0x0B,
 | 
						|
  DAC960_V1_ReadBadDataTable =			0x25,
 | 
						|
  DAC960_V1_ClearBadDataTable =			0x26,
 | 
						|
  DAC960_V1_GetErrorTable =			0x17,
 | 
						|
  DAC960_V1_AddCapacityAsync =			0x2A,
 | 
						|
  DAC960_V1_BackgroundInitializationControl =	0x2B,
 | 
						|
  /* Configuration Related Commands */
 | 
						|
  DAC960_V1_ReadConfig2 =			0x3D,
 | 
						|
  DAC960_V1_WriteConfig2 =			0x3C,
 | 
						|
  DAC960_V1_ReadConfigurationOnDisk =		0x4A,
 | 
						|
  DAC960_V1_WriteConfigurationOnDisk =		0x4B,
 | 
						|
  DAC960_V1_ReadConfiguration =			0x4E,
 | 
						|
  DAC960_V1_ReadBackupConfiguration =		0x4D,
 | 
						|
  DAC960_V1_WriteConfiguration =		0x4F,
 | 
						|
  DAC960_V1_AddConfiguration =			0x4C,
 | 
						|
  DAC960_V1_ReadConfigurationLabel =		0x48,
 | 
						|
  DAC960_V1_WriteConfigurationLabel =		0x49,
 | 
						|
  /* Firmware Upgrade Related Commands */
 | 
						|
  DAC960_V1_LoadImage =				0x20,
 | 
						|
  DAC960_V1_StoreImage =			0x21,
 | 
						|
  DAC960_V1_ProgramImage =			0x22,
 | 
						|
  /* Diagnostic Commands */
 | 
						|
  DAC960_V1_SetDiagnosticMode =			0x31,
 | 
						|
  DAC960_V1_RunDiagnostic =			0x32,
 | 
						|
  /* Subsystem Service Commands */
 | 
						|
  DAC960_V1_GetSubsystemData =			0x70,
 | 
						|
  DAC960_V1_SetSubsystemParameters =		0x71,
 | 
						|
  /* Version 2.xx Firmware Commands */
 | 
						|
  DAC960_V1_Enquiry_Old =			0x05,
 | 
						|
  DAC960_V1_GetDeviceState_Old =		0x14,
 | 
						|
  DAC960_V1_Read_Old =				0x02,
 | 
						|
  DAC960_V1_Write_Old =				0x03,
 | 
						|
  DAC960_V1_ReadWithScatterGather_Old =		0x82,
 | 
						|
  DAC960_V1_WriteWithScatterGather_Old =	0x83
 | 
						|
}
 | 
						|
__attribute__ ((packed))
 | 
						|
DAC960_V1_CommandOpcode_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V1 Firmware Command Identifier type.
 | 
						|
*/
 | 
						|
 | 
						|
typedef unsigned char DAC960_V1_CommandIdentifier_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V1 Firmware Command Status Codes.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_V1_NormalCompletion		0x0000	/* Common */
 | 
						|
#define DAC960_V1_CheckConditionReceived	0x0002	/* Common */
 | 
						|
#define DAC960_V1_NoDeviceAtAddress		0x0102	/* Common */
 | 
						|
#define DAC960_V1_InvalidDeviceAddress		0x0105	/* Common */
 | 
						|
#define DAC960_V1_InvalidParameter		0x0105	/* Common */
 | 
						|
#define DAC960_V1_IrrecoverableDataError	0x0001	/* I/O */
 | 
						|
#define DAC960_V1_LogicalDriveNonexistentOrOffline 0x0002 /* I/O */
 | 
						|
#define DAC960_V1_AccessBeyondEndOfLogicalDrive	0x0105	/* I/O */
 | 
						|
#define DAC960_V1_BadDataEncountered		0x010C	/* I/O */
 | 
						|
#define DAC960_V1_DeviceBusy			0x0008	/* DCDB */
 | 
						|
#define DAC960_V1_DeviceNonresponsive		0x000E	/* DCDB */
 | 
						|
#define DAC960_V1_CommandTerminatedAbnormally	0x000F	/* DCDB */
 | 
						|
#define DAC960_V1_UnableToStartDevice		0x0002	/* Device */
 | 
						|
#define DAC960_V1_InvalidChannelOrTargetOrModifier 0x0105 /* Device */
 | 
						|
#define DAC960_V1_ChannelBusy			0x0106	/* Device */
 | 
						|
#define DAC960_V1_ChannelNotStopped		0x0002	/* Device */
 | 
						|
#define DAC960_V1_AttemptToRebuildOnlineDrive	0x0002	/* Consistency */
 | 
						|
#define DAC960_V1_RebuildBadBlocksEncountered	0x0003	/* Consistency */
 | 
						|
#define DAC960_V1_NewDiskFailedDuringRebuild	0x0004	/* Consistency */
 | 
						|
#define DAC960_V1_RebuildOrCheckAlreadyInProgress 0x0106 /* Consistency */
 | 
						|
#define DAC960_V1_DependentDiskIsDead		0x0002	/* Consistency */
 | 
						|
#define DAC960_V1_InconsistentBlocksFound	0x0003	/* Consistency */
 | 
						|
#define DAC960_V1_InvalidOrNonredundantLogicalDrive 0x0105 /* Consistency */
 | 
						|
#define DAC960_V1_NoRebuildOrCheckInProgress	0x0105	/* Consistency */
 | 
						|
#define DAC960_V1_RebuildInProgress_DataValid	0x0000	/* Consistency */
 | 
						|
#define DAC960_V1_RebuildFailed_LogicalDriveFailure 0x0002 /* Consistency */
 | 
						|
#define DAC960_V1_RebuildFailed_BadBlocksOnOther 0x0003	/* Consistency */
 | 
						|
#define DAC960_V1_RebuildFailed_NewDriveFailed	0x0004	/* Consistency */
 | 
						|
#define DAC960_V1_RebuildSuccessful		0x0100	/* Consistency */
 | 
						|
#define DAC960_V1_RebuildSuccessfullyTerminated	0x0107	/* Consistency */
 | 
						|
#define DAC960_V1_BackgroundInitSuccessful	0x0100	/* Consistency */
 | 
						|
#define DAC960_V1_BackgroundInitAborted		0x0005	/* Consistency */
 | 
						|
#define DAC960_V1_NoBackgroundInitInProgress	0x0105	/* Consistency */
 | 
						|
#define DAC960_V1_AddCapacityInProgress		0x0004	/* Consistency */
 | 
						|
#define DAC960_V1_AddCapacityFailedOrSuspended	0x00F4	/* Consistency */
 | 
						|
#define DAC960_V1_Config2ChecksumError		0x0002	/* Configuration */
 | 
						|
#define DAC960_V1_ConfigurationSuspended	0x0106	/* Configuration */
 | 
						|
#define DAC960_V1_FailedToConfigureNVRAM	0x0105	/* Configuration */
 | 
						|
#define DAC960_V1_ConfigurationNotSavedStateChange 0x0106 /* Configuration */
 | 
						|
#define DAC960_V1_SubsystemNotInstalled		0x0001	/* Subsystem */
 | 
						|
#define DAC960_V1_SubsystemFailed		0x0002	/* Subsystem */
 | 
						|
#define DAC960_V1_SubsystemBusy			0x0106	/* Subsystem */
 | 
						|
 | 
						|
typedef unsigned short DAC960_V1_CommandStatus_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V1 Firmware Enquiry Command reply structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V1_Enquiry
 | 
						|
{
 | 
						|
  unsigned char NumberOfLogicalDrives;			/* Byte 0 */
 | 
						|
  unsigned int :24;					/* Bytes 1-3 */
 | 
						|
  unsigned int LogicalDriveSizes[32];			/* Bytes 4-131 */
 | 
						|
  unsigned short FlashAge;				/* Bytes 132-133 */
 | 
						|
  struct {
 | 
						|
    bool DeferredWriteError:1;				/* Byte 134 Bit 0 */
 | 
						|
    bool BatteryLow:1;					/* Byte 134 Bit 1 */
 | 
						|
    unsigned char :6;					/* Byte 134 Bits 2-7 */
 | 
						|
  } StatusFlags;
 | 
						|
  unsigned char :8;					/* Byte 135 */
 | 
						|
  unsigned char MinorFirmwareVersion;			/* Byte 136 */
 | 
						|
  unsigned char MajorFirmwareVersion;			/* Byte 137 */
 | 
						|
  enum {
 | 
						|
    DAC960_V1_NoStandbyRebuildOrCheckInProgress =		    0x00,
 | 
						|
    DAC960_V1_StandbyRebuildInProgress =			    0x01,
 | 
						|
    DAC960_V1_BackgroundRebuildInProgress =			    0x02,
 | 
						|
    DAC960_V1_BackgroundCheckInProgress =			    0x03,
 | 
						|
    DAC960_V1_StandbyRebuildCompletedWithError =		    0xFF,
 | 
						|
    DAC960_V1_BackgroundRebuildOrCheckFailed_DriveFailed =	    0xF0,
 | 
						|
    DAC960_V1_BackgroundRebuildOrCheckFailed_LogicalDriveFailed =   0xF1,
 | 
						|
    DAC960_V1_BackgroundRebuildOrCheckFailed_OtherCauses =	    0xF2,
 | 
						|
    DAC960_V1_BackgroundRebuildOrCheckSuccessfullyTerminated =	    0xF3
 | 
						|
  } __attribute__ ((packed)) RebuildFlag;		/* Byte 138 */
 | 
						|
  unsigned char MaxCommands;				/* Byte 139 */
 | 
						|
  unsigned char OfflineLogicalDriveCount;		/* Byte 140 */
 | 
						|
  unsigned char :8;					/* Byte 141 */
 | 
						|
  unsigned short EventLogSequenceNumber;		/* Bytes 142-143 */
 | 
						|
  unsigned char CriticalLogicalDriveCount;		/* Byte 144 */
 | 
						|
  unsigned int :24;					/* Bytes 145-147 */
 | 
						|
  unsigned char DeadDriveCount;				/* Byte 148 */
 | 
						|
  unsigned char :8;					/* Byte 149 */
 | 
						|
  unsigned char RebuildCount;				/* Byte 150 */
 | 
						|
  struct {
 | 
						|
    unsigned char :3;					/* Byte 151 Bits 0-2 */
 | 
						|
    bool BatteryBackupUnitPresent:1;			/* Byte 151 Bit 3 */
 | 
						|
    unsigned char :3;					/* Byte 151 Bits 4-6 */
 | 
						|
    unsigned char :1;					/* Byte 151 Bit 7 */
 | 
						|
  } MiscFlags;
 | 
						|
  struct {
 | 
						|
    unsigned char TargetID;
 | 
						|
    unsigned char Channel;
 | 
						|
  } DeadDrives[21];					/* Bytes 152-194 */
 | 
						|
  unsigned char Reserved[62];				/* Bytes 195-255 */
 | 
						|
}
 | 
						|
__attribute__ ((packed))
 | 
						|
DAC960_V1_Enquiry_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V1 Firmware Enquiry2 Command reply structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V1_Enquiry2
 | 
						|
{
 | 
						|
  struct {
 | 
						|
    enum {
 | 
						|
      DAC960_V1_P_PD_PU =			0x01,
 | 
						|
      DAC960_V1_PL =				0x02,
 | 
						|
      DAC960_V1_PG =				0x10,
 | 
						|
      DAC960_V1_PJ =				0x11,
 | 
						|
      DAC960_V1_PR =				0x12,
 | 
						|
      DAC960_V1_PT =				0x13,
 | 
						|
      DAC960_V1_PTL0 =				0x14,
 | 
						|
      DAC960_V1_PRL =				0x15,
 | 
						|
      DAC960_V1_PTL1 =				0x16,
 | 
						|
      DAC960_V1_1164P =				0x20
 | 
						|
    } __attribute__ ((packed)) SubModel;		/* Byte 0 */
 | 
						|
    unsigned char ActualChannels;			/* Byte 1 */
 | 
						|
    enum {
 | 
						|
      DAC960_V1_FiveChannelBoard =		0x01,
 | 
						|
      DAC960_V1_ThreeChannelBoard =		0x02,
 | 
						|
      DAC960_V1_TwoChannelBoard =		0x03,
 | 
						|
      DAC960_V1_ThreeChannelASIC_DAC =		0x04
 | 
						|
    } __attribute__ ((packed)) Model;			/* Byte 2 */
 | 
						|
    enum {
 | 
						|
      DAC960_V1_EISA_Controller =		0x01,
 | 
						|
      DAC960_V1_MicroChannel_Controller =	0x02,
 | 
						|
      DAC960_V1_PCI_Controller =		0x03,
 | 
						|
      DAC960_V1_SCSItoSCSI_Controller =		0x08
 | 
						|
    } __attribute__ ((packed)) ProductFamily;		/* Byte 3 */
 | 
						|
  } HardwareID;						/* Bytes 0-3 */
 | 
						|
  /* MajorVersion.MinorVersion-FirmwareType-TurnID */
 | 
						|
  struct {
 | 
						|
    unsigned char MajorVersion;				/* Byte 4 */
 | 
						|
    unsigned char MinorVersion;				/* Byte 5 */
 | 
						|
    unsigned char TurnID;				/* Byte 6 */
 | 
						|
    char FirmwareType;					/* Byte 7 */
 | 
						|
  } FirmwareID;						/* Bytes 4-7 */
 | 
						|
  unsigned char :8;					/* Byte 8 */
 | 
						|
  unsigned int :24;					/* Bytes 9-11 */
 | 
						|
  unsigned char ConfiguredChannels;			/* Byte 12 */
 | 
						|
  unsigned char ActualChannels;				/* Byte 13 */
 | 
						|
  unsigned char MaxTargets;				/* Byte 14 */
 | 
						|
  unsigned char MaxTags;				/* Byte 15 */
 | 
						|
  unsigned char MaxLogicalDrives;			/* Byte 16 */
 | 
						|
  unsigned char MaxArms;				/* Byte 17 */
 | 
						|
  unsigned char MaxSpans;				/* Byte 18 */
 | 
						|
  unsigned char :8;					/* Byte 19 */
 | 
						|
  unsigned int :32;					/* Bytes 20-23 */
 | 
						|
  unsigned int MemorySize;				/* Bytes 24-27 */
 | 
						|
  unsigned int CacheSize;				/* Bytes 28-31 */
 | 
						|
  unsigned int FlashMemorySize;				/* Bytes 32-35 */
 | 
						|
  unsigned int NonVolatileMemorySize;			/* Bytes 36-39 */
 | 
						|
  struct {
 | 
						|
    enum {
 | 
						|
      DAC960_V1_RamType_DRAM =			0x0,
 | 
						|
      DAC960_V1_RamType_EDO =			0x1,
 | 
						|
      DAC960_V1_RamType_SDRAM =			0x2,
 | 
						|
      DAC960_V1_RamType_Last =			0x7
 | 
						|
    } __attribute__ ((packed)) RamType:3;		/* Byte 40 Bits 0-2 */
 | 
						|
    enum {
 | 
						|
      DAC960_V1_ErrorCorrection_None =		0x0,
 | 
						|
      DAC960_V1_ErrorCorrection_Parity =	0x1,
 | 
						|
      DAC960_V1_ErrorCorrection_ECC =		0x2,
 | 
						|
      DAC960_V1_ErrorCorrection_Last =		0x7
 | 
						|
    } __attribute__ ((packed)) ErrorCorrection:3;	/* Byte 40 Bits 3-5 */
 | 
						|
    bool FastPageMode:1;				/* Byte 40 Bit 6 */
 | 
						|
    bool LowPowerMemory:1;				/* Byte 40 Bit 7 */
 | 
						|
    unsigned char :8;					/* Bytes 41 */
 | 
						|
  } MemoryType;
 | 
						|
  unsigned short ClockSpeed;				/* Bytes 42-43 */
 | 
						|
  unsigned short MemorySpeed;				/* Bytes 44-45 */
 | 
						|
  unsigned short HardwareSpeed;				/* Bytes 46-47 */
 | 
						|
  unsigned int :32;					/* Bytes 48-51 */
 | 
						|
  unsigned int :32;					/* Bytes 52-55 */
 | 
						|
  unsigned char :8;					/* Byte 56 */
 | 
						|
  unsigned char :8;					/* Byte 57 */
 | 
						|
  unsigned short :16;					/* Bytes 58-59 */
 | 
						|
  unsigned short MaxCommands;				/* Bytes 60-61 */
 | 
						|
  unsigned short MaxScatterGatherEntries;		/* Bytes 62-63 */
 | 
						|
  unsigned short MaxDriveCommands;			/* Bytes 64-65 */
 | 
						|
  unsigned short MaxIODescriptors;			/* Bytes 66-67 */
 | 
						|
  unsigned short MaxCombinedSectors;			/* Bytes 68-69 */
 | 
						|
  unsigned char Latency;				/* Byte 70 */
 | 
						|
  unsigned char :8;					/* Byte 71 */
 | 
						|
  unsigned char SCSITimeout;				/* Byte 72 */
 | 
						|
  unsigned char :8;					/* Byte 73 */
 | 
						|
  unsigned short MinFreeLines;				/* Bytes 74-75 */
 | 
						|
  unsigned int :32;					/* Bytes 76-79 */
 | 
						|
  unsigned int :32;					/* Bytes 80-83 */
 | 
						|
  unsigned char RebuildRateConstant;			/* Byte 84 */
 | 
						|
  unsigned char :8;					/* Byte 85 */
 | 
						|
  unsigned char :8;					/* Byte 86 */
 | 
						|
  unsigned char :8;					/* Byte 87 */
 | 
						|
  unsigned int :32;					/* Bytes 88-91 */
 | 
						|
  unsigned int :32;					/* Bytes 92-95 */
 | 
						|
  unsigned short PhysicalDriveBlockSize;		/* Bytes 96-97 */
 | 
						|
  unsigned short LogicalDriveBlockSize;			/* Bytes 98-99 */
 | 
						|
  unsigned short MaxBlocksPerCommand;			/* Bytes 100-101 */
 | 
						|
  unsigned short BlockFactor;				/* Bytes 102-103 */
 | 
						|
  unsigned short CacheLineSize;				/* Bytes 104-105 */
 | 
						|
  struct {
 | 
						|
    enum {
 | 
						|
      DAC960_V1_Narrow_8bit =			0x0,
 | 
						|
      DAC960_V1_Wide_16bit =			0x1,
 | 
						|
      DAC960_V1_Wide_32bit =			0x2
 | 
						|
    } __attribute__ ((packed)) BusWidth:2;		/* Byte 106 Bits 0-1 */
 | 
						|
    enum {
 | 
						|
      DAC960_V1_Fast =				0x0,
 | 
						|
      DAC960_V1_Ultra =				0x1,
 | 
						|
      DAC960_V1_Ultra2 =			0x2
 | 
						|
    } __attribute__ ((packed)) BusSpeed:2;		/* Byte 106 Bits 2-3 */
 | 
						|
    bool Differential:1;				/* Byte 106 Bit 4 */
 | 
						|
    unsigned char :3;					/* Byte 106 Bits 5-7 */
 | 
						|
  } SCSICapability;
 | 
						|
  unsigned char :8;					/* Byte 107 */
 | 
						|
  unsigned int :32;					/* Bytes 108-111 */
 | 
						|
  unsigned short FirmwareBuildNumber;			/* Bytes 112-113 */
 | 
						|
  enum {
 | 
						|
    DAC960_V1_AEMI =				0x01,
 | 
						|
    DAC960_V1_OEM1 =				0x02,
 | 
						|
    DAC960_V1_OEM2 =				0x04,
 | 
						|
    DAC960_V1_OEM3 =				0x08,
 | 
						|
    DAC960_V1_Conner =				0x10,
 | 
						|
    DAC960_V1_SAFTE =				0x20
 | 
						|
  } __attribute__ ((packed)) FaultManagementType;	/* Byte 114 */
 | 
						|
  unsigned char :8;					/* Byte 115 */
 | 
						|
  struct {
 | 
						|
    bool Clustering:1;					/* Byte 116 Bit 0 */
 | 
						|
    bool MylexOnlineRAIDExpansion:1;			/* Byte 116 Bit 1 */
 | 
						|
    bool ReadAhead:1;					/* Byte 116 Bit 2 */
 | 
						|
    bool BackgroundInitialization:1;			/* Byte 116 Bit 3 */
 | 
						|
    unsigned int :28;					/* Bytes 116-119 */
 | 
						|
  } FirmwareFeatures;
 | 
						|
  unsigned int :32;					/* Bytes 120-123 */
 | 
						|
  unsigned int :32;					/* Bytes 124-127 */
 | 
						|
}
 | 
						|
DAC960_V1_Enquiry2_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V1 Firmware Logical Drive State type.
 | 
						|
*/
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
  DAC960_V1_LogicalDrive_Online =		0x03,
 | 
						|
  DAC960_V1_LogicalDrive_Critical =		0x04,
 | 
						|
  DAC960_V1_LogicalDrive_Offline =		0xFF
 | 
						|
}
 | 
						|
__attribute__ ((packed))
 | 
						|
DAC960_V1_LogicalDriveState_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V1 Firmware Logical Drive Information structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V1_LogicalDriveInformation
 | 
						|
{
 | 
						|
  unsigned int LogicalDriveSize;			/* Bytes 0-3 */
 | 
						|
  DAC960_V1_LogicalDriveState_T LogicalDriveState;	/* Byte 4 */
 | 
						|
  unsigned char RAIDLevel:7;				/* Byte 5 Bits 0-6 */
 | 
						|
  bool WriteBack:1;					/* Byte 5 Bit 7 */
 | 
						|
  unsigned short :16;					/* Bytes 6-7 */
 | 
						|
}
 | 
						|
DAC960_V1_LogicalDriveInformation_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V1 Firmware Get Logical Drive Information Command
 | 
						|
  reply structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef DAC960_V1_LogicalDriveInformation_T
 | 
						|
	DAC960_V1_LogicalDriveInformationArray_T[DAC960_MaxLogicalDrives];
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V1 Firmware Perform Event Log Operation Types.
 | 
						|
*/
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
  DAC960_V1_GetEventLogEntry =			0x00
 | 
						|
}
 | 
						|
__attribute__ ((packed))
 | 
						|
DAC960_V1_PerformEventLogOpType_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V1 Firmware Get Event Log Entry Command reply structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V1_EventLogEntry
 | 
						|
{
 | 
						|
  unsigned char MessageType;				/* Byte 0 */
 | 
						|
  unsigned char MessageLength;				/* Byte 1 */
 | 
						|
  unsigned char TargetID:5;				/* Byte 2 Bits 0-4 */
 | 
						|
  unsigned char Channel:3;				/* Byte 2 Bits 5-7 */
 | 
						|
  unsigned char LogicalUnit:6;				/* Byte 3 Bits 0-5 */
 | 
						|
  unsigned char :2;					/* Byte 3 Bits 6-7 */
 | 
						|
  unsigned short SequenceNumber;			/* Bytes 4-5 */
 | 
						|
  unsigned char ErrorCode:7;				/* Byte 6 Bits 0-6 */
 | 
						|
  bool Valid:1;						/* Byte 6 Bit 7 */
 | 
						|
  unsigned char SegmentNumber;				/* Byte 7 */
 | 
						|
  DAC960_SCSI_RequestSenseKey_T SenseKey:4;		/* Byte 8 Bits 0-3 */
 | 
						|
  unsigned char :1;					/* Byte 8 Bit 4 */
 | 
						|
  bool ILI:1;						/* Byte 8 Bit 5 */
 | 
						|
  bool EOM:1;						/* Byte 8 Bit 6 */
 | 
						|
  bool Filemark:1;					/* Byte 8 Bit 7 */
 | 
						|
  unsigned char Information[4];				/* Bytes 9-12 */
 | 
						|
  unsigned char AdditionalSenseLength;			/* Byte 13 */
 | 
						|
  unsigned char CommandSpecificInformation[4];		/* Bytes 14-17 */
 | 
						|
  unsigned char AdditionalSenseCode;			/* Byte 18 */
 | 
						|
  unsigned char AdditionalSenseCodeQualifier;		/* Byte 19 */
 | 
						|
  unsigned char Dummy[12];				/* Bytes 20-31 */
 | 
						|
}
 | 
						|
DAC960_V1_EventLogEntry_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V1 Firmware Physical Device State type.
 | 
						|
*/
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
    DAC960_V1_Device_Dead =			0x00,
 | 
						|
    DAC960_V1_Device_WriteOnly =		0x02,
 | 
						|
    DAC960_V1_Device_Online =			0x03,
 | 
						|
    DAC960_V1_Device_Standby =			0x10
 | 
						|
}
 | 
						|
__attribute__ ((packed))
 | 
						|
DAC960_V1_PhysicalDeviceState_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V1 Firmware Get Device State Command reply structure.
 | 
						|
  The structure is padded by 2 bytes for compatibility with Version 2.xx
 | 
						|
  Firmware.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V1_DeviceState
 | 
						|
{
 | 
						|
  bool Present:1;					/* Byte 0 Bit 0 */
 | 
						|
  unsigned char :7;					/* Byte 0 Bits 1-7 */
 | 
						|
  enum {
 | 
						|
    DAC960_V1_OtherType =			0x0,
 | 
						|
    DAC960_V1_DiskType =			0x1,
 | 
						|
    DAC960_V1_SequentialType =			0x2,
 | 
						|
    DAC960_V1_CDROM_or_WORM_Type =		0x3
 | 
						|
    } __attribute__ ((packed)) DeviceType:2;		/* Byte 1 Bits 0-1 */
 | 
						|
  bool :1;						/* Byte 1 Bit 2 */
 | 
						|
  bool Fast20:1;					/* Byte 1 Bit 3 */
 | 
						|
  bool Sync:1;						/* Byte 1 Bit 4 */
 | 
						|
  bool Fast:1;						/* Byte 1 Bit 5 */
 | 
						|
  bool Wide:1;						/* Byte 1 Bit 6 */
 | 
						|
  bool TaggedQueuingSupported:1;			/* Byte 1 Bit 7 */
 | 
						|
  DAC960_V1_PhysicalDeviceState_T DeviceState;		/* Byte 2 */
 | 
						|
  unsigned char :8;					/* Byte 3 */
 | 
						|
  unsigned char SynchronousMultiplier;			/* Byte 4 */
 | 
						|
  unsigned char SynchronousOffset:5;			/* Byte 5 Bits 0-4 */
 | 
						|
  unsigned char :3;					/* Byte 5 Bits 5-7 */
 | 
						|
  unsigned int DiskSize __attribute__ ((packed));	/* Bytes 6-9 */
 | 
						|
  unsigned short :16;					/* Bytes 10-11 */
 | 
						|
}
 | 
						|
DAC960_V1_DeviceState_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V1 Firmware Get Rebuild Progress Command reply structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V1_RebuildProgress
 | 
						|
{
 | 
						|
  unsigned int LogicalDriveNumber;			/* Bytes 0-3 */
 | 
						|
  unsigned int LogicalDriveSize;			/* Bytes 4-7 */
 | 
						|
  unsigned int RemainingBlocks;				/* Bytes 8-11 */
 | 
						|
}
 | 
						|
DAC960_V1_RebuildProgress_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V1 Firmware Background Initialization Status Command
 | 
						|
  reply structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V1_BackgroundInitializationStatus
 | 
						|
{
 | 
						|
  unsigned int LogicalDriveSize;			/* Bytes 0-3 */
 | 
						|
  unsigned int BlocksCompleted;				/* Bytes 4-7 */
 | 
						|
  unsigned char Reserved1[12];				/* Bytes 8-19 */
 | 
						|
  unsigned int LogicalDriveNumber;			/* Bytes 20-23 */
 | 
						|
  unsigned char RAIDLevel;				/* Byte 24 */
 | 
						|
  enum {
 | 
						|
    DAC960_V1_BackgroundInitializationInvalid =	    0x00,
 | 
						|
    DAC960_V1_BackgroundInitializationStarted =	    0x02,
 | 
						|
    DAC960_V1_BackgroundInitializationInProgress =  0x04,
 | 
						|
    DAC960_V1_BackgroundInitializationSuspended =   0x05,
 | 
						|
    DAC960_V1_BackgroundInitializationCancelled =   0x06
 | 
						|
  } __attribute__ ((packed)) Status;			/* Byte 25 */
 | 
						|
  unsigned char Reserved2[6];				/* Bytes 26-31 */
 | 
						|
}
 | 
						|
DAC960_V1_BackgroundInitializationStatus_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V1 Firmware Error Table Entry structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V1_ErrorTableEntry
 | 
						|
{
 | 
						|
  unsigned char ParityErrorCount;			/* Byte 0 */
 | 
						|
  unsigned char SoftErrorCount;				/* Byte 1 */
 | 
						|
  unsigned char HardErrorCount;				/* Byte 2 */
 | 
						|
  unsigned char MiscErrorCount;				/* Byte 3 */
 | 
						|
}
 | 
						|
DAC960_V1_ErrorTableEntry_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V1 Firmware Get Error Table Command reply structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V1_ErrorTable
 | 
						|
{
 | 
						|
  DAC960_V1_ErrorTableEntry_T
 | 
						|
    ErrorTableEntries[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets];
 | 
						|
}
 | 
						|
DAC960_V1_ErrorTable_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V1 Firmware Read Config2 Command reply structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V1_Config2
 | 
						|
{
 | 
						|
  unsigned char :1;					/* Byte 0 Bit 0 */
 | 
						|
  bool ActiveNegationEnabled:1;				/* Byte 0 Bit 1 */
 | 
						|
  unsigned char :5;					/* Byte 0 Bits 2-6 */
 | 
						|
  bool NoRescanIfResetReceivedDuringScan:1;		/* Byte 0 Bit 7 */
 | 
						|
  bool StorageWorksSupportEnabled:1;			/* Byte 1 Bit 0 */
 | 
						|
  bool HewlettPackardSupportEnabled:1;			/* Byte 1 Bit 1 */
 | 
						|
  bool NoDisconnectOnFirstCommand:1;			/* Byte 1 Bit 2 */
 | 
						|
  unsigned char :2;					/* Byte 1 Bits 3-4 */
 | 
						|
  bool AEMI_ARM:1;					/* Byte 1 Bit 5 */
 | 
						|
  bool AEMI_OFM:1;					/* Byte 1 Bit 6 */
 | 
						|
  unsigned char :1;					/* Byte 1 Bit 7 */
 | 
						|
  enum {
 | 
						|
    DAC960_V1_OEMID_Mylex =			0x00,
 | 
						|
    DAC960_V1_OEMID_IBM =			0x08,
 | 
						|
    DAC960_V1_OEMID_HP =			0x0A,
 | 
						|
    DAC960_V1_OEMID_DEC =			0x0C,
 | 
						|
    DAC960_V1_OEMID_Siemens =			0x10,
 | 
						|
    DAC960_V1_OEMID_Intel =			0x12
 | 
						|
  } __attribute__ ((packed)) OEMID;			/* Byte 2 */
 | 
						|
  unsigned char OEMModelNumber;				/* Byte 3 */
 | 
						|
  unsigned char PhysicalSector;				/* Byte 4 */
 | 
						|
  unsigned char LogicalSector;				/* Byte 5 */
 | 
						|
  unsigned char BlockFactor;				/* Byte 6 */
 | 
						|
  bool ReadAheadEnabled:1;				/* Byte 7 Bit 0 */
 | 
						|
  bool LowBIOSDelay:1;					/* Byte 7 Bit 1 */
 | 
						|
  unsigned char :2;					/* Byte 7 Bits 2-3 */
 | 
						|
  bool ReassignRestrictedToOneSector:1;			/* Byte 7 Bit 4 */
 | 
						|
  unsigned char :1;					/* Byte 7 Bit 5 */
 | 
						|
  bool ForceUnitAccessDuringWriteRecovery:1;		/* Byte 7 Bit 6 */
 | 
						|
  bool EnableLeftSymmetricRAID5Algorithm:1;		/* Byte 7 Bit 7 */
 | 
						|
  unsigned char DefaultRebuildRate;			/* Byte 8 */
 | 
						|
  unsigned char :8;					/* Byte 9 */
 | 
						|
  unsigned char BlocksPerCacheLine;			/* Byte 10 */
 | 
						|
  unsigned char BlocksPerStripe;			/* Byte 11 */
 | 
						|
  struct {
 | 
						|
    enum {
 | 
						|
      DAC960_V1_Async =				0x0,
 | 
						|
      DAC960_V1_Sync_8MHz =			0x1,
 | 
						|
      DAC960_V1_Sync_5MHz =			0x2,
 | 
						|
      DAC960_V1_Sync_10or20MHz =		0x3	/* Byte 11 Bits 0-1 */
 | 
						|
    } __attribute__ ((packed)) Speed:2;
 | 
						|
    bool Force8Bit:1;					/* Byte 11 Bit 2 */
 | 
						|
    bool DisableFast20:1;				/* Byte 11 Bit 3 */
 | 
						|
    unsigned char :3;					/* Byte 11 Bits 4-6 */
 | 
						|
    bool EnableTaggedQueuing:1;				/* Byte 11 Bit 7 */
 | 
						|
  } __attribute__ ((packed)) ChannelParameters[6];	/* Bytes 12-17 */
 | 
						|
  unsigned char SCSIInitiatorID;			/* Byte 18 */
 | 
						|
  unsigned char :8;					/* Byte 19 */
 | 
						|
  enum {
 | 
						|
    DAC960_V1_StartupMode_ControllerSpinUp =	0x00,
 | 
						|
    DAC960_V1_StartupMode_PowerOnSpinUp =	0x01
 | 
						|
  } __attribute__ ((packed)) StartupMode;		/* Byte 20 */
 | 
						|
  unsigned char SimultaneousDeviceSpinUpCount;		/* Byte 21 */
 | 
						|
  unsigned char SecondsDelayBetweenSpinUps;		/* Byte 22 */
 | 
						|
  unsigned char Reserved1[29];				/* Bytes 23-51 */
 | 
						|
  bool BIOSDisabled:1;					/* Byte 52 Bit 0 */
 | 
						|
  bool CDROMBootEnabled:1;				/* Byte 52 Bit 1 */
 | 
						|
  unsigned char :3;					/* Byte 52 Bits 2-4 */
 | 
						|
  enum {
 | 
						|
    DAC960_V1_Geometry_128_32 =			0x0,
 | 
						|
    DAC960_V1_Geometry_255_63 =			0x1,
 | 
						|
    DAC960_V1_Geometry_Reserved1 =		0x2,
 | 
						|
    DAC960_V1_Geometry_Reserved2 =		0x3
 | 
						|
  } __attribute__ ((packed)) DriveGeometry:2;		/* Byte 52 Bits 5-6 */
 | 
						|
  unsigned char :1;					/* Byte 52 Bit 7 */
 | 
						|
  unsigned char Reserved2[9];				/* Bytes 53-61 */
 | 
						|
  unsigned short Checksum;				/* Bytes 62-63 */
 | 
						|
}
 | 
						|
DAC960_V1_Config2_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V1 Firmware DCDB request structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V1_DCDB
 | 
						|
{
 | 
						|
  unsigned char TargetID:4;				 /* Byte 0 Bits 0-3 */
 | 
						|
  unsigned char Channel:4;				 /* Byte 0 Bits 4-7 */
 | 
						|
  enum {
 | 
						|
    DAC960_V1_DCDB_NoDataTransfer =		0,
 | 
						|
    DAC960_V1_DCDB_DataTransferDeviceToSystem = 1,
 | 
						|
    DAC960_V1_DCDB_DataTransferSystemToDevice = 2,
 | 
						|
    DAC960_V1_DCDB_IllegalDataTransfer =	3
 | 
						|
  } __attribute__ ((packed)) Direction:2;		 /* Byte 1 Bits 0-1 */
 | 
						|
  bool EarlyStatus:1;					 /* Byte 1 Bit 2 */
 | 
						|
  unsigned char :1;					 /* Byte 1 Bit 3 */
 | 
						|
  enum {
 | 
						|
    DAC960_V1_DCDB_Timeout_24_hours =		0,
 | 
						|
    DAC960_V1_DCDB_Timeout_10_seconds =		1,
 | 
						|
    DAC960_V1_DCDB_Timeout_60_seconds =		2,
 | 
						|
    DAC960_V1_DCDB_Timeout_10_minutes =		3
 | 
						|
  } __attribute__ ((packed)) Timeout:2;			 /* Byte 1 Bits 4-5 */
 | 
						|
  bool NoAutomaticRequestSense:1;			 /* Byte 1 Bit 6 */
 | 
						|
  bool DisconnectPermitted:1;				 /* Byte 1 Bit 7 */
 | 
						|
  unsigned short TransferLength;			 /* Bytes 2-3 */
 | 
						|
  DAC960_BusAddress32_T BusAddress;			 /* Bytes 4-7 */
 | 
						|
  unsigned char CDBLength:4;				 /* Byte 8 Bits 0-3 */
 | 
						|
  unsigned char TransferLengthHigh4:4;			 /* Byte 8 Bits 4-7 */
 | 
						|
  unsigned char SenseLength;				 /* Byte 9 */
 | 
						|
  unsigned char CDB[12];				 /* Bytes 10-21 */
 | 
						|
  unsigned char SenseData[64];				 /* Bytes 22-85 */
 | 
						|
  unsigned char Status;					 /* Byte 86 */
 | 
						|
  unsigned char :8;					 /* Byte 87 */
 | 
						|
}
 | 
						|
DAC960_V1_DCDB_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V1 Firmware Scatter/Gather List Type 1 32 Bit Address
 | 
						|
  32 Bit Byte Count structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V1_ScatterGatherSegment
 | 
						|
{
 | 
						|
  DAC960_BusAddress32_T SegmentDataPointer;		/* Bytes 0-3 */
 | 
						|
  DAC960_ByteCount32_T SegmentByteCount;		/* Bytes 4-7 */
 | 
						|
}
 | 
						|
DAC960_V1_ScatterGatherSegment_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the 13 Byte DAC960 V1 Firmware Command Mailbox structure.  Bytes 13-15
 | 
						|
  are not used.  The Command Mailbox structure is padded to 16 bytes for
 | 
						|
  efficient access.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_V1_CommandMailbox
 | 
						|
{
 | 
						|
  unsigned int Words[4];				/* Words 0-3 */
 | 
						|
  unsigned char Bytes[16];				/* Bytes 0-15 */
 | 
						|
  struct {
 | 
						|
    DAC960_V1_CommandOpcode_T CommandOpcode;		/* Byte 0 */
 | 
						|
    DAC960_V1_CommandIdentifier_T CommandIdentifier;	/* Byte 1 */
 | 
						|
    unsigned char Dummy[14];				/* Bytes 2-15 */
 | 
						|
  } __attribute__ ((packed)) Common;
 | 
						|
  struct {
 | 
						|
    DAC960_V1_CommandOpcode_T CommandOpcode;		/* Byte 0 */
 | 
						|
    DAC960_V1_CommandIdentifier_T CommandIdentifier;	/* Byte 1 */
 | 
						|
    unsigned char Dummy1[6];				/* Bytes 2-7 */
 | 
						|
    DAC960_BusAddress32_T BusAddress;			/* Bytes 8-11 */
 | 
						|
    unsigned char Dummy2[4];				/* Bytes 12-15 */
 | 
						|
  } __attribute__ ((packed)) Type3;
 | 
						|
  struct {
 | 
						|
    DAC960_V1_CommandOpcode_T CommandOpcode;		/* Byte 0 */
 | 
						|
    DAC960_V1_CommandIdentifier_T CommandIdentifier;	/* Byte 1 */
 | 
						|
    unsigned char CommandOpcode2;			/* Byte 2 */
 | 
						|
    unsigned char Dummy1[5];				/* Bytes 3-7 */
 | 
						|
    DAC960_BusAddress32_T BusAddress;			/* Bytes 8-11 */
 | 
						|
    unsigned char Dummy2[4];				/* Bytes 12-15 */
 | 
						|
  } __attribute__ ((packed)) Type3B;
 | 
						|
  struct {
 | 
						|
    DAC960_V1_CommandOpcode_T CommandOpcode;		/* Byte 0 */
 | 
						|
    DAC960_V1_CommandIdentifier_T CommandIdentifier;	/* Byte 1 */
 | 
						|
    unsigned char Dummy1[5];				/* Bytes 2-6 */
 | 
						|
    unsigned char LogicalDriveNumber:6;			/* Byte 7 Bits 0-6 */
 | 
						|
    bool AutoRestore:1;					/* Byte 7 Bit 7 */
 | 
						|
    unsigned char Dummy2[8];				/* Bytes 8-15 */
 | 
						|
  } __attribute__ ((packed)) Type3C;
 | 
						|
  struct {
 | 
						|
    DAC960_V1_CommandOpcode_T CommandOpcode;		/* Byte 0 */
 | 
						|
    DAC960_V1_CommandIdentifier_T CommandIdentifier;	/* Byte 1 */
 | 
						|
    unsigned char Channel;				/* Byte 2 */
 | 
						|
    unsigned char TargetID;				/* Byte 3 */
 | 
						|
    DAC960_V1_PhysicalDeviceState_T DeviceState:5;	/* Byte 4 Bits 0-4 */
 | 
						|
    unsigned char Modifier:3;				/* Byte 4 Bits 5-7 */
 | 
						|
    unsigned char Dummy1[3];				/* Bytes 5-7 */
 | 
						|
    DAC960_BusAddress32_T BusAddress;			/* Bytes 8-11 */
 | 
						|
    unsigned char Dummy2[4];				/* Bytes 12-15 */
 | 
						|
  } __attribute__ ((packed)) Type3D;
 | 
						|
  struct {
 | 
						|
    DAC960_V1_CommandOpcode_T CommandOpcode;		/* Byte 0 */
 | 
						|
    DAC960_V1_CommandIdentifier_T CommandIdentifier;	/* Byte 1 */
 | 
						|
    DAC960_V1_PerformEventLogOpType_T OperationType;	/* Byte 2 */
 | 
						|
    unsigned char OperationQualifier;			/* Byte 3 */
 | 
						|
    unsigned short SequenceNumber;			/* Bytes 4-5 */
 | 
						|
    unsigned char Dummy1[2];				/* Bytes 6-7 */
 | 
						|
    DAC960_BusAddress32_T BusAddress;			/* Bytes 8-11 */
 | 
						|
    unsigned char Dummy2[4];				/* Bytes 12-15 */
 | 
						|
  } __attribute__ ((packed)) Type3E;
 | 
						|
  struct {
 | 
						|
    DAC960_V1_CommandOpcode_T CommandOpcode;		/* Byte 0 */
 | 
						|
    DAC960_V1_CommandIdentifier_T CommandIdentifier;	/* Byte 1 */
 | 
						|
    unsigned char Dummy1[2];				/* Bytes 2-3 */
 | 
						|
    unsigned char RebuildRateConstant;			/* Byte 4 */
 | 
						|
    unsigned char Dummy2[3];				/* Bytes 5-7 */
 | 
						|
    DAC960_BusAddress32_T BusAddress;			/* Bytes 8-11 */
 | 
						|
    unsigned char Dummy3[4];				/* Bytes 12-15 */
 | 
						|
  } __attribute__ ((packed)) Type3R;
 | 
						|
  struct {
 | 
						|
    DAC960_V1_CommandOpcode_T CommandOpcode;		/* Byte 0 */
 | 
						|
    DAC960_V1_CommandIdentifier_T CommandIdentifier;	/* Byte 1 */
 | 
						|
    unsigned short TransferLength;			/* Bytes 2-3 */
 | 
						|
    unsigned int LogicalBlockAddress;			/* Bytes 4-7 */
 | 
						|
    DAC960_BusAddress32_T BusAddress;			/* Bytes 8-11 */
 | 
						|
    unsigned char LogicalDriveNumber;			/* Byte 12 */
 | 
						|
    unsigned char Dummy[3];				/* Bytes 13-15 */
 | 
						|
  } __attribute__ ((packed)) Type4;
 | 
						|
  struct {
 | 
						|
    DAC960_V1_CommandOpcode_T CommandOpcode;		/* Byte 0 */
 | 
						|
    DAC960_V1_CommandIdentifier_T CommandIdentifier;	/* Byte 1 */
 | 
						|
    struct {
 | 
						|
      unsigned short TransferLength:11;			/* Bytes 2-3 */
 | 
						|
      unsigned char LogicalDriveNumber:5;		/* Byte 3 Bits 3-7 */
 | 
						|
    } __attribute__ ((packed)) LD;
 | 
						|
    unsigned int LogicalBlockAddress;			/* Bytes 4-7 */
 | 
						|
    DAC960_BusAddress32_T BusAddress;			/* Bytes 8-11 */
 | 
						|
    unsigned char ScatterGatherCount:6;			/* Byte 12 Bits 0-5 */
 | 
						|
    enum {
 | 
						|
      DAC960_V1_ScatterGather_32BitAddress_32BitByteCount = 0x0,
 | 
						|
      DAC960_V1_ScatterGather_32BitAddress_16BitByteCount = 0x1,
 | 
						|
      DAC960_V1_ScatterGather_32BitByteCount_32BitAddress = 0x2,
 | 
						|
      DAC960_V1_ScatterGather_16BitByteCount_32BitAddress = 0x3
 | 
						|
    } __attribute__ ((packed)) ScatterGatherType:2;	/* Byte 12 Bits 6-7 */
 | 
						|
    unsigned char Dummy[3];				/* Bytes 13-15 */
 | 
						|
  } __attribute__ ((packed)) Type5;
 | 
						|
  struct {
 | 
						|
    DAC960_V1_CommandOpcode_T CommandOpcode;		/* Byte 0 */
 | 
						|
    DAC960_V1_CommandIdentifier_T CommandIdentifier;	/* Byte 1 */
 | 
						|
    unsigned char CommandOpcode2;			/* Byte 2 */
 | 
						|
    unsigned char :8;					/* Byte 3 */
 | 
						|
    DAC960_BusAddress32_T CommandMailboxesBusAddress;	/* Bytes 4-7 */
 | 
						|
    DAC960_BusAddress32_T StatusMailboxesBusAddress;	/* Bytes 8-11 */
 | 
						|
    unsigned char Dummy[4];				/* Bytes 12-15 */
 | 
						|
  } __attribute__ ((packed)) TypeX;
 | 
						|
}
 | 
						|
DAC960_V1_CommandMailbox_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Command Opcodes.
 | 
						|
*/
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
  DAC960_V2_MemCopy =				0x01,
 | 
						|
  DAC960_V2_SCSI_10_Passthru =			0x02,
 | 
						|
  DAC960_V2_SCSI_255_Passthru =			0x03,
 | 
						|
  DAC960_V2_SCSI_10 =				0x04,
 | 
						|
  DAC960_V2_SCSI_256 =				0x05,
 | 
						|
  DAC960_V2_IOCTL =				0x20
 | 
						|
}
 | 
						|
__attribute__ ((packed))
 | 
						|
DAC960_V2_CommandOpcode_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware IOCTL Opcodes.
 | 
						|
*/
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
  DAC960_V2_GetControllerInfo =			0x01,
 | 
						|
  DAC960_V2_GetLogicalDeviceInfoValid =		0x03,
 | 
						|
  DAC960_V2_GetPhysicalDeviceInfoValid =	0x05,
 | 
						|
  DAC960_V2_GetHealthStatus =			0x11,
 | 
						|
  DAC960_V2_GetEvent =				0x15,
 | 
						|
  DAC960_V2_StartDiscovery =			0x81,
 | 
						|
  DAC960_V2_SetDeviceState =			0x82,
 | 
						|
  DAC960_V2_RebuildDeviceStart =		0x88,
 | 
						|
  DAC960_V2_RebuildDeviceStop =			0x89,
 | 
						|
  DAC960_V2_ConsistencyCheckStart =		0x8C,
 | 
						|
  DAC960_V2_ConsistencyCheckStop =		0x8D,
 | 
						|
  DAC960_V2_SetMemoryMailbox =			0x8E,
 | 
						|
  DAC960_V2_PauseDevice =			0x92,
 | 
						|
  DAC960_V2_TranslatePhysicalToLogicalDevice =	0xC5
 | 
						|
}
 | 
						|
__attribute__ ((packed))
 | 
						|
DAC960_V2_IOCTL_Opcode_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Command Identifier type.
 | 
						|
*/
 | 
						|
 | 
						|
typedef unsigned short DAC960_V2_CommandIdentifier_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Command Status Codes.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_V2_NormalCompletion		0x00
 | 
						|
#define DAC960_V2_AbormalCompletion		0x02
 | 
						|
#define DAC960_V2_DeviceBusy			0x08
 | 
						|
#define DAC960_V2_DeviceNonresponsive		0x0E
 | 
						|
#define DAC960_V2_DeviceNonresponsive2		0x0F
 | 
						|
#define DAC960_V2_DeviceRevervationConflict	0x18
 | 
						|
 | 
						|
typedef unsigned char DAC960_V2_CommandStatus_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Memory Type structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V2_MemoryType
 | 
						|
{
 | 
						|
  enum {
 | 
						|
    DAC960_V2_MemoryType_Reserved =		0x00,
 | 
						|
    DAC960_V2_MemoryType_DRAM =			0x01,
 | 
						|
    DAC960_V2_MemoryType_EDRAM =		0x02,
 | 
						|
    DAC960_V2_MemoryType_EDO =			0x03,
 | 
						|
    DAC960_V2_MemoryType_SDRAM =		0x04,
 | 
						|
    DAC960_V2_MemoryType_Last =			0x1F
 | 
						|
  } __attribute__ ((packed)) MemoryType:5;		/* Byte 0 Bits 0-4 */
 | 
						|
  bool :1;						/* Byte 0 Bit 5 */
 | 
						|
  bool MemoryParity:1;					/* Byte 0 Bit 6 */
 | 
						|
  bool MemoryECC:1;					/* Byte 0 Bit 7 */
 | 
						|
}
 | 
						|
DAC960_V2_MemoryType_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Processor Type structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
  DAC960_V2_ProcessorType_i960CA =		0x01,
 | 
						|
  DAC960_V2_ProcessorType_i960RD =		0x02,
 | 
						|
  DAC960_V2_ProcessorType_i960RN =		0x03,
 | 
						|
  DAC960_V2_ProcessorType_i960RP =		0x04,
 | 
						|
  DAC960_V2_ProcessorType_NorthBay =		0x05,
 | 
						|
  DAC960_V2_ProcessorType_StrongArm =		0x06,
 | 
						|
  DAC960_V2_ProcessorType_i960RM =		0x07
 | 
						|
}
 | 
						|
__attribute__ ((packed))
 | 
						|
DAC960_V2_ProcessorType_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Get Controller Info reply structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V2_ControllerInfo
 | 
						|
{
 | 
						|
  unsigned char :8;					/* Byte 0 */
 | 
						|
  enum {
 | 
						|
    DAC960_V2_SCSI_Bus =			0x00,
 | 
						|
    DAC960_V2_Fibre_Bus =			0x01,
 | 
						|
    DAC960_V2_PCI_Bus =				0x03
 | 
						|
  } __attribute__ ((packed)) BusInterfaceType;		/* Byte 1 */
 | 
						|
  enum {
 | 
						|
    DAC960_V2_DAC960E =				0x01,
 | 
						|
    DAC960_V2_DAC960M =				0x08,
 | 
						|
    DAC960_V2_DAC960PD =			0x10,
 | 
						|
    DAC960_V2_DAC960PL =			0x11,
 | 
						|
    DAC960_V2_DAC960PU =			0x12,
 | 
						|
    DAC960_V2_DAC960PE =			0x13,
 | 
						|
    DAC960_V2_DAC960PG =			0x14,
 | 
						|
    DAC960_V2_DAC960PJ =			0x15,
 | 
						|
    DAC960_V2_DAC960PTL0 =			0x16,
 | 
						|
    DAC960_V2_DAC960PR =			0x17,
 | 
						|
    DAC960_V2_DAC960PRL =			0x18,
 | 
						|
    DAC960_V2_DAC960PT =			0x19,
 | 
						|
    DAC960_V2_DAC1164P =			0x1A,
 | 
						|
    DAC960_V2_DAC960PTL1 =			0x1B,
 | 
						|
    DAC960_V2_EXR2000P =			0x1C,
 | 
						|
    DAC960_V2_EXR3000P =			0x1D,
 | 
						|
    DAC960_V2_AcceleRAID352 =			0x1E,
 | 
						|
    DAC960_V2_AcceleRAID170 =			0x1F,
 | 
						|
    DAC960_V2_AcceleRAID160 =			0x20,
 | 
						|
    DAC960_V2_DAC960S =				0x60,
 | 
						|
    DAC960_V2_DAC960SU =			0x61,
 | 
						|
    DAC960_V2_DAC960SX =			0x62,
 | 
						|
    DAC960_V2_DAC960SF =			0x63,
 | 
						|
    DAC960_V2_DAC960SS =			0x64,
 | 
						|
    DAC960_V2_DAC960FL =			0x65,
 | 
						|
    DAC960_V2_DAC960LL =			0x66,
 | 
						|
    DAC960_V2_DAC960FF =			0x67,
 | 
						|
    DAC960_V2_DAC960HP =			0x68,
 | 
						|
    DAC960_V2_RAIDBRICK =			0x69,
 | 
						|
    DAC960_V2_METEOR_FL =			0x6A,
 | 
						|
    DAC960_V2_METEOR_FF =			0x6B
 | 
						|
  } __attribute__ ((packed)) ControllerType;		/* Byte 2 */
 | 
						|
  unsigned char :8;					/* Byte 3 */
 | 
						|
  unsigned short BusInterfaceSpeedMHz;			/* Bytes 4-5 */
 | 
						|
  unsigned char BusWidthBits;				/* Byte 6 */
 | 
						|
  unsigned char FlashCodeTypeOrProductID;		/* Byte 7 */
 | 
						|
  unsigned char NumberOfHostPortsPresent;		/* Byte 8 */
 | 
						|
  unsigned char Reserved1[7];				/* Bytes 9-15 */
 | 
						|
  unsigned char BusInterfaceName[16];			/* Bytes 16-31 */
 | 
						|
  unsigned char ControllerName[16];			/* Bytes 32-47 */
 | 
						|
  unsigned char Reserved2[16];				/* Bytes 48-63 */
 | 
						|
  /* Firmware Release Information */
 | 
						|
  unsigned char FirmwareMajorVersion;			/* Byte 64 */
 | 
						|
  unsigned char FirmwareMinorVersion;			/* Byte 65 */
 | 
						|
  unsigned char FirmwareTurnNumber;			/* Byte 66 */
 | 
						|
  unsigned char FirmwareBuildNumber;			/* Byte 67 */
 | 
						|
  unsigned char FirmwareReleaseDay;			/* Byte 68 */
 | 
						|
  unsigned char FirmwareReleaseMonth;			/* Byte 69 */
 | 
						|
  unsigned char FirmwareReleaseYearHigh2Digits;		/* Byte 70 */
 | 
						|
  unsigned char FirmwareReleaseYearLow2Digits;		/* Byte 71 */
 | 
						|
  /* Hardware Release Information */
 | 
						|
  unsigned char HardwareRevision;			/* Byte 72 */
 | 
						|
  unsigned int :24;					/* Bytes 73-75 */
 | 
						|
  unsigned char HardwareReleaseDay;			/* Byte 76 */
 | 
						|
  unsigned char HardwareReleaseMonth;			/* Byte 77 */
 | 
						|
  unsigned char HardwareReleaseYearHigh2Digits;		/* Byte 78 */
 | 
						|
  unsigned char HardwareReleaseYearLow2Digits;		/* Byte 79 */
 | 
						|
  /* Hardware Manufacturing Information */
 | 
						|
  unsigned char ManufacturingBatchNumber;		/* Byte 80 */
 | 
						|
  unsigned char :8;					/* Byte 81 */
 | 
						|
  unsigned char ManufacturingPlantNumber;		/* Byte 82 */
 | 
						|
  unsigned char :8;					/* Byte 83 */
 | 
						|
  unsigned char HardwareManufacturingDay;		/* Byte 84 */
 | 
						|
  unsigned char HardwareManufacturingMonth;		/* Byte 85 */
 | 
						|
  unsigned char HardwareManufacturingYearHigh2Digits;	/* Byte 86 */
 | 
						|
  unsigned char HardwareManufacturingYearLow2Digits;	/* Byte 87 */
 | 
						|
  unsigned char MaximumNumberOfPDDperXLD;		/* Byte 88 */
 | 
						|
  unsigned char MaximumNumberOfILDperXLD;		/* Byte 89 */
 | 
						|
  unsigned short NonvolatileMemorySizeKB;		/* Bytes 90-91 */
 | 
						|
  unsigned char MaximumNumberOfXLD;			/* Byte 92 */
 | 
						|
  unsigned int :24;					/* Bytes 93-95 */
 | 
						|
  /* Unique Information per Controller */
 | 
						|
  unsigned char ControllerSerialNumber[16];		/* Bytes 96-111 */
 | 
						|
  unsigned char Reserved3[16];				/* Bytes 112-127 */
 | 
						|
  /* Vendor Information */
 | 
						|
  unsigned int :24;					/* Bytes 128-130 */
 | 
						|
  unsigned char OEM_Code;				/* Byte 131 */
 | 
						|
  unsigned char VendorName[16];				/* Bytes 132-147 */
 | 
						|
  /* Other Physical/Controller/Operation Information */
 | 
						|
  bool BBU_Present:1;					/* Byte 148 Bit 0 */
 | 
						|
  bool ActiveActiveClusteringMode:1;			/* Byte 148 Bit 1 */
 | 
						|
  unsigned char :6;					/* Byte 148 Bits 2-7 */
 | 
						|
  unsigned char :8;					/* Byte 149 */
 | 
						|
  unsigned short :16;					/* Bytes 150-151 */
 | 
						|
  /* Physical Device Scan Information */
 | 
						|
  bool PhysicalScanActive:1;				/* Byte 152 Bit 0 */
 | 
						|
  unsigned char :7;					/* Byte 152 Bits 1-7 */
 | 
						|
  unsigned char PhysicalDeviceChannelNumber;		/* Byte 153 */
 | 
						|
  unsigned char PhysicalDeviceTargetID;			/* Byte 154 */
 | 
						|
  unsigned char PhysicalDeviceLogicalUnit;		/* Byte 155 */
 | 
						|
  /* Maximum Command Data Transfer Sizes */
 | 
						|
  unsigned short MaximumDataTransferSizeInBlocks;	/* Bytes 156-157 */
 | 
						|
  unsigned short MaximumScatterGatherEntries;		/* Bytes 158-159 */
 | 
						|
  /* Logical/Physical Device Counts */
 | 
						|
  unsigned short LogicalDevicesPresent;			/* Bytes 160-161 */
 | 
						|
  unsigned short LogicalDevicesCritical;		/* Bytes 162-163 */
 | 
						|
  unsigned short LogicalDevicesOffline;			/* Bytes 164-165 */
 | 
						|
  unsigned short PhysicalDevicesPresent;		/* Bytes 166-167 */
 | 
						|
  unsigned short PhysicalDisksPresent;			/* Bytes 168-169 */
 | 
						|
  unsigned short PhysicalDisksCritical;			/* Bytes 170-171 */
 | 
						|
  unsigned short PhysicalDisksOffline;			/* Bytes 172-173 */
 | 
						|
  unsigned short MaximumParallelCommands;		/* Bytes 174-175 */
 | 
						|
  /* Channel and Target ID Information */
 | 
						|
  unsigned char NumberOfPhysicalChannelsPresent;	/* Byte 176 */
 | 
						|
  unsigned char NumberOfVirtualChannelsPresent;		/* Byte 177 */
 | 
						|
  unsigned char NumberOfPhysicalChannelsPossible;	/* Byte 178 */
 | 
						|
  unsigned char NumberOfVirtualChannelsPossible;	/* Byte 179 */
 | 
						|
  unsigned char MaximumTargetsPerChannel[16];		/* Bytes 180-195 */
 | 
						|
  unsigned char Reserved4[12];				/* Bytes 196-207 */
 | 
						|
  /* Memory/Cache Information */
 | 
						|
  unsigned short MemorySizeMB;				/* Bytes 208-209 */
 | 
						|
  unsigned short CacheSizeMB;				/* Bytes 210-211 */
 | 
						|
  unsigned int ValidCacheSizeInBytes;			/* Bytes 212-215 */
 | 
						|
  unsigned int DirtyCacheSizeInBytes;			/* Bytes 216-219 */
 | 
						|
  unsigned short MemorySpeedMHz;			/* Bytes 220-221 */
 | 
						|
  unsigned char MemoryDataWidthBits;			/* Byte 222 */
 | 
						|
  DAC960_V2_MemoryType_T MemoryType;			/* Byte 223 */
 | 
						|
  unsigned char CacheMemoryTypeName[16];		/* Bytes 224-239 */
 | 
						|
  /* Execution Memory Information */
 | 
						|
  unsigned short ExecutionMemorySizeMB;			/* Bytes 240-241 */
 | 
						|
  unsigned short ExecutionL2CacheSizeMB;		/* Bytes 242-243 */
 | 
						|
  unsigned char Reserved5[8];				/* Bytes 244-251 */
 | 
						|
  unsigned short ExecutionMemorySpeedMHz;		/* Bytes 252-253 */
 | 
						|
  unsigned char ExecutionMemoryDataWidthBits;		/* Byte 254 */
 | 
						|
  DAC960_V2_MemoryType_T ExecutionMemoryType;		/* Byte 255 */
 | 
						|
  unsigned char ExecutionMemoryTypeName[16];		/* Bytes 256-271 */
 | 
						|
  /* First CPU Type Information */
 | 
						|
  unsigned short FirstProcessorSpeedMHz;		/* Bytes 272-273 */
 | 
						|
  DAC960_V2_ProcessorType_T FirstProcessorType;		/* Byte 274 */
 | 
						|
  unsigned char FirstProcessorCount;			/* Byte 275 */
 | 
						|
  unsigned char Reserved6[12];				/* Bytes 276-287 */
 | 
						|
  unsigned char FirstProcessorName[16];			/* Bytes 288-303 */
 | 
						|
  /* Second CPU Type Information */
 | 
						|
  unsigned short SecondProcessorSpeedMHz;		/* Bytes 304-305 */
 | 
						|
  DAC960_V2_ProcessorType_T SecondProcessorType;	/* Byte 306 */
 | 
						|
  unsigned char SecondProcessorCount;			/* Byte 307 */
 | 
						|
  unsigned char Reserved7[12];				/* Bytes 308-319 */
 | 
						|
  unsigned char SecondProcessorName[16];		/* Bytes 320-335 */
 | 
						|
  /* Debugging/Profiling/Command Time Tracing Information */
 | 
						|
  unsigned short CurrentProfilingDataPageNumber;	/* Bytes 336-337 */
 | 
						|
  unsigned short ProgramsAwaitingProfilingData;		/* Bytes 338-339 */
 | 
						|
  unsigned short CurrentCommandTimeTraceDataPageNumber;	/* Bytes 340-341 */
 | 
						|
  unsigned short ProgramsAwaitingCommandTimeTraceData;	/* Bytes 342-343 */
 | 
						|
  unsigned char Reserved8[8];				/* Bytes 344-351 */
 | 
						|
  /* Error Counters on Physical Devices */
 | 
						|
  unsigned short PhysicalDeviceBusResets;		/* Bytes 352-353 */
 | 
						|
  unsigned short PhysicalDeviceParityErrors;		/* Bytes 355-355 */
 | 
						|
  unsigned short PhysicalDeviceSoftErrors;		/* Bytes 356-357 */
 | 
						|
  unsigned short PhysicalDeviceCommandsFailed;		/* Bytes 358-359 */
 | 
						|
  unsigned short PhysicalDeviceMiscellaneousErrors;	/* Bytes 360-361 */
 | 
						|
  unsigned short PhysicalDeviceCommandTimeouts;		/* Bytes 362-363 */
 | 
						|
  unsigned short PhysicalDeviceSelectionTimeouts;	/* Bytes 364-365 */
 | 
						|
  unsigned short PhysicalDeviceRetriesDone;		/* Bytes 366-367 */
 | 
						|
  unsigned short PhysicalDeviceAbortsDone;		/* Bytes 368-369 */
 | 
						|
  unsigned short PhysicalDeviceHostCommandAbortsDone;	/* Bytes 370-371 */
 | 
						|
  unsigned short PhysicalDevicePredictedFailuresDetected; /* Bytes 372-373 */
 | 
						|
  unsigned short PhysicalDeviceHostCommandsFailed;	/* Bytes 374-375 */
 | 
						|
  unsigned short PhysicalDeviceHardErrors;		/* Bytes 376-377 */
 | 
						|
  unsigned char Reserved9[6];				/* Bytes 378-383 */
 | 
						|
  /* Error Counters on Logical Devices */
 | 
						|
  unsigned short LogicalDeviceSoftErrors;		/* Bytes 384-385 */
 | 
						|
  unsigned short LogicalDeviceCommandsFailed;		/* Bytes 386-387 */
 | 
						|
  unsigned short LogicalDeviceHostCommandAbortsDone;	/* Bytes 388-389 */
 | 
						|
  unsigned short :16;					/* Bytes 390-391 */
 | 
						|
  /* Error Counters on Controller */
 | 
						|
  unsigned short ControllerMemoryErrors;		/* Bytes 392-393 */
 | 
						|
  unsigned short ControllerHostCommandAbortsDone;	/* Bytes 394-395 */
 | 
						|
  unsigned int :32;					/* Bytes 396-399 */
 | 
						|
  /* Long Duration Activity Information */
 | 
						|
  unsigned short BackgroundInitializationsActive;	/* Bytes 400-401 */
 | 
						|
  unsigned short LogicalDeviceInitializationsActive;	/* Bytes 402-403 */
 | 
						|
  unsigned short PhysicalDeviceInitializationsActive;	/* Bytes 404-405 */
 | 
						|
  unsigned short ConsistencyChecksActive;		/* Bytes 406-407 */
 | 
						|
  unsigned short RebuildsActive;			/* Bytes 408-409 */
 | 
						|
  unsigned short OnlineExpansionsActive;		/* Bytes 410-411 */
 | 
						|
  unsigned short PatrolActivitiesActive;		/* Bytes 412-413 */
 | 
						|
  unsigned short :16;					/* Bytes 414-415 */
 | 
						|
  /* Flash ROM Information */
 | 
						|
  unsigned char FlashType;				/* Byte 416 */
 | 
						|
  unsigned char :8;					/* Byte 417 */
 | 
						|
  unsigned short FlashSizeMB;				/* Bytes 418-419 */
 | 
						|
  unsigned int FlashLimit;				/* Bytes 420-423 */
 | 
						|
  unsigned int FlashCount;				/* Bytes 424-427 */
 | 
						|
  unsigned int :32;					/* Bytes 428-431 */
 | 
						|
  unsigned char FlashTypeName[16];			/* Bytes 432-447 */
 | 
						|
  /* Firmware Run Time Information */
 | 
						|
  unsigned char RebuildRate;				/* Byte 448 */
 | 
						|
  unsigned char BackgroundInitializationRate;		/* Byte 449 */
 | 
						|
  unsigned char ForegroundInitializationRate;		/* Byte 450 */
 | 
						|
  unsigned char ConsistencyCheckRate;			/* Byte 451 */
 | 
						|
  unsigned int :32;					/* Bytes 452-455 */
 | 
						|
  unsigned int MaximumDP;				/* Bytes 456-459 */
 | 
						|
  unsigned int FreeDP;					/* Bytes 460-463 */
 | 
						|
  unsigned int MaximumIOP;				/* Bytes 464-467 */
 | 
						|
  unsigned int FreeIOP;					/* Bytes 468-471 */
 | 
						|
  unsigned short MaximumCombLengthInBlocks;		/* Bytes 472-473 */
 | 
						|
  unsigned short NumberOfConfigurationGroups;		/* Bytes 474-475 */
 | 
						|
  bool InstallationAbortStatus:1;			/* Byte 476 Bit 0 */
 | 
						|
  bool MaintenanceModeStatus:1;				/* Byte 476 Bit 1 */
 | 
						|
  unsigned int :24;					/* Bytes 476-479 */
 | 
						|
  unsigned char Reserved10[32];				/* Bytes 480-511 */
 | 
						|
  unsigned char Reserved11[512];			/* Bytes 512-1023 */
 | 
						|
}
 | 
						|
DAC960_V2_ControllerInfo_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Logical Device State type.
 | 
						|
*/
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
  DAC960_V2_LogicalDevice_Online =		0x01,
 | 
						|
  DAC960_V2_LogicalDevice_Offline =		0x08,
 | 
						|
  DAC960_V2_LogicalDevice_Critical =		0x09
 | 
						|
}
 | 
						|
__attribute__ ((packed))
 | 
						|
DAC960_V2_LogicalDeviceState_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Get Logical Device Info reply structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V2_LogicalDeviceInfo
 | 
						|
{
 | 
						|
  unsigned char :8;					/* Byte 0 */
 | 
						|
  unsigned char Channel;				/* Byte 1 */
 | 
						|
  unsigned char TargetID;				/* Byte 2 */
 | 
						|
  unsigned char LogicalUnit;				/* Byte 3 */
 | 
						|
  DAC960_V2_LogicalDeviceState_T LogicalDeviceState;	/* Byte 4 */
 | 
						|
  unsigned char RAIDLevel;				/* Byte 5 */
 | 
						|
  unsigned char StripeSize;				/* Byte 6 */
 | 
						|
  unsigned char CacheLineSize;				/* Byte 7 */
 | 
						|
  struct {
 | 
						|
    enum {
 | 
						|
      DAC960_V2_ReadCacheDisabled =		0x0,
 | 
						|
      DAC960_V2_ReadCacheEnabled =		0x1,
 | 
						|
      DAC960_V2_ReadAheadEnabled =		0x2,
 | 
						|
      DAC960_V2_IntelligentReadAheadEnabled =	0x3,
 | 
						|
      DAC960_V2_ReadCache_Last =		0x7
 | 
						|
    } __attribute__ ((packed)) ReadCache:3;		/* Byte 8 Bits 0-2 */
 | 
						|
    enum {
 | 
						|
      DAC960_V2_WriteCacheDisabled =		0x0,
 | 
						|
      DAC960_V2_LogicalDeviceReadOnly =		0x1,
 | 
						|
      DAC960_V2_WriteCacheEnabled =		0x2,
 | 
						|
      DAC960_V2_IntelligentWriteCacheEnabled =	0x3,
 | 
						|
      DAC960_V2_WriteCache_Last =		0x7
 | 
						|
    } __attribute__ ((packed)) WriteCache:3;		/* Byte 8 Bits 3-5 */
 | 
						|
    bool :1;						/* Byte 8 Bit 6 */
 | 
						|
    bool LogicalDeviceInitialized:1;			/* Byte 8 Bit 7 */
 | 
						|
  } LogicalDeviceControl;				/* Byte 8 */
 | 
						|
  /* Logical Device Operations Status */
 | 
						|
  bool ConsistencyCheckInProgress:1;			/* Byte 9 Bit 0 */
 | 
						|
  bool RebuildInProgress:1;				/* Byte 9 Bit 1 */
 | 
						|
  bool BackgroundInitializationInProgress:1;		/* Byte 9 Bit 2 */
 | 
						|
  bool ForegroundInitializationInProgress:1;		/* Byte 9 Bit 3 */
 | 
						|
  bool DataMigrationInProgress:1;			/* Byte 9 Bit 4 */
 | 
						|
  bool PatrolOperationInProgress:1;			/* Byte 9 Bit 5 */
 | 
						|
  unsigned char :2;					/* Byte 9 Bits 6-7 */
 | 
						|
  unsigned char RAID5WriteUpdate;			/* Byte 10 */
 | 
						|
  unsigned char RAID5Algorithm;				/* Byte 11 */
 | 
						|
  unsigned short LogicalDeviceNumber;			/* Bytes 12-13 */
 | 
						|
  /* BIOS Info */
 | 
						|
  bool BIOSDisabled:1;					/* Byte 14 Bit 0 */
 | 
						|
  bool CDROMBootEnabled:1;				/* Byte 14 Bit 1 */
 | 
						|
  bool DriveCoercionEnabled:1;				/* Byte 14 Bit 2 */
 | 
						|
  bool WriteSameDisabled:1;				/* Byte 14 Bit 3 */
 | 
						|
  bool HBA_ModeEnabled:1;				/* Byte 14 Bit 4 */
 | 
						|
  enum {
 | 
						|
    DAC960_V2_Geometry_128_32 =			0x0,
 | 
						|
    DAC960_V2_Geometry_255_63 =			0x1,
 | 
						|
    DAC960_V2_Geometry_Reserved1 =		0x2,
 | 
						|
    DAC960_V2_Geometry_Reserved2 =		0x3
 | 
						|
  } __attribute__ ((packed)) DriveGeometry:2;		/* Byte 14 Bits 5-6 */
 | 
						|
  bool SuperReadAheadEnabled:1;				/* Byte 14 Bit 7 */
 | 
						|
  unsigned char :8;					/* Byte 15 */
 | 
						|
  /* Error Counters */
 | 
						|
  unsigned short SoftErrors;				/* Bytes 16-17 */
 | 
						|
  unsigned short CommandsFailed;			/* Bytes 18-19 */
 | 
						|
  unsigned short HostCommandAbortsDone;			/* Bytes 20-21 */
 | 
						|
  unsigned short DeferredWriteErrors;			/* Bytes 22-23 */
 | 
						|
  unsigned int :32;					/* Bytes 24-27 */
 | 
						|
  unsigned int :32;					/* Bytes 28-31 */
 | 
						|
  /* Device Size Information */
 | 
						|
  unsigned short :16;					/* Bytes 32-33 */
 | 
						|
  unsigned short DeviceBlockSizeInBytes;		/* Bytes 34-35 */
 | 
						|
  unsigned int OriginalDeviceSize;			/* Bytes 36-39 */
 | 
						|
  unsigned int ConfigurableDeviceSize;			/* Bytes 40-43 */
 | 
						|
  unsigned int :32;					/* Bytes 44-47 */
 | 
						|
  unsigned char LogicalDeviceName[32];			/* Bytes 48-79 */
 | 
						|
  unsigned char SCSI_InquiryData[36];			/* Bytes 80-115 */
 | 
						|
  unsigned char Reserved1[12];				/* Bytes 116-127 */
 | 
						|
  DAC960_ByteCount64_T LastReadBlockNumber;		/* Bytes 128-135 */
 | 
						|
  DAC960_ByteCount64_T LastWrittenBlockNumber;		/* Bytes 136-143 */
 | 
						|
  DAC960_ByteCount64_T ConsistencyCheckBlockNumber;	/* Bytes 144-151 */
 | 
						|
  DAC960_ByteCount64_T RebuildBlockNumber;		/* Bytes 152-159 */
 | 
						|
  DAC960_ByteCount64_T BackgroundInitializationBlockNumber; /* Bytes 160-167 */
 | 
						|
  DAC960_ByteCount64_T ForegroundInitializationBlockNumber; /* Bytes 168-175 */
 | 
						|
  DAC960_ByteCount64_T DataMigrationBlockNumber;	/* Bytes 176-183 */
 | 
						|
  DAC960_ByteCount64_T PatrolOperationBlockNumber;	/* Bytes 184-191 */
 | 
						|
  unsigned char Reserved2[64];				/* Bytes 192-255 */
 | 
						|
}
 | 
						|
DAC960_V2_LogicalDeviceInfo_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Physical Device State type.
 | 
						|
*/
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
    DAC960_V2_Device_Unconfigured =		0x00,
 | 
						|
    DAC960_V2_Device_Online =			0x01,
 | 
						|
    DAC960_V2_Device_Rebuild =			0x03,
 | 
						|
    DAC960_V2_Device_Missing =			0x04,
 | 
						|
    DAC960_V2_Device_Critical =			0x05,
 | 
						|
    DAC960_V2_Device_Dead =			0x08,
 | 
						|
    DAC960_V2_Device_SuspectedDead =		0x0C,
 | 
						|
    DAC960_V2_Device_CommandedOffline =		0x10,
 | 
						|
    DAC960_V2_Device_Standby =			0x21,
 | 
						|
    DAC960_V2_Device_InvalidState =		0xFF
 | 
						|
}
 | 
						|
__attribute__ ((packed))
 | 
						|
DAC960_V2_PhysicalDeviceState_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Get Physical Device Info reply structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V2_PhysicalDeviceInfo
 | 
						|
{
 | 
						|
  unsigned char :8;					/* Byte 0 */
 | 
						|
  unsigned char Channel;				/* Byte 1 */
 | 
						|
  unsigned char TargetID;				/* Byte 2 */
 | 
						|
  unsigned char LogicalUnit;				/* Byte 3 */
 | 
						|
  /* Configuration Status Bits */
 | 
						|
  bool PhysicalDeviceFaultTolerant:1;			/* Byte 4 Bit 0 */
 | 
						|
  bool PhysicalDeviceConnected:1;			/* Byte 4 Bit 1 */
 | 
						|
  bool PhysicalDeviceLocalToController:1;		/* Byte 4 Bit 2 */
 | 
						|
  unsigned char :5;					/* Byte 4 Bits 3-7 */
 | 
						|
  /* Multiple Host/Controller Status Bits */
 | 
						|
  bool RemoteHostSystemDead:1;				/* Byte 5 Bit 0 */
 | 
						|
  bool RemoteControllerDead:1;				/* Byte 5 Bit 1 */
 | 
						|
  unsigned char :6;					/* Byte 5 Bits 2-7 */
 | 
						|
  DAC960_V2_PhysicalDeviceState_T PhysicalDeviceState;	/* Byte 6 */
 | 
						|
  unsigned char NegotiatedDataWidthBits;		/* Byte 7 */
 | 
						|
  unsigned short NegotiatedSynchronousMegaTransfers;	/* Bytes 8-9 */
 | 
						|
  /* Multiported Physical Device Information */
 | 
						|
  unsigned char NumberOfPortConnections;		/* Byte 10 */
 | 
						|
  unsigned char DriveAccessibilityBitmap;		/* Byte 11 */
 | 
						|
  unsigned int :32;					/* Bytes 12-15 */
 | 
						|
  unsigned char NetworkAddress[16];			/* Bytes 16-31 */
 | 
						|
  unsigned short MaximumTags;				/* Bytes 32-33 */
 | 
						|
  /* Physical Device Operations Status */
 | 
						|
  bool ConsistencyCheckInProgress:1;			/* Byte 34 Bit 0 */
 | 
						|
  bool RebuildInProgress:1;				/* Byte 34 Bit 1 */
 | 
						|
  bool MakingDataConsistentInProgress:1;		/* Byte 34 Bit 2 */
 | 
						|
  bool PhysicalDeviceInitializationInProgress:1;	/* Byte 34 Bit 3 */
 | 
						|
  bool DataMigrationInProgress:1;			/* Byte 34 Bit 4 */
 | 
						|
  bool PatrolOperationInProgress:1;			/* Byte 34 Bit 5 */
 | 
						|
  unsigned char :2;					/* Byte 34 Bits 6-7 */
 | 
						|
  unsigned char LongOperationStatus;			/* Byte 35 */
 | 
						|
  unsigned char ParityErrors;				/* Byte 36 */
 | 
						|
  unsigned char SoftErrors;				/* Byte 37 */
 | 
						|
  unsigned char HardErrors;				/* Byte 38 */
 | 
						|
  unsigned char MiscellaneousErrors;			/* Byte 39 */
 | 
						|
  unsigned char CommandTimeouts;			/* Byte 40 */
 | 
						|
  unsigned char Retries;				/* Byte 41 */
 | 
						|
  unsigned char Aborts;					/* Byte 42 */
 | 
						|
  unsigned char PredictedFailuresDetected;		/* Byte 43 */
 | 
						|
  unsigned int :32;					/* Bytes 44-47 */
 | 
						|
  unsigned short :16;					/* Bytes 48-49 */
 | 
						|
  unsigned short DeviceBlockSizeInBytes;		/* Bytes 50-51 */
 | 
						|
  unsigned int OriginalDeviceSize;			/* Bytes 52-55 */
 | 
						|
  unsigned int ConfigurableDeviceSize;			/* Bytes 56-59 */
 | 
						|
  unsigned int :32;					/* Bytes 60-63 */
 | 
						|
  unsigned char PhysicalDeviceName[16];			/* Bytes 64-79 */
 | 
						|
  unsigned char Reserved1[16];				/* Bytes 80-95 */
 | 
						|
  unsigned char Reserved2[32];				/* Bytes 96-127 */
 | 
						|
  unsigned char SCSI_InquiryData[36];			/* Bytes 128-163 */
 | 
						|
  unsigned char Reserved3[20];				/* Bytes 164-183 */
 | 
						|
  unsigned char Reserved4[8];				/* Bytes 184-191 */
 | 
						|
  DAC960_ByteCount64_T LastReadBlockNumber;		/* Bytes 192-199 */
 | 
						|
  DAC960_ByteCount64_T LastWrittenBlockNumber;		/* Bytes 200-207 */
 | 
						|
  DAC960_ByteCount64_T ConsistencyCheckBlockNumber;	/* Bytes 208-215 */
 | 
						|
  DAC960_ByteCount64_T RebuildBlockNumber;		/* Bytes 216-223 */
 | 
						|
  DAC960_ByteCount64_T MakingDataConsistentBlockNumber;	/* Bytes 224-231 */
 | 
						|
  DAC960_ByteCount64_T DeviceInitializationBlockNumber; /* Bytes 232-239 */
 | 
						|
  DAC960_ByteCount64_T DataMigrationBlockNumber;	/* Bytes 240-247 */
 | 
						|
  DAC960_ByteCount64_T PatrolOperationBlockNumber;	/* Bytes 248-255 */
 | 
						|
  unsigned char Reserved5[256];				/* Bytes 256-511 */
 | 
						|
}
 | 
						|
DAC960_V2_PhysicalDeviceInfo_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Health Status Buffer structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V2_HealthStatusBuffer
 | 
						|
{
 | 
						|
  unsigned int MicrosecondsFromControllerStartTime;	/* Bytes 0-3 */
 | 
						|
  unsigned int MillisecondsFromControllerStartTime;	/* Bytes 4-7 */
 | 
						|
  unsigned int SecondsFrom1January1970;			/* Bytes 8-11 */
 | 
						|
  unsigned int :32;					/* Bytes 12-15 */
 | 
						|
  unsigned int StatusChangeCounter;			/* Bytes 16-19 */
 | 
						|
  unsigned int :32;					/* Bytes 20-23 */
 | 
						|
  unsigned int DebugOutputMessageBufferIndex;		/* Bytes 24-27 */
 | 
						|
  unsigned int CodedMessageBufferIndex;			/* Bytes 28-31 */
 | 
						|
  unsigned int CurrentTimeTracePageNumber;		/* Bytes 32-35 */
 | 
						|
  unsigned int CurrentProfilerPageNumber;		/* Bytes 36-39 */
 | 
						|
  unsigned int NextEventSequenceNumber;			/* Bytes 40-43 */
 | 
						|
  unsigned int :32;					/* Bytes 44-47 */
 | 
						|
  unsigned char Reserved1[16];				/* Bytes 48-63 */
 | 
						|
  unsigned char Reserved2[64];				/* Bytes 64-127 */
 | 
						|
}
 | 
						|
DAC960_V2_HealthStatusBuffer_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Get Event reply structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V2_Event
 | 
						|
{
 | 
						|
  unsigned int EventSequenceNumber;			/* Bytes 0-3 */
 | 
						|
  unsigned int EventTime;				/* Bytes 4-7 */
 | 
						|
  unsigned int EventCode;				/* Bytes 8-11 */
 | 
						|
  unsigned char :8;					/* Byte 12 */
 | 
						|
  unsigned char Channel;				/* Byte 13 */
 | 
						|
  unsigned char TargetID;				/* Byte 14 */
 | 
						|
  unsigned char LogicalUnit;				/* Byte 15 */
 | 
						|
  unsigned int :32;					/* Bytes 16-19 */
 | 
						|
  unsigned int EventSpecificParameter;			/* Bytes 20-23 */
 | 
						|
  unsigned char RequestSenseData[40];			/* Bytes 24-63 */
 | 
						|
}
 | 
						|
DAC960_V2_Event_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Command Control Bits structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V2_CommandControlBits
 | 
						|
{
 | 
						|
  bool ForceUnitAccess:1;				/* Byte 0 Bit 0 */
 | 
						|
  bool DisablePageOut:1;				/* Byte 0 Bit 1 */
 | 
						|
  bool :1;						/* Byte 0 Bit 2 */
 | 
						|
  bool AdditionalScatterGatherListMemory:1;		/* Byte 0 Bit 3 */
 | 
						|
  bool DataTransferControllerToHost:1;			/* Byte 0 Bit 4 */
 | 
						|
  bool :1;						/* Byte 0 Bit 5 */
 | 
						|
  bool NoAutoRequestSense:1;				/* Byte 0 Bit 6 */
 | 
						|
  bool DisconnectProhibited:1;				/* Byte 0 Bit 7 */
 | 
						|
}
 | 
						|
DAC960_V2_CommandControlBits_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Command Timeout structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V2_CommandTimeout
 | 
						|
{
 | 
						|
  unsigned char TimeoutValue:6;				/* Byte 0 Bits 0-5 */
 | 
						|
  enum {
 | 
						|
    DAC960_V2_TimeoutScale_Seconds =		0,
 | 
						|
    DAC960_V2_TimeoutScale_Minutes =		1,
 | 
						|
    DAC960_V2_TimeoutScale_Hours =		2,
 | 
						|
    DAC960_V2_TimeoutScale_Reserved =		3
 | 
						|
  } __attribute__ ((packed)) TimeoutScale:2;		/* Byte 0 Bits 6-7 */
 | 
						|
}
 | 
						|
DAC960_V2_CommandTimeout_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Physical Device structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V2_PhysicalDevice
 | 
						|
{
 | 
						|
  unsigned char LogicalUnit;				/* Byte 0 */
 | 
						|
  unsigned char TargetID;				/* Byte 1 */
 | 
						|
  unsigned char Channel:3;				/* Byte 2 Bits 0-2 */
 | 
						|
  unsigned char Controller:5;				/* Byte 2 Bits 3-7 */
 | 
						|
}
 | 
						|
__attribute__ ((packed))
 | 
						|
DAC960_V2_PhysicalDevice_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Logical Device structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V2_LogicalDevice
 | 
						|
{
 | 
						|
  unsigned short LogicalDeviceNumber;			/* Bytes 0-1 */
 | 
						|
  unsigned char :3;					/* Byte 2 Bits 0-2 */
 | 
						|
  unsigned char Controller:5;				/* Byte 2 Bits 3-7 */
 | 
						|
}
 | 
						|
__attribute__ ((packed))
 | 
						|
DAC960_V2_LogicalDevice_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Operation Device type.
 | 
						|
*/
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
  DAC960_V2_Physical_Device =			0x00,
 | 
						|
  DAC960_V2_RAID_Device =			0x01,
 | 
						|
  DAC960_V2_Physical_Channel =			0x02,
 | 
						|
  DAC960_V2_RAID_Channel =			0x03,
 | 
						|
  DAC960_V2_Physical_Controller =		0x04,
 | 
						|
  DAC960_V2_RAID_Controller =			0x05,
 | 
						|
  DAC960_V2_Configuration_Group =		0x10,
 | 
						|
  DAC960_V2_Enclosure =				0x11
 | 
						|
}
 | 
						|
__attribute__ ((packed))
 | 
						|
DAC960_V2_OperationDevice_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Translate Physical To Logical Device structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V2_PhysicalToLogicalDevice
 | 
						|
{
 | 
						|
  unsigned short LogicalDeviceNumber;			/* Bytes 0-1 */
 | 
						|
  unsigned short :16;					/* Bytes 2-3 */
 | 
						|
  unsigned char PreviousBootController;			/* Byte 4 */
 | 
						|
  unsigned char PreviousBootChannel;			/* Byte 5 */
 | 
						|
  unsigned char PreviousBootTargetID;			/* Byte 6 */
 | 
						|
  unsigned char PreviousBootLogicalUnit;		/* Byte 7 */
 | 
						|
}
 | 
						|
DAC960_V2_PhysicalToLogicalDevice_T;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Scatter/Gather List Entry structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V2_ScatterGatherSegment
 | 
						|
{
 | 
						|
  DAC960_BusAddress64_T SegmentDataPointer;		/* Bytes 0-7 */
 | 
						|
  DAC960_ByteCount64_T SegmentByteCount;		/* Bytes 8-15 */
 | 
						|
}
 | 
						|
DAC960_V2_ScatterGatherSegment_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Data Transfer Memory Address structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_V2_DataTransferMemoryAddress
 | 
						|
{
 | 
						|
  DAC960_V2_ScatterGatherSegment_T ScatterGatherSegments[2]; /* Bytes 0-31 */
 | 
						|
  struct {
 | 
						|
    unsigned short ScatterGatherList0Length;		/* Bytes 0-1 */
 | 
						|
    unsigned short ScatterGatherList1Length;		/* Bytes 2-3 */
 | 
						|
    unsigned short ScatterGatherList2Length;		/* Bytes 4-5 */
 | 
						|
    unsigned short :16;					/* Bytes 6-7 */
 | 
						|
    DAC960_BusAddress64_T ScatterGatherList0Address;	/* Bytes 8-15 */
 | 
						|
    DAC960_BusAddress64_T ScatterGatherList1Address;	/* Bytes 16-23 */
 | 
						|
    DAC960_BusAddress64_T ScatterGatherList2Address;	/* Bytes 24-31 */
 | 
						|
  } ExtendedScatterGather;
 | 
						|
}
 | 
						|
DAC960_V2_DataTransferMemoryAddress_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the 64 Byte DAC960 V2 Firmware Command Mailbox structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_V2_CommandMailbox
 | 
						|
{
 | 
						|
  unsigned int Words[16];				/* Words 0-15 */
 | 
						|
  struct {
 | 
						|
    DAC960_V2_CommandIdentifier_T CommandIdentifier;	/* Bytes 0-1 */
 | 
						|
    DAC960_V2_CommandOpcode_T CommandOpcode;		/* Byte 2 */
 | 
						|
    DAC960_V2_CommandControlBits_T CommandControlBits;	/* Byte 3 */
 | 
						|
    DAC960_ByteCount32_T DataTransferSize:24;		/* Bytes 4-6 */
 | 
						|
    unsigned char DataTransferPageNumber;		/* Byte 7 */
 | 
						|
    DAC960_BusAddress64_T RequestSenseBusAddress;	/* Bytes 8-15 */
 | 
						|
    unsigned int :24;					/* Bytes 16-18 */
 | 
						|
    DAC960_V2_CommandTimeout_T CommandTimeout;		/* Byte 19 */
 | 
						|
    unsigned char RequestSenseSize;			/* Byte 20 */
 | 
						|
    unsigned char IOCTL_Opcode;				/* Byte 21 */
 | 
						|
    unsigned char Reserved[10];				/* Bytes 22-31 */
 | 
						|
    DAC960_V2_DataTransferMemoryAddress_T
 | 
						|
      DataTransferMemoryAddress;			/* Bytes 32-63 */
 | 
						|
  } Common;
 | 
						|
  struct {
 | 
						|
    DAC960_V2_CommandIdentifier_T CommandIdentifier;	/* Bytes 0-1 */
 | 
						|
    DAC960_V2_CommandOpcode_T CommandOpcode;		/* Byte 2 */
 | 
						|
    DAC960_V2_CommandControlBits_T CommandControlBits;	/* Byte 3 */
 | 
						|
    DAC960_ByteCount32_T DataTransferSize;		/* Bytes 4-7 */
 | 
						|
    DAC960_BusAddress64_T RequestSenseBusAddress;	/* Bytes 8-15 */
 | 
						|
    DAC960_V2_PhysicalDevice_T PhysicalDevice;		/* Bytes 16-18 */
 | 
						|
    DAC960_V2_CommandTimeout_T CommandTimeout;		/* Byte 19 */
 | 
						|
    unsigned char RequestSenseSize;			/* Byte 20 */
 | 
						|
    unsigned char CDBLength;				/* Byte 21 */
 | 
						|
    unsigned char SCSI_CDB[10];				/* Bytes 22-31 */
 | 
						|
    DAC960_V2_DataTransferMemoryAddress_T
 | 
						|
      DataTransferMemoryAddress;			/* Bytes 32-63 */
 | 
						|
  } SCSI_10;
 | 
						|
  struct {
 | 
						|
    DAC960_V2_CommandIdentifier_T CommandIdentifier;	/* Bytes 0-1 */
 | 
						|
    DAC960_V2_CommandOpcode_T CommandOpcode;		/* Byte 2 */
 | 
						|
    DAC960_V2_CommandControlBits_T CommandControlBits;	/* Byte 3 */
 | 
						|
    DAC960_ByteCount32_T DataTransferSize;		/* Bytes 4-7 */
 | 
						|
    DAC960_BusAddress64_T RequestSenseBusAddress;	/* Bytes 8-15 */
 | 
						|
    DAC960_V2_PhysicalDevice_T PhysicalDevice;		/* Bytes 16-18 */
 | 
						|
    DAC960_V2_CommandTimeout_T CommandTimeout;		/* Byte 19 */
 | 
						|
    unsigned char RequestSenseSize;			/* Byte 20 */
 | 
						|
    unsigned char CDBLength;				/* Byte 21 */
 | 
						|
    unsigned short :16;					/* Bytes 22-23 */
 | 
						|
    DAC960_BusAddress64_T SCSI_CDB_BusAddress;		/* Bytes 24-31 */
 | 
						|
    DAC960_V2_DataTransferMemoryAddress_T
 | 
						|
      DataTransferMemoryAddress;			/* Bytes 32-63 */
 | 
						|
  } SCSI_255;
 | 
						|
  struct {
 | 
						|
    DAC960_V2_CommandIdentifier_T CommandIdentifier;	/* Bytes 0-1 */
 | 
						|
    DAC960_V2_CommandOpcode_T CommandOpcode;		/* Byte 2 */
 | 
						|
    DAC960_V2_CommandControlBits_T CommandControlBits;	/* Byte 3 */
 | 
						|
    DAC960_ByteCount32_T DataTransferSize:24;		/* Bytes 4-6 */
 | 
						|
    unsigned char DataTransferPageNumber;		/* Byte 7 */
 | 
						|
    DAC960_BusAddress64_T RequestSenseBusAddress;	/* Bytes 8-15 */
 | 
						|
    unsigned short :16;					/* Bytes 16-17 */
 | 
						|
    unsigned char ControllerNumber;			/* Byte 18 */
 | 
						|
    DAC960_V2_CommandTimeout_T CommandTimeout;		/* Byte 19 */
 | 
						|
    unsigned char RequestSenseSize;			/* Byte 20 */
 | 
						|
    unsigned char IOCTL_Opcode;				/* Byte 21 */
 | 
						|
    unsigned char Reserved[10];				/* Bytes 22-31 */
 | 
						|
    DAC960_V2_DataTransferMemoryAddress_T
 | 
						|
      DataTransferMemoryAddress;			/* Bytes 32-63 */
 | 
						|
  } ControllerInfo;
 | 
						|
  struct {
 | 
						|
    DAC960_V2_CommandIdentifier_T CommandIdentifier;	/* Bytes 0-1 */
 | 
						|
    DAC960_V2_CommandOpcode_T CommandOpcode;		/* Byte 2 */
 | 
						|
    DAC960_V2_CommandControlBits_T CommandControlBits;	/* Byte 3 */
 | 
						|
    DAC960_ByteCount32_T DataTransferSize:24;		/* Bytes 4-6 */
 | 
						|
    unsigned char DataTransferPageNumber;		/* Byte 7 */
 | 
						|
    DAC960_BusAddress64_T RequestSenseBusAddress;	/* Bytes 8-15 */
 | 
						|
    DAC960_V2_LogicalDevice_T LogicalDevice;		/* Bytes 16-18 */
 | 
						|
    DAC960_V2_CommandTimeout_T CommandTimeout;		/* Byte 19 */
 | 
						|
    unsigned char RequestSenseSize;			/* Byte 20 */
 | 
						|
    unsigned char IOCTL_Opcode;				/* Byte 21 */
 | 
						|
    unsigned char Reserved[10];				/* Bytes 22-31 */
 | 
						|
    DAC960_V2_DataTransferMemoryAddress_T
 | 
						|
      DataTransferMemoryAddress;			/* Bytes 32-63 */
 | 
						|
  } LogicalDeviceInfo;
 | 
						|
  struct {
 | 
						|
    DAC960_V2_CommandIdentifier_T CommandIdentifier;	/* Bytes 0-1 */
 | 
						|
    DAC960_V2_CommandOpcode_T CommandOpcode;		/* Byte 2 */
 | 
						|
    DAC960_V2_CommandControlBits_T CommandControlBits;	/* Byte 3 */
 | 
						|
    DAC960_ByteCount32_T DataTransferSize:24;		/* Bytes 4-6 */
 | 
						|
    unsigned char DataTransferPageNumber;		/* Byte 7 */
 | 
						|
    DAC960_BusAddress64_T RequestSenseBusAddress;	/* Bytes 8-15 */
 | 
						|
    DAC960_V2_PhysicalDevice_T PhysicalDevice;		/* Bytes 16-18 */
 | 
						|
    DAC960_V2_CommandTimeout_T CommandTimeout;		/* Byte 19 */
 | 
						|
    unsigned char RequestSenseSize;			/* Byte 20 */
 | 
						|
    unsigned char IOCTL_Opcode;				/* Byte 21 */
 | 
						|
    unsigned char Reserved[10];				/* Bytes 22-31 */
 | 
						|
    DAC960_V2_DataTransferMemoryAddress_T
 | 
						|
      DataTransferMemoryAddress;			/* Bytes 32-63 */
 | 
						|
  } PhysicalDeviceInfo;
 | 
						|
  struct {
 | 
						|
    DAC960_V2_CommandIdentifier_T CommandIdentifier;	/* Bytes 0-1 */
 | 
						|
    DAC960_V2_CommandOpcode_T CommandOpcode;		/* Byte 2 */
 | 
						|
    DAC960_V2_CommandControlBits_T CommandControlBits;	/* Byte 3 */
 | 
						|
    DAC960_ByteCount32_T DataTransferSize:24;		/* Bytes 4-6 */
 | 
						|
    unsigned char DataTransferPageNumber;		/* Byte 7 */
 | 
						|
    DAC960_BusAddress64_T RequestSenseBusAddress;	/* Bytes 8-15 */
 | 
						|
    unsigned short EventSequenceNumberHigh16;		/* Bytes 16-17 */
 | 
						|
    unsigned char ControllerNumber;			/* Byte 18 */
 | 
						|
    DAC960_V2_CommandTimeout_T CommandTimeout;		/* Byte 19 */
 | 
						|
    unsigned char RequestSenseSize;			/* Byte 20 */
 | 
						|
    unsigned char IOCTL_Opcode;				/* Byte 21 */
 | 
						|
    unsigned short EventSequenceNumberLow16;		/* Bytes 22-23 */
 | 
						|
    unsigned char Reserved[8];				/* Bytes 24-31 */
 | 
						|
    DAC960_V2_DataTransferMemoryAddress_T
 | 
						|
      DataTransferMemoryAddress;			/* Bytes 32-63 */
 | 
						|
  } GetEvent;
 | 
						|
  struct {
 | 
						|
    DAC960_V2_CommandIdentifier_T CommandIdentifier;	/* Bytes 0-1 */
 | 
						|
    DAC960_V2_CommandOpcode_T CommandOpcode;		/* Byte 2 */
 | 
						|
    DAC960_V2_CommandControlBits_T CommandControlBits;	/* Byte 3 */
 | 
						|
    DAC960_ByteCount32_T DataTransferSize:24;		/* Bytes 4-6 */
 | 
						|
    unsigned char DataTransferPageNumber;		/* Byte 7 */
 | 
						|
    DAC960_BusAddress64_T RequestSenseBusAddress;	/* Bytes 8-15 */
 | 
						|
    DAC960_V2_LogicalDevice_T LogicalDevice;		/* Bytes 16-18 */
 | 
						|
    DAC960_V2_CommandTimeout_T CommandTimeout;		/* Byte 19 */
 | 
						|
    unsigned char RequestSenseSize;			/* Byte 20 */
 | 
						|
    unsigned char IOCTL_Opcode;				/* Byte 21 */
 | 
						|
    union {
 | 
						|
      DAC960_V2_LogicalDeviceState_T LogicalDeviceState;
 | 
						|
      DAC960_V2_PhysicalDeviceState_T PhysicalDeviceState;
 | 
						|
    } DeviceState;					/* Byte 22 */
 | 
						|
    unsigned char Reserved[9];				/* Bytes 23-31 */
 | 
						|
    DAC960_V2_DataTransferMemoryAddress_T
 | 
						|
      DataTransferMemoryAddress;			/* Bytes 32-63 */
 | 
						|
  } SetDeviceState;
 | 
						|
  struct {
 | 
						|
    DAC960_V2_CommandIdentifier_T CommandIdentifier;	/* Bytes 0-1 */
 | 
						|
    DAC960_V2_CommandOpcode_T CommandOpcode;		/* Byte 2 */
 | 
						|
    DAC960_V2_CommandControlBits_T CommandControlBits;	/* Byte 3 */
 | 
						|
    DAC960_ByteCount32_T DataTransferSize:24;		/* Bytes 4-6 */
 | 
						|
    unsigned char DataTransferPageNumber;		/* Byte 7 */
 | 
						|
    DAC960_BusAddress64_T RequestSenseBusAddress;	/* Bytes 8-15 */
 | 
						|
    DAC960_V2_LogicalDevice_T LogicalDevice;		/* Bytes 16-18 */
 | 
						|
    DAC960_V2_CommandTimeout_T CommandTimeout;		/* Byte 19 */
 | 
						|
    unsigned char RequestSenseSize;			/* Byte 20 */
 | 
						|
    unsigned char IOCTL_Opcode;				/* Byte 21 */
 | 
						|
    bool RestoreConsistency:1;				/* Byte 22 Bit 0 */
 | 
						|
    bool InitializedAreaOnly:1;				/* Byte 22 Bit 1 */
 | 
						|
    unsigned char :6;					/* Byte 22 Bits 2-7 */
 | 
						|
    unsigned char Reserved[9];				/* Bytes 23-31 */
 | 
						|
    DAC960_V2_DataTransferMemoryAddress_T
 | 
						|
      DataTransferMemoryAddress;			/* Bytes 32-63 */
 | 
						|
  } ConsistencyCheck;
 | 
						|
  struct {
 | 
						|
    DAC960_V2_CommandIdentifier_T CommandIdentifier;	/* Bytes 0-1 */
 | 
						|
    DAC960_V2_CommandOpcode_T CommandOpcode;		/* Byte 2 */
 | 
						|
    DAC960_V2_CommandControlBits_T CommandControlBits;	/* Byte 3 */
 | 
						|
    unsigned char FirstCommandMailboxSizeKB;		/* Byte 4 */
 | 
						|
    unsigned char FirstStatusMailboxSizeKB;		/* Byte 5 */
 | 
						|
    unsigned char SecondCommandMailboxSizeKB;		/* Byte 6 */
 | 
						|
    unsigned char SecondStatusMailboxSizeKB;		/* Byte 7 */
 | 
						|
    DAC960_BusAddress64_T RequestSenseBusAddress;	/* Bytes 8-15 */
 | 
						|
    unsigned int :24;					/* Bytes 16-18 */
 | 
						|
    DAC960_V2_CommandTimeout_T CommandTimeout;		/* Byte 19 */
 | 
						|
    unsigned char RequestSenseSize;			/* Byte 20 */
 | 
						|
    unsigned char IOCTL_Opcode;				/* Byte 21 */
 | 
						|
    unsigned char HealthStatusBufferSizeKB;		/* Byte 22 */
 | 
						|
    unsigned char :8;					/* Byte 23 */
 | 
						|
    DAC960_BusAddress64_T HealthStatusBufferBusAddress; /* Bytes 24-31 */
 | 
						|
    DAC960_BusAddress64_T FirstCommandMailboxBusAddress; /* Bytes 32-39 */
 | 
						|
    DAC960_BusAddress64_T FirstStatusMailboxBusAddress; /* Bytes 40-47 */
 | 
						|
    DAC960_BusAddress64_T SecondCommandMailboxBusAddress; /* Bytes 48-55 */
 | 
						|
    DAC960_BusAddress64_T SecondStatusMailboxBusAddress; /* Bytes 56-63 */
 | 
						|
  } SetMemoryMailbox;
 | 
						|
  struct {
 | 
						|
    DAC960_V2_CommandIdentifier_T CommandIdentifier;	/* Bytes 0-1 */
 | 
						|
    DAC960_V2_CommandOpcode_T CommandOpcode;		/* Byte 2 */
 | 
						|
    DAC960_V2_CommandControlBits_T CommandControlBits;	/* Byte 3 */
 | 
						|
    DAC960_ByteCount32_T DataTransferSize:24;		/* Bytes 4-6 */
 | 
						|
    unsigned char DataTransferPageNumber;		/* Byte 7 */
 | 
						|
    DAC960_BusAddress64_T RequestSenseBusAddress;	/* Bytes 8-15 */
 | 
						|
    DAC960_V2_PhysicalDevice_T PhysicalDevice;		/* Bytes 16-18 */
 | 
						|
    DAC960_V2_CommandTimeout_T CommandTimeout;		/* Byte 19 */
 | 
						|
    unsigned char RequestSenseSize;			/* Byte 20 */
 | 
						|
    unsigned char IOCTL_Opcode;				/* Byte 21 */
 | 
						|
    DAC960_V2_OperationDevice_T OperationDevice;	/* Byte 22 */
 | 
						|
    unsigned char Reserved[9];				/* Bytes 23-31 */
 | 
						|
    DAC960_V2_DataTransferMemoryAddress_T
 | 
						|
      DataTransferMemoryAddress;			/* Bytes 32-63 */
 | 
						|
  } DeviceOperation;
 | 
						|
}
 | 
						|
DAC960_V2_CommandMailbox_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 Driver IOCTL requests.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_IOCTL_GET_CONTROLLER_COUNT	0xDAC001
 | 
						|
#define DAC960_IOCTL_GET_CONTROLLER_INFO	0xDAC002
 | 
						|
#define DAC960_IOCTL_V1_EXECUTE_COMMAND		0xDAC003
 | 
						|
#define DAC960_IOCTL_V2_EXECUTE_COMMAND		0xDAC004
 | 
						|
#define DAC960_IOCTL_V2_GET_HEALTH_STATUS	0xDAC005
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960_IOCTL_GET_CONTROLLER_INFO reply structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_ControllerInfo
 | 
						|
{
 | 
						|
  unsigned char ControllerNumber;
 | 
						|
  unsigned char FirmwareType;
 | 
						|
  unsigned char Channels;
 | 
						|
  unsigned char Targets;
 | 
						|
  unsigned char PCI_Bus;
 | 
						|
  unsigned char PCI_Device;
 | 
						|
  unsigned char PCI_Function;
 | 
						|
  unsigned char IRQ_Channel;
 | 
						|
  DAC960_PCI_Address_T PCI_Address;
 | 
						|
  unsigned char ModelName[20];
 | 
						|
  unsigned char FirmwareVersion[12];
 | 
						|
}
 | 
						|
DAC960_ControllerInfo_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the User Mode DAC960_IOCTL_V1_EXECUTE_COMMAND request structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V1_UserCommand
 | 
						|
{
 | 
						|
  unsigned char ControllerNumber;
 | 
						|
  DAC960_V1_CommandMailbox_T CommandMailbox;
 | 
						|
  int DataTransferLength;
 | 
						|
  void __user *DataTransferBuffer;
 | 
						|
  DAC960_V1_DCDB_T __user *DCDB;
 | 
						|
}
 | 
						|
DAC960_V1_UserCommand_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the Kernel Mode DAC960_IOCTL_V1_EXECUTE_COMMAND request structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V1_KernelCommand
 | 
						|
{
 | 
						|
  unsigned char ControllerNumber;
 | 
						|
  DAC960_V1_CommandMailbox_T CommandMailbox;
 | 
						|
  int DataTransferLength;
 | 
						|
  void *DataTransferBuffer;
 | 
						|
  DAC960_V1_DCDB_T *DCDB;
 | 
						|
  DAC960_V1_CommandStatus_T CommandStatus;
 | 
						|
  void (*CompletionFunction)(struct DAC960_V1_KernelCommand *);
 | 
						|
  void *CompletionData;
 | 
						|
}
 | 
						|
DAC960_V1_KernelCommand_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the User Mode DAC960_IOCTL_V2_EXECUTE_COMMAND request structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V2_UserCommand
 | 
						|
{
 | 
						|
  unsigned char ControllerNumber;
 | 
						|
  DAC960_V2_CommandMailbox_T CommandMailbox;
 | 
						|
  int DataTransferLength;
 | 
						|
  int RequestSenseLength;
 | 
						|
  void __user *DataTransferBuffer;
 | 
						|
  void __user *RequestSenseBuffer;
 | 
						|
}
 | 
						|
DAC960_V2_UserCommand_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the Kernel Mode DAC960_IOCTL_V2_EXECUTE_COMMAND request structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V2_KernelCommand
 | 
						|
{
 | 
						|
  unsigned char ControllerNumber;
 | 
						|
  DAC960_V2_CommandMailbox_T CommandMailbox;
 | 
						|
  int DataTransferLength;
 | 
						|
  int RequestSenseLength;
 | 
						|
  void *DataTransferBuffer;
 | 
						|
  void *RequestSenseBuffer;
 | 
						|
  DAC960_V2_CommandStatus_T CommandStatus;
 | 
						|
  void (*CompletionFunction)(struct DAC960_V2_KernelCommand *);
 | 
						|
  void *CompletionData;
 | 
						|
}
 | 
						|
DAC960_V2_KernelCommand_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the User Mode DAC960_IOCTL_V2_GET_HEALTH_STATUS request structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_V2_GetHealthStatus
 | 
						|
{
 | 
						|
  unsigned char ControllerNumber;
 | 
						|
  DAC960_V2_HealthStatusBuffer_T __user *HealthStatusBuffer;
 | 
						|
}
 | 
						|
DAC960_V2_GetHealthStatus_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Import the Kernel Mode IOCTL interface.
 | 
						|
*/
 | 
						|
 | 
						|
extern int DAC960_KernelIOCTL(unsigned int Request, void *Argument);
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  DAC960_DriverVersion protects the private portion of this file.
 | 
						|
*/
 | 
						|
 | 
						|
#ifdef DAC960_DriverVersion
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the maximum Driver Queue Depth and Controller Queue Depth supported
 | 
						|
  by DAC960 V1 and V2 Firmware Controllers.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_MaxDriverQueueDepth		511
 | 
						|
#define DAC960_MaxControllerQueueDepth		512
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the maximum number of Scatter/Gather Segments supported for any
 | 
						|
  DAC960 V1 and V2 Firmware controller.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_V1_ScatterGatherLimit		33
 | 
						|
#define DAC960_V2_ScatterGatherLimit		128
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the number of Command Mailboxes and Status Mailboxes used by the
 | 
						|
  DAC960 V1 and V2 Firmware Memory Mailbox Interface.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_V1_CommandMailboxCount		256
 | 
						|
#define DAC960_V1_StatusMailboxCount		1024
 | 
						|
#define DAC960_V2_CommandMailboxCount		512
 | 
						|
#define DAC960_V2_StatusMailboxCount		512
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 Controller Monitoring Timer Interval.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_MonitoringTimerInterval		(10 * HZ)
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 Controller Secondary Monitoring Interval.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_SecondaryMonitoringInterval	(60 * HZ)
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 Controller Health Status Monitoring Interval.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_HealthStatusMonitoringInterval	(1 * HZ)
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 Controller Progress Reporting Interval.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_ProgressReportingInterval	(60 * HZ)
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the maximum number of Partitions allowed for each Logical Drive.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_MaxPartitions			8
 | 
						|
#define DAC960_MaxPartitionsBits		3
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 Controller fixed Block Size and Block Size Bits.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_BlockSize			512
 | 
						|
#define DAC960_BlockSizeBits			9
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the number of Command structures that should be allocated as a
 | 
						|
  group to optimize kernel memory allocation.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_V1_CommandAllocationGroupSize	11
 | 
						|
#define DAC960_V2_CommandAllocationGroupSize	29
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the Controller Line Buffer, Progress Buffer, User Message, and
 | 
						|
  Initial Status Buffer sizes.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_LineBufferSize			100
 | 
						|
#define DAC960_ProgressBufferSize		200
 | 
						|
#define DAC960_UserMessageSize			200
 | 
						|
#define DAC960_InitialStatusBufferSize		(8192-32)
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 Controller Firmware Types.
 | 
						|
*/
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
  DAC960_V1_Controller =			1,
 | 
						|
  DAC960_V2_Controller =			2
 | 
						|
}
 | 
						|
DAC960_FirmwareType_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 Controller Hardware Types.
 | 
						|
*/
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
  DAC960_BA_Controller =			1,	/* eXtremeRAID 2000 */
 | 
						|
  DAC960_LP_Controller =			2,	/* AcceleRAID 352 */
 | 
						|
  DAC960_LA_Controller =			3,	/* DAC1164P */
 | 
						|
  DAC960_PG_Controller =			4,	/* DAC960PTL/PJ/PG */
 | 
						|
  DAC960_PD_Controller =			5,	/* DAC960PU/PD/PL/P */
 | 
						|
  DAC960_P_Controller =				6,	/* DAC960PU/PD/PL/P */
 | 
						|
  DAC960_GEM_Controller =			7,	/* AcceleRAID 4/5/600 */
 | 
						|
}
 | 
						|
DAC960_HardwareType_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the Driver Message Levels.
 | 
						|
*/
 | 
						|
 | 
						|
typedef enum DAC960_MessageLevel
 | 
						|
{
 | 
						|
  DAC960_AnnounceLevel =			0,
 | 
						|
  DAC960_InfoLevel =				1,
 | 
						|
  DAC960_NoticeLevel =				2,
 | 
						|
  DAC960_WarningLevel =				3,
 | 
						|
  DAC960_ErrorLevel =				4,
 | 
						|
  DAC960_ProgressLevel =			5,
 | 
						|
  DAC960_CriticalLevel =			6,
 | 
						|
  DAC960_UserCriticalLevel =			7
 | 
						|
}
 | 
						|
DAC960_MessageLevel_T;
 | 
						|
 | 
						|
static char
 | 
						|
  *DAC960_MessageLevelMap[] =
 | 
						|
    { KERN_NOTICE, KERN_NOTICE, KERN_NOTICE, KERN_WARNING,
 | 
						|
      KERN_ERR, KERN_CRIT, KERN_CRIT, KERN_CRIT };
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define Driver Message macros.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_Announce(Format, Arguments...) \
 | 
						|
  DAC960_Message(DAC960_AnnounceLevel, Format, ##Arguments)
 | 
						|
 | 
						|
#define DAC960_Info(Format, Arguments...) \
 | 
						|
  DAC960_Message(DAC960_InfoLevel, Format, ##Arguments)
 | 
						|
 | 
						|
#define DAC960_Notice(Format, Arguments...) \
 | 
						|
  DAC960_Message(DAC960_NoticeLevel, Format, ##Arguments)
 | 
						|
 | 
						|
#define DAC960_Warning(Format, Arguments...) \
 | 
						|
  DAC960_Message(DAC960_WarningLevel, Format, ##Arguments)
 | 
						|
 | 
						|
#define DAC960_Error(Format, Arguments...) \
 | 
						|
  DAC960_Message(DAC960_ErrorLevel, Format, ##Arguments)
 | 
						|
 | 
						|
#define DAC960_Progress(Format, Arguments...) \
 | 
						|
  DAC960_Message(DAC960_ProgressLevel, Format, ##Arguments)
 | 
						|
 | 
						|
#define DAC960_Critical(Format, Arguments...) \
 | 
						|
  DAC960_Message(DAC960_CriticalLevel, Format, ##Arguments)
 | 
						|
 | 
						|
#define DAC960_UserCritical(Format, Arguments...) \
 | 
						|
  DAC960_Message(DAC960_UserCriticalLevel, Format, ##Arguments)
 | 
						|
 | 
						|
 | 
						|
struct DAC960_privdata {
 | 
						|
	DAC960_HardwareType_T	HardwareType;
 | 
						|
	DAC960_FirmwareType_T	FirmwareType;
 | 
						|
	irq_handler_t		InterruptHandler;
 | 
						|
	unsigned int		MemoryWindowSize;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V1 Firmware Controller Status Mailbox structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_V1_StatusMailbox
 | 
						|
{
 | 
						|
  unsigned int Word;					/* Word 0 */
 | 
						|
  struct {
 | 
						|
    DAC960_V1_CommandIdentifier_T CommandIdentifier;	/* Byte 0 */
 | 
						|
    unsigned char :7;					/* Byte 1 Bits 0-6 */
 | 
						|
    bool Valid:1;					/* Byte 1 Bit 7 */
 | 
						|
    DAC960_V1_CommandStatus_T CommandStatus;		/* Bytes 2-3 */
 | 
						|
  } Fields;
 | 
						|
}
 | 
						|
DAC960_V1_StatusMailbox_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 V2 Firmware Controller Status Mailbox structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_V2_StatusMailbox
 | 
						|
{
 | 
						|
  unsigned int Words[2];				/* Words 0-1 */
 | 
						|
  struct {
 | 
						|
    DAC960_V2_CommandIdentifier_T CommandIdentifier;	/* Bytes 0-1 */
 | 
						|
    DAC960_V2_CommandStatus_T CommandStatus;		/* Byte 2 */
 | 
						|
    unsigned char RequestSenseLength;			/* Byte 3 */
 | 
						|
    int DataTransferResidue;				/* Bytes 4-7 */
 | 
						|
  } Fields;
 | 
						|
}
 | 
						|
DAC960_V2_StatusMailbox_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 Driver Command Types.
 | 
						|
*/
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
  DAC960_ReadCommand =				1,
 | 
						|
  DAC960_WriteCommand =				2,
 | 
						|
  DAC960_ReadRetryCommand =			3,
 | 
						|
  DAC960_WriteRetryCommand =			4,
 | 
						|
  DAC960_MonitoringCommand =			5,
 | 
						|
  DAC960_ImmediateCommand =			6,
 | 
						|
  DAC960_QueuedCommand =			7
 | 
						|
}
 | 
						|
DAC960_CommandType_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 Driver Command structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_Command
 | 
						|
{
 | 
						|
  int CommandIdentifier;
 | 
						|
  DAC960_CommandType_T CommandType;
 | 
						|
  struct DAC960_Controller *Controller;
 | 
						|
  struct DAC960_Command *Next;
 | 
						|
  struct completion *Completion;
 | 
						|
  unsigned int LogicalDriveNumber;
 | 
						|
  unsigned int BlockNumber;
 | 
						|
  unsigned int BlockCount;
 | 
						|
  unsigned int SegmentCount;
 | 
						|
  int	DmaDirection;
 | 
						|
  struct scatterlist *cmd_sglist;
 | 
						|
  struct request *Request;
 | 
						|
  union {
 | 
						|
    struct {
 | 
						|
      DAC960_V1_CommandMailbox_T CommandMailbox;
 | 
						|
      DAC960_V1_KernelCommand_T *KernelCommand;
 | 
						|
      DAC960_V1_CommandStatus_T CommandStatus;
 | 
						|
      DAC960_V1_ScatterGatherSegment_T *ScatterGatherList;
 | 
						|
      dma_addr_t ScatterGatherListDMA;
 | 
						|
      struct scatterlist ScatterList[DAC960_V1_ScatterGatherLimit];
 | 
						|
      unsigned int EndMarker[0];
 | 
						|
    } V1;
 | 
						|
    struct {
 | 
						|
      DAC960_V2_CommandMailbox_T CommandMailbox;
 | 
						|
      DAC960_V2_KernelCommand_T *KernelCommand;
 | 
						|
      DAC960_V2_CommandStatus_T CommandStatus;
 | 
						|
      unsigned char RequestSenseLength;
 | 
						|
      int DataTransferResidue;
 | 
						|
      DAC960_V2_ScatterGatherSegment_T *ScatterGatherList;
 | 
						|
      dma_addr_t ScatterGatherListDMA;
 | 
						|
      DAC960_SCSI_RequestSense_T *RequestSense;
 | 
						|
      dma_addr_t RequestSenseDMA;
 | 
						|
      struct scatterlist ScatterList[DAC960_V2_ScatterGatherLimit];
 | 
						|
      unsigned int EndMarker[0];
 | 
						|
    } V2;
 | 
						|
  } FW;
 | 
						|
}
 | 
						|
DAC960_Command_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 Driver Controller structure.
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct DAC960_Controller
 | 
						|
{
 | 
						|
  void __iomem *BaseAddress;
 | 
						|
  void __iomem *MemoryMappedAddress;
 | 
						|
  DAC960_FirmwareType_T FirmwareType;
 | 
						|
  DAC960_HardwareType_T HardwareType;
 | 
						|
  DAC960_IO_Address_T IO_Address;
 | 
						|
  DAC960_PCI_Address_T PCI_Address;
 | 
						|
  struct pci_dev *PCIDevice;
 | 
						|
  unsigned char ControllerNumber;
 | 
						|
  unsigned char ControllerName[4];
 | 
						|
  unsigned char ModelName[20];
 | 
						|
  unsigned char FullModelName[28];
 | 
						|
  unsigned char FirmwareVersion[12];
 | 
						|
  unsigned char Bus;
 | 
						|
  unsigned char Device;
 | 
						|
  unsigned char Function;
 | 
						|
  unsigned char IRQ_Channel;
 | 
						|
  unsigned char Channels;
 | 
						|
  unsigned char Targets;
 | 
						|
  unsigned char MemorySize;
 | 
						|
  unsigned char LogicalDriveCount;
 | 
						|
  unsigned short CommandAllocationGroupSize;
 | 
						|
  unsigned short ControllerQueueDepth;
 | 
						|
  unsigned short DriverQueueDepth;
 | 
						|
  unsigned short MaxBlocksPerCommand;
 | 
						|
  unsigned short ControllerScatterGatherLimit;
 | 
						|
  unsigned short DriverScatterGatherLimit;
 | 
						|
  u64		BounceBufferLimit;
 | 
						|
  unsigned int CombinedStatusBufferLength;
 | 
						|
  unsigned int InitialStatusLength;
 | 
						|
  unsigned int CurrentStatusLength;
 | 
						|
  unsigned int ProgressBufferLength;
 | 
						|
  unsigned int UserStatusLength;
 | 
						|
  struct dma_loaf DmaPages;
 | 
						|
  unsigned long MonitoringTimerCount;
 | 
						|
  unsigned long PrimaryMonitoringTime;
 | 
						|
  unsigned long SecondaryMonitoringTime;
 | 
						|
  unsigned long ShutdownMonitoringTimer;
 | 
						|
  unsigned long LastProgressReportTime;
 | 
						|
  unsigned long LastCurrentStatusTime;
 | 
						|
  bool ControllerInitialized;
 | 
						|
  bool MonitoringCommandDeferred;
 | 
						|
  bool EphemeralProgressMessage;
 | 
						|
  bool DriveSpinUpMessageDisplayed;
 | 
						|
  bool MonitoringAlertMode;
 | 
						|
  bool SuppressEnclosureMessages;
 | 
						|
  struct timer_list MonitoringTimer;
 | 
						|
  struct gendisk *disks[DAC960_MaxLogicalDrives];
 | 
						|
  struct pci_pool *ScatterGatherPool;
 | 
						|
  DAC960_Command_T *FreeCommands;
 | 
						|
  unsigned char *CombinedStatusBuffer;
 | 
						|
  unsigned char *CurrentStatusBuffer;
 | 
						|
  struct request_queue *RequestQueue[DAC960_MaxLogicalDrives];
 | 
						|
  int req_q_index;
 | 
						|
  spinlock_t queue_lock;
 | 
						|
  wait_queue_head_t CommandWaitQueue;
 | 
						|
  wait_queue_head_t HealthStatusWaitQueue;
 | 
						|
  DAC960_Command_T InitialCommand;
 | 
						|
  DAC960_Command_T *Commands[DAC960_MaxDriverQueueDepth];
 | 
						|
  struct proc_dir_entry *ControllerProcEntry;
 | 
						|
  bool LogicalDriveInitiallyAccessible[DAC960_MaxLogicalDrives];
 | 
						|
  void (*QueueCommand)(DAC960_Command_T *Command);
 | 
						|
  bool (*ReadControllerConfiguration)(struct DAC960_Controller *);
 | 
						|
  bool (*ReadDeviceConfiguration)(struct DAC960_Controller *);
 | 
						|
  bool (*ReportDeviceConfiguration)(struct DAC960_Controller *);
 | 
						|
  void (*QueueReadWriteCommand)(DAC960_Command_T *Command);
 | 
						|
  union {
 | 
						|
    struct {
 | 
						|
      unsigned char GeometryTranslationHeads;
 | 
						|
      unsigned char GeometryTranslationSectors;
 | 
						|
      unsigned char PendingRebuildFlag;
 | 
						|
      unsigned short StripeSize;
 | 
						|
      unsigned short SegmentSize;
 | 
						|
      unsigned short NewEventLogSequenceNumber;
 | 
						|
      unsigned short OldEventLogSequenceNumber;
 | 
						|
      unsigned short DeviceStateChannel;
 | 
						|
      unsigned short DeviceStateTargetID;
 | 
						|
      bool DualModeMemoryMailboxInterface;
 | 
						|
      bool BackgroundInitializationStatusSupported;
 | 
						|
      bool SAFTE_EnclosureManagementEnabled;
 | 
						|
      bool NeedLogicalDriveInformation;
 | 
						|
      bool NeedErrorTableInformation;
 | 
						|
      bool NeedDeviceStateInformation;
 | 
						|
      bool NeedDeviceInquiryInformation;
 | 
						|
      bool NeedDeviceSerialNumberInformation;
 | 
						|
      bool NeedRebuildProgress;
 | 
						|
      bool NeedConsistencyCheckProgress;
 | 
						|
      bool NeedBackgroundInitializationStatus;
 | 
						|
      bool StartDeviceStateScan;
 | 
						|
      bool RebuildProgressFirst;
 | 
						|
      bool RebuildFlagPending;
 | 
						|
      bool RebuildStatusPending;
 | 
						|
 | 
						|
      dma_addr_t	FirstCommandMailboxDMA;
 | 
						|
      DAC960_V1_CommandMailbox_T *FirstCommandMailbox;
 | 
						|
      DAC960_V1_CommandMailbox_T *LastCommandMailbox;
 | 
						|
      DAC960_V1_CommandMailbox_T *NextCommandMailbox;
 | 
						|
      DAC960_V1_CommandMailbox_T *PreviousCommandMailbox1;
 | 
						|
      DAC960_V1_CommandMailbox_T *PreviousCommandMailbox2;
 | 
						|
 | 
						|
      dma_addr_t	FirstStatusMailboxDMA;
 | 
						|
      DAC960_V1_StatusMailbox_T *FirstStatusMailbox;
 | 
						|
      DAC960_V1_StatusMailbox_T *LastStatusMailbox;
 | 
						|
      DAC960_V1_StatusMailbox_T *NextStatusMailbox;
 | 
						|
 | 
						|
      DAC960_V1_DCDB_T *MonitoringDCDB;
 | 
						|
      dma_addr_t MonitoringDCDB_DMA;
 | 
						|
 | 
						|
      DAC960_V1_Enquiry_T Enquiry;
 | 
						|
      DAC960_V1_Enquiry_T *NewEnquiry;
 | 
						|
      dma_addr_t NewEnquiryDMA;
 | 
						|
 | 
						|
      DAC960_V1_ErrorTable_T ErrorTable;
 | 
						|
      DAC960_V1_ErrorTable_T *NewErrorTable;
 | 
						|
      dma_addr_t NewErrorTableDMA;
 | 
						|
 | 
						|
      DAC960_V1_EventLogEntry_T *EventLogEntry;
 | 
						|
      dma_addr_t EventLogEntryDMA;
 | 
						|
 | 
						|
      DAC960_V1_RebuildProgress_T *RebuildProgress;
 | 
						|
      dma_addr_t RebuildProgressDMA;
 | 
						|
      DAC960_V1_CommandStatus_T LastRebuildStatus;
 | 
						|
      DAC960_V1_CommandStatus_T PendingRebuildStatus;
 | 
						|
 | 
						|
      DAC960_V1_LogicalDriveInformationArray_T LogicalDriveInformation;
 | 
						|
      DAC960_V1_LogicalDriveInformationArray_T *NewLogicalDriveInformation;
 | 
						|
      dma_addr_t NewLogicalDriveInformationDMA;
 | 
						|
 | 
						|
      DAC960_V1_BackgroundInitializationStatus_T
 | 
						|
        	*BackgroundInitializationStatus;
 | 
						|
      dma_addr_t BackgroundInitializationStatusDMA;
 | 
						|
      DAC960_V1_BackgroundInitializationStatus_T
 | 
						|
        	LastBackgroundInitializationStatus;
 | 
						|
 | 
						|
      DAC960_V1_DeviceState_T
 | 
						|
	DeviceState[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets];
 | 
						|
      DAC960_V1_DeviceState_T *NewDeviceState;
 | 
						|
      dma_addr_t	NewDeviceStateDMA;
 | 
						|
 | 
						|
      DAC960_SCSI_Inquiry_T
 | 
						|
	InquiryStandardData[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets];
 | 
						|
      DAC960_SCSI_Inquiry_T *NewInquiryStandardData;
 | 
						|
      dma_addr_t NewInquiryStandardDataDMA;
 | 
						|
 | 
						|
      DAC960_SCSI_Inquiry_UnitSerialNumber_T
 | 
						|
	InquiryUnitSerialNumber[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets];
 | 
						|
      DAC960_SCSI_Inquiry_UnitSerialNumber_T *NewInquiryUnitSerialNumber;
 | 
						|
      dma_addr_t NewInquiryUnitSerialNumberDMA;
 | 
						|
 | 
						|
      int DeviceResetCount[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets];
 | 
						|
      bool DirectCommandActive[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets];
 | 
						|
    } V1;
 | 
						|
    struct {
 | 
						|
      unsigned int StatusChangeCounter;
 | 
						|
      unsigned int NextEventSequenceNumber;
 | 
						|
      unsigned int PhysicalDeviceIndex;
 | 
						|
      bool NeedLogicalDeviceInformation;
 | 
						|
      bool NeedPhysicalDeviceInformation;
 | 
						|
      bool NeedDeviceSerialNumberInformation;
 | 
						|
      bool StartLogicalDeviceInformationScan;
 | 
						|
      bool StartPhysicalDeviceInformationScan;
 | 
						|
      struct pci_pool *RequestSensePool;
 | 
						|
 | 
						|
      dma_addr_t	FirstCommandMailboxDMA;
 | 
						|
      DAC960_V2_CommandMailbox_T *FirstCommandMailbox;
 | 
						|
      DAC960_V2_CommandMailbox_T *LastCommandMailbox;
 | 
						|
      DAC960_V2_CommandMailbox_T *NextCommandMailbox;
 | 
						|
      DAC960_V2_CommandMailbox_T *PreviousCommandMailbox1;
 | 
						|
      DAC960_V2_CommandMailbox_T *PreviousCommandMailbox2;
 | 
						|
 | 
						|
      dma_addr_t	FirstStatusMailboxDMA;
 | 
						|
      DAC960_V2_StatusMailbox_T *FirstStatusMailbox;
 | 
						|
      DAC960_V2_StatusMailbox_T *LastStatusMailbox;
 | 
						|
      DAC960_V2_StatusMailbox_T *NextStatusMailbox;
 | 
						|
 | 
						|
      dma_addr_t	HealthStatusBufferDMA;
 | 
						|
      DAC960_V2_HealthStatusBuffer_T *HealthStatusBuffer;
 | 
						|
 | 
						|
      DAC960_V2_ControllerInfo_T ControllerInformation;
 | 
						|
      DAC960_V2_ControllerInfo_T *NewControllerInformation;
 | 
						|
      dma_addr_t	NewControllerInformationDMA;
 | 
						|
 | 
						|
      DAC960_V2_LogicalDeviceInfo_T
 | 
						|
	*LogicalDeviceInformation[DAC960_MaxLogicalDrives];
 | 
						|
      DAC960_V2_LogicalDeviceInfo_T *NewLogicalDeviceInformation;
 | 
						|
      dma_addr_t	 NewLogicalDeviceInformationDMA;
 | 
						|
 | 
						|
      DAC960_V2_PhysicalDeviceInfo_T
 | 
						|
	*PhysicalDeviceInformation[DAC960_V2_MaxPhysicalDevices];
 | 
						|
      DAC960_V2_PhysicalDeviceInfo_T *NewPhysicalDeviceInformation;
 | 
						|
      dma_addr_t	NewPhysicalDeviceInformationDMA;
 | 
						|
 | 
						|
      DAC960_SCSI_Inquiry_UnitSerialNumber_T *NewInquiryUnitSerialNumber;
 | 
						|
      dma_addr_t	NewInquiryUnitSerialNumberDMA;
 | 
						|
      DAC960_SCSI_Inquiry_UnitSerialNumber_T
 | 
						|
	*InquiryUnitSerialNumber[DAC960_V2_MaxPhysicalDevices];
 | 
						|
 | 
						|
      DAC960_V2_Event_T *Event;
 | 
						|
      dma_addr_t EventDMA;
 | 
						|
 | 
						|
      DAC960_V2_PhysicalToLogicalDevice_T *PhysicalToLogicalDevice;
 | 
						|
      dma_addr_t PhysicalToLogicalDeviceDMA;
 | 
						|
 | 
						|
      DAC960_V2_PhysicalDevice_T
 | 
						|
	LogicalDriveToVirtualDevice[DAC960_MaxLogicalDrives];
 | 
						|
      bool LogicalDriveFoundDuringScan[DAC960_MaxLogicalDrives];
 | 
						|
    } V2;
 | 
						|
  } FW;
 | 
						|
  unsigned char ProgressBuffer[DAC960_ProgressBufferSize];
 | 
						|
  unsigned char UserStatusBuffer[DAC960_UserMessageSize];
 | 
						|
}
 | 
						|
DAC960_Controller_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Simplify access to Firmware Version Dependent Data Structure Components
 | 
						|
  and Functions.
 | 
						|
*/
 | 
						|
 | 
						|
#define V1				FW.V1
 | 
						|
#define V2				FW.V2
 | 
						|
#define DAC960_QueueCommand(Command) \
 | 
						|
  (Controller->QueueCommand)(Command)
 | 
						|
#define DAC960_ReadControllerConfiguration(Controller) \
 | 
						|
  (Controller->ReadControllerConfiguration)(Controller)
 | 
						|
#define DAC960_ReadDeviceConfiguration(Controller) \
 | 
						|
  (Controller->ReadDeviceConfiguration)(Controller)
 | 
						|
#define DAC960_ReportDeviceConfiguration(Controller) \
 | 
						|
  (Controller->ReportDeviceConfiguration)(Controller)
 | 
						|
#define DAC960_QueueReadWriteCommand(Command) \
 | 
						|
  (Controller->QueueReadWriteCommand)(Command)
 | 
						|
 | 
						|
/*
 | 
						|
 * dma_addr_writeql is provided to write dma_addr_t types
 | 
						|
 * to a 64-bit pci address space register.  The controller
 | 
						|
 * will accept having the register written as two 32-bit
 | 
						|
 * values.
 | 
						|
 *
 | 
						|
 * In HIGHMEM kernels, dma_addr_t is a 64-bit value.
 | 
						|
 * without HIGHMEM,  dma_addr_t is a 32-bit value.
 | 
						|
 *
 | 
						|
 * The compiler should always fix up the assignment
 | 
						|
 * to u.wq appropriately, depending upon the size of
 | 
						|
 * dma_addr_t.
 | 
						|
 */
 | 
						|
static inline
 | 
						|
void dma_addr_writeql(dma_addr_t addr, void __iomem *write_address)
 | 
						|
{
 | 
						|
	union {
 | 
						|
		u64 wq;
 | 
						|
		uint wl[2];
 | 
						|
	} u;
 | 
						|
 | 
						|
	u.wq = addr;
 | 
						|
 | 
						|
	writel(u.wl[0], write_address);
 | 
						|
	writel(u.wl[1], write_address + 4);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 GEM Series Controller Interface Register Offsets.
 | 
						|
 */
 | 
						|
 | 
						|
#define DAC960_GEM_RegisterWindowSize	0x600
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
  DAC960_GEM_InboundDoorBellRegisterReadSetOffset   =   0x214,
 | 
						|
  DAC960_GEM_InboundDoorBellRegisterClearOffset     =   0x218,
 | 
						|
  DAC960_GEM_OutboundDoorBellRegisterReadSetOffset  =   0x224,
 | 
						|
  DAC960_GEM_OutboundDoorBellRegisterClearOffset    =   0x228,
 | 
						|
  DAC960_GEM_InterruptStatusRegisterOffset          =   0x208,
 | 
						|
  DAC960_GEM_InterruptMaskRegisterReadSetOffset     =   0x22C,
 | 
						|
  DAC960_GEM_InterruptMaskRegisterClearOffset       =   0x230,
 | 
						|
  DAC960_GEM_CommandMailboxBusAddressOffset         =   0x510,
 | 
						|
  DAC960_GEM_CommandStatusOffset                    =   0x518,
 | 
						|
  DAC960_GEM_ErrorStatusRegisterReadSetOffset       =   0x224,
 | 
						|
  DAC960_GEM_ErrorStatusRegisterClearOffset         =   0x228,
 | 
						|
}
 | 
						|
DAC960_GEM_RegisterOffsets_T;
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 GEM Series Inbound Door Bell
 | 
						|
 */
 | 
						|
 | 
						|
typedef union DAC960_GEM_InboundDoorBellRegister
 | 
						|
{
 | 
						|
  unsigned int All;
 | 
						|
  struct {
 | 
						|
    unsigned int :24;
 | 
						|
    bool HardwareMailboxNewCommand:1;
 | 
						|
    bool AcknowledgeHardwareMailboxStatus:1;
 | 
						|
    bool GenerateInterrupt:1;
 | 
						|
    bool ControllerReset:1;
 | 
						|
    bool MemoryMailboxNewCommand:1;
 | 
						|
    unsigned int :3;
 | 
						|
  } Write;
 | 
						|
  struct {
 | 
						|
    unsigned int :24;
 | 
						|
    bool HardwareMailboxFull:1;
 | 
						|
    bool InitializationInProgress:1;
 | 
						|
    unsigned int :6;
 | 
						|
  } Read;
 | 
						|
}
 | 
						|
DAC960_GEM_InboundDoorBellRegister_T;
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 GEM Series Outbound Door Bell Register.
 | 
						|
 */
 | 
						|
typedef union DAC960_GEM_OutboundDoorBellRegister
 | 
						|
{
 | 
						|
  unsigned int All;
 | 
						|
  struct {
 | 
						|
    unsigned int :24;
 | 
						|
    bool AcknowledgeHardwareMailboxInterrupt:1;
 | 
						|
    bool AcknowledgeMemoryMailboxInterrupt:1;
 | 
						|
    unsigned int :6;
 | 
						|
  } Write;
 | 
						|
  struct {
 | 
						|
    unsigned int :24;
 | 
						|
    bool HardwareMailboxStatusAvailable:1;
 | 
						|
    bool MemoryMailboxStatusAvailable:1;
 | 
						|
    unsigned int :6;
 | 
						|
  } Read;
 | 
						|
}
 | 
						|
DAC960_GEM_OutboundDoorBellRegister_T;
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 GEM Series Interrupt Mask Register.
 | 
						|
 */
 | 
						|
typedef union DAC960_GEM_InterruptMaskRegister
 | 
						|
{
 | 
						|
  unsigned int All;
 | 
						|
  struct {
 | 
						|
    unsigned int :16;
 | 
						|
    unsigned int :8;
 | 
						|
    unsigned int HardwareMailboxInterrupt:1;
 | 
						|
    unsigned int MemoryMailboxInterrupt:1;
 | 
						|
    unsigned int :6;
 | 
						|
  } Bits;
 | 
						|
}
 | 
						|
DAC960_GEM_InterruptMaskRegister_T;
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 GEM Series Error Status Register.
 | 
						|
 */
 | 
						|
 | 
						|
typedef union DAC960_GEM_ErrorStatusRegister
 | 
						|
{
 | 
						|
  unsigned int All;
 | 
						|
  struct {
 | 
						|
    unsigned int :24;
 | 
						|
    unsigned int :5;
 | 
						|
    bool ErrorStatusPending:1;
 | 
						|
    unsigned int :2;
 | 
						|
  } Bits;
 | 
						|
}
 | 
						|
DAC960_GEM_ErrorStatusRegister_T;
 | 
						|
 | 
						|
/*
 | 
						|
  Define inline functions to provide an abstraction for reading and writing the
 | 
						|
  DAC960 GEM Series Controller Interface Registers.
 | 
						|
*/
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_GEM_HardwareMailboxNewCommand(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.HardwareMailboxNewCommand = true;
 | 
						|
  writel(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_GEM_InboundDoorBellRegisterReadSetOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_GEM_AcknowledgeHardwareMailboxStatus(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.AcknowledgeHardwareMailboxStatus = true;
 | 
						|
  writel(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_GEM_InboundDoorBellRegisterClearOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_GEM_GenerateInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.GenerateInterrupt = true;
 | 
						|
  writel(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_GEM_InboundDoorBellRegisterReadSetOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_GEM_ControllerReset(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.ControllerReset = true;
 | 
						|
  writel(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_GEM_InboundDoorBellRegisterReadSetOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_GEM_MemoryMailboxNewCommand(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.MemoryMailboxNewCommand = true;
 | 
						|
  writel(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_GEM_InboundDoorBellRegisterReadSetOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_GEM_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All =
 | 
						|
    readl(ControllerBaseAddress +
 | 
						|
          DAC960_GEM_InboundDoorBellRegisterReadSetOffset);
 | 
						|
  return InboundDoorBellRegister.Read.HardwareMailboxFull;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_GEM_InitializationInProgressP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All =
 | 
						|
    readl(ControllerBaseAddress +
 | 
						|
          DAC960_GEM_InboundDoorBellRegisterReadSetOffset);
 | 
						|
  return InboundDoorBellRegister.Read.InitializationInProgress;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_GEM_AcknowledgeHardwareMailboxInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_GEM_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All = 0;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
 | 
						|
  writel(OutboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_GEM_OutboundDoorBellRegisterClearOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_GEM_AcknowledgeMemoryMailboxInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_GEM_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All = 0;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
 | 
						|
  writel(OutboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_GEM_OutboundDoorBellRegisterClearOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_GEM_AcknowledgeInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_GEM_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All = 0;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
 | 
						|
  writel(OutboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_GEM_OutboundDoorBellRegisterClearOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_GEM_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_GEM_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All =
 | 
						|
    readl(ControllerBaseAddress +
 | 
						|
          DAC960_GEM_OutboundDoorBellRegisterReadSetOffset);
 | 
						|
  return OutboundDoorBellRegister.Read.HardwareMailboxStatusAvailable;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_GEM_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_GEM_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All =
 | 
						|
    readl(ControllerBaseAddress +
 | 
						|
          DAC960_GEM_OutboundDoorBellRegisterReadSetOffset);
 | 
						|
  return OutboundDoorBellRegister.Read.MemoryMailboxStatusAvailable;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_GEM_EnableInterrupts(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_GEM_InterruptMaskRegister_T InterruptMaskRegister;
 | 
						|
  InterruptMaskRegister.All = 0;
 | 
						|
  InterruptMaskRegister.Bits.HardwareMailboxInterrupt = true;
 | 
						|
  InterruptMaskRegister.Bits.MemoryMailboxInterrupt = true;
 | 
						|
  writel(InterruptMaskRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_GEM_InterruptMaskRegisterClearOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_GEM_DisableInterrupts(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_GEM_InterruptMaskRegister_T InterruptMaskRegister;
 | 
						|
  InterruptMaskRegister.All = 0;
 | 
						|
  InterruptMaskRegister.Bits.HardwareMailboxInterrupt = true;
 | 
						|
  InterruptMaskRegister.Bits.MemoryMailboxInterrupt = true;
 | 
						|
  writel(InterruptMaskRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_GEM_InterruptMaskRegisterReadSetOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_GEM_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_GEM_InterruptMaskRegister_T InterruptMaskRegister;
 | 
						|
  InterruptMaskRegister.All =
 | 
						|
    readl(ControllerBaseAddress +
 | 
						|
          DAC960_GEM_InterruptMaskRegisterReadSetOffset);
 | 
						|
  return !(InterruptMaskRegister.Bits.HardwareMailboxInterrupt ||
 | 
						|
           InterruptMaskRegister.Bits.MemoryMailboxInterrupt);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_GEM_WriteCommandMailbox(DAC960_V2_CommandMailbox_T
 | 
						|
				     *MemoryCommandMailbox,
 | 
						|
				   DAC960_V2_CommandMailbox_T
 | 
						|
				     *CommandMailbox)
 | 
						|
{
 | 
						|
  memcpy(&MemoryCommandMailbox->Words[1], &CommandMailbox->Words[1],
 | 
						|
	 sizeof(DAC960_V2_CommandMailbox_T) - sizeof(unsigned int));
 | 
						|
  wmb();
 | 
						|
  MemoryCommandMailbox->Words[0] = CommandMailbox->Words[0];
 | 
						|
  mb();
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_GEM_WriteHardwareMailbox(void __iomem *ControllerBaseAddress,
 | 
						|
				    dma_addr_t CommandMailboxDMA)
 | 
						|
{
 | 
						|
	dma_addr_writeql(CommandMailboxDMA,
 | 
						|
		ControllerBaseAddress +
 | 
						|
		DAC960_GEM_CommandMailboxBusAddressOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline DAC960_V2_CommandIdentifier_T
 | 
						|
DAC960_GEM_ReadCommandIdentifier(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  return readw(ControllerBaseAddress + DAC960_GEM_CommandStatusOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline DAC960_V2_CommandStatus_T
 | 
						|
DAC960_GEM_ReadCommandStatus(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  return readw(ControllerBaseAddress + DAC960_GEM_CommandStatusOffset + 2);
 | 
						|
}
 | 
						|
 | 
						|
static inline bool
 | 
						|
DAC960_GEM_ReadErrorStatus(void __iomem *ControllerBaseAddress,
 | 
						|
			  unsigned char *ErrorStatus,
 | 
						|
			  unsigned char *Parameter0,
 | 
						|
			  unsigned char *Parameter1)
 | 
						|
{
 | 
						|
  DAC960_GEM_ErrorStatusRegister_T ErrorStatusRegister;
 | 
						|
  ErrorStatusRegister.All =
 | 
						|
    readl(ControllerBaseAddress + DAC960_GEM_ErrorStatusRegisterReadSetOffset);
 | 
						|
  if (!ErrorStatusRegister.Bits.ErrorStatusPending) return false;
 | 
						|
  ErrorStatusRegister.Bits.ErrorStatusPending = false;
 | 
						|
  *ErrorStatus = ErrorStatusRegister.All;
 | 
						|
  *Parameter0 =
 | 
						|
    readb(ControllerBaseAddress + DAC960_GEM_CommandMailboxBusAddressOffset + 0);
 | 
						|
  *Parameter1 =
 | 
						|
    readb(ControllerBaseAddress + DAC960_GEM_CommandMailboxBusAddressOffset + 1);
 | 
						|
  writel(0x03000000, ControllerBaseAddress +
 | 
						|
         DAC960_GEM_ErrorStatusRegisterClearOffset);
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 BA Series Controller Interface Register Offsets.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_BA_RegisterWindowSize		0x80
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
  DAC960_BA_InboundDoorBellRegisterOffset =	0x60,
 | 
						|
  DAC960_BA_OutboundDoorBellRegisterOffset =	0x61,
 | 
						|
  DAC960_BA_InterruptStatusRegisterOffset =	0x30,
 | 
						|
  DAC960_BA_InterruptMaskRegisterOffset =	0x34,
 | 
						|
  DAC960_BA_CommandMailboxBusAddressOffset =	0x50,
 | 
						|
  DAC960_BA_CommandStatusOffset =		0x58,
 | 
						|
  DAC960_BA_ErrorStatusRegisterOffset =		0x63
 | 
						|
}
 | 
						|
DAC960_BA_RegisterOffsets_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 BA Series Inbound Door Bell Register.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_BA_InboundDoorBellRegister
 | 
						|
{
 | 
						|
  unsigned char All;
 | 
						|
  struct {
 | 
						|
    bool HardwareMailboxNewCommand:1;			/* Bit 0 */
 | 
						|
    bool AcknowledgeHardwareMailboxStatus:1;		/* Bit 1 */
 | 
						|
    bool GenerateInterrupt:1;				/* Bit 2 */
 | 
						|
    bool ControllerReset:1;				/* Bit 3 */
 | 
						|
    bool MemoryMailboxNewCommand:1;			/* Bit 4 */
 | 
						|
    unsigned char :3;					/* Bits 5-7 */
 | 
						|
  } Write;
 | 
						|
  struct {
 | 
						|
    bool HardwareMailboxEmpty:1;			/* Bit 0 */
 | 
						|
    bool InitializationNotInProgress:1;			/* Bit 1 */
 | 
						|
    unsigned char :6;					/* Bits 2-7 */
 | 
						|
  } Read;
 | 
						|
}
 | 
						|
DAC960_BA_InboundDoorBellRegister_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 BA Series Outbound Door Bell Register.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_BA_OutboundDoorBellRegister
 | 
						|
{
 | 
						|
  unsigned char All;
 | 
						|
  struct {
 | 
						|
    bool AcknowledgeHardwareMailboxInterrupt:1;		/* Bit 0 */
 | 
						|
    bool AcknowledgeMemoryMailboxInterrupt:1;		/* Bit 1 */
 | 
						|
    unsigned char :6;					/* Bits 2-7 */
 | 
						|
  } Write;
 | 
						|
  struct {
 | 
						|
    bool HardwareMailboxStatusAvailable:1;		/* Bit 0 */
 | 
						|
    bool MemoryMailboxStatusAvailable:1;		/* Bit 1 */
 | 
						|
    unsigned char :6;					/* Bits 2-7 */
 | 
						|
  } Read;
 | 
						|
}
 | 
						|
DAC960_BA_OutboundDoorBellRegister_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 BA Series Interrupt Mask Register.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_BA_InterruptMaskRegister
 | 
						|
{
 | 
						|
  unsigned char All;
 | 
						|
  struct {
 | 
						|
    unsigned int :2;					/* Bits 0-1 */
 | 
						|
    bool DisableInterrupts:1;				/* Bit 2 */
 | 
						|
    bool DisableInterruptsI2O:1;			/* Bit 3 */
 | 
						|
    unsigned int :4;					/* Bits 4-7 */
 | 
						|
  } Bits;
 | 
						|
}
 | 
						|
DAC960_BA_InterruptMaskRegister_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 BA Series Error Status Register.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_BA_ErrorStatusRegister
 | 
						|
{
 | 
						|
  unsigned char All;
 | 
						|
  struct {
 | 
						|
    unsigned int :2;					/* Bits 0-1 */
 | 
						|
    bool ErrorStatusPending:1;				/* Bit 2 */
 | 
						|
    unsigned int :5;					/* Bits 3-7 */
 | 
						|
  } Bits;
 | 
						|
}
 | 
						|
DAC960_BA_ErrorStatusRegister_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define inline functions to provide an abstraction for reading and writing the
 | 
						|
  DAC960 BA Series Controller Interface Registers.
 | 
						|
*/
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_BA_HardwareMailboxNewCommand(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.HardwareMailboxNewCommand = true;
 | 
						|
  writeb(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_BA_AcknowledgeHardwareMailboxStatus(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.AcknowledgeHardwareMailboxStatus = true;
 | 
						|
  writeb(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_BA_GenerateInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.GenerateInterrupt = true;
 | 
						|
  writeb(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_BA_ControllerReset(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.ControllerReset = true;
 | 
						|
  writeb(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_BA_MemoryMailboxNewCommand(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.MemoryMailboxNewCommand = true;
 | 
						|
  writeb(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_BA_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset);
 | 
						|
  return !InboundDoorBellRegister.Read.HardwareMailboxEmpty;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_BA_InitializationInProgressP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_BA_InboundDoorBellRegisterOffset);
 | 
						|
  return !InboundDoorBellRegister.Read.InitializationNotInProgress;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_BA_AcknowledgeHardwareMailboxInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_BA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All = 0;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
 | 
						|
  writeb(OutboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_BA_OutboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_BA_AcknowledgeMemoryMailboxInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_BA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All = 0;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
 | 
						|
  writeb(OutboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_BA_OutboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_BA_AcknowledgeInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_BA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All = 0;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
 | 
						|
  writeb(OutboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_BA_OutboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_BA_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_BA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_BA_OutboundDoorBellRegisterOffset);
 | 
						|
  return OutboundDoorBellRegister.Read.HardwareMailboxStatusAvailable;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_BA_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_BA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_BA_OutboundDoorBellRegisterOffset);
 | 
						|
  return OutboundDoorBellRegister.Read.MemoryMailboxStatusAvailable;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_BA_EnableInterrupts(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_BA_InterruptMaskRegister_T InterruptMaskRegister;
 | 
						|
  InterruptMaskRegister.All = 0xFF;
 | 
						|
  InterruptMaskRegister.Bits.DisableInterrupts = false;
 | 
						|
  InterruptMaskRegister.Bits.DisableInterruptsI2O = true;
 | 
						|
  writeb(InterruptMaskRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_BA_InterruptMaskRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_BA_DisableInterrupts(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_BA_InterruptMaskRegister_T InterruptMaskRegister;
 | 
						|
  InterruptMaskRegister.All = 0xFF;
 | 
						|
  InterruptMaskRegister.Bits.DisableInterrupts = true;
 | 
						|
  InterruptMaskRegister.Bits.DisableInterruptsI2O = true;
 | 
						|
  writeb(InterruptMaskRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_BA_InterruptMaskRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_BA_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_BA_InterruptMaskRegister_T InterruptMaskRegister;
 | 
						|
  InterruptMaskRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_BA_InterruptMaskRegisterOffset);
 | 
						|
  return !InterruptMaskRegister.Bits.DisableInterrupts;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_BA_WriteCommandMailbox(DAC960_V2_CommandMailbox_T
 | 
						|
				     *MemoryCommandMailbox,
 | 
						|
				   DAC960_V2_CommandMailbox_T
 | 
						|
				     *CommandMailbox)
 | 
						|
{
 | 
						|
  memcpy(&MemoryCommandMailbox->Words[1], &CommandMailbox->Words[1],
 | 
						|
	 sizeof(DAC960_V2_CommandMailbox_T) - sizeof(unsigned int));
 | 
						|
  wmb();
 | 
						|
  MemoryCommandMailbox->Words[0] = CommandMailbox->Words[0];
 | 
						|
  mb();
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_BA_WriteHardwareMailbox(void __iomem *ControllerBaseAddress,
 | 
						|
				    dma_addr_t CommandMailboxDMA)
 | 
						|
{
 | 
						|
	dma_addr_writeql(CommandMailboxDMA,
 | 
						|
		ControllerBaseAddress +
 | 
						|
		DAC960_BA_CommandMailboxBusAddressOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline DAC960_V2_CommandIdentifier_T
 | 
						|
DAC960_BA_ReadCommandIdentifier(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  return readw(ControllerBaseAddress + DAC960_BA_CommandStatusOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline DAC960_V2_CommandStatus_T
 | 
						|
DAC960_BA_ReadCommandStatus(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  return readw(ControllerBaseAddress + DAC960_BA_CommandStatusOffset + 2);
 | 
						|
}
 | 
						|
 | 
						|
static inline bool
 | 
						|
DAC960_BA_ReadErrorStatus(void __iomem *ControllerBaseAddress,
 | 
						|
			  unsigned char *ErrorStatus,
 | 
						|
			  unsigned char *Parameter0,
 | 
						|
			  unsigned char *Parameter1)
 | 
						|
{
 | 
						|
  DAC960_BA_ErrorStatusRegister_T ErrorStatusRegister;
 | 
						|
  ErrorStatusRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_BA_ErrorStatusRegisterOffset);
 | 
						|
  if (!ErrorStatusRegister.Bits.ErrorStatusPending) return false;
 | 
						|
  ErrorStatusRegister.Bits.ErrorStatusPending = false;
 | 
						|
  *ErrorStatus = ErrorStatusRegister.All;
 | 
						|
  *Parameter0 =
 | 
						|
    readb(ControllerBaseAddress + DAC960_BA_CommandMailboxBusAddressOffset + 0);
 | 
						|
  *Parameter1 =
 | 
						|
    readb(ControllerBaseAddress + DAC960_BA_CommandMailboxBusAddressOffset + 1);
 | 
						|
  writeb(0xFF, ControllerBaseAddress + DAC960_BA_ErrorStatusRegisterOffset);
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 LP Series Controller Interface Register Offsets.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_LP_RegisterWindowSize		0x80
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
  DAC960_LP_InboundDoorBellRegisterOffset =	0x20,
 | 
						|
  DAC960_LP_OutboundDoorBellRegisterOffset =	0x2C,
 | 
						|
  DAC960_LP_InterruptStatusRegisterOffset =	0x30,
 | 
						|
  DAC960_LP_InterruptMaskRegisterOffset =	0x34,
 | 
						|
  DAC960_LP_CommandMailboxBusAddressOffset =	0x10,
 | 
						|
  DAC960_LP_CommandStatusOffset =		0x18,
 | 
						|
  DAC960_LP_ErrorStatusRegisterOffset =		0x2E
 | 
						|
}
 | 
						|
DAC960_LP_RegisterOffsets_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 LP Series Inbound Door Bell Register.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_LP_InboundDoorBellRegister
 | 
						|
{
 | 
						|
  unsigned char All;
 | 
						|
  struct {
 | 
						|
    bool HardwareMailboxNewCommand:1;			/* Bit 0 */
 | 
						|
    bool AcknowledgeHardwareMailboxStatus:1;		/* Bit 1 */
 | 
						|
    bool GenerateInterrupt:1;				/* Bit 2 */
 | 
						|
    bool ControllerReset:1;				/* Bit 3 */
 | 
						|
    bool MemoryMailboxNewCommand:1;			/* Bit 4 */
 | 
						|
    unsigned char :3;					/* Bits 5-7 */
 | 
						|
  } Write;
 | 
						|
  struct {
 | 
						|
    bool HardwareMailboxFull:1;				/* Bit 0 */
 | 
						|
    bool InitializationInProgress:1;			/* Bit 1 */
 | 
						|
    unsigned char :6;					/* Bits 2-7 */
 | 
						|
  } Read;
 | 
						|
}
 | 
						|
DAC960_LP_InboundDoorBellRegister_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 LP Series Outbound Door Bell Register.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_LP_OutboundDoorBellRegister
 | 
						|
{
 | 
						|
  unsigned char All;
 | 
						|
  struct {
 | 
						|
    bool AcknowledgeHardwareMailboxInterrupt:1;		/* Bit 0 */
 | 
						|
    bool AcknowledgeMemoryMailboxInterrupt:1;		/* Bit 1 */
 | 
						|
    unsigned char :6;					/* Bits 2-7 */
 | 
						|
  } Write;
 | 
						|
  struct {
 | 
						|
    bool HardwareMailboxStatusAvailable:1;		/* Bit 0 */
 | 
						|
    bool MemoryMailboxStatusAvailable:1;		/* Bit 1 */
 | 
						|
    unsigned char :6;					/* Bits 2-7 */
 | 
						|
  } Read;
 | 
						|
}
 | 
						|
DAC960_LP_OutboundDoorBellRegister_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 LP Series Interrupt Mask Register.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_LP_InterruptMaskRegister
 | 
						|
{
 | 
						|
  unsigned char All;
 | 
						|
  struct {
 | 
						|
    unsigned int :2;					/* Bits 0-1 */
 | 
						|
    bool DisableInterrupts:1;				/* Bit 2 */
 | 
						|
    unsigned int :5;					/* Bits 3-7 */
 | 
						|
  } Bits;
 | 
						|
}
 | 
						|
DAC960_LP_InterruptMaskRegister_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 LP Series Error Status Register.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_LP_ErrorStatusRegister
 | 
						|
{
 | 
						|
  unsigned char All;
 | 
						|
  struct {
 | 
						|
    unsigned int :2;					/* Bits 0-1 */
 | 
						|
    bool ErrorStatusPending:1;				/* Bit 2 */
 | 
						|
    unsigned int :5;					/* Bits 3-7 */
 | 
						|
  } Bits;
 | 
						|
}
 | 
						|
DAC960_LP_ErrorStatusRegister_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define inline functions to provide an abstraction for reading and writing the
 | 
						|
  DAC960 LP Series Controller Interface Registers.
 | 
						|
*/
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LP_HardwareMailboxNewCommand(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.HardwareMailboxNewCommand = true;
 | 
						|
  writeb(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LP_AcknowledgeHardwareMailboxStatus(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.AcknowledgeHardwareMailboxStatus = true;
 | 
						|
  writeb(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LP_GenerateInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.GenerateInterrupt = true;
 | 
						|
  writeb(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LP_ControllerReset(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.ControllerReset = true;
 | 
						|
  writeb(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LP_MemoryMailboxNewCommand(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.MemoryMailboxNewCommand = true;
 | 
						|
  writeb(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_LP_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset);
 | 
						|
  return InboundDoorBellRegister.Read.HardwareMailboxFull;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_LP_InitializationInProgressP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_LP_InboundDoorBellRegisterOffset);
 | 
						|
  return InboundDoorBellRegister.Read.InitializationInProgress;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LP_AcknowledgeHardwareMailboxInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LP_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All = 0;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
 | 
						|
  writeb(OutboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_LP_OutboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LP_AcknowledgeMemoryMailboxInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LP_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All = 0;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
 | 
						|
  writeb(OutboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_LP_OutboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LP_AcknowledgeInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LP_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All = 0;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
 | 
						|
  writeb(OutboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_LP_OutboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_LP_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LP_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_LP_OutboundDoorBellRegisterOffset);
 | 
						|
  return OutboundDoorBellRegister.Read.HardwareMailboxStatusAvailable;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_LP_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LP_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_LP_OutboundDoorBellRegisterOffset);
 | 
						|
  return OutboundDoorBellRegister.Read.MemoryMailboxStatusAvailable;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LP_EnableInterrupts(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LP_InterruptMaskRegister_T InterruptMaskRegister;
 | 
						|
  InterruptMaskRegister.All = 0xFF;
 | 
						|
  InterruptMaskRegister.Bits.DisableInterrupts = false;
 | 
						|
  writeb(InterruptMaskRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_LP_InterruptMaskRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LP_DisableInterrupts(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LP_InterruptMaskRegister_T InterruptMaskRegister;
 | 
						|
  InterruptMaskRegister.All = 0xFF;
 | 
						|
  InterruptMaskRegister.Bits.DisableInterrupts = true;
 | 
						|
  writeb(InterruptMaskRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_LP_InterruptMaskRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_LP_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LP_InterruptMaskRegister_T InterruptMaskRegister;
 | 
						|
  InterruptMaskRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_LP_InterruptMaskRegisterOffset);
 | 
						|
  return !InterruptMaskRegister.Bits.DisableInterrupts;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LP_WriteCommandMailbox(DAC960_V2_CommandMailbox_T
 | 
						|
				     *MemoryCommandMailbox,
 | 
						|
				   DAC960_V2_CommandMailbox_T
 | 
						|
				     *CommandMailbox)
 | 
						|
{
 | 
						|
  memcpy(&MemoryCommandMailbox->Words[1], &CommandMailbox->Words[1],
 | 
						|
	 sizeof(DAC960_V2_CommandMailbox_T) - sizeof(unsigned int));
 | 
						|
  wmb();
 | 
						|
  MemoryCommandMailbox->Words[0] = CommandMailbox->Words[0];
 | 
						|
  mb();
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LP_WriteHardwareMailbox(void __iomem *ControllerBaseAddress,
 | 
						|
				    dma_addr_t CommandMailboxDMA)
 | 
						|
{
 | 
						|
	dma_addr_writeql(CommandMailboxDMA,
 | 
						|
		ControllerBaseAddress +
 | 
						|
		DAC960_LP_CommandMailboxBusAddressOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline DAC960_V2_CommandIdentifier_T
 | 
						|
DAC960_LP_ReadCommandIdentifier(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  return readw(ControllerBaseAddress + DAC960_LP_CommandStatusOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline DAC960_V2_CommandStatus_T
 | 
						|
DAC960_LP_ReadCommandStatus(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  return readw(ControllerBaseAddress + DAC960_LP_CommandStatusOffset + 2);
 | 
						|
}
 | 
						|
 | 
						|
static inline bool
 | 
						|
DAC960_LP_ReadErrorStatus(void __iomem *ControllerBaseAddress,
 | 
						|
			  unsigned char *ErrorStatus,
 | 
						|
			  unsigned char *Parameter0,
 | 
						|
			  unsigned char *Parameter1)
 | 
						|
{
 | 
						|
  DAC960_LP_ErrorStatusRegister_T ErrorStatusRegister;
 | 
						|
  ErrorStatusRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_LP_ErrorStatusRegisterOffset);
 | 
						|
  if (!ErrorStatusRegister.Bits.ErrorStatusPending) return false;
 | 
						|
  ErrorStatusRegister.Bits.ErrorStatusPending = false;
 | 
						|
  *ErrorStatus = ErrorStatusRegister.All;
 | 
						|
  *Parameter0 =
 | 
						|
    readb(ControllerBaseAddress + DAC960_LP_CommandMailboxBusAddressOffset + 0);
 | 
						|
  *Parameter1 =
 | 
						|
    readb(ControllerBaseAddress + DAC960_LP_CommandMailboxBusAddressOffset + 1);
 | 
						|
  writeb(0xFF, ControllerBaseAddress + DAC960_LP_ErrorStatusRegisterOffset);
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 LA Series Controller Interface Register Offsets.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_LA_RegisterWindowSize		0x80
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
  DAC960_LA_InboundDoorBellRegisterOffset =	0x60,
 | 
						|
  DAC960_LA_OutboundDoorBellRegisterOffset =	0x61,
 | 
						|
  DAC960_LA_InterruptMaskRegisterOffset =	0x34,
 | 
						|
  DAC960_LA_CommandOpcodeRegisterOffset =	0x50,
 | 
						|
  DAC960_LA_CommandIdentifierRegisterOffset =	0x51,
 | 
						|
  DAC960_LA_MailboxRegister2Offset =		0x52,
 | 
						|
  DAC960_LA_MailboxRegister3Offset =		0x53,
 | 
						|
  DAC960_LA_MailboxRegister4Offset =		0x54,
 | 
						|
  DAC960_LA_MailboxRegister5Offset =		0x55,
 | 
						|
  DAC960_LA_MailboxRegister6Offset =		0x56,
 | 
						|
  DAC960_LA_MailboxRegister7Offset =		0x57,
 | 
						|
  DAC960_LA_MailboxRegister8Offset =		0x58,
 | 
						|
  DAC960_LA_MailboxRegister9Offset =		0x59,
 | 
						|
  DAC960_LA_MailboxRegister10Offset =		0x5A,
 | 
						|
  DAC960_LA_MailboxRegister11Offset =		0x5B,
 | 
						|
  DAC960_LA_MailboxRegister12Offset =		0x5C,
 | 
						|
  DAC960_LA_StatusCommandIdentifierRegOffset =	0x5D,
 | 
						|
  DAC960_LA_StatusRegisterOffset =		0x5E,
 | 
						|
  DAC960_LA_ErrorStatusRegisterOffset =		0x63
 | 
						|
}
 | 
						|
DAC960_LA_RegisterOffsets_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 LA Series Inbound Door Bell Register.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_LA_InboundDoorBellRegister
 | 
						|
{
 | 
						|
  unsigned char All;
 | 
						|
  struct {
 | 
						|
    bool HardwareMailboxNewCommand:1;			/* Bit 0 */
 | 
						|
    bool AcknowledgeHardwareMailboxStatus:1;		/* Bit 1 */
 | 
						|
    bool GenerateInterrupt:1;				/* Bit 2 */
 | 
						|
    bool ControllerReset:1;				/* Bit 3 */
 | 
						|
    bool MemoryMailboxNewCommand:1;			/* Bit 4 */
 | 
						|
    unsigned char :3;					/* Bits 5-7 */
 | 
						|
  } Write;
 | 
						|
  struct {
 | 
						|
    bool HardwareMailboxEmpty:1;			/* Bit 0 */
 | 
						|
    bool InitializationNotInProgress:1;		/* Bit 1 */
 | 
						|
    unsigned char :6;					/* Bits 2-7 */
 | 
						|
  } Read;
 | 
						|
}
 | 
						|
DAC960_LA_InboundDoorBellRegister_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 LA Series Outbound Door Bell Register.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_LA_OutboundDoorBellRegister
 | 
						|
{
 | 
						|
  unsigned char All;
 | 
						|
  struct {
 | 
						|
    bool AcknowledgeHardwareMailboxInterrupt:1;		/* Bit 0 */
 | 
						|
    bool AcknowledgeMemoryMailboxInterrupt:1;		/* Bit 1 */
 | 
						|
    unsigned char :6;					/* Bits 2-7 */
 | 
						|
  } Write;
 | 
						|
  struct {
 | 
						|
    bool HardwareMailboxStatusAvailable:1;		/* Bit 0 */
 | 
						|
    bool MemoryMailboxStatusAvailable:1;		/* Bit 1 */
 | 
						|
    unsigned char :6;					/* Bits 2-7 */
 | 
						|
  } Read;
 | 
						|
}
 | 
						|
DAC960_LA_OutboundDoorBellRegister_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 LA Series Interrupt Mask Register.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_LA_InterruptMaskRegister
 | 
						|
{
 | 
						|
  unsigned char All;
 | 
						|
  struct {
 | 
						|
    unsigned char :2;					/* Bits 0-1 */
 | 
						|
    bool DisableInterrupts:1;				/* Bit 2 */
 | 
						|
    unsigned char :5;					/* Bits 3-7 */
 | 
						|
  } Bits;
 | 
						|
}
 | 
						|
DAC960_LA_InterruptMaskRegister_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 LA Series Error Status Register.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_LA_ErrorStatusRegister
 | 
						|
{
 | 
						|
  unsigned char All;
 | 
						|
  struct {
 | 
						|
    unsigned int :2;					/* Bits 0-1 */
 | 
						|
    bool ErrorStatusPending:1;				/* Bit 2 */
 | 
						|
    unsigned int :5;					/* Bits 3-7 */
 | 
						|
  } Bits;
 | 
						|
}
 | 
						|
DAC960_LA_ErrorStatusRegister_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define inline functions to provide an abstraction for reading and writing the
 | 
						|
  DAC960 LA Series Controller Interface Registers.
 | 
						|
*/
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LA_HardwareMailboxNewCommand(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.HardwareMailboxNewCommand = true;
 | 
						|
  writeb(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LA_AcknowledgeHardwareMailboxStatus(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.AcknowledgeHardwareMailboxStatus = true;
 | 
						|
  writeb(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LA_GenerateInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.GenerateInterrupt = true;
 | 
						|
  writeb(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LA_ControllerReset(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.ControllerReset = true;
 | 
						|
  writeb(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LA_MemoryMailboxNewCommand(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.MemoryMailboxNewCommand = true;
 | 
						|
  writeb(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_LA_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset);
 | 
						|
  return !InboundDoorBellRegister.Read.HardwareMailboxEmpty;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_LA_InitializationInProgressP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_LA_InboundDoorBellRegisterOffset);
 | 
						|
  return !InboundDoorBellRegister.Read.InitializationNotInProgress;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LA_AcknowledgeHardwareMailboxInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All = 0;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
 | 
						|
  writeb(OutboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_LA_OutboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LA_AcknowledgeMemoryMailboxInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All = 0;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
 | 
						|
  writeb(OutboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_LA_OutboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LA_AcknowledgeInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All = 0;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
 | 
						|
  writeb(OutboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_LA_OutboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_LA_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_LA_OutboundDoorBellRegisterOffset);
 | 
						|
  return OutboundDoorBellRegister.Read.HardwareMailboxStatusAvailable;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_LA_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_LA_OutboundDoorBellRegisterOffset);
 | 
						|
  return OutboundDoorBellRegister.Read.MemoryMailboxStatusAvailable;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LA_EnableInterrupts(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LA_InterruptMaskRegister_T InterruptMaskRegister;
 | 
						|
  InterruptMaskRegister.All = 0xFF;
 | 
						|
  InterruptMaskRegister.Bits.DisableInterrupts = false;
 | 
						|
  writeb(InterruptMaskRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_LA_InterruptMaskRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LA_DisableInterrupts(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LA_InterruptMaskRegister_T InterruptMaskRegister;
 | 
						|
  InterruptMaskRegister.All = 0xFF;
 | 
						|
  InterruptMaskRegister.Bits.DisableInterrupts = true;
 | 
						|
  writeb(InterruptMaskRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_LA_InterruptMaskRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_LA_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_LA_InterruptMaskRegister_T InterruptMaskRegister;
 | 
						|
  InterruptMaskRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_LA_InterruptMaskRegisterOffset);
 | 
						|
  return !InterruptMaskRegister.Bits.DisableInterrupts;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LA_WriteCommandMailbox(DAC960_V1_CommandMailbox_T
 | 
						|
				     *MemoryCommandMailbox,
 | 
						|
				   DAC960_V1_CommandMailbox_T
 | 
						|
				     *CommandMailbox)
 | 
						|
{
 | 
						|
  MemoryCommandMailbox->Words[1] = CommandMailbox->Words[1];
 | 
						|
  MemoryCommandMailbox->Words[2] = CommandMailbox->Words[2];
 | 
						|
  MemoryCommandMailbox->Words[3] = CommandMailbox->Words[3];
 | 
						|
  wmb();
 | 
						|
  MemoryCommandMailbox->Words[0] = CommandMailbox->Words[0];
 | 
						|
  mb();
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_LA_WriteHardwareMailbox(void __iomem *ControllerBaseAddress,
 | 
						|
				    DAC960_V1_CommandMailbox_T *CommandMailbox)
 | 
						|
{
 | 
						|
  writel(CommandMailbox->Words[0],
 | 
						|
	 ControllerBaseAddress + DAC960_LA_CommandOpcodeRegisterOffset);
 | 
						|
  writel(CommandMailbox->Words[1],
 | 
						|
	 ControllerBaseAddress + DAC960_LA_MailboxRegister4Offset);
 | 
						|
  writel(CommandMailbox->Words[2],
 | 
						|
	 ControllerBaseAddress + DAC960_LA_MailboxRegister8Offset);
 | 
						|
  writeb(CommandMailbox->Bytes[12],
 | 
						|
	 ControllerBaseAddress + DAC960_LA_MailboxRegister12Offset);
 | 
						|
}
 | 
						|
 | 
						|
static inline DAC960_V1_CommandIdentifier_T
 | 
						|
DAC960_LA_ReadStatusCommandIdentifier(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  return readb(ControllerBaseAddress
 | 
						|
	       + DAC960_LA_StatusCommandIdentifierRegOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline DAC960_V1_CommandStatus_T
 | 
						|
DAC960_LA_ReadStatusRegister(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  return readw(ControllerBaseAddress + DAC960_LA_StatusRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline bool
 | 
						|
DAC960_LA_ReadErrorStatus(void __iomem *ControllerBaseAddress,
 | 
						|
			  unsigned char *ErrorStatus,
 | 
						|
			  unsigned char *Parameter0,
 | 
						|
			  unsigned char *Parameter1)
 | 
						|
{
 | 
						|
  DAC960_LA_ErrorStatusRegister_T ErrorStatusRegister;
 | 
						|
  ErrorStatusRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_LA_ErrorStatusRegisterOffset);
 | 
						|
  if (!ErrorStatusRegister.Bits.ErrorStatusPending) return false;
 | 
						|
  ErrorStatusRegister.Bits.ErrorStatusPending = false;
 | 
						|
  *ErrorStatus = ErrorStatusRegister.All;
 | 
						|
  *Parameter0 =
 | 
						|
    readb(ControllerBaseAddress + DAC960_LA_CommandOpcodeRegisterOffset);
 | 
						|
  *Parameter1 =
 | 
						|
    readb(ControllerBaseAddress + DAC960_LA_CommandIdentifierRegisterOffset);
 | 
						|
  writeb(0xFF, ControllerBaseAddress + DAC960_LA_ErrorStatusRegisterOffset);
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 PG Series Controller Interface Register Offsets.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_PG_RegisterWindowSize		0x2000
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
  DAC960_PG_InboundDoorBellRegisterOffset =	0x0020,
 | 
						|
  DAC960_PG_OutboundDoorBellRegisterOffset =	0x002C,
 | 
						|
  DAC960_PG_InterruptMaskRegisterOffset =	0x0034,
 | 
						|
  DAC960_PG_CommandOpcodeRegisterOffset =	0x1000,
 | 
						|
  DAC960_PG_CommandIdentifierRegisterOffset =	0x1001,
 | 
						|
  DAC960_PG_MailboxRegister2Offset =		0x1002,
 | 
						|
  DAC960_PG_MailboxRegister3Offset =		0x1003,
 | 
						|
  DAC960_PG_MailboxRegister4Offset =		0x1004,
 | 
						|
  DAC960_PG_MailboxRegister5Offset =		0x1005,
 | 
						|
  DAC960_PG_MailboxRegister6Offset =		0x1006,
 | 
						|
  DAC960_PG_MailboxRegister7Offset =		0x1007,
 | 
						|
  DAC960_PG_MailboxRegister8Offset =		0x1008,
 | 
						|
  DAC960_PG_MailboxRegister9Offset =		0x1009,
 | 
						|
  DAC960_PG_MailboxRegister10Offset =		0x100A,
 | 
						|
  DAC960_PG_MailboxRegister11Offset =		0x100B,
 | 
						|
  DAC960_PG_MailboxRegister12Offset =		0x100C,
 | 
						|
  DAC960_PG_StatusCommandIdentifierRegOffset =	0x1018,
 | 
						|
  DAC960_PG_StatusRegisterOffset =		0x101A,
 | 
						|
  DAC960_PG_ErrorStatusRegisterOffset =		0x103F
 | 
						|
}
 | 
						|
DAC960_PG_RegisterOffsets_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 PG Series Inbound Door Bell Register.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_PG_InboundDoorBellRegister
 | 
						|
{
 | 
						|
  unsigned int All;
 | 
						|
  struct {
 | 
						|
    bool HardwareMailboxNewCommand:1;			/* Bit 0 */
 | 
						|
    bool AcknowledgeHardwareMailboxStatus:1;		/* Bit 1 */
 | 
						|
    bool GenerateInterrupt:1;				/* Bit 2 */
 | 
						|
    bool ControllerReset:1;				/* Bit 3 */
 | 
						|
    bool MemoryMailboxNewCommand:1;			/* Bit 4 */
 | 
						|
    unsigned int :27;					/* Bits 5-31 */
 | 
						|
  } Write;
 | 
						|
  struct {
 | 
						|
    bool HardwareMailboxFull:1;				/* Bit 0 */
 | 
						|
    bool InitializationInProgress:1;			/* Bit 1 */
 | 
						|
    unsigned int :30;					/* Bits 2-31 */
 | 
						|
  } Read;
 | 
						|
}
 | 
						|
DAC960_PG_InboundDoorBellRegister_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 PG Series Outbound Door Bell Register.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_PG_OutboundDoorBellRegister
 | 
						|
{
 | 
						|
  unsigned int All;
 | 
						|
  struct {
 | 
						|
    bool AcknowledgeHardwareMailboxInterrupt:1;		/* Bit 0 */
 | 
						|
    bool AcknowledgeMemoryMailboxInterrupt:1;		/* Bit 1 */
 | 
						|
    unsigned int :30;					/* Bits 2-31 */
 | 
						|
  } Write;
 | 
						|
  struct {
 | 
						|
    bool HardwareMailboxStatusAvailable:1;		/* Bit 0 */
 | 
						|
    bool MemoryMailboxStatusAvailable:1;		/* Bit 1 */
 | 
						|
    unsigned int :30;					/* Bits 2-31 */
 | 
						|
  } Read;
 | 
						|
}
 | 
						|
DAC960_PG_OutboundDoorBellRegister_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 PG Series Interrupt Mask Register.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_PG_InterruptMaskRegister
 | 
						|
{
 | 
						|
  unsigned int All;
 | 
						|
  struct {
 | 
						|
    unsigned int MessageUnitInterruptMask1:2;		/* Bits 0-1 */
 | 
						|
    bool DisableInterrupts:1;				/* Bit 2 */
 | 
						|
    unsigned int MessageUnitInterruptMask2:5;		/* Bits 3-7 */
 | 
						|
    unsigned int Reserved0:24;				/* Bits 8-31 */
 | 
						|
  } Bits;
 | 
						|
}
 | 
						|
DAC960_PG_InterruptMaskRegister_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 PG Series Error Status Register.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_PG_ErrorStatusRegister
 | 
						|
{
 | 
						|
  unsigned char All;
 | 
						|
  struct {
 | 
						|
    unsigned int :2;					/* Bits 0-1 */
 | 
						|
    bool ErrorStatusPending:1;				/* Bit 2 */
 | 
						|
    unsigned int :5;					/* Bits 3-7 */
 | 
						|
  } Bits;
 | 
						|
}
 | 
						|
DAC960_PG_ErrorStatusRegister_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define inline functions to provide an abstraction for reading and writing the
 | 
						|
  DAC960 PG Series Controller Interface Registers.
 | 
						|
*/
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PG_HardwareMailboxNewCommand(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.HardwareMailboxNewCommand = true;
 | 
						|
  writel(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PG_AcknowledgeHardwareMailboxStatus(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.AcknowledgeHardwareMailboxStatus = true;
 | 
						|
  writel(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PG_GenerateInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.GenerateInterrupt = true;
 | 
						|
  writel(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PG_ControllerReset(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.ControllerReset = true;
 | 
						|
  writel(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PG_MemoryMailboxNewCommand(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.MemoryMailboxNewCommand = true;
 | 
						|
  writel(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_PG_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All =
 | 
						|
    readl(ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset);
 | 
						|
  return InboundDoorBellRegister.Read.HardwareMailboxFull;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_PG_InitializationInProgressP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All =
 | 
						|
    readl(ControllerBaseAddress + DAC960_PG_InboundDoorBellRegisterOffset);
 | 
						|
  return InboundDoorBellRegister.Read.InitializationInProgress;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PG_AcknowledgeHardwareMailboxInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PG_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All = 0;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
 | 
						|
  writel(OutboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_PG_OutboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PG_AcknowledgeMemoryMailboxInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PG_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All = 0;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
 | 
						|
  writel(OutboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_PG_OutboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PG_AcknowledgeInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PG_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All = 0;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
 | 
						|
  writel(OutboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_PG_OutboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_PG_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PG_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All =
 | 
						|
    readl(ControllerBaseAddress + DAC960_PG_OutboundDoorBellRegisterOffset);
 | 
						|
  return OutboundDoorBellRegister.Read.HardwareMailboxStatusAvailable;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_PG_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PG_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All =
 | 
						|
    readl(ControllerBaseAddress + DAC960_PG_OutboundDoorBellRegisterOffset);
 | 
						|
  return OutboundDoorBellRegister.Read.MemoryMailboxStatusAvailable;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PG_EnableInterrupts(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PG_InterruptMaskRegister_T InterruptMaskRegister;
 | 
						|
  InterruptMaskRegister.All = 0;
 | 
						|
  InterruptMaskRegister.Bits.MessageUnitInterruptMask1 = 0x3;
 | 
						|
  InterruptMaskRegister.Bits.DisableInterrupts = false;
 | 
						|
  InterruptMaskRegister.Bits.MessageUnitInterruptMask2 = 0x1F;
 | 
						|
  writel(InterruptMaskRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_PG_InterruptMaskRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PG_DisableInterrupts(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PG_InterruptMaskRegister_T InterruptMaskRegister;
 | 
						|
  InterruptMaskRegister.All = 0;
 | 
						|
  InterruptMaskRegister.Bits.MessageUnitInterruptMask1 = 0x3;
 | 
						|
  InterruptMaskRegister.Bits.DisableInterrupts = true;
 | 
						|
  InterruptMaskRegister.Bits.MessageUnitInterruptMask2 = 0x1F;
 | 
						|
  writel(InterruptMaskRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_PG_InterruptMaskRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_PG_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PG_InterruptMaskRegister_T InterruptMaskRegister;
 | 
						|
  InterruptMaskRegister.All =
 | 
						|
    readl(ControllerBaseAddress + DAC960_PG_InterruptMaskRegisterOffset);
 | 
						|
  return !InterruptMaskRegister.Bits.DisableInterrupts;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PG_WriteCommandMailbox(DAC960_V1_CommandMailbox_T
 | 
						|
				     *MemoryCommandMailbox,
 | 
						|
				   DAC960_V1_CommandMailbox_T
 | 
						|
				     *CommandMailbox)
 | 
						|
{
 | 
						|
  MemoryCommandMailbox->Words[1] = CommandMailbox->Words[1];
 | 
						|
  MemoryCommandMailbox->Words[2] = CommandMailbox->Words[2];
 | 
						|
  MemoryCommandMailbox->Words[3] = CommandMailbox->Words[3];
 | 
						|
  wmb();
 | 
						|
  MemoryCommandMailbox->Words[0] = CommandMailbox->Words[0];
 | 
						|
  mb();
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PG_WriteHardwareMailbox(void __iomem *ControllerBaseAddress,
 | 
						|
				    DAC960_V1_CommandMailbox_T *CommandMailbox)
 | 
						|
{
 | 
						|
  writel(CommandMailbox->Words[0],
 | 
						|
	 ControllerBaseAddress + DAC960_PG_CommandOpcodeRegisterOffset);
 | 
						|
  writel(CommandMailbox->Words[1],
 | 
						|
	 ControllerBaseAddress + DAC960_PG_MailboxRegister4Offset);
 | 
						|
  writel(CommandMailbox->Words[2],
 | 
						|
	 ControllerBaseAddress + DAC960_PG_MailboxRegister8Offset);
 | 
						|
  writeb(CommandMailbox->Bytes[12],
 | 
						|
	 ControllerBaseAddress + DAC960_PG_MailboxRegister12Offset);
 | 
						|
}
 | 
						|
 | 
						|
static inline DAC960_V1_CommandIdentifier_T
 | 
						|
DAC960_PG_ReadStatusCommandIdentifier(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  return readb(ControllerBaseAddress
 | 
						|
	       + DAC960_PG_StatusCommandIdentifierRegOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline DAC960_V1_CommandStatus_T
 | 
						|
DAC960_PG_ReadStatusRegister(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  return readw(ControllerBaseAddress + DAC960_PG_StatusRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline bool
 | 
						|
DAC960_PG_ReadErrorStatus(void __iomem *ControllerBaseAddress,
 | 
						|
			  unsigned char *ErrorStatus,
 | 
						|
			  unsigned char *Parameter0,
 | 
						|
			  unsigned char *Parameter1)
 | 
						|
{
 | 
						|
  DAC960_PG_ErrorStatusRegister_T ErrorStatusRegister;
 | 
						|
  ErrorStatusRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_PG_ErrorStatusRegisterOffset);
 | 
						|
  if (!ErrorStatusRegister.Bits.ErrorStatusPending) return false;
 | 
						|
  ErrorStatusRegister.Bits.ErrorStatusPending = false;
 | 
						|
  *ErrorStatus = ErrorStatusRegister.All;
 | 
						|
  *Parameter0 =
 | 
						|
    readb(ControllerBaseAddress + DAC960_PG_CommandOpcodeRegisterOffset);
 | 
						|
  *Parameter1 =
 | 
						|
    readb(ControllerBaseAddress + DAC960_PG_CommandIdentifierRegisterOffset);
 | 
						|
  writeb(0, ControllerBaseAddress + DAC960_PG_ErrorStatusRegisterOffset);
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Define the DAC960 PD Series Controller Interface Register Offsets.
 | 
						|
*/
 | 
						|
 | 
						|
#define DAC960_PD_RegisterWindowSize		0x80
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
  DAC960_PD_CommandOpcodeRegisterOffset =	0x00,
 | 
						|
  DAC960_PD_CommandIdentifierRegisterOffset =	0x01,
 | 
						|
  DAC960_PD_MailboxRegister2Offset =		0x02,
 | 
						|
  DAC960_PD_MailboxRegister3Offset =		0x03,
 | 
						|
  DAC960_PD_MailboxRegister4Offset =		0x04,
 | 
						|
  DAC960_PD_MailboxRegister5Offset =		0x05,
 | 
						|
  DAC960_PD_MailboxRegister6Offset =		0x06,
 | 
						|
  DAC960_PD_MailboxRegister7Offset =		0x07,
 | 
						|
  DAC960_PD_MailboxRegister8Offset =		0x08,
 | 
						|
  DAC960_PD_MailboxRegister9Offset =		0x09,
 | 
						|
  DAC960_PD_MailboxRegister10Offset =		0x0A,
 | 
						|
  DAC960_PD_MailboxRegister11Offset =		0x0B,
 | 
						|
  DAC960_PD_MailboxRegister12Offset =		0x0C,
 | 
						|
  DAC960_PD_StatusCommandIdentifierRegOffset =	0x0D,
 | 
						|
  DAC960_PD_StatusRegisterOffset =		0x0E,
 | 
						|
  DAC960_PD_ErrorStatusRegisterOffset =		0x3F,
 | 
						|
  DAC960_PD_InboundDoorBellRegisterOffset =	0x40,
 | 
						|
  DAC960_PD_OutboundDoorBellRegisterOffset =	0x41,
 | 
						|
  DAC960_PD_InterruptEnableRegisterOffset =	0x43
 | 
						|
}
 | 
						|
DAC960_PD_RegisterOffsets_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 PD Series Inbound Door Bell Register.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_PD_InboundDoorBellRegister
 | 
						|
{
 | 
						|
  unsigned char All;
 | 
						|
  struct {
 | 
						|
    bool NewCommand:1;					/* Bit 0 */
 | 
						|
    bool AcknowledgeStatus:1;				/* Bit 1 */
 | 
						|
    bool GenerateInterrupt:1;				/* Bit 2 */
 | 
						|
    bool ControllerReset:1;				/* Bit 3 */
 | 
						|
    unsigned char :4;					/* Bits 4-7 */
 | 
						|
  } Write;
 | 
						|
  struct {
 | 
						|
    bool MailboxFull:1;					/* Bit 0 */
 | 
						|
    bool InitializationInProgress:1;			/* Bit 1 */
 | 
						|
    unsigned char :6;					/* Bits 2-7 */
 | 
						|
  } Read;
 | 
						|
}
 | 
						|
DAC960_PD_InboundDoorBellRegister_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 PD Series Outbound Door Bell Register.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_PD_OutboundDoorBellRegister
 | 
						|
{
 | 
						|
  unsigned char All;
 | 
						|
  struct {
 | 
						|
    bool AcknowledgeInterrupt:1;			/* Bit 0 */
 | 
						|
    unsigned char :7;					/* Bits 1-7 */
 | 
						|
  } Write;
 | 
						|
  struct {
 | 
						|
    bool StatusAvailable:1;				/* Bit 0 */
 | 
						|
    unsigned char :7;					/* Bits 1-7 */
 | 
						|
  } Read;
 | 
						|
}
 | 
						|
DAC960_PD_OutboundDoorBellRegister_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 PD Series Interrupt Enable Register.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_PD_InterruptEnableRegister
 | 
						|
{
 | 
						|
  unsigned char All;
 | 
						|
  struct {
 | 
						|
    bool EnableInterrupts:1;				/* Bit 0 */
 | 
						|
    unsigned char :7;					/* Bits 1-7 */
 | 
						|
  } Bits;
 | 
						|
}
 | 
						|
DAC960_PD_InterruptEnableRegister_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define the structure of the DAC960 PD Series Error Status Register.
 | 
						|
*/
 | 
						|
 | 
						|
typedef union DAC960_PD_ErrorStatusRegister
 | 
						|
{
 | 
						|
  unsigned char All;
 | 
						|
  struct {
 | 
						|
    unsigned int :2;					/* Bits 0-1 */
 | 
						|
    bool ErrorStatusPending:1;				/* Bit 2 */
 | 
						|
    unsigned int :5;					/* Bits 3-7 */
 | 
						|
  } Bits;
 | 
						|
}
 | 
						|
DAC960_PD_ErrorStatusRegister_T;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define inline functions to provide an abstraction for reading and writing the
 | 
						|
  DAC960 PD Series Controller Interface Registers.
 | 
						|
*/
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PD_NewCommand(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PD_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.NewCommand = true;
 | 
						|
  writeb(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_PD_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PD_AcknowledgeStatus(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PD_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.AcknowledgeStatus = true;
 | 
						|
  writeb(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_PD_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PD_GenerateInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PD_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.GenerateInterrupt = true;
 | 
						|
  writeb(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_PD_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PD_ControllerReset(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PD_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All = 0;
 | 
						|
  InboundDoorBellRegister.Write.ControllerReset = true;
 | 
						|
  writeb(InboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_PD_InboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_PD_MailboxFullP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PD_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_PD_InboundDoorBellRegisterOffset);
 | 
						|
  return InboundDoorBellRegister.Read.MailboxFull;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_PD_InitializationInProgressP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PD_InboundDoorBellRegister_T InboundDoorBellRegister;
 | 
						|
  InboundDoorBellRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_PD_InboundDoorBellRegisterOffset);
 | 
						|
  return InboundDoorBellRegister.Read.InitializationInProgress;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PD_AcknowledgeInterrupt(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PD_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All = 0;
 | 
						|
  OutboundDoorBellRegister.Write.AcknowledgeInterrupt = true;
 | 
						|
  writeb(OutboundDoorBellRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_PD_OutboundDoorBellRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_PD_StatusAvailableP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PD_OutboundDoorBellRegister_T OutboundDoorBellRegister;
 | 
						|
  OutboundDoorBellRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_PD_OutboundDoorBellRegisterOffset);
 | 
						|
  return OutboundDoorBellRegister.Read.StatusAvailable;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PD_EnableInterrupts(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PD_InterruptEnableRegister_T InterruptEnableRegister;
 | 
						|
  InterruptEnableRegister.All = 0;
 | 
						|
  InterruptEnableRegister.Bits.EnableInterrupts = true;
 | 
						|
  writeb(InterruptEnableRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_PD_InterruptEnableRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PD_DisableInterrupts(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PD_InterruptEnableRegister_T InterruptEnableRegister;
 | 
						|
  InterruptEnableRegister.All = 0;
 | 
						|
  InterruptEnableRegister.Bits.EnableInterrupts = false;
 | 
						|
  writeb(InterruptEnableRegister.All,
 | 
						|
	 ControllerBaseAddress + DAC960_PD_InterruptEnableRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
bool DAC960_PD_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  DAC960_PD_InterruptEnableRegister_T InterruptEnableRegister;
 | 
						|
  InterruptEnableRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_PD_InterruptEnableRegisterOffset);
 | 
						|
  return InterruptEnableRegister.Bits.EnableInterrupts;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PD_WriteCommandMailbox(void __iomem *ControllerBaseAddress,
 | 
						|
				   DAC960_V1_CommandMailbox_T *CommandMailbox)
 | 
						|
{
 | 
						|
  writel(CommandMailbox->Words[0],
 | 
						|
	 ControllerBaseAddress + DAC960_PD_CommandOpcodeRegisterOffset);
 | 
						|
  writel(CommandMailbox->Words[1],
 | 
						|
	 ControllerBaseAddress + DAC960_PD_MailboxRegister4Offset);
 | 
						|
  writel(CommandMailbox->Words[2],
 | 
						|
	 ControllerBaseAddress + DAC960_PD_MailboxRegister8Offset);
 | 
						|
  writeb(CommandMailbox->Bytes[12],
 | 
						|
	 ControllerBaseAddress + DAC960_PD_MailboxRegister12Offset);
 | 
						|
}
 | 
						|
 | 
						|
static inline DAC960_V1_CommandIdentifier_T
 | 
						|
DAC960_PD_ReadStatusCommandIdentifier(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  return readb(ControllerBaseAddress
 | 
						|
	       + DAC960_PD_StatusCommandIdentifierRegOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline DAC960_V1_CommandStatus_T
 | 
						|
DAC960_PD_ReadStatusRegister(void __iomem *ControllerBaseAddress)
 | 
						|
{
 | 
						|
  return readw(ControllerBaseAddress + DAC960_PD_StatusRegisterOffset);
 | 
						|
}
 | 
						|
 | 
						|
static inline bool
 | 
						|
DAC960_PD_ReadErrorStatus(void __iomem *ControllerBaseAddress,
 | 
						|
			  unsigned char *ErrorStatus,
 | 
						|
			  unsigned char *Parameter0,
 | 
						|
			  unsigned char *Parameter1)
 | 
						|
{
 | 
						|
  DAC960_PD_ErrorStatusRegister_T ErrorStatusRegister;
 | 
						|
  ErrorStatusRegister.All =
 | 
						|
    readb(ControllerBaseAddress + DAC960_PD_ErrorStatusRegisterOffset);
 | 
						|
  if (!ErrorStatusRegister.Bits.ErrorStatusPending) return false;
 | 
						|
  ErrorStatusRegister.Bits.ErrorStatusPending = false;
 | 
						|
  *ErrorStatus = ErrorStatusRegister.All;
 | 
						|
  *Parameter0 =
 | 
						|
    readb(ControllerBaseAddress + DAC960_PD_CommandOpcodeRegisterOffset);
 | 
						|
  *Parameter1 =
 | 
						|
    readb(ControllerBaseAddress + DAC960_PD_CommandIdentifierRegisterOffset);
 | 
						|
  writeb(0, ControllerBaseAddress + DAC960_PD_ErrorStatusRegisterOffset);
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
static inline void DAC960_P_To_PD_TranslateEnquiry(void *Enquiry)
 | 
						|
{
 | 
						|
  memcpy(Enquiry + 132, Enquiry + 36, 64);
 | 
						|
  memset(Enquiry + 36, 0, 96);
 | 
						|
}
 | 
						|
 | 
						|
static inline void DAC960_P_To_PD_TranslateDeviceState(void *DeviceState)
 | 
						|
{
 | 
						|
  memcpy(DeviceState + 2, DeviceState + 3, 1);
 | 
						|
  memmove(DeviceState + 4, DeviceState + 5, 2);
 | 
						|
  memmove(DeviceState + 6, DeviceState + 8, 4);
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_PD_To_P_TranslateReadWriteCommand(DAC960_V1_CommandMailbox_T
 | 
						|
					      *CommandMailbox)
 | 
						|
{
 | 
						|
  int LogicalDriveNumber = CommandMailbox->Type5.LD.LogicalDriveNumber;
 | 
						|
  CommandMailbox->Bytes[3] &= 0x7;
 | 
						|
  CommandMailbox->Bytes[3] |= CommandMailbox->Bytes[7] << 6;
 | 
						|
  CommandMailbox->Bytes[7] = LogicalDriveNumber;
 | 
						|
}
 | 
						|
 | 
						|
static inline
 | 
						|
void DAC960_P_To_PD_TranslateReadWriteCommand(DAC960_V1_CommandMailbox_T
 | 
						|
					      *CommandMailbox)
 | 
						|
{
 | 
						|
  int LogicalDriveNumber = CommandMailbox->Bytes[7];
 | 
						|
  CommandMailbox->Bytes[7] = CommandMailbox->Bytes[3] >> 6;
 | 
						|
  CommandMailbox->Bytes[3] &= 0x7;
 | 
						|
  CommandMailbox->Bytes[3] |= LogicalDriveNumber << 3;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  Define prototypes for the forward referenced DAC960 Driver Internal Functions.
 | 
						|
*/
 | 
						|
 | 
						|
static void DAC960_FinalizeController(DAC960_Controller_T *);
 | 
						|
static void DAC960_V1_QueueReadWriteCommand(DAC960_Command_T *);
 | 
						|
static void DAC960_V2_QueueReadWriteCommand(DAC960_Command_T *); 
 | 
						|
static void DAC960_RequestFunction(struct request_queue *);
 | 
						|
static irqreturn_t DAC960_BA_InterruptHandler(int, void *);
 | 
						|
static irqreturn_t DAC960_LP_InterruptHandler(int, void *);
 | 
						|
static irqreturn_t DAC960_LA_InterruptHandler(int, void *);
 | 
						|
static irqreturn_t DAC960_PG_InterruptHandler(int, void *);
 | 
						|
static irqreturn_t DAC960_PD_InterruptHandler(int, void *);
 | 
						|
static irqreturn_t DAC960_P_InterruptHandler(int, void *);
 | 
						|
static void DAC960_V1_QueueMonitoringCommand(DAC960_Command_T *);
 | 
						|
static void DAC960_V2_QueueMonitoringCommand(DAC960_Command_T *);
 | 
						|
static void DAC960_MonitoringTimerFunction(unsigned long);
 | 
						|
static void DAC960_Message(DAC960_MessageLevel_T, unsigned char *,
 | 
						|
			   DAC960_Controller_T *, ...);
 | 
						|
static void DAC960_CreateProcEntries(DAC960_Controller_T *);
 | 
						|
static void DAC960_DestroyProcEntries(DAC960_Controller_T *);
 | 
						|
 | 
						|
#endif /* DAC960_DriverVersion */
 |