Commit 56b58712 authored by Mark Haverkamp 's avatar Mark Haverkamp Committed by James Bottomley
Browse files

[SCSI] aacraid: remove sparse warnings



This patch addresses the sparse -Wbitwise warnings that Christoph wanted
me to eliminate.  This mostly consisted of making data structure
elements of hardware associated structures the __le* equivalent.
Although there were a couple places where there was mixing of cpu and le
variable math.  These changes have been tested on both an x86 and ppc
machine running bonnie++.  The usage of the LE32_ALL_ONES macro has been
eliminated.

Signed-off-by: default avatarMark Haverkamp <markh@osdl.org>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 1c2fb3f3
Loading
Loading
Loading
Loading
+13 −10
Original line number Diff line number Diff line
@@ -1893,7 +1893,9 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
		}
		/* hba wants the size to be exact */
		if(byte_count > scsicmd->request_bufflen){
			psg->sg[i-1].count -= (byte_count - scsicmd->request_bufflen);
			u32 temp = le32_to_cpu(psg->sg[i-1].count) - 
				(byte_count - scsicmd->request_bufflen);
			psg->sg[i-1].count = cpu_to_le32(temp);
			byte_count = scsicmd->request_bufflen;
		}
		/* Check for command underflow */
@@ -1922,7 +1924,7 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
{
	struct aac_dev *dev;
	unsigned long byte_count = 0;
	u64 le_addr;
	u64 addr;

	dev = (struct aac_dev *)scsicmd->device->host->hostdata;
	// Get rid of old data
@@ -1943,16 +1945,18 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
		byte_count = 0;

		for (i = 0; i < sg_count; i++) {
			le_addr = cpu_to_le64(sg_dma_address(sg));
			psg->sg[i].addr[1] = (u32)(le_addr>>32);
			psg->sg[i].addr[0] = (u32)(le_addr & 0xffffffff);
			addr = sg_dma_address(sg);
			psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff);
			psg->sg[i].addr[1] = cpu_to_le32(addr>>32);
			psg->sg[i].count = cpu_to_le32(sg_dma_len(sg));
			byte_count += sg_dma_len(sg);
			sg++;
		}
		/* hba wants the size to be exact */
		if(byte_count > scsicmd->request_bufflen){
			psg->sg[i-1].count -= (byte_count - scsicmd->request_bufflen);
			u32 temp = le32_to_cpu(psg->sg[i-1].count) - 
				(byte_count - scsicmd->request_bufflen);
			psg->sg[i-1].count = cpu_to_le32(temp);
			byte_count = scsicmd->request_bufflen;
		}
		/* Check for command underflow */
@@ -1962,15 +1966,14 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
		}
	}
	else if(scsicmd->request_bufflen) {
		dma_addr_t addr; 
		u64 addr; 
		addr = pci_map_single(dev->pdev,
				scsicmd->request_buffer,
				scsicmd->request_bufflen,
				scsicmd->sc_data_direction);
		psg->count = cpu_to_le32(1);
		le_addr = cpu_to_le64(addr);
		psg->sg[0].addr[1] = (u32)(le_addr>>32);
		psg->sg[0].addr[0] = (u32)(le_addr & 0xffffffff);
		psg->sg[0].addr[0] = cpu_to_le32(addr & 0xffffffff);
		psg->sg[0].addr[1] = cpu_to_le32(addr >> 32);
		psg->sg[0].count = cpu_to_le32(scsicmd->request_bufflen);  
		scsicmd->SCp.dma_handle = addr;
		byte_count = scsicmd->request_bufflen;
+222 −175
Original line number Diff line number Diff line
@@ -89,11 +89,21 @@ struct diskparm
 *	on 64 bit systems not all cards support the 64 bit version
 */
struct sgentry {
	__le32	addr;	/* 32-bit address. */
	__le32	count;	/* Length. */
};

struct user_sgentry {
	u32	addr;	/* 32-bit address. */
	u32	count;	/* Length. */
};

struct sgentry64 {
	__le32	addr[2];	/* 64-bit addr. 2 pieces for data alignment */
	__le32	count;	/* Length. */
};

struct user_sgentry64 {
	u32	addr[2];	/* 64-bit addr. 2 pieces for data alignment */
	u32	count;	/* Length. */
};
@@ -106,15 +116,25 @@ struct sgentry64 {
 */

struct sgmap {
	u32		count;
	__le32		count;
	struct sgentry	sg[1]; 
};

struct sgmap64 {
struct user_sgmap {
	u32		count;
	struct user_sgentry	sg[1]; 
};

struct sgmap64 {
	__le32		count;
	struct sgentry64 sg[1];
};

struct user_sgmap64 {
	u32		count;
	struct user_sgentry64 sg[1];
};

struct creation_info
{
	u8 		buildnum;		/* e.g., 588 */
@@ -123,14 +143,14 @@ struct creation_info
						 * 	 2 = API
						 */
	u8	 	year;		 	/* e.g., 1997 = 97 */
	u32		date;			/*
	__le32		date;			/*
						 * unsigned 	Month		:4;	// 1 - 12
						 * unsigned 	Day		:6;	// 1 - 32
						 * unsigned 	Hour		:6;	// 0 - 23
						 * unsigned 	Minute		:6;	// 0 - 60
						 * unsigned 	Second		:6;	// 0 - 60
						 */
	u32		serial[2];			/* e.g., 0x1DEADB0BFAFAF001 */
	__le32		serial[2];			/* e.g., 0x1DEADB0BFAFAF001 */
};


@@ -175,8 +195,8 @@ struct creation_info
 */

struct aac_entry {
	u32 size;          /* Size in bytes of Fib which this QE points to */
	u32 addr; /* Receiver address of the FIB */
	__le32 size; /* Size in bytes of Fib which this QE points to */
	__le32 addr; /* Receiver address of the FIB */
};

/*
@@ -185,9 +205,10 @@ struct aac_entry {
 */
 
struct aac_qhdr {
	u64 header_addr;		/* Address to hand the adapter to access to this queue head */
	u32 *producer;			/* The producer index for this queue (host address) */
	u32 *consumer;			/* The consumer index for this queue (host address) */
	__le64 header_addr;/* Address to hand the adapter to access 
			      to this queue head */
	__le32 *producer; /* The producer index for this queue (host address) */
	__le32 *consumer; /* The consumer index for this queue (host address) */
};

/*
@@ -261,19 +282,23 @@ enum aac_queue_types {
 */

struct aac_fibhdr {
	u32 XferState;			// Current transfer state for this CCB
	u16 Command;			// Routing information for the destination
	u8 StructType;			// Type FIB
	u8 Flags;			// Flags for FIB
	u16 Size;			// Size of this FIB in bytes
	u16 SenderSize;			// Size of the FIB in the sender (for response sizing)
	u32 SenderFibAddress;		// Host defined data in the FIB
	u32 ReceiverFibAddress;		// Logical address of this FIB for the adapter
	u32 SenderData;			// Place holder for the sender to store data
	__le32 XferState;	/* Current transfer state for this CCB */
	__le16 Command;		/* Routing information for the destination */
	u8 StructType;		/* Type FIB */
	u8 Flags;		/* Flags for FIB */
	__le16 Size;		/* Size of this FIB in bytes */
	__le16 SenderSize;	/* Size of the FIB in the sender 
				   (for response sizing) */
	__le32 SenderFibAddress;  /* Host defined data in the FIB */
	__le32 ReceiverFibAddress;/* Logical address of this FIB for 
				     the adapter */
	u32 SenderData;		/* Place holder for the sender to store data */
	union {
		struct {
		    u32 _ReceiverTimeStart; 	// Timestamp for receipt of fib
		    u32 _ReceiverTimeDone;	// Timestamp for completion of fib
		    __le32 _ReceiverTimeStart; 	/* Timestamp for 
						   receipt of fib */
		    __le32 _ReceiverTimeDone;	/* Timestamp for 
						   completion of fib */
		} _s;
	} _u;
};
@@ -385,19 +410,20 @@ enum fib_xfer_state {

struct aac_init
{
	u32	InitStructRevision;
	u32	MiniPortRevision;
	u32	fsrev;
	u32	CommHeaderAddress;
	u32	FastIoCommAreaAddress;
	u32	AdapterFibsPhysicalAddress;
	u32	AdapterFibsVirtualAddress;
	u32	AdapterFibsSize;
	u32	AdapterFibAlign;
	u32	printfbuf;
	u32	printfbufsiz;
	u32	HostPhysMemPages;		// number of 4k pages of host physical memory
	u32	HostElapsedSeconds;		// number of seconds since 1970.
	__le32	InitStructRevision;
	__le32	MiniPortRevision;
	__le32	fsrev;
	__le32	CommHeaderAddress;
	__le32	FastIoCommAreaAddress;
	__le32	AdapterFibsPhysicalAddress;
	__le32	AdapterFibsVirtualAddress;
	__le32	AdapterFibsSize;
	__le32	AdapterFibAlign;
	__le32	printfbuf;
	__le32	printfbufsiz;
	__le32	HostPhysMemPages;   /* number of 4k pages of host 
				       physical memory */
	__le32	HostElapsedSeconds; /* number of seconds since 1970. */
};

enum aac_log_level {
@@ -763,27 +789,27 @@ struct fib {
 
struct aac_adapter_info
{
	u32	platform;
	u32	cpu;
	u32	subcpu;
	u32	clock;
	u32	execmem;
	u32	buffermem;
	u32	totalmem;
	u32	kernelrev;
	u32	kernelbuild;
	u32	monitorrev;
	u32	monitorbuild;
	u32	hwrev;
	u32	hwbuild;
	u32	biosrev;
	u32	biosbuild;
	u32	cluster;
	u32	clusterchannelmask; 
	u32	serial[2];
	u32	battery;
	u32	options;
	u32	OEM;
	__le32	platform;
	__le32	cpu;
	__le32	subcpu;
	__le32	clock;
	__le32	execmem;
	__le32	buffermem;
	__le32	totalmem;
	__le32	kernelrev;
	__le32	kernelbuild;
	__le32	monitorrev;
	__le32	monitorbuild;
	__le32	hwrev;
	__le32	hwbuild;
	__le32	biosrev;
	__le32	biosbuild;
	__le32	cluster;
	__le32	clusterchannelmask; 
	__le32	serial[2];
	__le32	battery;
	__le32	options;
	__le32	OEM;
};

/*
@@ -1016,82 +1042,101 @@ struct aac_dev

struct aac_read
{
	u32	 	command;
	u32 		cid;
	u32 		block;
	u32 		count;
	__le32	 	command;
	__le32 		cid;
	__le32 		block;
	__le32 		count;
	struct sgmap	sg;	// Must be last in struct because it is variable
};

struct aac_read64
{
	u32	 	command;
	u16 		cid;
	u16 		sector_count;
	u32 		block;
	u16		pad;
	u16		flags;
	__le32	 	command;
	__le16 		cid;
	__le16 		sector_count;
	__le32 		block;
	__le16		pad;
	__le16		flags;
	struct sgmap64	sg;	// Must be last in struct because it is variable
};

struct aac_read_reply
{
	u32	 	status;
	u32 		count;
	__le32	 	status;
	__le32 		count;
};

struct aac_write
{
	u32		command;
	u32 		cid;
	u32 		block;
	u32 		count;
	u32	 	stable;	// Not used
	__le32		command;
	__le32 		cid;
	__le32 		block;
	__le32 		count;
	__le32	 	stable;	// Not used
	struct sgmap	sg;	// Must be last in struct because it is variable
};

struct aac_write64
{
	u32	 	command;
	u16 		cid;
	u16 		sector_count;
	u32 		block;
	u16		pad;
	u16		flags;
	__le32	 	command;
	__le16 		cid;
	__le16 		sector_count;
	__le32 		block;
	__le16		pad;
	__le16		flags;
	struct sgmap64	sg;	// Must be last in struct because it is variable
};
struct aac_write_reply
{
	u32		status;
	u32 		count;
	u32		committed;
	__le32		status;
	__le32 		count;
	__le32		committed;
};

#define CT_FLUSH_CACHE 129
struct aac_synchronize {
	u32		command;	/* VM_ContainerConfig */
	u32		type;		/* CT_FLUSH_CACHE */
	u32		cid;
	u32		parm1;
	u32		parm2;
	u32		parm3;
	u32		parm4;
	u32		count;	/* sizeof(((struct aac_synchronize_reply *)NULL)->data) */
	__le32		command;	/* VM_ContainerConfig */
	__le32		type;		/* CT_FLUSH_CACHE */
	__le32		cid;
	__le32		parm1;
	__le32		parm2;
	__le32		parm3;
	__le32		parm4;
	__le32		count;	/* sizeof(((struct aac_synchronize_reply *)NULL)->data) */
};

struct aac_synchronize_reply {
	u32		dummy0;
	u32		dummy1;
	u32		status;	/* CT_OK */
	u32		parm1;
	u32		parm2;
	u32		parm3;
	u32		parm4;
	u32		parm5;
	__le32		dummy0;
	__le32		dummy1;
	__le32		status;	/* CT_OK */
	__le32		parm1;
	__le32		parm2;
	__le32		parm3;
	__le32		parm4;
	__le32		parm5;
	u8		data[16];
};

struct aac_srb
{
	__le32		function;
	__le32		channel;
	__le32		id;
	__le32		lun;
	__le32		timeout;
	__le32		flags;
	__le32		count;		// Data xfer size
	__le32		retry_limit;
	__le32		cdb_size;
	u8		cdb[16];
	struct	sgmap	sg;
};

/*
 * This and assocated data structs are used by the 
 * ioctl caller and are in cpu order.
 */
struct user_aac_srb
{
	u32		function;
	u32		channel;
@@ -1103,20 +1148,18 @@ struct aac_srb
	u32		retry_limit;
	u32		cdb_size;
	u8		cdb[16];
	struct	sgmap	sg;
	struct	user_sgmap	sg;
};



#define		AAC_SENSE_BUFFERSIZE	 30

struct aac_srb_reply
{
	u32		status;
	u32		srb_status;
	u32		scsi_status;
	u32		data_xfer_length;
	u32		sense_data_size;
	__le32		status;
	__le32		srb_status;
	__le32		scsi_status;
	__le32		data_xfer_length;
	__le32		sense_data_size;
	u8		sense_data[AAC_SENSE_BUFFERSIZE]; // Can this be SCSI_SENSE_BUFFERSIZE
};
/*
@@ -1223,14 +1266,14 @@ struct aac_srb_reply
 */

struct aac_fsinfo {
	u32  fsTotalSize;	/* Consumed by fs, incl. metadata */
	u32  fsBlockSize;
	u32  fsFragSize;
	u32  fsMaxExtendSize;
	u32  fsSpaceUnits;
	u32  fsMaxNumFiles;
	u32  fsNumFreeFiles;
	u32  fsInodeDensity;
	__le32  fsTotalSize;	/* Consumed by fs, incl. metadata */
	__le32  fsBlockSize;
	__le32  fsFragSize;
	__le32  fsMaxExtendSize;
	__le32  fsSpaceUnits;
	__le32  fsMaxNumFiles;
	__le32  fsNumFreeFiles;
	__le32  fsInodeDensity;
};	/* valid iff ObjType == FT_FILESYS && !(ContentState & FSCS_NOTCLEAN) */

union aac_contentinfo {
@@ -1243,32 +1286,32 @@ union aac_contentinfo {

#define CT_GET_CONFIG_STATUS 147
struct aac_get_config_status {
	u32		command;	/* VM_ContainerConfig */
	u32		type;		/* CT_GET_CONFIG_STATUS */
	u32		parm1;
	u32		parm2;
	u32		parm3;
	u32		parm4;
	u32		parm5;
	u32		count;	/* sizeof(((struct aac_get_config_status_resp *)NULL)->data) */
	__le32		command;	/* VM_ContainerConfig */
	__le32		type;		/* CT_GET_CONFIG_STATUS */
	__le32		parm1;
	__le32		parm2;
	__le32		parm3;
	__le32		parm4;
	__le32		parm5;
	__le32		count;	/* sizeof(((struct aac_get_config_status_resp *)NULL)->data) */
};

#define CFACT_CONTINUE 0
#define CFACT_PAUSE    1
#define CFACT_ABORT    2
struct aac_get_config_status_resp {
	u32		response; /* ST_OK */
	u32		dummy0;
	u32		status;	/* CT_OK */
	u32		parm1;
	u32		parm2;
	u32		parm3;
	u32		parm4;
	u32		parm5;
	__le32		response; /* ST_OK */
	__le32		dummy0;
	__le32		status;	/* CT_OK */
	__le32		parm1;
	__le32		parm2;
	__le32		parm3;
	__le32		parm4;
	__le32		parm5;
	struct {
		u32	action; /* CFACT_CONTINUE, CFACT_PAUSE or CFACT_ABORT */
		u16	flags;
		s16	count;
		__le32	action; /* CFACT_CONTINUE, CFACT_PAUSE or CFACT_ABORT */
		__le16	flags;
		__le16	count;
	}		data;
};

@@ -1279,8 +1322,8 @@ struct aac_get_config_status_resp {
#define CT_COMMIT_CONFIG 152

struct aac_commit_config {
	u32		command;	/* VM_ContainerConfig */
	u32		type;		/* CT_COMMIT_CONFIG */
	__le32		command;	/* VM_ContainerConfig */
	__le32		type;		/* CT_COMMIT_CONFIG */
};

/*
@@ -1289,16 +1332,16 @@ struct aac_commit_config {

#define CT_GET_CONTAINER_COUNT 4
struct aac_get_container_count {
	u32		command;	/* VM_ContainerConfig */
	u32		type;		/* CT_GET_CONTAINER_COUNT */
	__le32		command;	/* VM_ContainerConfig */
	__le32		type;		/* CT_GET_CONTAINER_COUNT */
};

struct aac_get_container_count_resp {
	u32		response; /* ST_OK */
	u32		dummy0;
	u32		MaxContainers;
	u32		ContainerSwitchEntries;
	u32		MaxPartitions;
	__le32		response; /* ST_OK */
	__le32		dummy0;
	__le32		MaxContainers;
	__le32		ContainerSwitchEntries;
	__le32		MaxPartitions;
};


@@ -1308,15 +1351,19 @@ struct aac_get_container_count_resp {
 */

struct aac_mntent {
	u32    			oid;
	u8			name[16];	// if applicable
	struct creation_info	create_info;	// if applicable
	u32			capacity;
	u32			vol;    	// substrate structure
	u32			obj;	        // FT_FILESYS, FT_DATABASE, etc.
	u32			state;		// unready for mounting, readonly, etc.
	union aac_contentinfo	fileinfo;	// Info specific to content manager (eg, filesystem)
	u32			altoid;		// != oid <==> snapshot or broken mirror exists
	__le32    		oid;
	u8			name[16];	/* if applicable */
	struct creation_info	create_info;	/* if applicable */
	__le32			capacity;
	__le32			vol;    	/* substrate structure */
	__le32			obj;	        /* FT_FILESYS, 
						   FT_DATABASE, etc. */
	__le32			state;		/* unready for mounting, 
						   readonly, etc. */
	union aac_contentinfo	fileinfo;	/* Info specific to content 
						   manager (eg, filesystem) */
	__le32			altoid;		/* != oid <==> snapshot or 
						   broken mirror exists */
};

#define FSCS_NOTCLEAN	0x0001  /* fsck is neccessary before mounting */
@@ -1324,40 +1371,40 @@ struct aac_mntent {
#define FSCS_HIDDEN	0x0004	/* should be ignored - set during a clear */

struct aac_query_mount {
	u32		command;
	u32		type;
	u32		count;
	__le32		command;
	__le32		type;
	__le32		count;
};

struct aac_mount {
	u32		status;
	u32	   	type;           /* should be same as that requested */
	u32		count;
	__le32		status;
	__le32	   	type;           /* should be same as that requested */
	__le32		count;
	struct aac_mntent mnt[1];
};

#define CT_READ_NAME 130
struct aac_get_name {
	u32		command;	/* VM_ContainerConfig */
	u32		type;		/* CT_READ_NAME */
	u32		cid;
	u32		parm1;
	u32		parm2;
	u32		parm3;
	u32		parm4;
	u32		count;	/* sizeof(((struct aac_get_name_resp *)NULL)->data) */
	__le32		command;	/* VM_ContainerConfig */
	__le32		type;		/* CT_READ_NAME */
	__le32		cid;
	__le32		parm1;
	__le32		parm2;
	__le32		parm3;
	__le32		parm4;
	__le32		count;	/* sizeof(((struct aac_get_name_resp *)NULL)->data) */
};

#define CT_OK        218
struct aac_get_name_resp {
	u32		dummy0;
	u32		dummy1;
	u32		status;	/* CT_OK */
	u32		parm1;
	u32		parm2;
	u32		parm3;
	u32		parm4;
	u32		parm5;
	__le32		dummy0;
	__le32		dummy1;
	__le32		status;	/* CT_OK */
	__le32		parm1;
	__le32		parm2;
	__le32		parm3;
	__le32		parm4;
	__le32		parm5;
	u8		data[16];
};

@@ -1366,8 +1413,8 @@ struct aac_get_name_resp {
 */

struct aac_close {
	u32	command;
	u32	cid;
	__le32	command;
	__le32	cid;
};

struct aac_query_disk
@@ -1573,8 +1620,8 @@ extern struct aac_common aac_config;
 */

struct aac_aifcmd {
	u32 command;		/* Tell host what type of notify this is */
	u32 seqnum;		/* To allow ordering of reports (if necessary) */
	__le32 command;		/* Tell host what type of notify this is */
	__le32 seqnum;		/* To allow ordering of reports (if necessary) */
	u8 data[1];		/* Undefined length (from kernel viewpoint) */
};

+50 −43
Original line number Diff line number Diff line
@@ -86,7 +86,7 @@ static int ioctl_send_fib(struct aac_dev * dev, void __user *arg)
		return -EFAULT;
	}

	if (kfib->header.Command == cpu_to_le32(TakeABreakPt)) {
	if (kfib->header.Command == cpu_to_le16(TakeABreakPt)) {
		aac_adapter_interrupt(dev);
		/*
		 * Since we didn't really send a fib, zero out the state to allow 
@@ -94,7 +94,7 @@ static int ioctl_send_fib(struct aac_dev * dev, void __user *arg)
		 */
		kfib->header.XferState = 0;
	} else {
		int retval = fib_send(kfib->header.Command, fibptr,
		int retval = fib_send(le16_to_cpu(kfib->header.Command), fibptr,
				le16_to_cpu(kfib->header.Size) , FsaNormal,
				1, 1, NULL, NULL);
		if (retval) {
@@ -114,7 +114,7 @@ static int ioctl_send_fib(struct aac_dev * dev, void __user *arg)
	 *	was already included by the adapter.)
	 */

	if (copy_to_user(arg, (void *)kfib, kfib->header.Size)) {
	if (copy_to_user(arg, (void *)kfib, le16_to_cpu(kfib->header.Size))) {
		fib_free(fibptr);
		return -EFAULT;
	}
@@ -391,8 +391,8 @@ static int check_revision(struct aac_dev *dev, void __user *arg)
	struct revision response;

	response.compat = 1;
	response.version = dev->adapter_info.kernelrev;
	response.build = dev->adapter_info.kernelbuild;
	response.version = le32_to_cpu(dev->adapter_info.kernelrev);
	response.build = le32_to_cpu(dev->adapter_info.kernelbuild);

	if (copy_to_user(arg, &response, sizeof(response)))
		return -EFAULT;
@@ -409,8 +409,9 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
{
	struct fib* srbfib;
	int status;
	struct aac_srb *srbcmd;
	struct aac_srb __user *user_srb = arg;
	struct aac_srb *srbcmd = NULL;
	struct user_aac_srb *user_srbcmd = NULL;
	struct user_aac_srb __user *user_srb = arg;
	struct aac_srb_reply __user *user_reply;
	struct aac_srb_reply* reply;
	u32 fibsize = 0;
@@ -450,7 +451,8 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
		goto cleanup;
	}

	if(copy_from_user(srbcmd, user_srb,fibsize)){
	user_srbcmd = kmalloc(GFP_KERNEL, fibsize);
	if(copy_from_user(user_srbcmd, user_srb,fibsize)){
		printk(KERN_DEBUG"aacraid: Could not copy srb from user\n"); 
		rcode = -EFAULT;
		goto cleanup;
@@ -458,18 +460,19 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)

	user_reply = arg+fibsize;

	flags = srbcmd->flags;
	flags = user_srbcmd->flags; /* from user in cpu order */
	// Fix up srb for endian and force some values

	srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi);	// Force this
	srbcmd->channel  = cpu_to_le32(srbcmd->channel);
	srbcmd->id	 = cpu_to_le32(srbcmd->id);
	srbcmd->lun      = cpu_to_le32(srbcmd->lun);
	srbcmd->flags    = cpu_to_le32(srbcmd->flags);
	srbcmd->timeout  = cpu_to_le32(srbcmd->timeout);
	srbcmd->retry_limit =cpu_to_le32(0); // Obsolete parameter
	srbcmd->cdb_size = cpu_to_le32(srbcmd->cdb_size);
	
	switch (srbcmd->flags & (SRB_DataIn | SRB_DataOut)) {
	srbcmd->channel = cpu_to_le32(user_srbcmd->channel);
	srbcmd->id = cpu_to_le32(user_srbcmd->id);
	srbcmd->lun = cpu_to_le32(user_srbcmd->lun);
	srbcmd->flags = cpu_to_le32(user_srbcmd->flags);
	srbcmd->timeout = cpu_to_le32(user_srbcmd->timeout);
	srbcmd->retry_limit = 0; 
	srbcmd->cdb_size = cpu_to_le32(user_srbcmd->cdb_size);
	
	switch (flags & (SRB_DataIn | SRB_DataOut)) {
	case SRB_DataOut:
		data_dir = DMA_TO_DEVICE;
		break;
@@ -483,60 +486,61 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
		data_dir = DMA_NONE;
	}
	if (dev->dac_support == 1) {
		struct sgmap64* psg = (struct sgmap64*)&srbcmd->sg;
		struct user_sgmap64* upsg = (struct user_sgmap64*)&user_srbcmd->sg;
		struct sgmap64* psg = (struct sgmap64*)&user_srbcmd->sg;
		byte_count = 0;

		/*
		 * This should also catch if user used the 32 bit sgmap
		 */
		actual_fibsize = sizeof(struct aac_srb) - 
			sizeof(struct sgentry) + ((srbcmd->sg.count & 0xff) * 
			sizeof(struct sgentry) + 
			((user_srbcmd->sg.count & 0xff) * 
		 	sizeof(struct sgentry64));
		if(actual_fibsize != fibsize){ // User made a mistake - should not continue
			printk(KERN_DEBUG"aacraid: Bad Size specified in Raw SRB command\n");
			rcode = -EINVAL;
			goto cleanup;
		}
		if ((data_dir == DMA_NONE) && psg->count) { 
		if ((data_dir == DMA_NONE) && upsg->count) { 
			printk(KERN_DEBUG"aacraid: SG with no direction specified in Raw SRB command\n");
			rcode = -EINVAL;
			goto cleanup;
		}

		for (i = 0; i < psg->count; i++) {
			dma_addr_t addr; 
			u64 le_addr;
		for (i = 0; i < upsg->count; i++) {
			u64 addr; 
			void* p;
			p = kmalloc(psg->sg[i].count,GFP_KERNEL|__GFP_DMA);
			p = kmalloc(upsg->sg[i].count, GFP_KERNEL|__GFP_DMA);
			if(p == 0) {
				printk(KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
				psg->sg[i].count,i,psg->count);
				upsg->sg[i].count,i,upsg->count);
				rcode = -ENOMEM;
				goto cleanup;
			}
			sg_user[i] = (void __user *)psg->sg[i].addr;
			sg_user[i] = (void __user *)upsg->sg[i].addr;
			sg_list[i] = p; // save so we can clean up later
			sg_indx = i;

			if( flags & SRB_DataOut ){
				if(copy_from_user(p,sg_user[i],psg->sg[i].count)){
				if(copy_from_user(p,sg_user[i],upsg->sg[i].count)){
					printk(KERN_DEBUG"aacraid: Could not copy sg data from user\n"); 
					rcode = -EFAULT;
					goto cleanup;
				}
			}
			addr = pci_map_single(dev->pdev, p, psg->sg[i].count, data_dir);
			addr = pci_map_single(dev->pdev, p, upsg->sg[i].count, data_dir);

			le_addr = cpu_to_le64(addr);
			psg->sg[i].addr[1] = (u32)(le_addr>>32);
			psg->sg[i].addr[0] = (u32)(le_addr & 0xffffffff);
			psg->sg[i].count = cpu_to_le32(psg->sg[i].count);  
			byte_count += psg->sg[i].count;
			psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff);
			psg->sg[i].addr[1] = cpu_to_le32(addr >> 32);
			psg->sg[i].count = cpu_to_le32(upsg->sg[i].count);  
			byte_count += upsg->sg[i].count;
		}

		srbcmd->count = cpu_to_le32(byte_count);
		status = fib_send(ScsiPortCommand64, srbfib, actual_fibsize, FsaNormal, 1, 1,NULL,NULL);
	} else {
		struct user_sgmap* upsg = &user_srbcmd->sg;
		struct sgmap* psg = &srbcmd->sg;
		byte_count = 0;

@@ -548,37 +552,39 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
			rcode = -EINVAL;
			goto cleanup;
		}
		if ((data_dir == DMA_NONE) && psg->count) {
		if ((data_dir == DMA_NONE) && upsg->count) {
			printk(KERN_DEBUG"aacraid: SG with no direction specified in Raw SRB command\n");
			rcode = -EINVAL;
			goto cleanup;
		}
		for (i = 0; i < psg->count; i++) {
		for (i = 0; i < upsg->count; i++) {
			dma_addr_t addr; 
			void* p;
			p = kmalloc(psg->sg[i].count,GFP_KERNEL);
			p = kmalloc(upsg->sg[i].count, GFP_KERNEL);
			if(p == 0) {
				printk(KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
				psg->sg[i].count,i,psg->count);
				upsg->sg[i].count, i, upsg->count);
				rcode = -ENOMEM;
				goto cleanup;
			}
			sg_user[i] = (void __user *)(psg->sg[i].addr);
			sg_user[i] = (void __user *)upsg->sg[i].addr; 
			sg_list[i] = p; // save so we can clean up later
			sg_indx = i;

			if( flags & SRB_DataOut ){
				if(copy_from_user(p,sg_user[i],psg->sg[i].count)){
				if(copy_from_user(p, sg_user[i], 
							upsg->sg[i].count)) {
					printk(KERN_DEBUG"aacraid: Could not copy sg data from user\n"); 
					rcode = -EFAULT;
					goto cleanup;
				}
			}
			addr = pci_map_single(dev->pdev, p, psg->sg[i].count, data_dir);
			addr = pci_map_single(dev->pdev, p, 
					upsg->sg[i].count, data_dir);

			psg->sg[i].addr = cpu_to_le32(addr);
			psg->sg[i].count = cpu_to_le32(psg->sg[i].count);  
			byte_count += psg->sg[i].count;
			psg->sg[i].count = cpu_to_le32(upsg->sg[i].count);  
			byte_count += upsg->sg[i].count;
		}
		srbcmd->count = cpu_to_le32(byte_count);
		status = fib_send(ScsiPortCommand, srbfib, actual_fibsize, FsaNormal, 1, 1, NULL, NULL);
@@ -609,6 +615,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
	}

cleanup:
	kfree(user_srbcmd);
	for(i=0; i <= sg_indx; i++){
		kfree(sg_list[i]);
	}
+2 −2
Original line number Diff line number Diff line
@@ -152,8 +152,8 @@ static void aac_queue_init(struct aac_dev * dev, struct aac_queue * q, u32 *mem,
	init_waitqueue_head(&q->qfull);
	spin_lock_init(&q->lockdata);
	q->lock = &q->lockdata;
	q->headers.producer = mem;
	q->headers.consumer = mem+1;
	q->headers.producer = (__le32 *)mem;
	q->headers.consumer = (__le32 *)(mem+1);
	*(q->headers.producer) = cpu_to_le32(qsize);
	*(q->headers.consumer) = cpu_to_le32(qsize);
	q->entries = qsize;
+6 −7
Original line number Diff line number Diff line
@@ -102,7 +102,7 @@ int fib_setup(struct aac_dev * dev)
		fibptr->next = fibptr+1;	/* Forward chain the fibs */
		init_MUTEX_LOCKED(&fibptr->event_wait);
		spin_lock_init(&fibptr->event_lock);
		hw_fib_va->header.XferState = 0xffffffff;
		hw_fib_va->header.XferState = cpu_to_le32(0xffffffff);
		hw_fib_va->header.SenderSize = cpu_to_le16(sizeof(struct hw_fib));
		fibptr->hw_fib_pa = hw_fib_pa;
		hw_fib_va = (struct hw_fib *)((unsigned char *)hw_fib_va + sizeof(struct hw_fib));
@@ -658,9 +658,8 @@ int fib_adapter_complete(struct fib * fibptr, unsigned short size)
			}
			if (aac_insert_entry(dev, index, AdapHighRespQueue,  (nointr & (int)aac_config.irq_mod)) != 0) {
			}
		}
		else if (hw_fib->header.XferState & NormalPriority) 
		{
		} else if (hw_fib->header.XferState & 
				cpu_to_le32(NormalPriority)) {
			u32 index;

			if (size) {
@@ -832,8 +831,8 @@ int aac_command_thread(struct aac_dev * dev)
			aifcmd = (struct aac_aifcmd *) hw_fib->data;
			if (aifcmd->command == cpu_to_le32(AifCmdDriverNotify)) {
				/* Handle Driver Notify Events */
				*(u32 *)hw_fib->data = cpu_to_le32(ST_OK);
				fib_adapter_complete(fib, sizeof(u32));
				*(__le32 *)hw_fib->data = cpu_to_le32(ST_OK);
				fib_adapter_complete(fib, (u16)sizeof(u32));
			} else {
				struct list_head *entry;
				/* The u32 here is important and intended. We are using
@@ -916,7 +915,7 @@ int aac_command_thread(struct aac_dev * dev)
				/*
				 *	Set the status of this FIB
				 */
				*(u32 *)hw_fib->data = cpu_to_le32(ST_OK);
				*(__le32 *)hw_fib->data = cpu_to_le32(ST_OK);
				fib_adapter_complete(fib, sizeof(u32));
				spin_unlock_irqrestore(&dev->fib_lock, flagv);
			}
Loading