summaryrefslogtreecommitdiff
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.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index 1d4a6f1e88cd..78d25f6ab6c0 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -548,6 +548,10 @@ void ata_scsi_error(struct Scsi_Host *host)
/* finish or retry handled scmd's and clean up */
WARN_ON(!list_empty(&eh_work_q));
+#ifdef CONFIG_AHCI_IMX_PMP
+ ap->flags &= ~(0x7 << 29);
+#endif
+
DPRINTK("EXIT\n");
}
@@ -1933,6 +1937,10 @@ static void ata_eh_link_autopsy(struct ata_link *link)
if (ehc->i.flags & ATA_EHI_NO_AUTOPSY)
return;
+#ifdef CONFIG_AHCI_IMX_PMP
+ ata_msleep(ap, 20);
+#endif
+
/* obtain and analyze SError */
rc = sata_scr_read(link, SCR_ERROR, &serror);
if (rc == 0) {
@@ -3553,6 +3561,11 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
DPRINTK("ENTER\n");
+#ifdef CONFIG_AHCI_IMX_PMP
+ if (ap->flags & (1 << 31))
+ ap->flags |= (1 << 29);
+#endif
+
/* prep for recovery */
ata_for_each_link(link, ap, EDGE) {
struct ata_eh_context *ehc = &link->eh_context;