ahci: Minor cleanup.

* Mostly utilized ATACommands.h
This commit is contained in:
Axel Dörfler
2013-11-07 19:04:20 +01:00
parent 33945c5c89
commit 13e72c9a72
2 changed files with 17 additions and 8 deletions
@@ -13,6 +13,7 @@
#include <ByteOrder.h> #include <ByteOrder.h>
#include <KernelExport.h> #include <KernelExport.h>
#include <ATACommands.h>
#include <ATAInfoBlock.h> #include <ATAInfoBlock.h>
#include "ahci_controller.h" #include "ahci_controller.h"
@@ -358,8 +359,8 @@ AHCIPort::InterruptErrorHandler(uint32 is)
uint32 ci = fRegs->ci; uint32 ci = fRegs->ci;
if (!fTestUnitReadyActive) { if (!fTestUnitReadyActive) {
TRACE("AHCIPort::InterruptErrorHandler port %d, " TRACE("AHCIPort::InterruptErrorHandler port %d, fCommandsActive 0x%08"
"fCommandsActive 0x%08" B_PRIx32 ", is 0x%08" B_PRIx32 ", ci 0x%08" B_PRIx32 "\n", fIndex, B_PRIx32 ", is 0x%08" B_PRIx32 ", ci 0x%08" B_PRIx32 "\n", fIndex,
fCommandsActive, is, ci); fCommandsActive, is, ci);
TRACE("ssts 0x%08" B_PRIx32 "\n", fRegs->ssts); TRACE("ssts 0x%08" B_PRIx32 "\n", fRegs->ssts);
@@ -563,7 +564,8 @@ AHCIPort::ScsiInquiry(scsi_ccb *request)
sata_request sreq; sata_request sreq;
sreq.set_data(&ataData, sizeof(ataData)); sreq.set_data(&ataData, sizeof(ataData));
sreq.set_ata_cmd(fIsATAPI ? 0xa1 : 0xec); // Identify (Packet) Device sreq.set_ata_cmd(fIsATAPI
? ATA_COMMAND_IDENTIFY_PACKET_DEVICE : ATA_COMMAND_IDENTIFY_DEVICE);
ExecuteSataRequest(&sreq); ExecuteSataRequest(&sreq);
sreq.wait_for_completion(); sreq.wait_for_completion();
@@ -671,7 +673,8 @@ AHCIPort::ScsiSynchronizeCache(scsi_ccb *request)
return; return;
} }
sreq->set_ata_cmd(fUse48BitCommands ? 0xea : 0xe7); // Flush Cache sreq->set_ata_cmd(fUse48BitCommands
? ATA_COMMAND_FLUSH_CACHE_EXT : ATA_COMMAND_FLUSH_CACHE);
ExecuteSataRequest(sreq); ExecuteSataRequest(sreq);
} }
@@ -771,7 +774,9 @@ AHCIPort::ScsiReadWrite(scsi_ccb *request, uint64 lba, size_t sectorCount,
} }
if (lba > MAX_SECTOR_LBA_48) if (lba > MAX_SECTOR_LBA_48)
panic("achi: ScsiReadWrite position too large for 48-bit LBA\n"); panic("achi: ScsiReadWrite position too large for 48-bit LBA\n");
sreq->set_ata48_cmd(isWrite ? 0x35 : 0x25, lba, sectorCount); sreq->set_ata48_cmd(
isWrite ? ATA_COMMAND_WRITE_DMA_EXT : ATA_COMMAND_READ_DMA_EXT,
lba, sectorCount);
} else { } else {
if (sectorCount > 256) { if (sectorCount > 256) {
panic("ahci: ScsiReadWrite length too large, %lu sectors", panic("ahci: ScsiReadWrite length too large, %lu sectors",
@@ -779,7 +784,8 @@ AHCIPort::ScsiReadWrite(scsi_ccb *request, uint64 lba, size_t sectorCount,
} }
if (lba > MAX_SECTOR_LBA_28) if (lba > MAX_SECTOR_LBA_28)
panic("achi: ScsiReadWrite position too large for normal LBA\n"); panic("achi: ScsiReadWrite position too large for normal LBA\n");
sreq->set_ata28_cmd(isWrite ? 0xca : 0xc8, lba, sectorCount); sreq->set_ata28_cmd(isWrite
? ATA_COMMAND_WRITE_DMA : ATA_COMMAND_READ_DMA, lba, sectorCount);
} }
ExecuteSataRequest(sreq, isWrite); ExecuteSataRequest(sreq, isWrite);
@@ -799,6 +805,7 @@ AHCIPort::ScsiUnmap(scsi_ccb* request, scsi_unmap_parameter_list* unmapBlocks)
return; return;
} }
sreq->set_ata_cmd(ATA_COMMAND_DATA_SET_MANAGEMENT);
delete sreq; delete sreq;
} }
@@ -1074,7 +1081,6 @@ AHCIPort::ScsiExecuteRequest(scsi_ccb *request)
uchar uchar
AHCIPort::ScsiAbortRequest(scsi_ccb *request) AHCIPort::ScsiAbortRequest(scsi_ccb *request)
{ {
return SCSI_REQ_CMP; return SCSI_REQ_CMP;
} }
@@ -10,6 +10,9 @@
#include "scsi_cmds.h" #include "scsi_cmds.h"
#define FIS_TYPE_REGISTER_HOST_TO_DEVICE 0x27
sata_request::sata_request() sata_request::sata_request()
: :
fCcb(NULL), fCcb(NULL),
@@ -54,7 +57,7 @@ void
sata_request::set_ata_cmd(uint8 command) sata_request::set_ata_cmd(uint8 command)
{ {
memset(fFis, 0, sizeof(fFis)); memset(fFis, 0, sizeof(fFis));
fFis[0] = 0x27; fFis[0] = FIS_TYPE_REGISTER_HOST_TO_DEVICE;
fFis[1] = 0x80; fFis[1] = 0x80;
fFis[2] = command; fFis[2] = command;
} }