diff options
-rw-r--r-- | drivers/ata/libata-eh.c | 16 | ||||
-rw-r--r-- | drivers/ata/sata_sil24.c | 6 |
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" }, |