aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDon Brace <[email protected]>2015-11-04 15:50:50 -0600
committerMartin K. Petersen <[email protected]>2015-11-09 12:34:19 -0500
commitc8a6c9a6b41367d147990756b311ed5a67f19005 (patch)
tree092346d12b5cafa2a9a9b94e35d920df938cae24
parent683fc444697a388f17cbc3bd7e64191ce000b6b4 (diff)
hpsa: correct transfer length for 6 byte read/write commands
handle block counts of 0. Cleanup block and block count calculations. Reviewed-by: Scott Teel <[email protected]> Reviewed-by: Justin Lindley <[email protected]> Reviewed-by: Kevin Barnett <[email protected]> Reviewed-by: Tomas Henzl <[email protected]> Reviewed-by: Hannes Reinecke <[email protected]> Signed-off-by: Don Brace <[email protected]> Signed-off-by: Martin K. Petersen <[email protected]>
-rw-r--r--drivers/scsi/hpsa.c19
1 files changed, 6 insertions, 13 deletions
diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
index ce0341a178fd..ae9968b4f766 100644
--- a/drivers/scsi/hpsa.c
+++ b/drivers/scsi/hpsa.c
@@ -4012,19 +4012,14 @@ static int fixup_ioaccel_cdb(u8 *cdb, int *cdb_len)
case READ_6:
case READ_12:
if (*cdb_len == 6) {
- block = (((u32) cdb[2]) << 8) | cdb[3];
+ block = get_unaligned_be16(&cdb[2]);
block_cnt = cdb[4];
+ if (block_cnt == 0)
+ block_cnt = 256;
} else {
BUG_ON(*cdb_len != 12);
- block = (((u32) cdb[2]) << 24) |
- (((u32) cdb[3]) << 16) |
- (((u32) cdb[4]) << 8) |
- cdb[5];
- block_cnt =
- (((u32) cdb[6]) << 24) |
- (((u32) cdb[7]) << 16) |
- (((u32) cdb[8]) << 8) |
- cdb[9];
+ block = get_unaligned_be32(&cdb[2]);
+ block_cnt = get_unaligned_be32(&cdb[6]);
}
if (block_cnt > 0xffff)
return IO_ACCEL_INELIGIBLE;
@@ -4410,9 +4405,7 @@ static int hpsa_scsi_ioaccel_raid_map(struct ctlr_info *h,
case WRITE_6:
is_write = 1;
case READ_6:
- first_block =
- (((u64) cmd->cmnd[2]) << 8) |
- cmd->cmnd[3];
+ first_block = get_unaligned_be16(&cmd->cmnd[2]);
block_cnt = cmd->cmnd[4];
if (block_cnt == 0)
block_cnt = 256;