|
@@ -1800,10 +1800,8 @@ static void ata_eh_link_autopsy(struct ata_link *link)
|
|
|
qc->err_mask &= ~AC_ERR_OTHER;
|
|
|
|
|
|
/* SENSE_VALID trumps dev/unknown error and revalidation */
|
|
|
- if (qc->flags & ATA_QCFLAG_SENSE_VALID) {
|
|
|
+ if (qc->flags & ATA_QCFLAG_SENSE_VALID)
|
|
|
qc->err_mask &= ~(AC_ERR_DEV | AC_ERR_OTHER);
|
|
|
- ehc->i.action &= ~ATA_EH_REVALIDATE;
|
|
|
- }
|
|
|
|
|
|
/* accumulate error info */
|
|
|
ehc->i.dev = qc->dev;
|
|
@@ -1816,7 +1814,8 @@ static void ata_eh_link_autopsy(struct ata_link *link)
|
|
|
if (ap->pflags & ATA_PFLAG_FROZEN ||
|
|
|
all_err_mask & (AC_ERR_HSM | AC_ERR_TIMEOUT))
|
|
|
ehc->i.action |= ATA_EH_SOFTRESET;
|
|
|
- else if (all_err_mask)
|
|
|
+ else if ((is_io && all_err_mask) ||
|
|
|
+ (!is_io && (all_err_mask & ~AC_ERR_DEV)))
|
|
|
ehc->i.action |= ATA_EH_REVALIDATE;
|
|
|
|
|
|
/* if we have offending qcs and the associated failed device */
|
|
@@ -2697,8 +2696,15 @@ void ata_eh_finish(struct ata_port *ap)
|
|
|
/* FIXME: Once EH migration is complete,
|
|
|
* generate sense data in this function,
|
|
|
* considering both err_mask and tf.
|
|
|
+ *
|
|
|
+ * There's no point in retrying invalid
|
|
|
+ * (detected by libata) and non-IO device
|
|
|
+ * errors (rejected by device). Finish them
|
|
|
+ * immediately.
|
|
|
*/
|
|
|
- if (qc->err_mask & AC_ERR_INVALID)
|
|
|
+ if ((qc->err_mask & AC_ERR_INVALID) ||
|
|
|
+ (!(qc->flags & ATA_QCFLAG_IO) &&
|
|
|
+ qc->err_mask == AC_ERR_DEV))
|
|
|
ata_eh_qc_complete(qc);
|
|
|
else
|
|
|
ata_eh_qc_retry(qc);
|