Skip to content

Commit 270dac3

Browse files
Jian Pengjgarzik
authored andcommitted
libata: ahci_start_engine compliant to AHCI spec
At the end of section 10.1 of AHCI spec (rev 1.3), it states Software shall not set PxCMD.ST to 1 until it is determined that a functoinal device is present on the port as determined by PxTFD.STS.BSY=0, PxTFD.STS.DRQ=0 and PxSSTS.DET=3h Even though most AHCI host controller works without this check, specific controller will fail under this condition. Signed-off-by: Jian Peng <[email protected]> Signed-off-by: Jeff Garzik <[email protected]>
1 parent 792d37a commit 270dac3

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

drivers/ata/libahci.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,27 @@ void ahci_start_engine(struct ata_port *ap)
561561
{
562562
void __iomem *port_mmio = ahci_port_base(ap);
563563
u32 tmp;
564+
u8 status;
565+
566+
status = readl(port_mmio + PORT_TFDATA) & 0xFF;
567+
568+
/*
569+
* At end of section 10.1 of AHCI spec (rev 1.3), it states
570+
* Software shall not set PxCMD.ST to 1 until it is determined
571+
* that a functoinal device is present on the port as determined by
572+
* PxTFD.STS.BSY=0, PxTFD.STS.DRQ=0 and PxSSTS.DET=3h
573+
*
574+
* Even though most AHCI host controllers work without this check,
575+
* specific controller will fail under this condition
576+
*/
577+
if (status & (ATA_BUSY | ATA_DRQ))
578+
return;
579+
else {
580+
ahci_scr_read(&ap->link, SCR_STATUS, &tmp);
581+
582+
if ((tmp & 0xf) != 0x3)
583+
return;
584+
}
564585

565586
/* start DMA */
566587
tmp = readl(port_mmio + PORT_CMD);

0 commit comments

Comments
 (0)