[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Fix acknowledgement of level-triggered IOAPIC interrupts. This is a
ChangeSet 1.1433, 2005/05/10 17:45:22+01:00, kaf24@xxxxxxxxxxxxxxxxxxxx Fix acknowledgement of level-triggered IOAPIC interrupts. This is a second checkin, after disentangling from aborted and utterly broken PCI-MSI changes. Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> arch/x86/io_apic.c | 32 +++++++++++++++++++++++--------- include/asm-x86/io_apic.h | 2 -- 2 files changed, 23 insertions(+), 11 deletions(-) diff -Nru a/xen/arch/x86/io_apic.c b/xen/arch/x86/io_apic.c --- a/xen/arch/x86/io_apic.c 2005-05-10 13:04:05 -04:00 +++ b/xen/arch/x86/io_apic.c 2005-05-10 13:04:05 -04:00 @@ -145,16 +145,16 @@ __modify_IO_APIC_irq(irq, 0, 0x00010000); } -/* mask = 1, trigger = 0 */ -static void __mask_and_edge_IO_APIC_irq (unsigned int irq) +/* trigger = 0 */ +static void __edge_IO_APIC_irq (unsigned int irq) { - __modify_IO_APIC_irq(irq, 0x00010000, 0x00008000); + __modify_IO_APIC_irq(irq, 0, 0x00008000); } -/* mask = 0, trigger = 1 */ -static void __unmask_and_level_IO_APIC_irq (unsigned int irq) +/* trigger = 1 */ +static void __level_IO_APIC_irq (unsigned int irq) { - __modify_IO_APIC_irq(irq, 0x00008000, 0x00010000); + __modify_IO_APIC_irq(irq, 0x00008000, 0); } static void mask_IO_APIC_irq (unsigned int irq) @@ -1637,12 +1637,14 @@ return 0; /* don't check for pending */ } -static void end_level_ioapic_irq (unsigned int irq) +static void mask_and_ack_level_ioapic_irq (unsigned int irq) { unsigned long v; int i; move_irq(irq); + + mask_IO_APIC_irq(irq); /* * It appears there is an erratum which affects at least version 0x11 * of I/O APIC (that's the 82093AA and cores integrated into various @@ -1671,12 +1673,17 @@ if (!(v & (1 << (i & 0x1f)))) { atomic_inc(&irq_mis_count); spin_lock(&ioapic_lock); - __mask_and_edge_IO_APIC_irq(irq); - __unmask_and_level_IO_APIC_irq(irq); + __edge_IO_APIC_irq(irq); + __level_IO_APIC_irq(irq); spin_unlock(&ioapic_lock); } } +static void end_level_ioapic_irq (unsigned int irq) +{ + unmask_IO_APIC_irq(irq); +} + #ifdef CONFIG_PCI_MSI static unsigned int startup_edge_ioapic_vector(unsigned int vector) { @@ -1697,6 +1704,13 @@ int irq = vector_to_irq(vector); return startup_level_ioapic_irq (irq); +} + +static void mask_and_ack_level_ioapic_vector (unsigned int vector) +{ + int irq = vector_to_irq(vector); + + mask_and_ack_level_ioapic_irq(irq); } static void end_level_ioapic_vector (unsigned int vector) diff -Nru a/xen/include/asm-x86/io_apic.h b/xen/include/asm-x86/io_apic.h --- a/xen/include/asm-x86/io_apic.h 2005-05-10 13:04:05 -04:00 +++ b/xen/include/asm-x86/io_apic.h 2005-05-10 13:04:05 -04:00 @@ -17,7 +17,6 @@ #ifdef CONFIG_PCI_MSI static inline int use_pci_vector(void) {return 1;} static inline void disable_edge_ioapic_vector(unsigned int vector) { } -static inline void mask_and_ack_level_ioapic_vector(unsigned int vector) { } static inline void end_edge_ioapic_vector (unsigned int vector) { } #define startup_level_ioapic startup_level_ioapic_vector #define shutdown_level_ioapic mask_IO_APIC_vector @@ -36,7 +35,6 @@ #else static inline int use_pci_vector(void) {return 0;} static inline void disable_edge_ioapic_irq(unsigned int irq) { } -static inline void mask_and_ack_level_ioapic_irq(unsigned int irq) { } static inline void end_edge_ioapic_irq (unsigned int irq) { } #define startup_level_ioapic startup_level_ioapic_irq #define shutdown_level_ioapic mask_IO_APIC_irq _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |