Skip to content

Commit

Permalink
[PATCH] sata_sil24: exit early from softreset if SStatus reports no d…
Browse files Browse the repository at this point in the history
…evice

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>
  • Loading branch information
Tejun Heo authored and Jeff Garzik committed Mar 12, 2006
1 parent 75deb6f commit 10d996a
Showing 1 changed file with 14 additions and 8 deletions.
22 changes: 14 additions & 8 deletions drivers/scsi/sata_sil24.c
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,12 @@ static int sil24_softreset(struct ata_port *ap, int verbose,

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 */
irq_enable = readl(port + PORT_IRQ_ENABLE_SET);
writel(irq_enable, port + PORT_IRQ_ENABLE_CLR);
Expand Down Expand Up @@ -469,18 +475,18 @@ static int sil24_softreset(struct ata_port *ap, int verbose,
/* restore IRQs */
writel(irq_enable, port + PORT_IRQ_ENABLE_SET);

if (sata_dev_present(ap)) {
if (!(irq_stat & PORT_IRQ_COMPLETE)) {
DPRINTK("EXIT, srst failed\n");
return -EIO;
}

sil24_update_tf(ap);
*class = ata_dev_classify(&pp->tf);
if (!(irq_stat & PORT_IRQ_COMPLETE)) {
DPRINTK("EXIT, srst failed\n");
return -EIO;
}

sil24_update_tf(ap);
*class = ata_dev_classify(&pp->tf);

if (*class == ATA_DEV_UNKNOWN)
*class = ATA_DEV_NONE;

out:
DPRINTK("EXIT, class=%u\n", *class);
return 0;
}
Expand Down

0 comments on commit 10d996a

Please sign in to comment.