aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/libata.h
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2008-05-19 13:17:54 -0400
committerJeff Garzik <jgarzik@redhat.com>2008-07-14 15:59:32 -0400
commit87fbc5a060faf2394bee88a93519f9b9d434727c (patch)
tree6f90cacb1471e64051473c4e1e664b2dea8603e0 /include/linux/libata.h
parentd8af0eb6046c56e7238171ca420622541db24926 (diff)
libata: improve EH internal command timeout handling
ATA_TMOUT_INTERNAL which was 30secs were used for all internal commands which is way too long when something goes wrong. This patch implements command type based stepped timeouts. Different command types can use different timeouts and each command type can use different timeout values after timeouts. ie. the initial timeout is set to a value which should cover most of the cases but not too long so that run away cases don't delay things too much. After the first try times out, the second try can use longer timeout and if that one times out too, it can go for full 30sec timeout. IDENTIFYs use 5s - 10s - 30s timeout and all other commands use 5s - 10s timeouts. This patch significantly cuts down the needed time to handle failure cases while still allowing libata to work with nut job devices through retries. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'include/linux/libata.h')
-rw-r--r--include/linux/libata.h8
1 files changed, 7 insertions, 1 deletions
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 9058c2a325a9..035f8e1cd0ac 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -237,7 +237,6 @@ enum {
237 /* various lengths of time */ 237 /* various lengths of time */
238 ATA_TMOUT_BOOT = 30000, /* heuristic */ 238 ATA_TMOUT_BOOT = 30000, /* heuristic */
239 ATA_TMOUT_BOOT_QUICK = 7000, /* heuristic */ 239 ATA_TMOUT_BOOT_QUICK = 7000, /* heuristic */
240 ATA_TMOUT_INTERNAL = 30000,
241 ATA_TMOUT_INTERNAL_QUICK = 5000, 240 ATA_TMOUT_INTERNAL_QUICK = 5000,
242 241
243 /* FIXME: GoVault needs 2s but we can't afford that without 242 /* FIXME: GoVault needs 2s but we can't afford that without
@@ -341,6 +340,11 @@ enum {
341 340
342 SATA_PMP_RW_TIMEOUT = 3000, /* PMP read/write timeout */ 341 SATA_PMP_RW_TIMEOUT = 3000, /* PMP read/write timeout */
343 342
343 /* This should match the actual table size of
344 * ata_eh_cmd_timeout_table in libata-eh.c.
345 */
346 ATA_EH_CMD_TIMEOUT_TABLE_SIZE = 5,
347
344 /* Horkage types. May be set by libata or controller on drives 348 /* Horkage types. May be set by libata or controller on drives
345 (some horkage may be drive/controller pair dependant */ 349 (some horkage may be drive/controller pair dependant */
346 350
@@ -598,6 +602,8 @@ struct ata_eh_info {
598struct ata_eh_context { 602struct ata_eh_context {
599 struct ata_eh_info i; 603 struct ata_eh_info i;
600 int tries[ATA_MAX_DEVICES]; 604 int tries[ATA_MAX_DEVICES];
605 int cmd_timeout_idx[ATA_MAX_DEVICES]
606 [ATA_EH_CMD_TIMEOUT_TABLE_SIZE];
601 unsigned int classes[ATA_MAX_DEVICES]; 607 unsigned int classes[ATA_MAX_DEVICES];
602 unsigned int did_probe_mask; 608 unsigned int did_probe_mask;
603 unsigned int saved_ncq_enabled; 609 unsigned int saved_ncq_enabled;