Skip to content

Commit

Permalink
[PATCH] sata_sil24: lengthen softreset timeout
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Tejun Heo authored and Jeff Garzik committed Mar 12, 2006
1 parent 10d996a commit 8645984
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions drivers/scsi/sata_sil24.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");

Expand All @@ -461,16 +461,16 @@ 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 */

irq_stat >>= PORT_IRQ_RAW_SHIFT;
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);
Expand Down

0 comments on commit 8645984

Please sign in to comment.