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.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index 1f84e40fa6ae..5a2b2af4d0c1 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -2557,7 +2557,11 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
2557 2557
2558 /* reset */ 2558 /* reset */
2559 if (reset) { 2559 if (reset) {
2560 ata_eh_freeze_port(ap); 2560 /* if PMP is attached, this function only deals with
2561 * downstream links, port should stay thawed.
2562 */
2563 if (!ap->nr_pmp_links)
2564 ata_eh_freeze_port(ap);
2561 2565
2562 ata_port_for_each_link(link, ap) { 2566 ata_port_for_each_link(link, ap) {
2563 struct ata_eh_context *ehc = &link->eh_context; 2567 struct ata_eh_context *ehc = &link->eh_context;
@@ -2575,7 +2579,8 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
2575 } 2579 }
2576 } 2580 }
2577 2581
2578 ata_eh_thaw_port(ap); 2582 if (!ap->nr_pmp_links)
2583 ata_eh_thaw_port(ap);
2579 } 2584 }
2580 2585
2581 /* the rest */ 2586 /* the rest */
@@ -2610,8 +2615,14 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
2610 if (ata_eh_handle_dev_fail(dev, rc)) 2615 if (ata_eh_handle_dev_fail(dev, rc))
2611 nr_disabled_devs++; 2616 nr_disabled_devs++;
2612 2617
2613 if (ap->pflags & ATA_PFLAG_FROZEN) 2618 if (ap->pflags & ATA_PFLAG_FROZEN) {
2619 /* PMP reset requires working host port.
2620 * Can't retry if it's frozen.
2621 */
2622 if (ap->nr_pmp_links)
2623 goto out;
2614 break; 2624 break;
2625 }
2615 } 2626 }
2616 2627
2617 if (nr_failed_devs) { 2628 if (nr_failed_devs) {