[Haiku-commits] r26205 - haiku/trunk/src/add-ons/kernel/busses/scsi/ahci
marcusoverhagen at BerliOS
marcusoverhagen at mail.berlios.de
Wed Jul 2 00:04:34 CEST 2008
Author: marcusoverhagen
Date: 2008-07-02 00:04:33 +0200 (Wed, 02 Jul 2008)
New Revision: 26205
ViewCVS: http://svn.berlios.de/viewcvs/haiku?rev=26205&view=rev
Modified:
haiku/trunk/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp
haiku/trunk/src/add-ons/kernel/busses/scsi/ahci/sata_request.cpp
haiku/trunk/src/add-ons/kernel/busses/scsi/ahci/sata_request.h
Log:
Set transfer length when doing ATAPI transfers.
Dump ATAPI command packet on error.
Modified: haiku/trunk/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp
===================================================================
--- haiku/trunk/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp 2008-07-01 20:56:23 UTC (rev 26204)
+++ haiku/trunk/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp 2008-07-01 22:04:33 UTC (rev 26205)
@@ -790,7 +790,7 @@
// TRACE("AHCIPort::ScsiExecuteRequest ATAPI: port %d, opcode 0x%02x, length %u\n", fIndex, request->cdb[0], request->cdb_length);
sata_request *sreq = new(std::nothrow) sata_request(request);
- sreq->set_atapi_cmd();
+ sreq->set_atapi_cmd(request->data_length);
// uint8 *data = (uint8*) sreq->ccb()->cdb;
// for (int i = 0; i < 16; i += 8) {
// TRACE(" %02x %02x %02x %02x %02x %02x %02x %02x\n", data[i], data[i+1], data[i+2], data[i+3], data[i+4], data[i+5], data[i+6], data[i+7]);
Modified: haiku/trunk/src/add-ons/kernel/busses/scsi/ahci/sata_request.cpp
===================================================================
--- haiku/trunk/src/add-ons/kernel/busses/scsi/ahci/sata_request.cpp 2008-07-01 20:56:23 UTC (rev 26204)
+++ haiku/trunk/src/add-ons/kernel/busses/scsi/ahci/sata_request.cpp 2008-07-01 22:04:33 UTC (rev 26205)
@@ -84,47 +84,63 @@
void
-sata_request::set_atapi_cmd()
+sata_request::set_atapi_cmd(size_t transferLength)
{
fIsATAPI = true;
set_ata_cmd(0xa0);
- fFis[5] = 0xfe;
- fFis[6] = 0xff;
+ if (1 /* isPIO */) {
+ if (transferLength == 0)
+ transferLength = 2;
+ else if (transferLength > 0xfffe)
+ transferLength = 0xfffe;
+ fFis[5] = transferLength & 0xff;
+ fFis[6] = (transferLength >> 8) & 0xff;
+ }
}
void
sata_request::finish(int tfd, size_t bytesTransfered)
{
- if (tfd & ATA_ERR)
- dprintf("ahci: sata_request::finish ATA_ERR set for command 0x%02x\n", fFis[2]);
+ if (tfd & (ATA_ERR | ATA_DF)) {
+ uint8 status = tfd & 0xff;
+ uint8 error = (tfd >> 8) & 0xff;
+ dprintf("ahci: sata_request::finish ATA command 0x%02x failed\n", fFis[2]);
+ dprintf("ahci: sata_request::finish status 0x%02x, error 0x%02x\n", status, error);
+ }
+
if (fCcb) {
fCcb->data_resid = fCcb->data_length - bytesTransfered;
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);
+ fCcb->subsys_status = SCSI_REQ_CMP_ERR;
if (fIsATAPI) {
- fCcb->subsys_status = SCSI_REQ_CMP_ERR;
+ dprintf("ahci: sata_request::finish ATAPI packet %02x %02x %02x %02x "
+ "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x (len %d)\n",
+ fCcb->cdb[0], fCcb->cdb[1], fCcb->cdb[2], fCcb->cdb[3],
+ fCcb->cdb[4], fCcb->cdb[5], fCcb->cdb[6], fCcb->cdb[7],
+ fCcb->cdb[8], fCcb->cdb[9], fCcb->cdb[10], fCcb->cdb[11],
+ fCcb->cdb[12], fCcb->cdb[13], fCcb->cdb[14], fCcb->cdb[15],
+ fCcb->cdb_length);
fCcb->device_status = SCSI_STATUS_CHECK_CONDITION;
} else {
- fCcb->subsys_status = SCSI_REQ_CMP_ERR;
- // TODO error handling goes here
- }
+ // TODO ATA error handling goes here
/*
- if (error & 0x04) { // ABRT
- fCcb->subsys_status = SCSI_REQ_ABORTED;
- } else {
- fCcb->device_status = SCSI_STATUS_CHECK_CONDITION;
- fCcb->subsys_status |= SCSI_AUTOSNS_VALID;
- fCcb->sense_resid = 0; //FIXME
- scsi_sense *sense = (scsi_sense *)fCcb->sense;
- sense->error_code = SCSIS_CURR_ERROR;
- sense->sense_key = error >> 4;
- sense->asc = 0;
- sense->ascq = 0;
+ // TODO check ABORT bit if this is useful
+ if ((tfd >> 8) & 0x04) { // ABRT
+ fCcb->subsys_status = SCSI_REQ_ABORTED;
+ } else {
+ fCcb->device_status = SCSI_STATUS_CHECK_CONDITION;
+ fCcb->subsys_status |= SCSI_AUTOSNS_VALID;
+ fCcb->sense_resid = 0; //FIXME
+ scsi_sense *sense = (scsi_sense *)fCcb->sense;
+ sense->error_code = SCSIS_CURR_ERROR;
+ sense->sense_key = error >> 4;
+ sense->asc = 0;
+ sense->ascq = 0;
+ }
+*/
}
-*/
}
gSCSI->finished(fCcb, 1);
delete this;
@@ -144,7 +160,7 @@
gSCSI->finished(fCcb, 1);
delete this;
} else {
- fCompletionStatus = -1;
+ fCompletionStatus = ATA_ERR;
release_sem(fCompletionSem);
}
}
Modified: haiku/trunk/src/add-ons/kernel/busses/scsi/ahci/sata_request.h
===================================================================
--- haiku/trunk/src/add-ons/kernel/busses/scsi/ahci/sata_request.h 2008-07-01 20:56:23 UTC (rev 26204)
+++ haiku/trunk/src/add-ons/kernel/busses/scsi/ahci/sata_request.h 2008-07-01 22:04:33 UTC (rev 26205)
@@ -20,7 +20,7 @@
void set_ata28_cmd(uint8 command, uint32 lba, uint8 sectorCount);
void set_ata48_cmd(uint8 command, uint64 lba, uint16 sectorCount);
- void set_atapi_cmd();
+ void set_atapi_cmd(size_t transferLength);
bool is_atapi();
scsi_ccb * ccb();
More information about the Haiku-commits
mailing list