From d53ddcce75d9c0dffc1ec1f1b30898a6d470080f Mon Sep 17 00:00:00 2001 From: Marcus Overhagen Date: Sat, 24 May 2008 23:08:11 +0000 Subject: [PATCH] Provide better sense data. Turn off auto-sense for ATAPI, as we can't report anything. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25653 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/busses/scsi/ahci/ahci_defs.h | 1 + src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp | 2 +- .../kernel/busses/scsi/ahci/sata_request.cpp | 13 +++++++++++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/add-ons/kernel/busses/scsi/ahci/ahci_defs.h b/src/add-ons/kernel/busses/scsi/ahci/ahci_defs.h index abc5d5bf5c..8324f18eb1 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/ahci_defs.h +++ b/src/add-ons/kernel/busses/scsi/ahci/ahci_defs.h @@ -144,6 +144,7 @@ enum { enum { ATA_BSY = 0x80, + ATA_DF = 0x20, ATA_DRQ = 0x08, ATA_ERR = 0x01, }; 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 5b378903a4..b16562ae0f 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp +++ b/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp @@ -902,7 +902,7 @@ void AHCIPort::ScsiGetRestrictions(bool *isATAPI, bool *noAutoSense, uint32 *maxBlocks) { *isATAPI = fIsATAPI; - *noAutoSense = false; + *noAutoSense = fIsATAPI; // emulated auto sense for ATA, but not ATAPI *maxBlocks = fUse48BitCommands ? 65536 : 256; TRACE("AHCIPort::ScsiGetRestrictions port %d: isATAPI %d, noAutoSense %d, maxBlocks %lu\n", fIndex, *isATAPI, *noAutoSense, *maxBlocks); diff --git a/src/add-ons/kernel/busses/scsi/ahci/sata_request.cpp b/src/add-ons/kernel/busses/scsi/ahci/sata_request.cpp index 7370ede0cc..25b0216779 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/sata_request.cpp +++ b/src/add-ons/kernel/busses/scsi/ahci/sata_request.cpp @@ -100,10 +100,18 @@ sata_request::finish(int tfd, size_t bytesTransfered) dprintf("ahci: sata_request::finish ATA_ERR set for command 0x%02x\n", fFis[2]); if (fCcb) { fCcb->data_resid = fCcb->data_length - bytesTransfered; - fCcb->subsys_status = (tfd & ATA_ERR) ? SCSI_REQ_CMP_ERR : SCSI_REQ_CMP; - if (fIsATAPI && (tfd & ATA_ERR)) { + fCcb->subsys_status = SCSI_REQ_CMP; + if (tfd & (ATA_ERR | ATA_DF)) { uint8 error = (tfd >> 8) & 0xff; dprintf("ahci: sata_request::finish status 0x%02x, error 0x%02x\n", tfd & 0xff, error); + if (fIsATAPI) { + fCcb->subsys_status = SCSI_REQ_CMP_ERR; + fCcb->device_status = SCSI_STATUS_CHECK_CONDITION; + } else { + fCcb->subsys_status = SCSI_REQ_CMP_ERR; + // TODO error handling goes here + } +/* if (error & 0x04) { // ABRT fCcb->subsys_status = SCSI_REQ_ABORTED; } else { @@ -116,6 +124,7 @@ sata_request::finish(int tfd, size_t bytesTransfered) sense->asc = 0; sense->ascq = 0; } +*/ } gSCSI->finished(fCcb, 1); delete this;