diff options
| -rw-r--r-- | drivers/ata/libata-eh.c | 46 | ||||
| -rw-r--r-- | drivers/ata/libata-pmp.c | 4 |
2 files changed, 18 insertions, 32 deletions
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index a34adc2c85df..06a92c58a49d 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
| @@ -2170,6 +2170,9 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
| 2170 | /* | 2170 | /* |
| 2171 | * Perform reset | 2171 | * Perform reset |
| 2172 | */ | 2172 | */ |
| 2173 | if (ata_is_host_link(link)) | ||
| 2174 | ata_eh_freeze_port(ap); | ||
| 2175 | |||
| 2173 | deadline = jiffies + ata_eh_reset_timeouts[try++]; | 2176 | deadline = jiffies + ata_eh_reset_timeouts[try++]; |
| 2174 | 2177 | ||
| 2175 | if (reset) { | 2178 | if (reset) { |
| @@ -2238,6 +2241,10 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
| 2238 | if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0) | 2241 | if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0) |
| 2239 | link->sata_spd = (sstatus >> 4) & 0xf; | 2242 | link->sata_spd = (sstatus >> 4) & 0xf; |
| 2240 | 2243 | ||
| 2244 | /* thaw the port */ | ||
| 2245 | if (ata_is_host_link(link)) | ||
| 2246 | ata_eh_thaw_port(ap); | ||
| 2247 | |||
| 2241 | if (postreset) | 2248 | if (postreset) |
| 2242 | postreset(link, classes); | 2249 | postreset(link, classes); |
| 2243 | 2250 | ||
| @@ -2589,7 +2596,7 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset, | |||
| 2589 | struct ata_link *link; | 2596 | struct ata_link *link; |
| 2590 | struct ata_device *dev; | 2597 | struct ata_device *dev; |
| 2591 | int nr_failed_devs, nr_disabled_devs; | 2598 | int nr_failed_devs, nr_disabled_devs; |
| 2592 | int reset, rc; | 2599 | int rc; |
| 2593 | unsigned long flags; | 2600 | unsigned long flags; |
| 2594 | 2601 | ||
| 2595 | DPRINTK("ENTER\n"); | 2602 | DPRINTK("ENTER\n"); |
| @@ -2632,7 +2639,6 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset, | |||
| 2632 | rc = 0; | 2639 | rc = 0; |
| 2633 | nr_failed_devs = 0; | 2640 | nr_failed_devs = 0; |
| 2634 | nr_disabled_devs = 0; | 2641 | nr_disabled_devs = 0; |
| 2635 | reset = 0; | ||
| 2636 | 2642 | ||
| 2637 | /* if UNLOADING, finish immediately */ | 2643 | /* if UNLOADING, finish immediately */ |
| 2638 | if (ap->pflags & ATA_PFLAG_UNLOADING) | 2644 | if (ap->pflags & ATA_PFLAG_UNLOADING) |
| @@ -2646,40 +2652,24 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset, | |||
| 2646 | if (ata_eh_skip_recovery(link)) | 2652 | if (ata_eh_skip_recovery(link)) |
| 2647 | ehc->i.action = 0; | 2653 | ehc->i.action = 0; |
| 2648 | 2654 | ||
| 2649 | /* do we need to reset? */ | ||
| 2650 | if (ehc->i.action & ATA_EH_RESET) | ||
| 2651 | reset = 1; | ||
| 2652 | |||
| 2653 | ata_link_for_each_dev(dev, link) | 2655 | ata_link_for_each_dev(dev, link) |
| 2654 | ehc->classes[dev->devno] = ATA_DEV_UNKNOWN; | 2656 | ehc->classes[dev->devno] = ATA_DEV_UNKNOWN; |
| 2655 | } | 2657 | } |
| 2656 | 2658 | ||
| 2657 | /* reset */ | 2659 | /* reset */ |
| 2658 | if (reset) { | 2660 | ata_port_for_each_link(link, ap) { |
| 2659 | /* if PMP is attached, this function only deals with | 2661 | struct ata_eh_context *ehc = &link->eh_context; |
| 2660 | * downstream links, port should stay thawed. | ||
| 2661 | */ | ||
| 2662 | if (!sata_pmp_attached(ap)) | ||
| 2663 | ata_eh_freeze_port(ap); | ||
| 2664 | |||
| 2665 | ata_port_for_each_link(link, ap) { | ||
| 2666 | struct ata_eh_context *ehc = &link->eh_context; | ||
| 2667 | 2662 | ||
| 2668 | if (!(ehc->i.action & ATA_EH_RESET)) | 2663 | if (!(ehc->i.action & ATA_EH_RESET)) |
| 2669 | continue; | 2664 | continue; |
| 2670 | 2665 | ||
| 2671 | rc = ata_eh_reset(link, ata_link_nr_vacant(link), | 2666 | rc = ata_eh_reset(link, ata_link_nr_vacant(link), |
| 2672 | prereset, softreset, hardreset, | 2667 | prereset, softreset, hardreset, postreset); |
| 2673 | postreset); | 2668 | if (rc) { |
| 2674 | if (rc) { | 2669 | ata_link_printk(link, KERN_ERR, |
| 2675 | ata_link_printk(link, KERN_ERR, | 2670 | "reset failed, giving up\n"); |
| 2676 | "reset failed, giving up\n"); | 2671 | goto out; |
| 2677 | goto out; | ||
| 2678 | } | ||
| 2679 | } | 2672 | } |
| 2680 | |||
| 2681 | if (!sata_pmp_attached(ap)) | ||
| 2682 | ata_eh_thaw_port(ap); | ||
| 2683 | } | 2673 | } |
| 2684 | 2674 | ||
| 2685 | /* the rest */ | 2675 | /* the rest */ |
diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c index ff1822a7da38..f3ad024394c2 100644 --- a/drivers/ata/libata-pmp.c +++ b/drivers/ata/libata-pmp.c | |||
| @@ -700,8 +700,6 @@ static int sata_pmp_eh_recover_pmp(struct ata_port *ap, | |||
| 700 | if (ehc->i.action & ATA_EH_RESET) { | 700 | if (ehc->i.action & ATA_EH_RESET) { |
| 701 | struct ata_link *tlink; | 701 | struct ata_link *tlink; |
| 702 | 702 | ||
| 703 | ata_eh_freeze_port(ap); | ||
| 704 | |||
| 705 | /* reset */ | 703 | /* reset */ |
| 706 | rc = ata_eh_reset(link, 0, prereset, softreset, hardreset, | 704 | rc = ata_eh_reset(link, 0, prereset, softreset, hardreset, |
| 707 | postreset); | 705 | postreset); |
| @@ -711,8 +709,6 @@ static int sata_pmp_eh_recover_pmp(struct ata_port *ap, | |||
| 711 | goto fail; | 709 | goto fail; |
| 712 | } | 710 | } |
| 713 | 711 | ||
| 714 | ata_eh_thaw_port(ap); | ||
| 715 | |||
| 716 | /* PMP is reset, SErrors cannot be trusted, scan all */ | 712 | /* PMP is reset, SErrors cannot be trusted, scan all */ |
| 717 | ata_port_for_each_link(tlink, ap) { | 713 | ata_port_for_each_link(tlink, ap) { |
| 718 | struct ata_eh_context *ehc = &tlink->eh_context; | 714 | struct ata_eh_context *ehc = &tlink->eh_context; |
