From: Pavel Machek This cleans up io_apic.c a bit -- I do not really like 4 copies of same code. Signed-off-by: Andrew Morton --- 25-akpm/arch/i386/kernel/io_apic.c | 65 ++++++++----------------------------- 1 files changed, 15 insertions(+), 50 deletions(-) diff -puN arch/i386/kernel/io_apic.c~cleanups-for-apic arch/i386/kernel/io_apic.c --- 25/arch/i386/kernel/io_apic.c~cleanups-for-apic 2004-05-25 20:39:42.199537624 -0700 +++ 25-akpm/arch/i386/kernel/io_apic.c 2004-05-25 20:39:42.204536864 -0700 @@ -41,8 +41,6 @@ #include "io_ports.h" -#undef APIC_LOCKUP_DEBUG - #define APIC_LOCKUP_DEBUG static spinlock_t ioapic_lock = SPIN_LOCK_UNLOCKED; @@ -127,8 +125,7 @@ static void __init replace_pin_at_irq(un } } -/* mask = 1 */ -static void __mask_IO_APIC_irq (unsigned int irq) +static inline void __modify_IO_APIC_irq (unsigned int irq, unsigned long enable, unsigned long disable) { int pin; struct irq_pin_list *entry = irq_2_pin + irq; @@ -139,71 +136,39 @@ static void __mask_IO_APIC_irq (unsigned if (pin == -1) break; reg = io_apic_read(entry->apic, 0x10 + pin*2); - io_apic_modify(entry->apic, 0x10 + pin*2, reg |= 0x00010000); + reg &= ~disable; + reg |= enable; + io_apic_modify(entry->apic, 0x10 + pin*2, reg); if (!entry->next) break; entry = irq_2_pin + entry->next; } - io_apic_sync(entry->apic); } -/* mask = 0 */ -static void __unmask_IO_APIC_irq (unsigned int irq) +/* mask = 1 */ +static void __mask_IO_APIC_irq (unsigned int irq) { - int pin; struct irq_pin_list *entry = irq_2_pin + irq; + __modify_IO_APIC_irq(irq, 0x00010000, 0); + io_apic_sync(entry->apic); /* Is it needed? Or do others need it too? */ +} - for (;;) { - unsigned int reg; - pin = entry->pin; - if (pin == -1) - break; - reg = io_apic_read(entry->apic, 0x10 + pin*2); - io_apic_modify(entry->apic, 0x10 + pin*2, reg &= 0xfffeffff); - if (!entry->next) - break; - entry = irq_2_pin + entry->next; - } +/* mask = 0 */ +static void __unmask_IO_APIC_irq (unsigned int irq) +{ + __modify_IO_APIC_irq(irq, 0, 0x00010000); } /* mask = 1, trigger = 0 */ static void __mask_and_edge_IO_APIC_irq (unsigned int irq) { - int pin; - struct irq_pin_list *entry = irq_2_pin + irq; - - for (;;) { - unsigned int reg; - pin = entry->pin; - if (pin == -1) - break; - reg = io_apic_read(entry->apic, 0x10 + pin*2); - reg = (reg & 0xffff7fff) | 0x00010000; - io_apic_modify(entry->apic, 0x10 + pin*2, reg); - if (!entry->next) - break; - entry = irq_2_pin + entry->next; - } + __modify_IO_APIC_irq(irq, 0x00010000, 0x00008000); } /* mask = 0, trigger = 1 */ static void __unmask_and_level_IO_APIC_irq (unsigned int irq) { - int pin; - struct irq_pin_list *entry = irq_2_pin + irq; - - for (;;) { - unsigned int reg; - pin = entry->pin; - if (pin == -1) - break; - reg = io_apic_read(entry->apic, 0x10 + pin*2); - reg = (reg & 0xfffeffff) | 0x00008000; - io_apic_modify(entry->apic, 0x10 + pin*2, reg); - if (!entry->next) - break; - entry = irq_2_pin + entry->next; - } + __modify_IO_APIC_irq(irq, 0x00008000, 0x00010000); } static void mask_IO_APIC_irq (unsigned int irq) _