From: "Nakajima, Jun" <jun.nakajima@intel.com>

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.  



---

 arch/i386/kernel/acpi/boot.c |   11 +++++++++--
 arch/i386/kernel/mpparse.c   |   11 ++++-------
 drivers/acpi/osl.c           |    4 ++--
 include/asm-i386/acpi.h      |    1 +
 4 files changed, 16 insertions(+), 11 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	2004-02-02 00:31:35.000000000 -0800
+++ 25-akpm/arch/i386/kernel/acpi/boot.c	2004-02-02 00:32:13.000000000 -0800
@@ -27,13 +27,13 @@
 #include <linux/config.h>
 #include <linux/acpi.h>
 #include <linux/efi.h>
+#include <linux/irq.h>
 #include <asm/pgalloc.h>
 #include <asm/io_apic.h>
 #include <asm/apic.h>
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/mpspec.h>
-#include <asm/irq.h>
 
 #if defined (CONFIG_X86_LOCAL_APIC)
 #include <mach_apic.h>
@@ -313,7 +313,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	2004-02-02 00:31:35.000000000 -0800
+++ 25-akpm/arch/i386/kernel/mpparse.c	2004-02-02 00:31:35.000000000 -0800
@@ -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<<bit) & mp_ioapic_routing[ioapic].pin_programmed[idx]) {
 			printk(KERN_DEBUG "Pin %d-%d already programmed\n",
 				mp_ioapic_routing[ioapic].apic_id, ioapic_pin);
- 			if (use_pci_vector() && !platform_legacy_irq(irq))
- 				irq = IO_APIC_VECTOR(irq);
- 			entry->irq = irq;
+ 			entry->irq = acpi_irq_to_vector(irq);
 			continue;
 		}
 
 		mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit);
 
 		if (!io_apic_set_pci_routing(ioapic, ioapic_pin, irq, edge_level, active_high_low)) {
- 			if (use_pci_vector() && !platform_legacy_irq(irq))
- 				irq = IO_APIC_VECTOR(irq);
- 			entry->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	2004-02-02 00:31:35.000000000 -0800
+++ 25-akpm/drivers/acpi/osl.c	2004-02-02 00:31:35.000000000 -0800
@@ -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	2004-02-02 00:31:35.000000000 -0800
+++ 25-akpm/include/asm-i386/acpi.h	2004-02-02 00:31:35.000000000 -0800
@@ -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)
 {

_