# This is a BitKeeper generated patch for the following project: # Project Name: Linux kernel tree # This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas: # ChangeSet 1.1058.1.2 -> 1.1058.1.3 # arch/ia64/kernel/acpi.c 1.6.4.1 -> 1.6.4.2 # # The following is the BitKeeper ChangeSet Log # -------------------------------------------- # 03/08/05 kochi@hpc.bs1.fc.nec.co.jp 1.1058.1.3 # ia64: Fix ACPI interrupt polarity/trigger interpretation # # It seems that acpi_register_intr (in arch/ia64/kernel/acpi.c) # takes an interrupt polarity/trigger in opposite way. # Attached patch fixes this. Please apply. # # drivers/acpi/resource/rsirq.c decodes ACPI extended irq # resource and stores in edge_level and active_high_low members # of a structure (BTW, I think the names of these members # are source of confusion ;). # # And this logic in acpi.c inverts both polarity and trigger. # # vector = iosapic_register_intr(gsi, # polarity ? IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW, # mode ? IOSAPIC_EDGE : IOSAPIC_LEVEL); # # ACPI -> rsirq.c -> serial.c -> acpi.c -> iosapic.c # High 0 0 0 IOSAPIC_POL_LOW # Low 1 1 1 IOSAPIC_POL_HIGH # Edge 1 0 0 IOSAPIC_LEVEL # Level 0 1 1 IOSAPIC_EDGE # # As ACPI_ACTIVE_{HIGH,LOW} and ACPI_{LEVEL,EDGE}_SENSITIVE are # defined in acpi subsystem, it should be safer to use these symbols. # -------------------------------------------- # diff -Nru a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c --- a/arch/ia64/kernel/acpi.c Wed Oct 8 09:09:29 2003 +++ b/arch/ia64/kernel/acpi.c Wed Oct 8 09:09:29 2003 @@ -643,8 +643,9 @@ return 0; /* Turn it on */ - vector = iosapic_register_intr(gsi, polarity ? IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW, - mode ? IOSAPIC_EDGE : IOSAPIC_LEVEL); + vector = iosapic_register_intr(gsi, + (polarity == ACPI_ACTIVE_HIGH) ? IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW, + (mode == ACPI_EDGE_SENSITIVE) ? IOSAPIC_EDGE : IOSAPIC_LEVEL); return vector; }