summaryrefslogtreecommitdiff
path: root/drivers/ata
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2010-08-27 11:09:15 +0200
committerGreg Kroah-Hartman <gregkh@suse.de>2010-09-20 13:36:32 -0700
commit2b88bc4f87ca83631af8ab3286964a547835a0df (patch)
tree8ccc9e07f0728a255e4fc40c11a345c1508fe6ae /drivers/ata
parent63b754139e3c4b1e24e0e488a7864b136738032f (diff)
ahci: fix hang on failed softreset
commit f1f5a807b051eddd3f302e503d39214e5bde0ef2 upstream. ahci_do_softreset() compared the current time and deadline in reverse when calculating timeout for SRST issue. The result is that if @deadline is in future, SRST is issued with 0 timeout, which hasn't caused any problem because it later waits for DRDY with the correct timeout. If deadline is already exceeded by the time SRST is about to be issued, the timeout calculation underflows and if the device doesn't respond, timeout doesn't trigger for a _very_ long time. Reverse the incorrect comparison order. Signed-off-by: Tejun Heo <tj@kernel.org> Reported-by: Anssi Hannula <anssi.hannula@iki.fi> Tested-by: Gwendal Grignou <gwendal@google.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/ata')
-rw-r--r--drivers/ata/libahci.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c
index 81e772a94d59..98c80e1ab6e9 100644
--- a/drivers/ata/libahci.c
+++ b/drivers/ata/libahci.c
@@ -1320,7 +1320,7 @@ int ahci_do_softreset(struct ata_link *link, unsigned int *class,
/* issue the first D2H Register FIS */
msecs = 0;
now = jiffies;
- if (time_after(now, deadline))
+ if (time_after(deadline, now))
msecs = jiffies_to_msecs(deadline - now);
tf.ctl |= ATA_SRST;