--- old/drivers/scsi/sata_qstor.c 2006-09-19 23:42:06.000000000 -0400 +++ linux/drivers/scsi/sata_qstor.c 2006-11-06 09:50:02.000000000 -0500 @@ -459,6 +459,7 @@ { struct ata_host_set *host_set = dev_instance; unsigned int handled = 0; + static int spurious = 0; VPRINTK("ENTER\n"); @@ -466,6 +467,20 @@ handled = qs_intr_pkt(host_set) | qs_intr_mmio(host_set); spin_unlock(&host_set->lock); + /* There are reports of at least one system with glitchy interrupts, + * and if we return !handled here for those then the kernel may totally + * disable our own IRQ line (duh!). + * So, try and be tolerant, but not *too* tolerant. + */ + if (!handled) { + if (spurious < 10) { + printk("sata_qstor: spurious=%d\n", spurious); + ++spurious; + handled = 1; + } + } else if (spurious) + --spurious; + VPRINTK("EXIT\n"); return IRQ_RETVAL(handled);