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.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index 39f556c02992..2bff9adcacf1 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -1056,7 +1056,7 @@ static void ata_eh_analyze_serror(struct ata_port *ap)
1056 } 1056 }
1057 if (serror & SERR_INTERNAL) { 1057 if (serror & SERR_INTERNAL) {
1058 err_mask |= AC_ERR_SYSTEM; 1058 err_mask |= AC_ERR_SYSTEM;
1059 action |= ATA_EH_SOFTRESET; 1059 action |= ATA_EH_HARDRESET;
1060 } 1060 }
1061 if (serror & (SERR_PHYRDY_CHG | SERR_DEV_XCHG)) 1061 if (serror & (SERR_PHYRDY_CHG | SERR_DEV_XCHG))
1062 ata_ehi_hotplugged(&ehc->i); 1062 ata_ehi_hotplugged(&ehc->i);
@@ -1151,7 +1151,9 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc,
1151 return ATA_EH_SOFTRESET; 1151 return ATA_EH_SOFTRESET;
1152 } 1152 }
1153 1153
1154 if (!(qc->err_mask & AC_ERR_DEV)) 1154 if (stat & (ATA_ERR | ATA_DF))
1155 qc->err_mask |= AC_ERR_DEV;
1156 else
1155 return 0; 1157 return 0;
1156 1158
1157 switch (qc->dev->class) { 1159 switch (qc->dev->class) {
@@ -1669,7 +1671,10 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
1669 reset == softreset ? "soft" : "hard"); 1671 reset == softreset ? "soft" : "hard");
1670 1672
1671 /* mark that this EH session started with reset */ 1673 /* mark that this EH session started with reset */
1672 ehc->i.flags |= ATA_EHI_DID_RESET; 1674 if (reset == hardreset)
1675 ehc->i.flags |= ATA_EHI_DID_HARDRESET;
1676 else
1677 ehc->i.flags |= ATA_EHI_DID_SOFTRESET;
1673 1678
1674 rc = ata_do_reset(ap, reset, classes); 1679 rc = ata_do_reset(ap, reset, classes);
1675 1680
@@ -1808,6 +1813,10 @@ static int ata_eh_revalidate_and_attach(struct ata_port *ap,
1808 } 1813 }
1809 } 1814 }
1810 1815
1816 /* PDIAG- should have been released, ask cable type if post-reset */
1817 if ((ehc->i.flags & ATA_EHI_DID_RESET) && ap->ops->cable_detect)
1818 ap->cbl = ap->ops->cable_detect(ap);
1819
1811 /* Configure new devices forward such that user doesn't see 1820 /* Configure new devices forward such that user doesn't see
1812 * device detection messages backwards. 1821 * device detection messages backwards.
1813 */ 1822 */