diff --git a/drivers/scsi/libata-eh.c b/drivers/scsi/libata-eh.c
index 7244caff13a05fb7ee2be6da7de4356610a53139..750e734d1c0904124e1efb42e16cfe5af6e1fe78 100644
--- a/drivers/scsi/libata-eh.c
+++ b/drivers/scsi/libata-eh.c
@@ -1169,9 +1169,6 @@ static void ata_eh_autopsy(struct ata_port *ap)
 		/* inherit upper level err_mask */
 		qc->err_mask |= ehc->i.err_mask;
 
-		if (qc->err_mask & AC_ERR_TIMEOUT)
-			action |= ATA_EH_SOFTRESET;
-
 		/* analyze TF */
 		action |= ata_eh_analyze_tf(qc, &qc->result_tf);
 
@@ -1201,9 +1198,14 @@ static void ata_eh_autopsy(struct ata_port *ap)
 	if (failed_dev)
 		action |= ata_eh_speed_down(failed_dev, is_io, all_err_mask);
 
-	if (all_err_mask)
+	/* enforce default EH actions */
+	if (ap->flags & ATA_FLAG_FROZEN ||
+	    all_err_mask & (AC_ERR_HSM | AC_ERR_TIMEOUT))
+		action |= ATA_EH_SOFTRESET;
+	else if (all_err_mask)
 		action |= ATA_EH_REVALIDATE;
 
+	/* record autopsy result */
 	ehc->i.dev = failed_dev;
 	ehc->i.action = action;