aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/libata-eh.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ata/libata-eh.c')
-rw-r--r--drivers/ata/libata-eh.c33
1 files changed, 17 insertions, 16 deletions
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index 7894d83ea1eb..08dd07f10008 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -66,15 +66,14 @@ enum {
66 ATA_ECAT_DUBIOUS_TOUT_HSM = 6, 66 ATA_ECAT_DUBIOUS_TOUT_HSM = 6,
67 ATA_ECAT_DUBIOUS_UNK_DEV = 7, 67 ATA_ECAT_DUBIOUS_UNK_DEV = 7,
68 ATA_ECAT_NR = 8, 68 ATA_ECAT_NR = 8,
69};
70 69
71/* Waiting in ->prereset can never be reliable. It's sometimes nice 70 /* Waiting in ->prereset can never be reliable. It's
72 * to wait there but it can't be depended upon; otherwise, we wouldn't 71 * sometimes nice to wait there but it can't be depended upon;
73 * be resetting. Just give it enough time for most drives to spin up. 72 * otherwise, we wouldn't be resetting. Just give it enough
74 */ 73 * time for most drives to spin up.
75enum { 74 */
76 ATA_EH_PRERESET_TIMEOUT = 10 * HZ, 75 ATA_EH_PRERESET_TIMEOUT = 10000,
77 ATA_EH_FASTDRAIN_INTERVAL = 3 * HZ, 76 ATA_EH_FASTDRAIN_INTERVAL = 3000,
78}; 77};
79 78
80/* The following table determines how we sequence resets. Each entry 79/* The following table determines how we sequence resets. Each entry
@@ -84,10 +83,10 @@ enum {
84 * are mostly for error handling, hotplug and retarded devices. 83 * are mostly for error handling, hotplug and retarded devices.
85 */ 84 */
86static const unsigned long ata_eh_reset_timeouts[] = { 85static const unsigned long ata_eh_reset_timeouts[] = {
87 10 * HZ, /* most drives spin up by 10sec */ 86 10000, /* most drives spin up by 10sec */
88 10 * HZ, /* > 99% working drives spin up before 20sec */ 87 10000, /* > 99% working drives spin up before 20sec */
89 35 * HZ, /* give > 30 secs of idleness for retarded devices */ 88 35000, /* give > 30 secs of idleness for retarded devices */
90 5 * HZ, /* and sweet one last chance */ 89 5000, /* and sweet one last chance */
91 /* > 1 min has elapsed, give up */ 90 /* > 1 min has elapsed, give up */
92}; 91};
93 92
@@ -641,7 +640,7 @@ void ata_eh_fastdrain_timerfn(unsigned long arg)
641 /* some qcs have finished, give it another chance */ 640 /* some qcs have finished, give it another chance */
642 ap->fastdrain_cnt = cnt; 641 ap->fastdrain_cnt = cnt;
643 ap->fastdrain_timer.expires = 642 ap->fastdrain_timer.expires =
644 jiffies + ATA_EH_FASTDRAIN_INTERVAL; 643 ata_deadline(jiffies, ATA_EH_FASTDRAIN_INTERVAL);
645 add_timer(&ap->fastdrain_timer); 644 add_timer(&ap->fastdrain_timer);
646 } 645 }
647 646
@@ -681,7 +680,8 @@ static void ata_eh_set_pending(struct ata_port *ap, int fastdrain)
681 680
682 /* activate fast drain */ 681 /* activate fast drain */
683 ap->fastdrain_cnt = cnt; 682 ap->fastdrain_cnt = cnt;
684 ap->fastdrain_timer.expires = jiffies + ATA_EH_FASTDRAIN_INTERVAL; 683 ap->fastdrain_timer.expires =
684 ata_deadline(jiffies, ATA_EH_FASTDRAIN_INTERVAL);
685 add_timer(&ap->fastdrain_timer); 685 add_timer(&ap->fastdrain_timer);
686} 686}
687 687
@@ -2125,7 +2125,8 @@ int ata_eh_reset(struct ata_link *link, int classify,
2125 } 2125 }
2126 2126
2127 if (prereset) { 2127 if (prereset) {
2128 rc = prereset(link, jiffies + ATA_EH_PRERESET_TIMEOUT); 2128 rc = prereset(link,
2129 ata_deadline(jiffies, ATA_EH_PRERESET_TIMEOUT));
2129 if (rc) { 2130 if (rc) {
2130 if (rc == -ENOENT) { 2131 if (rc == -ENOENT) {
2131 ata_link_printk(link, KERN_DEBUG, 2132 ata_link_printk(link, KERN_DEBUG,
@@ -2160,7 +2161,7 @@ int ata_eh_reset(struct ata_link *link, int classify,
2160 if (ata_is_host_link(link)) 2161 if (ata_is_host_link(link))
2161 ata_eh_freeze_port(ap); 2162 ata_eh_freeze_port(ap);
2162 2163
2163 deadline = jiffies + ata_eh_reset_timeouts[try++]; 2164 deadline = ata_deadline(jiffies, ata_eh_reset_timeouts[try++]);
2164 2165
2165 if (reset) { 2166 if (reset) {
2166 if (verbose) 2167 if (verbose)