From 357dd96aa0be69821a615ae7aeade1903ad5f4c3 Mon Sep 17 00:00:00 2001 From: Natalie Protasevich Date: Mon, 18 Oct 2004 18:11:32 -0700 Subject: [PATCH] [PATCH] Incorrect PCI interrupt assignment on ES7000 for platform GSI In arch/i386/kernel/acpi/boot.c, platform GSI does not propagate back from mp_register_gsi() to a calling routine which results in IRQ to be set for wrong GSI. This causes most of the PCI slots on the first PCI module to fail. This patch fixes the problem by returning new GSI back to acpi_register_gsi(). Signed-off-by: Natalie Protasevich Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- arch/i386/kernel/acpi/boot.c | 5 +++-- arch/i386/kernel/mpparse.c | 11 ++++++----- arch/x86_64/kernel/mpparse.c | 13 +++++++------ include/asm-i386/mpspec.h | 2 +- include/asm-x86_64/mpspec.h | 2 +- 5 files changed, 18 insertions(+), 15 deletions(-) diff --git a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c index 8a0536250dd33..4d60d9b9c3ac4 100644 --- a/arch/i386/kernel/acpi/boot.c +++ b/arch/i386/kernel/acpi/boot.c @@ -450,6 +450,7 @@ int acpi_gsi_to_irq(u32 gsi, unsigned int *irq) unsigned int acpi_register_gsi(u32 gsi, int edge_level, int active_high_low) { unsigned int irq; + unsigned int plat_gsi = gsi; #ifdef CONFIG_PCI /* @@ -471,10 +472,10 @@ unsigned int acpi_register_gsi(u32 gsi, int edge_level, int active_high_low) #ifdef CONFIG_X86_IO_APIC if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC) { - mp_register_gsi(gsi, edge_level, active_high_low); + plat_gsi = mp_register_gsi(gsi, edge_level, active_high_low); } #endif - acpi_gsi_to_irq(gsi, &irq); + acpi_gsi_to_irq(plat_gsi, &irq); return irq; } EXPORT_SYMBOL(acpi_register_gsi); diff --git a/arch/i386/kernel/mpparse.c b/arch/i386/kernel/mpparse.c index 41cb82604f7f8..8b6c7e8187af1 100644 --- a/arch/i386/kernel/mpparse.c +++ b/arch/i386/kernel/mpparse.c @@ -1051,7 +1051,7 @@ void __init mp_config_acpi_legacy_irqs (void) int (*platform_rename_gsi)(int ioapic, int gsi); -void mp_register_gsi (u32 gsi, int edge_level, int active_high_low) +int mp_register_gsi (u32 gsi, int edge_level, int active_high_low) { int ioapic = -1; int ioapic_pin = 0; @@ -1060,13 +1060,13 @@ void mp_register_gsi (u32 gsi, int edge_level, int active_high_low) #ifdef CONFIG_ACPI_BUS /* Don't set up the ACPI SCI because it's already set up */ if (acpi_fadt.sci_int == gsi) - return; + return gsi; #endif ioapic = mp_find_ioapic(gsi); if (ioapic < 0) { printk(KERN_WARNING "No IOAPIC for GSI %u\n", gsi); - return; + return gsi; } ioapic_pin = gsi - mp_ioapic_routing[ioapic].gsi_base; @@ -1085,12 +1085,12 @@ void mp_register_gsi (u32 gsi, int edge_level, int active_high_low) printk(KERN_ERR "Invalid reference to IOAPIC pin " "%d-%d\n", mp_ioapic_routing[ioapic].apic_id, ioapic_pin); - return; + return gsi; } if ((1<