From: "Maciej W. Rozycki" There's a bug in Linux's ACPI IRQ setup as I've discovered by comparing the code to the spec. --- arch/i386/kernel/mpparse.c | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-) diff -puN arch/i386/kernel/mpparse.c~nforce-irq-setup-fix arch/i386/kernel/mpparse.c --- 25/arch/i386/kernel/mpparse.c~nforce-irq-setup-fix 2004-02-06 15:55:04.000000000 -0800 +++ 25-akpm/arch/i386/kernel/mpparse.c 2004-02-06 15:55:04.000000000 -0800 @@ -940,7 +940,7 @@ void __init mp_override_legacy_irq ( * erroneously sets the trigger to level, resulting in a HUGE * increase of timer interrupts! */ - if ((bus_irq == 0) && (global_irq == 2) && (trigger == 3)) + if ((bus_irq == 0) && (trigger == 3)) trigger = 1; intsrc.mpc_type = MP_INTSRC; @@ -961,7 +961,7 @@ void __init mp_override_legacy_irq ( * Otherwise create a new entry (e.g. global_irq == 2). */ for (i = 0; i < mp_irq_entries; i++) { - if ((mp_irqs[i].mpc_dstapic == intsrc.mpc_dstapic) + if ((mp_irqs[i].mpc_srcbus == intsrc.mpc_srcbus) && (mp_irqs[i].mpc_srcbusirq == intsrc.mpc_srcbusirq)) { mp_irqs[i] = intsrc; found = 1; @@ -1008,9 +1008,10 @@ void __init mp_config_acpi_legacy_irqs ( */ for (i = 0; i < 16; i++) { - if (i == 2) continue; /* Don't connect IRQ2 */ + if (i == 2) + continue; /* Don't connect IRQ2 */ - intsrc.mpc_irqtype = i ? mp_INT : mp_ExtINT; /* 8259A to #0 */ + intsrc.mpc_irqtype = mp_INT; intsrc.mpc_srcbusirq = i; /* Identity mapped */ intsrc.mpc_dstirq = i; _