--- 2.2.11/arch/i386/kernel/irq.c Thu Aug 12 02:32:28 1999 +++ /tmp/irq.c Mon Aug 16 19:26:32 1999 @@ -969,14 +969,25 @@ 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 + * now, set as autodetect any unassigned irqs */ spin_lock_irq(&irq_controller_lock); for (i = NR_IRQS-1; i > 0; i--) { if (!irq_desc[i].action) { irq_desc[i].status |= IRQ_AUTODETECT | IRQ_WAITING; - irq_desc[i].handler->startup(i); } } spin_unlock_irq(&irq_controller_lock);