aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2010-04-09 06:46:38 -0400
committerJeff Garzik <jgarzik@redhat.com>2010-05-14 17:08:02 -0400
commitb48d58f55aa1d2d0d12378e45663842d4021916e (patch)
tree6fe1afb742eef755f4d09022548b6d2d2f8e919e /drivers/ata
parent294440887b32c58d220fb54b73b7a58079b78f20 (diff)
libata: use longer 0xff wait if parallel scan is enabled
There are some SATA devices which take relatively long to get out of 0xff status after reset. In libata, this timeout is determined by ATA_TMOUT_FF_WAIT. Quantum GoVault is the worst requring about 2s for reliable detection. However, because 2s 0xff timeout can introduce rather long spurious delay during boot, libata has been compromising at the next longest timeout of 800ms for HHD424020F7SV00 iVDR drive. Now that parallel scan is in place for common drivers, libata can afford 2s 0xff timeout. Use 2s 0xff timeout if parallel scan is enabled. Please note that the chance of spurious wait is pretty slim w/ working SCR access so this will only affect SATA controllers w/o SCR access which isn't too common these days. Please read the following thread for more information on the GoVault drive. http://thread.gmane.org/gmane.linux.ide/14545/focus=14663 Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Gary Hade <garyhade@us.ibm.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/ata')
-rw-r--r--drivers/ata/libata-core.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 49cffb6094a3..134b5df80ace 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -3631,9 +3631,15 @@ int ata_wait_ready(struct ata_link *link, unsigned long deadline,
3631 int (*check_ready)(struct ata_link *link)) 3631 int (*check_ready)(struct ata_link *link))
3632{ 3632{
3633 unsigned long start = jiffies; 3633 unsigned long start = jiffies;
3634 unsigned long nodev_deadline = ata_deadline(start, ATA_TMOUT_FF_WAIT); 3634 unsigned long nodev_deadline;
3635 int warned = 0; 3635 int warned = 0;
3636 3636
3637 /* choose which 0xff timeout to use, read comment in libata.h */
3638 if (link->ap->host->flags & ATA_HOST_PARALLEL_SCAN)
3639 nodev_deadline = ata_deadline(start, ATA_TMOUT_FF_WAIT_LONG);
3640 else
3641 nodev_deadline = ata_deadline(start, ATA_TMOUT_FF_WAIT);
3642
3637 /* Slave readiness can't be tested separately from master. On 3643 /* Slave readiness can't be tested separately from master. On
3638 * M/S emulation configuration, this function should be called 3644 * M/S emulation configuration, this function should be called
3639 * only on the master and it will handle both master and slave. 3645 * only on the master and it will handle both master and slave.
@@ -3651,12 +3657,12 @@ int ata_wait_ready(struct ata_link *link, unsigned long deadline,
3651 if (ready > 0) 3657 if (ready > 0)
3652 return 0; 3658 return 0;
3653 3659
3654 /* -ENODEV could be transient. Ignore -ENODEV if link 3660 /*
3661 * -ENODEV could be transient. Ignore -ENODEV if link
3655 * is online. Also, some SATA devices take a long 3662 * is online. Also, some SATA devices take a long
3656 * time to clear 0xff after reset. For example, 3663 * time to clear 0xff after reset. Wait for
3657 * HHD424020F7SV00 iVDR needs >= 800ms while Quantum 3664 * ATA_TMOUT_FF_WAIT[_LONG] on -ENODEV if link isn't
3658 * GoVault needs even more than that. Wait for 3665 * offline.
3659 * ATA_TMOUT_FF_WAIT on -ENODEV if link isn't offline.
3660 * 3666 *
3661 * Note that some PATA controllers (pata_ali) explode 3667 * Note that some PATA controllers (pata_ali) explode
3662 * if status register is read more than once when 3668 * if status register is read more than once when