From 0762289b3f6fc460ea1e4d5b51db1d1cbb6b4d78 Mon Sep 17 00:00:00 2001 From: Marcus Overhagen Date: Sat, 5 Jan 2008 15:19:10 +0000 Subject: [PATCH] Cleanup ccb->data_length handling. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23255 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/busses/scsi/ahci/ahci_port.cpp | 37 +++++++++---------- .../kernel/busses/scsi/ahci/ahci_port.h | 2 +- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp b/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp index 4f68cfba16..5a35ff25ba 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp +++ b/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp @@ -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); diff --git a/src/add-ons/kernel/busses/scsi/ahci/ahci_port.h b/src/add-ons/kernel/busses/scsi/ahci/ahci_port.h index 0bca6a6d69..1c741c3183 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/ahci_port.h +++ b/src/add-ons/kernel/busses/scsi/ahci/ahci_port.h @@ -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);