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
|