[PATCH] libata: enforce default EH actions
authorTejun Heo <htejun@gmail.com>
Tue, 16 May 2006 03:58:24 +0000 (12:58 +0900)
committerJeff Garzik <jeff@garzik.org>
Sat, 20 May 2006 04:39:08 +0000 (00:39 -0400)
LLDDs rely on libata that certain EH actions are automatically taken
on some errors.  If the port is frozen or one or more qc's have failed
with HSM violation or timeout, softreset is enforced (LLDD can ask for
storonger EH action at will).  If any other error condition exists,
libata EH always revalidates.

This behavior existed in earlier revisions of new EH but lost during
development process.  This patch restores it.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/scsi/libata-eh.c

index 7244caff13a05fb7ee2be6da7de4356610a53139..750e734d1c0904124e1efb42e16cfe5af6e1fe78 100644 (file)
@@ -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;