diff -urN 2.3.14-pre2/arch/i386/kernel/irq.c 2.3.14-pre2-probeirq/arch/i386/kernel/irq.c --- 2.3.14-pre2/arch/i386/kernel/irq.c Thu Aug 12 02:53:17 1999 +++ 2.3.14-pre2-probeirq/arch/i386/kernel/irq.c Thu Aug 19 01:37:05 1999 @@ -960,8 +960,24 @@ unsigned int i; unsigned long delay; + /* + * something may have generated an irq long ago and we want to + * flush such a longstanding irq before considering it as spurious. + */ + spin_lock_irq(&irq_controller_lock); + for (i = NR_IRQS-1; i > 0; i--) + if (!irq_desc[i].action) + irq_desc[i].handler->startup(i); + spin_unlock_irq(&irq_controller_lock); + + /* Wait for longstanding interrupts to trigger. */ + for (delay = jiffies + HZ/50; time_after(delay, jiffies); ) + /* about 20ms delay */ synchronize_irq(); + /* - * first, enable any unassigned irqs + * enable any unassigned irqs + * (we must startup again here because if a longstanding irq + * happened in the previous stage, it may have masked itself) */ spin_lock_irq(&irq_controller_lock); for (i = NR_IRQS-1; i > 0; i--) {