All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeff Garzik <jgarzik@pobox.com>
To: Adam Radford <aradford@amcc.com>
Cc: akpm@osdl.org, james.bottomley@steeleye.com, hch@lst.de,
	linux-scsi@vger.kernel.org
Subject: Re: [PATCH/RFC 2/2] 3ware 9000 SATA-RAID driver v2.26.00.009
Date: Wed, 26 May 2004 17:16:33 -0400	[thread overview]
Message-ID: <40B50931.6050002@pobox.com> (raw)
In-Reply-To: <HYC9VV01.E0R@hadar.amcc.com>

Adam Radford wrote:
> +/* Command Packet */
> +typedef struct TW_Command {
> +	/* First DWORD */
> +	struct {
> +		unsigned char opcode:5;
> +		unsigned char sgl_offset:3;
> +	} byte0_offset;
> +	unsigned char size;
> +	unsigned char request_id;
> +	struct {
> +		unsigned char unit:4;
> +		unsigned char host_id:4;
> +	} byte3_offset;
> +	/* Second DWORD */
> +	unsigned char status;
> +	unsigned char flags;
> +	union {
> +		unsigned short block_count;
> +		unsigned short parameter_count;
> +	} byte6_offset;
> +	union {
> +		struct {
> +			u32 lba;
> +			TW_SG_Entry sgl[TW_ESCALADE_MAX_SGL_LENGTH];
> +#if BITS_PER_LONG > 32
> +			u32 padding[2];	/* pad to 512 bytes */
> +#else
> +			u32 padding;
> +#endif
> +		} io;
> +		struct {
> +			TW_SG_Entry sgl[TW_ESCALADE_MAX_SGL_LENGTH];
> +#if BITS_PER_LONG > 32
> +			u32 padding[3];
> +#else
> +			u32 padding[2];
> +#endif
> +		} param;
> +	} byte8_offset;
> +} TW_Command;

Bitfields aren't portable to big endian machines...  grep for 
__LITTLE_ENDIAN_BITFIELD and __BIG_ENDIAN_BITFIELD for examples.


> +/* Scatter gather element for 9000+ controllers */
> +typedef struct TAG_TW_SG_Apache {
> +	unsigned long address;
> +	u32 length;
> +} TW_SG_Apache;

is this a hardware structure?

This structure changes size and padding on 32-bit versus 64-bit machines.


> +/* Command Packet for 9000+ controllers */
> +typedef struct TAG_TW_Command_Apache {
> +	struct {
> +		unsigned char opcode:5;
> +		unsigned char reserved:3;
> +	} command;
> +	unsigned char unit;
> +	unsigned short request_id;
> +	unsigned char status;
> +	unsigned char sgl_offset;
> +	unsigned short sgl_entries;
> +	unsigned char cdb[16];
> +	TW_SG_Apache sg_list[TW_APACHE_MAX_SGL_LENGTH];
> +#if BITS_PER_LONG > 32
> +	unsigned char padding[8];
> +#endif
> +} TW_Command_Apache;

ditto bitfield comment.


> +/* New command packet header */
> +typedef struct TAG_TW_Command_Apache_Header {
> +	unsigned char sense_data[TW_SENSE_DATA_LENGTH];
> +	struct {
> +		char reserved[4];
> +		unsigned short error;
> +		unsigned char padding;
> +		struct {
> +			unsigned char severity:3;
> +			unsigned char reserved:5;
> +		} substatus_block;
> +	} status_block;
> +	unsigned char err_specific_desc[98];
> +	struct {
> +		unsigned char size_header;
> +		unsigned short reserved;
> +		unsigned char size_sense;
> +	} header_desc;
> +} TW_Command_Apache_Header;

bitfield


> +/* This struct is a union of the 2 command packets */
> +typedef struct TAG_TW_Command_Full {
> +	TW_Command_Apache_Header header;
> +	union {
> +		TW_Command oldcommand;
> +		TW_Command_Apache newcommand;
> +	} command;
> +} TW_Command_Full;
> +
> +/* Initconnection structure */
> +typedef struct TAG_TW_Initconnect {
> +	unsigned char opcode:5;
> +	unsigned char res1:3;
> +	unsigned char size;
> +	unsigned char request_id;
> +	unsigned char res2;
> +	unsigned char status;
> +	unsigned char flags;
> +	unsigned short message_credits;
> +	u32 features;
> +	unsigned short fw_srl;
> +	unsigned short fw_arch_id;
> +	unsigned short fw_branch;
> +	unsigned short fw_build;
> +	u32 result;
> +} TW_Initconnect;

ditto


> +/* Event info structure */
> +typedef struct TAG_TW_Event
> +{
> +	unsigned int sequence_id;
> +	unsigned int time_stamp_sec;
> +	unsigned short aen_code;
> +	unsigned char severity;
> +	unsigned char retrieved;
> +	unsigned char repeat_count;
> +	unsigned char parameter_len;
> +	unsigned char parameter_data[98];
> +} TW_Event;
> +
> +typedef struct TAG_TW_Ioctl_Driver_Command {
> +	unsigned int control_code;
> +	unsigned int status;
> +	unsigned int unique_id;
> +	unsigned int sequence_id;
> +	unsigned int os_specific;
> +	unsigned int buffer_length;
> +} TW_Ioctl_Driver_Command;
> +
> +typedef struct TAG_TW_Ioctl_Apache {
> +	TW_Ioctl_Driver_Command driver_command;
> +        char padding[488];
> +	TW_Command_Full firmware_command;
> +	char data_buffer[1];
> +} TW_Ioctl_Buf_Apache;
> +
> +/* Lock structure for ioctl get/release lock */
> +typedef struct TAG_TW_Lock {
> +	unsigned long timeout_msec;
> +	unsigned long time_remaining_msec;
> +	unsigned long force_flag;
> +} TW_Lock;
> +
> +/* GetParam descriptor */
> +typedef struct {
> +	unsigned short	table_id;
> +	unsigned short	parameter_id;
> +	unsigned short	parameter_size_bytes;
> +	unsigned short  actual_parameter_size_bytes;
> +	unsigned char	data[1];
> +} TW_Param_Apache, *PTW_Param_Apache;
> +
> +/* Response queue */
> +typedef union TAG_TW_Response_Queue {
> +	struct {
> +		u32 undefined_1: 4;
> +		u32 response_id: 8;
> +		u32 undefined_2: 20;
> +	} u;
> +	u32 value;
> +} TW_Response_Queue;

ditto


> +typedef struct TAG_TW_Info {
> +	char *buffer;
> +	int length;
> +	int offset;
> +	int position;
> +} TW_Info;
> +
> +/* Compatibility information structure */
> +typedef struct TAG_TW_Compatibility_Info
> +{
> +	char driver_version[32];
> +	unsigned short working_srl;
> +	unsigned short working_branch;
> +	unsigned short working_build;
> +} TW_Compatibility_Info;
> +
> +/* Command header for ATA pass-thru */
> +typedef struct TAG_TW_Passthru
> +{
> +	struct {
> +		unsigned char opcode:5;
> +		unsigned char sgloff:3;
> +	} byte0;
> +	unsigned char size;
> +	unsigned char request_id;
> +	struct {
> +		unsigned char aport:4;
> +		unsigned char host_id:4;
> +	} byte3;
> +	unsigned char status;
> +	unsigned char flags;
> +	unsigned short param;
> +	unsigned short features;
> +	unsigned short sector_count;
> +	unsigned short sector_num;
> +	unsigned short cylinder_lo;
> +	unsigned short cylinder_hi;
> +	unsigned char drive_head;
> +	unsigned char command;
> +	TW_SG_Entry sg_list[TW_ATA_PASS_SGL_MAX];
> +	unsigned char padding[12];
> +} TW_Passthru;

ditto


> +typedef struct TAG_TW_Device_Extension {
> +	u32                     *base_addr;
> +	unsigned long	       	*generic_buffer_virt[TW_Q_LENGTH];
> +	unsigned long	       	generic_buffer_phys[TW_Q_LENGTH];
> +	unsigned long	       	*command_packet_virt[TW_Q_LENGTH];
> +	unsigned long		command_packet_phys[TW_Q_LENGTH];
> +	struct pci_dev		*tw_pci_dev;
> +	struct scsi_cmnd	*srb[TW_Q_LENGTH];
> +	unsigned char		free_queue[TW_Q_LENGTH];
> +	unsigned char		free_head;
> +	unsigned char		free_tail;
> +	unsigned char		pending_queue[TW_Q_LENGTH];
> +	unsigned char		pending_head;
> +	unsigned char		pending_tail;
> +	int     		state[TW_Q_LENGTH];
> +	unsigned int		posted_request_count;
> +	unsigned int		max_posted_request_count;
> +	unsigned int	        pending_request_count;
> +	unsigned int		max_pending_request_count;
> +	unsigned int		max_sgl_entries;
> +	unsigned int		sgl_entries;
> +	unsigned int		num_aborts;
> +	unsigned int		num_resets;
> +	unsigned int		sector_count;
> +	unsigned int		max_sector_count;
> +	unsigned int		aen_count;
> +	struct Scsi_Host	*host;
> +	long			flags;
> +	int			reset_print;
> +	TW_Event                *event_queue[TW_Q_LENGTH];
> +	unsigned char           error_index;
> +	unsigned char		event_queue_wrapped;
> +	unsigned int            error_sequence_id;
> +	int                     ioctl_sem_lock;
> +	u32                     ioctl_msec;
> +	int			chrdev_request_id;
> +	wait_queue_head_t	ioctl_wqueue;
> +	struct semaphore	ioctl_sem;
> +	char			aen_clobber;
> +	unsigned short		working_srl;
> +	unsigned short		working_branch;
> +	unsigned short		working_build;
> +} TW_Device_Extension;
> +
> +#pragma pack()
> +
> +#endif /* _3W_9XXX_H */


General comment:  bitfields are annoying.  Even if you do apply the 
__BIG_ENDIAN_BITFIELD switching, the compiler still generates crappy 
code for bitfields (as do all compilers).

You'll find that using bitmasks on natural integers often results in 
_much_ better generated code out of the compiler.

	Jeff



      reply	other threads:[~2004-05-26 21:16 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-05-26 20:49 [PATCH/RFC 2/2] 3ware 9000 SATA-RAID driver v2.26.00.009 Adam Radford
2004-05-26 21:16 ` Jeff Garzik [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=40B50931.6050002@pobox.com \
    --to=jgarzik@pobox.com \
    --cc=akpm@osdl.org \
    --cc=aradford@amcc.com \
    --cc=hch@lst.de \
    --cc=james.bottomley@steeleye.com \
    --cc=linux-scsi@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.