sata_sil: ignore and clear spurious IRQs while executing commands by polling
authorTejun Heo <htejun@gmail.com>
Sat, 24 Feb 2007 13:30:36 +0000 (22:30 +0900)
committerJeff Garzik <jeff@garzik.org>
Sun, 25 Feb 2007 01:52:12 +0000 (20:52 -0500)
sata_sil used to trigger HSM error if IRQ occurs during polling
command.  This didn't matter because polling wasn't used in sata_sil.
However, as of 2.6.20, all IDENTIFYs are performed by polling and
device detection sometimes fails due to spurious IRQ.  This patch
makes sata_sil ignore and clear spurious IRQ while executing commands
by polling.

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

index 14872556334be81d96df55ccff435e4dd5ba22db..aaff357db5f52b01eea9f16c3781e9e61e3466bc 100644 (file)
@@ -386,9 +386,15 @@ static void sil_host_intr(struct ata_port *ap, u32 bmdma2)
                goto freeze;
        }
 
-       if (unlikely(!qc || qc->tf.ctl & ATA_NIEN))
+       if (unlikely(!qc))
                goto freeze;
 
+       if (unlikely(qc->tf.flags & ATA_TFLAG_POLLING)) {
+               /* this sometimes happens, just clear IRQ */
+               ata_chk_status(ap);
+               return;
+       }
+
        /* Check whether we are expecting interrupt in this state */
        switch (ap->hsm_task_state) {
        case HSM_ST_FIRST: