diff options
Diffstat (limited to 'drivers/scsi/hpsa_cmd.h')
| -rw-r--r-- | drivers/scsi/hpsa_cmd.h | 204 | 
1 files changed, 126 insertions, 78 deletions
diff --git a/drivers/scsi/hpsa_cmd.h b/drivers/scsi/hpsa_cmd.h index 12d71387ed9..3e0abdf7668 100644 --- a/drivers/scsi/hpsa_cmd.h +++ b/drivers/scsi/hpsa_cmd.h @@ -101,19 +101,20 @@  #define CFGTBL_AccCmds          0x00000001l  #define CFGTBL_Trans_Simple     0x00000002l +#define CFGTBL_Trans_Performant 0x00000004l  #define CFGTBL_BusType_Ultra2   0x00000001l  #define CFGTBL_BusType_Ultra3   0x00000002l  #define CFGTBL_BusType_Fibre1G  0x00000100l  #define CFGTBL_BusType_Fibre2G  0x00000200l  struct vals32 { -	__u32   lower; -	__u32   upper; +	u32   lower; +	u32   upper;  };  union u64bit {  	struct vals32 val32; -	__u64 val; +	u64 val;  };  /* FIXME this is a per controller value (barf!) */ @@ -126,34 +127,34 @@ union u64bit {  #define HPSA_INQUIRY 0x12  struct InquiryData { -	__u8 data_byte[36]; +	u8 data_byte[36];  };  #define HPSA_REPORT_LOG 0xc2    /* Report Logical LUNs */  #define HPSA_REPORT_PHYS 0xc3   /* Report Physical LUNs */  struct ReportLUNdata { -	__u8 LUNListLength[4]; -	__u32 reserved; -	__u8 LUN[HPSA_MAX_LUN][8]; +	u8 LUNListLength[4]; +	u32 reserved; +	u8 LUN[HPSA_MAX_LUN][8];  };  struct ReportExtendedLUNdata { -	__u8 LUNListLength[4]; -	__u8 extended_response_flag; -	__u8 reserved[3]; -	__u8 LUN[HPSA_MAX_LUN][24]; +	u8 LUNListLength[4]; +	u8 extended_response_flag; +	u8 reserved[3]; +	u8 LUN[HPSA_MAX_LUN][24];  };  struct SenseSubsystem_info { -	__u8 reserved[36]; -	__u8 portname[8]; -	__u8 reserved1[1108]; +	u8 reserved[36]; +	u8 portname[8]; +	u8 reserved1[1108];  };  #define HPSA_READ_CAPACITY 0x25 /* Read Capacity */  struct ReadCapdata { -	__u8 total_size[4];	/* Total size in blocks */ -	__u8 block_size[4];	/* Size of blocks in bytes */ +	u8 total_size[4];	/* Total size in blocks */ +	u8 block_size[4];	/* Size of blocks in bytes */  };  #if 0 @@ -174,112 +175,131 @@ struct ReadCapdata {  /* Command List Structure */  union SCSI3Addr {  	struct { -		__u8 Dev; -		__u8 Bus:6; -		__u8 Mode:2;        /* b00 */ +		u8 Dev; +		u8 Bus:6; +		u8 Mode:2;        /* b00 */  	} PeripDev;  	struct { -		__u8 DevLSB; -		__u8 DevMSB:6; -		__u8 Mode:2;        /* b01 */ +		u8 DevLSB; +		u8 DevMSB:6; +		u8 Mode:2;        /* b01 */  	} LogDev;  	struct { -		__u8 Dev:5; -		__u8 Bus:3; -		__u8 Targ:6; -		__u8 Mode:2;        /* b10 */ +		u8 Dev:5; +		u8 Bus:3; +		u8 Targ:6; +		u8 Mode:2;        /* b10 */  	} LogUnit;  };  struct PhysDevAddr { -	__u32             TargetId:24; -	__u32             Bus:6; -	__u32             Mode:2; +	u32             TargetId:24; +	u32             Bus:6; +	u32             Mode:2;  	/* 2 level target device addr */  	union SCSI3Addr  Target[2];  };  struct LogDevAddr { -	__u32            VolId:30; -	__u32            Mode:2; -	__u8             reserved[4]; +	u32            VolId:30; +	u32            Mode:2; +	u8             reserved[4];  };  union LUNAddr { -	__u8               LunAddrBytes[8]; +	u8               LunAddrBytes[8];  	union SCSI3Addr    SCSI3Lun[4];  	struct PhysDevAddr PhysDev;  	struct LogDevAddr  LogDev;  };  struct CommandListHeader { -	__u8              ReplyQueue; -	__u8              SGList; -	__u16             SGTotal; +	u8              ReplyQueue; +	u8              SGList; +	u16             SGTotal;  	struct vals32     Tag;  	union LUNAddr     LUN;  };  struct RequestBlock { -	__u8   CDBLen; +	u8   CDBLen;  	struct { -		__u8 Type:3; -		__u8 Attribute:3; -		__u8 Direction:2; +		u8 Type:3; +		u8 Attribute:3; +		u8 Direction:2;  	} Type; -	__u16  Timeout; -	__u8   CDB[16]; +	u16  Timeout; +	u8   CDB[16];  };  struct ErrDescriptor {  	struct vals32 Addr; -	__u32  Len; +	u32  Len;  };  struct SGDescriptor {  	struct vals32 Addr; -	__u32  Len; -	__u32  Ext; +	u32  Len; +	u32  Ext;  };  union MoreErrInfo {  	struct { -		__u8  Reserved[3]; -		__u8  Type; -		__u32 ErrorInfo; +		u8  Reserved[3]; +		u8  Type; +		u32 ErrorInfo;  	} Common_Info;  	struct { -		__u8  Reserved[2]; -		__u8  offense_size; /* size of offending entry */ -		__u8  offense_num;  /* byte # of offense 0-base */ -		__u32 offense_value; +		u8  Reserved[2]; +		u8  offense_size; /* size of offending entry */ +		u8  offense_num;  /* byte # of offense 0-base */ +		u32 offense_value;  	} Invalid_Cmd;  };  struct ErrorInfo { -	__u8               ScsiStatus; -	__u8               SenseLen; -	__u16              CommandStatus; -	__u32              ResidualCnt; +	u8               ScsiStatus; +	u8               SenseLen; +	u16              CommandStatus; +	u32              ResidualCnt;  	union MoreErrInfo  MoreErrInfo; -	__u8               SenseInfo[SENSEINFOBYTES]; +	u8               SenseInfo[SENSEINFOBYTES];  };  /* Command types */  #define CMD_IOCTL_PEND  0x01  #define CMD_SCSI	0x03 +/* This structure needs to be divisible by 32 for new + * indexing method and performant mode. + */ +#define PAD32 32 +#define PAD64DIFF 0 +#define USEEXTRA ((sizeof(void *) - 4)/4) +#define PADSIZE (PAD32 + PAD64DIFF * USEEXTRA) + +#define DIRECT_LOOKUP_SHIFT 5 +#define DIRECT_LOOKUP_BIT 0x10 + +#define HPSA_ERROR_BIT          0x02  struct ctlr_info; /* defined in hpsa.h */ -/* The size of this structure needs to be divisible by 8 - * od on all architectures, because the controller uses 2 - * lower bits of the address, and the driver uses 1 lower - * bit (3 bits total.) +/* The size of this structure needs to be divisible by 32 + * on all architectures because low 5 bits of the addresses + * are used as follows: + * + * bit 0: to device, used to indicate "performant mode" command + *        from device, indidcates error status. + * bit 1-3: to device, indicates block fetch table entry for + *          reducing DMA in fetching commands from host memory. + * bit 4: used to indicate whether tag is "direct lookup" (index), + *        or a bus address.   */ +  struct CommandList {  	struct CommandListHeader Header;  	struct RequestBlock      Request;  	struct ErrDescriptor     ErrDesc;  	struct SGDescriptor      SG[MAXSGENTRIES];  	/* information associated with the command */ -	__u32			   busaddr; /* physical addr of this record */ +	u32			   busaddr; /* physical addr of this record */  	struct ErrorInfo *err_info; /* pointer to the allocated mem */  	struct ctlr_info	   *h;  	int			   cmd_type; @@ -291,35 +311,63 @@ struct CommandList {  	struct completion *waiting;  	int	 retry_count;  	void   *scsi_cmd; + +/* on 64 bit architectures, to get this to be 32-byte-aligned + * it so happens we need no padding, on 32 bit systems, + * we need 8 bytes of padding.   This does that. + */ +#define COMMANDLIST_PAD ((8 - sizeof(long))/4 * 8) +	u8 pad[COMMANDLIST_PAD]; +  };  /* Configuration Table Structure */  struct HostWrite { -	__u32 TransportRequest; -	__u32 Reserved; -	__u32 CoalIntDelay; -	__u32 CoalIntCount; +	u32 TransportRequest; +	u32 Reserved; +	u32 CoalIntDelay; +	u32 CoalIntCount;  }; +#define SIMPLE_MODE     0x02 +#define PERFORMANT_MODE 0x04 +#define MEMQ_MODE       0x08 +  struct CfgTable { -	__u8             Signature[4]; -	__u32            SpecValence; -	__u32            TransportSupport; -	__u32            TransportActive; -	struct HostWrite HostWrite; -	__u32            CmdsOutMax; -	__u32            BusTypes; -	__u32            Reserved; -	__u8             ServerName[16]; -	__u32            HeartBeat; -	__u32            SCSI_Prefetch; +	u8            Signature[4]; +	u32		SpecValence; +	u32           TransportSupport; +	u32           TransportActive; +	struct 		HostWrite HostWrite; +	u32           CmdsOutMax; +	u32           BusTypes; +	u32           TransMethodOffset; +	u8            ServerName[16]; +	u32           HeartBeat; +	u32           SCSI_Prefetch; +	u32	 	MaxScatterGatherElements; +	u32		MaxLogicalUnits; +	u32		MaxPhysicalDevices; +	u32		MaxPhysicalDrivesPerLogicalUnit; +	u32		MaxPerformantModeCommands; +}; + +#define NUM_BLOCKFETCH_ENTRIES 8 +struct TransTable_struct { +	u32            BlockFetch[NUM_BLOCKFETCH_ENTRIES]; +	u32            RepQSize; +	u32            RepQCount; +	u32            RepQCtrAddrLow32; +	u32            RepQCtrAddrHigh32; +	u32            RepQAddr0Low32; +	u32            RepQAddr0High32;  };  struct hpsa_pci_info {  	unsigned char	bus;  	unsigned char	dev_fn;  	unsigned short	domain; -	__u32		board_id; +	u32		board_id;  };  #pragma pack()  |