mirror of
https://github.com/adulau/aha.git
synced 2024-12-30 12:46:17 +00:00
[PATCH] sata_sil24: exit early from softreset if SStatus reports no device
sata_sil24 softreset routine used to check sata_dev_present() after SRST is complete in the hope that SRST may do some good even when SStatus reports no device. This is okay as long as SRST timeout is short (> 100ms in the current code) but it seems that not all SATA devices are happy with short SRST timeout. This patch makes softreset exit early without performing actual SRST if SStatus reports no device in preparation for lengthening SRST timeout. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
75deb6fa98
commit
10d996ad19
1 changed files with 14 additions and 8 deletions
|
@ -440,6 +440,12 @@ static int sil24_softreset(struct ata_port *ap, int verbose,
|
||||||
|
|
||||||
DPRINTK("ENTER\n");
|
DPRINTK("ENTER\n");
|
||||||
|
|
||||||
|
if (!sata_dev_present(ap)) {
|
||||||
|
DPRINTK("PHY reports no device\n");
|
||||||
|
*class = ATA_DEV_NONE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
/* temporarily turn off IRQs during SRST */
|
/* temporarily turn off IRQs during SRST */
|
||||||
irq_enable = readl(port + PORT_IRQ_ENABLE_SET);
|
irq_enable = readl(port + PORT_IRQ_ENABLE_SET);
|
||||||
writel(irq_enable, port + PORT_IRQ_ENABLE_CLR);
|
writel(irq_enable, port + PORT_IRQ_ENABLE_CLR);
|
||||||
|
@ -469,7 +475,6 @@ static int sil24_softreset(struct ata_port *ap, int verbose,
|
||||||
/* restore IRQs */
|
/* restore IRQs */
|
||||||
writel(irq_enable, port + PORT_IRQ_ENABLE_SET);
|
writel(irq_enable, port + PORT_IRQ_ENABLE_SET);
|
||||||
|
|
||||||
if (sata_dev_present(ap)) {
|
|
||||||
if (!(irq_stat & PORT_IRQ_COMPLETE)) {
|
if (!(irq_stat & PORT_IRQ_COMPLETE)) {
|
||||||
DPRINTK("EXIT, srst failed\n");
|
DPRINTK("EXIT, srst failed\n");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
@ -477,10 +482,11 @@ static int sil24_softreset(struct ata_port *ap, int verbose,
|
||||||
|
|
||||||
sil24_update_tf(ap);
|
sil24_update_tf(ap);
|
||||||
*class = ata_dev_classify(&pp->tf);
|
*class = ata_dev_classify(&pp->tf);
|
||||||
}
|
|
||||||
if (*class == ATA_DEV_UNKNOWN)
|
if (*class == ATA_DEV_UNKNOWN)
|
||||||
*class = ATA_DEV_NONE;
|
*class = ATA_DEV_NONE;
|
||||||
|
|
||||||
|
out:
|
||||||
DPRINTK("EXIT, class=%u\n", *class);
|
DPRINTK("EXIT, class=%u\n", *class);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue