From: "Nakajima, Jun" To get the vector-based interrupt handling work, we need to give the vector number to device drivers instead of the IRQ if IRQ < 16. It was not happening for SCI, and the patch fixes it. In many cases, the IRQ for SCI is 9, and the problem was not detected, but one particular machine exposed the bug. --- 25-akpm/arch/i386/kernel/acpi/boot.c | 10 +++++++++- 25-akpm/arch/i386/kernel/mpparse.c | 11 ++++------- 25-akpm/drivers/acpi/osl.c | 4 ++-- 25-akpm/include/asm-i386/acpi.h | 1 + 4 files changed, 16 insertions(+), 10 deletions(-) diff -puN arch/i386/kernel/acpi/boot.c~ia32-MSI-vector-handling-fix arch/i386/kernel/acpi/boot.c --- 25/arch/i386/kernel/acpi/boot.c~ia32-MSI-vector-handling-fix Thu Jan 15 14:49:07 2004 +++ 25-akpm/arch/i386/kernel/acpi/boot.c Thu Jan 15 14:49:07 2004 @@ -32,6 +32,7 @@ #include #include #include +#include #if defined (CONFIG_X86_LOCAL_APIC) #include @@ -311,7 +312,14 @@ __setup("acpi_pic_sci=", acpi_pic_sci_se #endif /* CONFIG_ACPI_BUS */ - +#ifdef CONFIG_X86_IO_APIC +int acpi_irq_to_vector(u32 irq) +{ + if (use_pci_vector() && !platform_legacy_irq(irq)) + irq = IO_APIC_VECTOR(irq); + return irq; +} +#endif static unsigned long __init acpi_scan_rsdp ( diff -puN arch/i386/kernel/mpparse.c~ia32-MSI-vector-handling-fix arch/i386/kernel/mpparse.c --- 25/arch/i386/kernel/mpparse.c~ia32-MSI-vector-handling-fix Thu Jan 15 14:49:07 2004 +++ 25-akpm/arch/i386/kernel/mpparse.c Thu Jan 15 14:49:07 2004 @@ -1126,7 +1126,8 @@ void __init mp_parse_prt (void) /* Don't set up the ACPI SCI because it's already set up */ if (acpi_fadt.sci_int == irq) { - entry->irq = irq; /*we still need to set entry's irq*/ + irq = acpi_irq_to_vector(irq); + entry->irq = irq; /* we still need to set entry's irq */ continue; } @@ -1156,18 +1157,14 @@ void __init mp_parse_prt (void) if ((1<irq = irq; + entry->irq = acpi_irq_to_vector(irq); continue; } mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<irq = irq; + entry->irq = acpi_irq_to_vector(irq); } printk(KERN_DEBUG "%02x:%02x:%02x[%c] -> %d-%d -> IRQ %d\n", entry->id.segment, entry->id.bus, diff -puN drivers/acpi/osl.c~ia32-MSI-vector-handling-fix drivers/acpi/osl.c --- 25/drivers/acpi/osl.c~ia32-MSI-vector-handling-fix Thu Jan 15 14:49:07 2004 +++ 25-akpm/drivers/acpi/osl.c Thu Jan 15 14:49:23 2004 @@ -249,7 +249,7 @@ acpi_os_install_interrupt_handler(u32 ir */ irq = acpi_fadt.sci_int; -#ifdef CONFIG_IA64 +#if defined(CONFIG_IA64) || defined(CONFIG_PCI_USE_VECTOR) irq = acpi_irq_to_vector(irq); if (irq < 0) { printk(KERN_ERR PREFIX "SCI (ACPI interrupt %d) not registered\n", @@ -272,7 +272,7 @@ acpi_status acpi_os_remove_interrupt_handler(u32 irq, OSD_HANDLER handler) { if (irq) { -#ifdef CONFIG_IA64 +#if defined(CONFIG_IA64) || defined(CONFIG_PCI_USE_VECTOR) irq = acpi_irq_to_vector(irq); #endif free_irq(irq, acpi_irq); diff -puN include/asm-i386/acpi.h~ia32-MSI-vector-handling-fix include/asm-i386/acpi.h --- 25/include/asm-i386/acpi.h~ia32-MSI-vector-handling-fix Thu Jan 15 14:49:07 2004 +++ 25-akpm/include/asm-i386/acpi.h Thu Jan 15 14:49:07 2004 @@ -116,6 +116,7 @@ extern int acpi_noirq; #ifdef CONFIG_X86_IO_APIC extern int skip_ioapic_setup; +extern int acpi_irq_to_vector(u32 irq); static inline void disable_ioapic_setup(void) { _