aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2006-03-11 11:44:08 +0900
committerJeff Garzik <jeff@garzik.org>2006-03-11 19:29:42 -0500
commit8645984c357a0262a29b8a28353a576645e2c707 (patch)
treea97b41a4c84a295dc075106226d053fd04a40c07
parent10d996ad1990ec2338c463042db6d5ef4f347187 (diff)
downloadlinux-8645984c357a0262a29b8a28353a576645e2c707.tar.gz
[PATCH] sata_sil24: lengthen softreset timeout
sil24 softreset timeout was > 100ms (100 loops with msleep(1)), which turned out to be too short for some devices (ASI ARAID99 2000). This patch converts sil24 softreset waiting loop to use proper timeout condition and lengthen the timeout to ATA_TMOUT_BOOT secs and check interval to 100ms. Chisato Yamauchi discovered the problem and supplied initial patch. Signed-off-by: Tejun Heo <htejun@gmail.com> Cc: Chisato Yamauchi <cyamauch@plamo.linet.gr.jp> Signed-off-by: Jeff Garzik <jeff@garzik.org>
-rw-r--r--drivers/scsi/sata_sil24.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/scsi/sata_sil24.c b/drivers/scsi/sata_sil24.c
index fa1a5ac606393..9a53a5ed38c5a 100644
--- a/drivers/scsi/sata_sil24.c
+++ b/drivers/scsi/sata_sil24.c
@@ -435,8 +435,8 @@ static int sil24_softreset(struct ata_port *ap, int verbose,
struct sil24_port_priv *pp = ap->private_data;
struct sil24_prb *prb = &pp->cmd_block[0].ata.prb;
dma_addr_t paddr = pp->cmd_block_dma;
+ unsigned long timeout = jiffies + ATA_TMOUT_BOOT * HZ;
u32 irq_enable, irq_stat;
- int cnt;
DPRINTK("ENTER\n");
@@ -461,7 +461,7 @@ static int sil24_softreset(struct ata_port *ap, int verbose,
writel((u32)paddr, port + PORT_CMD_ACTIVATE);
- for (cnt = 0; cnt < 100; cnt++) {
+ do {
irq_stat = readl(port + PORT_IRQ_STAT);
writel(irq_stat, port + PORT_IRQ_STAT); /* clear irq */
@@ -469,8 +469,8 @@ static int sil24_softreset(struct ata_port *ap, int verbose,
if (irq_stat & (PORT_IRQ_COMPLETE | PORT_IRQ_ERROR))
break;
- msleep(1);
- }
+ msleep(100);
+ } while (time_before(jiffies, timeout));
/* restore IRQs */
writel(irq_enable, port + PORT_IRQ_ENABLE_SET);