Cleanup ccb->data_length handling.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23255 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Marcus Overhagen
2008-01-05 15:19:10 +00:00
parent ebd99341e9
commit 0762289b3f
2 changed files with 18 additions and 21 deletions
@@ -401,11 +401,12 @@ AHCIPort::ScsiInquiry(scsi_ccb *request)
TRACE("AHCIPort::ScsiInquiry port %d\n", fIndex);
scsi_cmd_inquiry *cmd = (scsi_cmd_inquiry *)request->cdb;
scsi_res_inquiry scsiData;
ata_res_identify_device ataData;
ASSERT(sizeof(ataData) == 512);
if (cmd->evpd || cmd->page_code) {
if (cmd->evpd || cmd->page_code || request->data_length < sizeof(scsiData)) {
TRACE("invalid request\n");
request->subsys_status = SCSI_REQ_ABORTED;
gSCSI->finished(request, 1);
@@ -432,7 +433,6 @@ AHCIPort::ScsiInquiry(scsi_ccb *request)
}
*/
scsi_res_inquiry scsiData;
scsiData.device_type = scsi_dev_direct_access;
scsiData.device_qualifier = scsi_periph_qual_connected;
scsiData.device_type_modifier = 0;
@@ -491,8 +491,7 @@ AHCIPort::ScsiInquiry(scsi_ccb *request)
request->subsys_status = SCSI_DATA_RUN_ERR;
} else {
request->subsys_status = SCSI_REQ_CMP;
request->data_resid = request->data_length - sizeof(scsiData);// ???
request->data_length = sizeof(scsiData); // ???
request->data_resid = request->data_length - sizeof(scsiData);
}
gSCSI->finished(request, 1);
}
@@ -517,7 +516,7 @@ AHCIPort::ScsiReadCapacity(scsi_ccb *request)
scsi_cmd_read_capacity *cmd = (scsi_cmd_read_capacity *)request->cdb;
scsi_res_read_capacity scsiData;
if (cmd->pmi || cmd->lba) {
if (cmd->pmi || cmd->lba || request->data_length < sizeof(scsiData)) {
TRACE("invalid request\n");
return;
}
@@ -534,18 +533,16 @@ AHCIPort::ScsiReadCapacity(scsi_ccb *request)
request->subsys_status = SCSI_DATA_RUN_ERR;
} else {
request->subsys_status = SCSI_REQ_CMP;
request->data_resid = request->data_length - sizeof(scsiData);// ???
request->data_length = sizeof(scsiData); // ???
request->data_resid = request->data_length - sizeof(scsiData);
}
gSCSI->finished(request, 1);
}
void
AHCIPort::ScsiReadWrite(scsi_ccb *request, uint64 position, size_t length, bool isWrite)
AHCIPort::ScsiReadWrite(scsi_ccb *request, uint64 lba, size_t sectorCount, bool isWrite)
{
uint32 bytecount = length * 512;
RWTRACE("ScsiReadWrite: position %llu, size %lu, isWrite %d\n", position * 512, bytecount, isWrite);
RWTRACE("ScsiReadWrite: position %llu, size %lu, isWrite %d\n", lba * 512, sectorCount * 512, isWrite);
#if 0
if (isWrite) {
@@ -556,22 +553,22 @@ AHCIPort::ScsiReadWrite(scsi_ccb *request, uint64 position, size_t length, bool
return;
}
#endif
request->data_length = bytecount; // XXX really?
ASSERT(request->data_length == sectorCount * 512);
sata_request *sreq = new sata_request(request);
if (fUse48BitCommands) {
if (length > 65536)
panic("ahci: ScsiReadWrite length too large, %lu sectors", length);
if (position > MAX_SECTOR_LBA_48)
if (sectorCount > 65536)
panic("ahci: ScsiReadWrite length too large, %lu sectors", sectorCount);
if (lba > MAX_SECTOR_LBA_48)
panic("achi: ScsiReadWrite position too large for 48-bit LBA\n");
sreq->set_ata48_cmd(isWrite ? 0x35 : 0x25, position, length);
sreq->set_ata48_cmd(isWrite ? 0x35 : 0x25, lba, sectorCount);
} else {
if (length > 256)
panic("ahci: ScsiReadWrite length too large, %lu sectors", length);
if (position > MAX_SECTOR_LBA_28)
if (sectorCount > 256)
panic("ahci: ScsiReadWrite length too large, %lu sectors", sectorCount);
if (lba > MAX_SECTOR_LBA_28)
panic("achi: ScsiReadWrite position too large for normal LBA\n");
sreq->set_ata28_cmd(isWrite ? 0xca : 0xc8, position, length);
sreq->set_ata28_cmd(isWrite ? 0xca : 0xc8, lba, sectorCount);
}
ExecuteSataRequest(sreq, isWrite);
@@ -32,7 +32,7 @@ private:
void ScsiTestUnitReady(scsi_ccb *request);
void ScsiInquiry(scsi_ccb *request);
void ScsiReadCapacity(scsi_ccb *request);
void ScsiReadWrite(scsi_ccb *request, uint64 position, size_t length, bool isWrite);
void ScsiReadWrite(scsi_ccb *request, uint64 lba, size_t sectorCount, bool isWrite);
void ScsiSynchronizeCache(scsi_ccb *request);
void ExecuteSataRequest(sata_request *request, bool isWrite = false);