[libata sata_mv] handle lack of hardware nIEN support
authorJeff Garzik <jgarzik@pobox.com>
Thu, 17 Nov 2005 10:44:44 +0000 (05:44 -0500)
committerJeff Garzik <jgarzik@pobox.com>
Thu, 17 Nov 2005 10:44:44 +0000 (05:44 -0500)
Handle errata (it was unintentional on this h/w, whereas its intentional
on others) whereby the nIEN bit in Device Control is ignored, leading to
a situation where a hardware interrupt completes the qc before the
polling code has a chance to.

This will get fixed The Right Way(tm) once Albert Lee's irq-pio
branch is merged, as the more natural PIO method on this hardware is
interrupt-driven.

drivers/scsi/sata_mv.c

index ee0634da08720f4054f3e49f4bd1ac2570e7b335..ac184e60797e5f1ffe055c999d648cd06e58c557 100644 (file)
@@ -1219,6 +1219,10 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant,
                        handled++;
                }
 
+               if (ap &&
+                   (ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR)))
+                       continue;
+
                err_mask = ac_err_mask(ata_status);
 
                shift = port << 1;              /* (port * 2) */
@@ -1237,7 +1241,8 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant,
                                VPRINTK("port %u IRQ found for qc, "
                                        "ata_status 0x%x\n", port,ata_status);
                                /* mark qc status appropriately */
-                               ata_qc_complete(qc, err_mask);
+                               if (!(qc->tf.ctl & ATA_NIEN))
+                                       ata_qc_complete(qc, err_mask);
                        }
                }
        }