aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ata/libata-eh.c16
-rw-r--r--drivers/ata/sata_sil24.c6
2 files changed, 14 insertions, 8 deletions
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index fefea7470e51..3c6ad7d949c1 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -1800,10 +1800,8 @@ static void ata_eh_link_autopsy(struct ata_link *link)
1800 qc->err_mask &= ~AC_ERR_OTHER; 1800 qc->err_mask &= ~AC_ERR_OTHER;
1801 1801
1802 /* SENSE_VALID trumps dev/unknown error and revalidation */ 1802 /* SENSE_VALID trumps dev/unknown error and revalidation */
1803 if (qc->flags & ATA_QCFLAG_SENSE_VALID) { 1803 if (qc->flags & ATA_QCFLAG_SENSE_VALID)
1804 qc->err_mask &= ~(AC_ERR_DEV | AC_ERR_OTHER); 1804 qc->err_mask &= ~(AC_ERR_DEV | AC_ERR_OTHER);
1805 ehc->i.action &= ~ATA_EH_REVALIDATE;
1806 }
1807 1805
1808 /* accumulate error info */ 1806 /* accumulate error info */
1809 ehc->i.dev = qc->dev; 1807 ehc->i.dev = qc->dev;
@@ -1816,7 +1814,8 @@ static void ata_eh_link_autopsy(struct ata_link *link)
1816 if (ap->pflags & ATA_PFLAG_FROZEN || 1814 if (ap->pflags & ATA_PFLAG_FROZEN ||
1817 all_err_mask & (AC_ERR_HSM | AC_ERR_TIMEOUT)) 1815 all_err_mask & (AC_ERR_HSM | AC_ERR_TIMEOUT))
1818 ehc->i.action |= ATA_EH_SOFTRESET; 1816 ehc->i.action |= ATA_EH_SOFTRESET;
1819 else if (all_err_mask) 1817 else if ((is_io && all_err_mask) ||
1818 (!is_io && (all_err_mask & ~AC_ERR_DEV)))
1820 ehc->i.action |= ATA_EH_REVALIDATE; 1819 ehc->i.action |= ATA_EH_REVALIDATE;
1821 1820
1822 /* if we have offending qcs and the associated failed device */ 1821 /* if we have offending qcs and the associated failed device */
@@ -2697,8 +2696,15 @@ void ata_eh_finish(struct ata_port *ap)
2697 /* FIXME: Once EH migration is complete, 2696 /* FIXME: Once EH migration is complete,
2698 * generate sense data in this function, 2697 * generate sense data in this function,
2699 * considering both err_mask and tf. 2698 * considering both err_mask and tf.
2699 *
2700 * There's no point in retrying invalid
2701 * (detected by libata) and non-IO device
2702 * errors (rejected by device). Finish them
2703 * immediately.
2700 */ 2704 */
2701 if (qc->err_mask & AC_ERR_INVALID) 2705 if ((qc->err_mask & AC_ERR_INVALID) ||
2706 (!(qc->flags & ATA_QCFLAG_IO) &&
2707 qc->err_mask == AC_ERR_DEV))
2702 ata_eh_qc_complete(qc); 2708 ata_eh_qc_complete(qc);
2703 else 2709 else
2704 ata_eh_qc_retry(qc); 2710 ata_eh_qc_retry(qc);
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c
index 3c481e0e0c03..187dcb02c681 100644
--- a/drivers/ata/sata_sil24.c
+++ b/drivers/ata/sata_sil24.c
@@ -265,11 +265,11 @@ static struct sil24_cerr_info {
265 unsigned int err_mask, action; 265 unsigned int err_mask, action;
266 const char *desc; 266 const char *desc;
267} sil24_cerr_db[] = { 267} sil24_cerr_db[] = {
268 [0] = { AC_ERR_DEV, ATA_EH_REVALIDATE, 268 [0] = { AC_ERR_DEV, 0,
269 "device error" }, 269 "device error" },
270 [PORT_CERR_DEV] = { AC_ERR_DEV, ATA_EH_REVALIDATE, 270 [PORT_CERR_DEV] = { AC_ERR_DEV, 0,
271 "device error via D2H FIS" }, 271 "device error via D2H FIS" },
272 [PORT_CERR_SDB] = { AC_ERR_DEV, ATA_EH_REVALIDATE, 272 [PORT_CERR_SDB] = { AC_ERR_DEV, 0,
273 "device error via SDB FIS" }, 273 "device error via SDB FIS" },
274 [PORT_CERR_DATA] = { AC_ERR_ATA_BUS, ATA_EH_SOFTRESET, 274 [PORT_CERR_DATA] = { AC_ERR_ATA_BUS, ATA_EH_SOFTRESET,
275 "error in data FIS" }, 275 "error in data FIS" },