diff options
Diffstat (limited to 'drivers/scsi/hpsa_cmd.h')
| -rw-r--r-- | drivers/scsi/hpsa_cmd.h | 78 | 
1 files changed, 45 insertions, 33 deletions
| diff --git a/drivers/scsi/hpsa_cmd.h b/drivers/scsi/hpsa_cmd.h index d126bb877250..ba6a3aa8d954 100644 --- a/drivers/scsi/hpsa_cmd.h +++ b/drivers/scsi/hpsa_cmd.h @@ -20,6 +20,11 @@  #ifndef HPSA_CMD_H  #define HPSA_CMD_H +#include <linux/compiler.h> + +#include <linux/build_bug.h> /* static_assert */ +#include <linux/stddef.h> /* offsetof */ +  /* general boundary defintions */  #define SENSEINFOBYTES          32 /* may vary between hbas */  #define SG_ENTRIES_IN_CMD	32 /* Max SG entries excluding chain blocks */ @@ -200,12 +205,10 @@ union u64bit {  	MAX_EXT_TARGETS + 1) /* + 1 is for the controller itself */  /* SCSI-3 Commands */ -#pragma pack(1) -  #define HPSA_INQUIRY 0x12  struct InquiryData {  	u8 data_byte[36]; -}; +} __packed;  #define HPSA_REPORT_LOG 0xc2    /* Report Logical LUNs */  #define HPSA_REPORT_PHYS 0xc3   /* Report Physical LUNs */ @@ -221,7 +224,7 @@ struct raid_map_disk_data {  	u8    xor_mult[2];            /**< XOR multipliers for this position,  					*  valid for data disks only */  	u8    reserved[2]; -}; +} __packed;  struct raid_map_data {  	__le32   structure_size;	/* Size of entire structure in bytes */ @@ -247,14 +250,14 @@ struct raid_map_data {  	__le16   dekindex;		/* Data encryption key index. */  	u8    reserved[16];  	struct raid_map_disk_data data[RAID_MAP_MAX_ENTRIES]; -}; +} __packed;  struct ReportLUNdata {  	u8 LUNListLength[4];  	u8 extended_response_flag;  	u8 reserved[3];  	u8 LUN[HPSA_MAX_LUN][8]; -}; +} __packed;  struct ext_report_lun_entry {  	u8 lunid[8]; @@ -269,20 +272,20 @@ struct ext_report_lun_entry {  	u8 lun_count; /* multi-lun device, how many luns */  	u8 redundant_paths;  	u32 ioaccel_handle; /* ioaccel1 only uses lower 16 bits */ -}; +} __packed;  struct ReportExtendedLUNdata {  	u8 LUNListLength[4];  	u8 extended_response_flag;  	u8 reserved[3];  	struct ext_report_lun_entry LUN[HPSA_MAX_PHYS_LUN]; -}; +} __packed;  struct SenseSubsystem_info {  	u8 reserved[36];  	u8 portname[8];  	u8 reserved1[1108]; -}; +} __packed;  /* BMIC commands */  #define BMIC_READ 0x26 @@ -317,7 +320,7 @@ union SCSI3Addr {  		u8 Targ:6;  		u8 Mode:2;        /* b10 */  	} LogUnit; -}; +} __packed;  struct PhysDevAddr {  	u32             TargetId:24; @@ -325,20 +328,20 @@ struct PhysDevAddr {  	u32             Mode:2;  	/* 2 level target device addr */  	union SCSI3Addr  Target[2]; -}; +} __packed;  struct LogDevAddr {  	u32            VolId:30;  	u32            Mode:2;  	u8             reserved[4]; -}; +} __packed;  union LUNAddr {  	u8               LunAddrBytes[8];  	union SCSI3Addr    SCSI3Lun[4];  	struct PhysDevAddr PhysDev;  	struct LogDevAddr  LogDev; -}; +} __packed;  struct CommandListHeader {  	u8              ReplyQueue; @@ -346,7 +349,7 @@ struct CommandListHeader {  	__le16          SGTotal;  	__le64		tag;  	union LUNAddr     LUN; -}; +} __packed;  struct RequestBlock {  	u8   CDBLen; @@ -365,18 +368,18 @@ struct RequestBlock {  #define GET_DIR(tad) (((tad) >> 6) & 0x03)  	u16  Timeout;  	u8   CDB[16]; -}; +} __packed;  struct ErrDescriptor {  	__le64 Addr;  	__le32 Len; -}; +} __packed;  struct SGDescriptor {  	__le64 Addr;  	__le32 Len;  	__le32 Ext; -}; +} __packed;  union MoreErrInfo {  	struct { @@ -390,7 +393,8 @@ union MoreErrInfo {  		u8  offense_num;  /* byte # of offense 0-base */  		u32 offense_value;  	} Invalid_Cmd; -}; +} __packed; +  struct ErrorInfo {  	u8               ScsiStatus;  	u8               SenseLen; @@ -398,7 +402,7 @@ struct ErrorInfo {  	u32              ResidualCnt;  	union MoreErrInfo  MoreErrInfo;  	u8               SenseInfo[SENSEINFOBYTES]; -}; +} __packed;  /* Command types */  #define CMD_IOCTL_PEND  0x01  #define CMD_SCSI	0x03 @@ -453,6 +457,15 @@ struct CommandList {  	atomic_t refcount; /* Must be last to avoid memset in hpsa_cmd_init() */  } __aligned(COMMANDLIST_ALIGNMENT); +/* + * Make sure our embedded atomic variable is aligned. Otherwise we break atomic + * operations on architectures that don't support unaligned atomics like IA64. + * + * The assert guards against reintroductin against unwanted __packed to + * the struct CommandList. + */ +static_assert(offsetof(struct CommandList, refcount) % __alignof__(atomic_t) == 0); +  /* Max S/G elements in I/O accelerator command */  #define IOACCEL1_MAXSGENTRIES           24  #define IOACCEL2_MAXSGENTRIES		28 @@ -489,7 +502,7 @@ struct io_accel1_cmd {  	__le64 host_addr;		/* 0x70 - 0x77 */  	u8  CISS_LUN[8];		/* 0x78 - 0x7F */  	struct SGDescriptor SG[IOACCEL1_MAXSGENTRIES]; -} __aligned(IOACCEL1_COMMANDLIST_ALIGNMENT); +} __packed __aligned(IOACCEL1_COMMANDLIST_ALIGNMENT);  #define IOACCEL1_FUNCTION_SCSIIO        0x00  #define IOACCEL1_SGLOFFSET              32 @@ -519,7 +532,7 @@ struct ioaccel2_sg_element {  	u8 chain_indicator;  #define IOACCEL2_CHAIN 0x80  #define IOACCEL2_LAST_SG 0x40 -}; +} __packed;  /*   * SCSI Response Format structure for IO Accelerator Mode 2 @@ -559,7 +572,7 @@ struct io_accel2_scsi_response {  	u8 sense_data_len;		/* sense/response data length */  	u8 resid_cnt[4];		/* residual count */  	u8 sense_data_buff[32];		/* sense/response data buffer */ -}; +} __packed;  /*   * Structure for I/O accelerator (mode 2 or m2) commands. @@ -592,7 +605,7 @@ struct io_accel2_cmd {  	__le32 tweak_upper;		/* Encryption tweak, upper 4 bytes */  	struct ioaccel2_sg_element sg[IOACCEL2_MAXSGENTRIES];  	struct io_accel2_scsi_response error_data; -} __aligned(IOACCEL2_COMMANDLIST_ALIGNMENT); +} __packed __aligned(IOACCEL2_COMMANDLIST_ALIGNMENT);  /*   * defines for Mode 2 command struct @@ -618,7 +631,7 @@ struct hpsa_tmf_struct {  	__le64 abort_tag;	/* cciss tag of SCSI cmd or TMF to abort */  	__le64 error_ptr;		/* Error Pointer */  	__le32 error_len;		/* Error Length */ -} __aligned(IOACCEL2_COMMANDLIST_ALIGNMENT); +} __packed __aligned(IOACCEL2_COMMANDLIST_ALIGNMENT);  /* Configuration Table Structure */  struct HostWrite { @@ -626,7 +639,7 @@ struct HostWrite {  	__le32		command_pool_addr_hi;  	__le32		CoalIntDelay;  	__le32		CoalIntCount; -}; +} __packed;  #define SIMPLE_MODE     0x02  #define PERFORMANT_MODE 0x04 @@ -675,7 +688,7 @@ struct CfgTable {  #define		HPSA_EVENT_NOTIFY_ACCEL_IO_PATH_STATE_CHANGE (1 << 30)  #define		HPSA_EVENT_NOTIFY_ACCEL_IO_PATH_CONFIG_CHANGE (1 << 31)  	__le32		clear_event_notify; -}; +} __packed;  #define NUM_BLOCKFETCH_ENTRIES 8  struct TransTable_struct { @@ -686,14 +699,14 @@ struct TransTable_struct {  	__le32		RepQCtrAddrHigh32;  #define MAX_REPLY_QUEUES 64  	struct vals32  RepQAddr[MAX_REPLY_QUEUES]; -}; +} __packed;  struct hpsa_pci_info {  	unsigned char	bus;  	unsigned char	dev_fn;  	unsigned short	domain;  	u32		board_id; -}; +} __packed;  struct bmic_identify_controller {  	u8	configured_logical_drive_count;	/* offset 0 */ @@ -702,7 +715,7 @@ struct bmic_identify_controller {  	u8	pad2[136];  	u8	controller_mode;	/* offset 292 */  	u8	pad3[32]; -}; +} __packed;  struct bmic_identify_physical_device { @@ -845,7 +858,7 @@ struct bmic_identify_physical_device {  	u8     max_link_rate[256];  	u8     neg_phys_link_rate[256];  	u8     box_conn_name[8]; -} __attribute((aligned(512))); +} __packed __attribute((aligned(512)));  struct bmic_sense_subsystem_info {  	u8	primary_slot_number; @@ -858,7 +871,7 @@ struct bmic_sense_subsystem_info {  	u8	secondary_array_serial_number[32];  	u8	secondary_cache_serial_number[32];  	u8	pad[332]; -}; +} __packed;  struct bmic_sense_storage_box_params {  	u8	reserved[36]; @@ -870,7 +883,6 @@ struct bmic_sense_storage_box_params {  	u8	reserver_3[84];  	u8	phys_connector[2];  	u8	reserved_4[296]; -}; +} __packed; -#pragma pack()  #endif /* HPSA_CMD_H */ |