mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 05:02:12 +00:00
[SCSI] aacraid: Fix read capacity 16 return data
Received from Mark Salyzyn. The return data from a read capacity 16 needs to have RTO_EN and PROT_EN zeroed out. Signed-off-by: Mark Haverkamp <markh@osdl.org> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
f64a181d89
commit
07ce5eba85
@ -1579,18 +1579,10 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
|
|||||||
break;
|
break;
|
||||||
{
|
{
|
||||||
u64 capacity;
|
u64 capacity;
|
||||||
char cp[12];
|
char cp[13];
|
||||||
unsigned int offset = 0;
|
|
||||||
|
|
||||||
dprintk((KERN_DEBUG "READ CAPACITY_16 command.\n"));
|
dprintk((KERN_DEBUG "READ CAPACITY_16 command.\n"));
|
||||||
capacity = fsa_dev_ptr[cid].size - 1;
|
capacity = fsa_dev_ptr[cid].size - 1;
|
||||||
if (scsicmd->cmnd[13] > 12) {
|
|
||||||
offset = scsicmd->cmnd[13] - 12;
|
|
||||||
if (offset > sizeof(cp))
|
|
||||||
break;
|
|
||||||
memset(cp, 0, offset);
|
|
||||||
aac_internal_transfer(scsicmd, cp, 0, offset);
|
|
||||||
}
|
|
||||||
cp[0] = (capacity >> 56) & 0xff;
|
cp[0] = (capacity >> 56) & 0xff;
|
||||||
cp[1] = (capacity >> 48) & 0xff;
|
cp[1] = (capacity >> 48) & 0xff;
|
||||||
cp[2] = (capacity >> 40) & 0xff;
|
cp[2] = (capacity >> 40) & 0xff;
|
||||||
@ -1603,7 +1595,18 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
|
|||||||
cp[9] = 0;
|
cp[9] = 0;
|
||||||
cp[10] = 2;
|
cp[10] = 2;
|
||||||
cp[11] = 0;
|
cp[11] = 0;
|
||||||
aac_internal_transfer(scsicmd, cp, offset, sizeof(cp));
|
cp[12] = 0;
|
||||||
|
aac_internal_transfer(scsicmd, cp, 0,
|
||||||
|
min((unsigned int)scsicmd->cmnd[13], sizeof(cp)));
|
||||||
|
if (sizeof(cp) < scsicmd->cmnd[13]) {
|
||||||
|
unsigned int len, offset = sizeof(cp);
|
||||||
|
|
||||||
|
memset(cp, 0, offset);
|
||||||
|
do {
|
||||||
|
len = min(scsicmd->cmnd[13]-offset, sizeof(cp));
|
||||||
|
aac_internal_transfer(scsicmd, cp, offset, len);
|
||||||
|
} while ((offset += len) < scsicmd->cmnd[13]);
|
||||||
|
}
|
||||||
|
|
||||||
/* Do not cache partition table for arrays */
|
/* Do not cache partition table for arrays */
|
||||||
scsicmd->device->removable = 1;
|
scsicmd->device->removable = 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user