aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2012-06-22 02:41:41 -0400
committerJames Bottomley <JBottomley@Parallels.com>2012-08-24 05:04:08 -0400
commitca6d43b051b5a061b33c43303b6b4c93b46a34b5 (patch)
tree159875541331b8e087d058a107a6393f287511d0
parentd9875690d9b89a866022ff49e3fcea892345ad92 (diff)
[SCSI] libata: reset once
Hotplug testing with libsas currently encounters a 55 second wait for link recovery to give up. In the case where the user trusts the response time of their devices permit the recovery attempts to be limited to one. Signed-off-by: Dan Williams <dan.j.williams@intel.com> Acked-by: Jeff Garzik <jgarzik@redhat.com> Acked-by: Tejun Heo <tj@kernel.org> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
-rw-r--r--Documentation/kernel-parameters.txt3
-rw-r--r--drivers/ata/libata-core.c1
-rw-r--r--drivers/ata/libata-eh.c2
-rw-r--r--include/linux/libata.h1
4 files changed, 7 insertions, 0 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index ad7e2e5088c1..2cb2d81a51ab 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -1350,6 +1350,9 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
1350 * nohrst, nosrst, norst: suppress hard, soft 1350 * nohrst, nosrst, norst: suppress hard, soft
1351 and both resets. 1351 and both resets.
1352 1352
1353 * rstonce: only attempt one reset during
1354 hot-unplug link recovery
1355
1353 * dump_id: dump IDENTIFY data. 1356 * dump_id: dump IDENTIFY data.
1354 1357
1355 If there are multiple matching configurations changing 1358 If there are multiple matching configurations changing
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index fadd5866d40f..70964aabcb89 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -6387,6 +6387,7 @@ static int __init ata_parse_force_one(char **cur,
6387 { "nohrst", .lflags = ATA_LFLAG_NO_HRST }, 6387 { "nohrst", .lflags = ATA_LFLAG_NO_HRST },
6388 { "nosrst", .lflags = ATA_LFLAG_NO_SRST }, 6388 { "nosrst", .lflags = ATA_LFLAG_NO_SRST },
6389 { "norst", .lflags = ATA_LFLAG_NO_HRST | ATA_LFLAG_NO_SRST }, 6389 { "norst", .lflags = ATA_LFLAG_NO_HRST | ATA_LFLAG_NO_SRST },
6390 { "rstonce", .lflags = ATA_LFLAG_RST_ONCE },
6390 }; 6391 };
6391 char *start = *cur, *p = *cur; 6392 char *start = *cur, *p = *cur;
6392 char *id, *val, *endp; 6393 char *id, *val, *endp;
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index 7d4535e989bf..100428dde421 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -2623,6 +2623,8 @@ int ata_eh_reset(struct ata_link *link, int classify,
2623 */ 2623 */
2624 while (ata_eh_reset_timeouts[max_tries] != ULONG_MAX) 2624 while (ata_eh_reset_timeouts[max_tries] != ULONG_MAX)
2625 max_tries++; 2625 max_tries++;
2626 if (link->flags & ATA_LFLAG_RST_ONCE)
2627 max_tries = 1;
2626 if (link->flags & ATA_LFLAG_NO_HRST) 2628 if (link->flags & ATA_LFLAG_NO_HRST)
2627 hardreset = NULL; 2629 hardreset = NULL;
2628 if (link->flags & ATA_LFLAG_NO_SRST) 2630 if (link->flags & ATA_LFLAG_NO_SRST)
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 64f90e17e51d..31a2853e9530 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -184,6 +184,7 @@ enum {
184 ATA_LFLAG_DISABLED = (1 << 6), /* link is disabled */ 184 ATA_LFLAG_DISABLED = (1 << 6), /* link is disabled */
185 ATA_LFLAG_SW_ACTIVITY = (1 << 7), /* keep activity stats */ 185 ATA_LFLAG_SW_ACTIVITY = (1 << 7), /* keep activity stats */
186 ATA_LFLAG_NO_LPM = (1 << 8), /* disable LPM on this link */ 186 ATA_LFLAG_NO_LPM = (1 << 8), /* disable LPM on this link */
187 ATA_LFLAG_RST_ONCE = (1 << 9), /* limit recovery to one reset */
187 188
188 /* struct ata_port flags */ 189 /* struct ata_port flags */
189 ATA_FLAG_SLAVE_POSS = (1 << 0), /* host supports slave dev */ 190 ATA_FLAG_SLAVE_POSS = (1 << 0), /* host supports slave dev */