Lines 561-587
void ahci_start_engine(struct ata_port *ap)
Link Here
|
561 |
{ |
561 |
{ |
562 |
void __iomem *port_mmio = ahci_port_base(ap); |
562 |
void __iomem *port_mmio = ahci_port_base(ap); |
563 |
u32 tmp; |
563 |
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 |
} |
585 |
|
564 |
|
586 |
/* start DMA */ |
565 |
/* start DMA */ |
587 |
tmp = readl(port_mmio + PORT_CMD); |
566 |
tmp = readl(port_mmio + PORT_CMD); |
588 |
- |
|
|