Modify all irq hw handler so that end() can work with probe_irq_on() and potentially SMP machines. Thanks to Jim Paris bug report. Jun diff -Nru oss-link/arch/mips/ddb5xxx/ddb5477/irq_5477.c.orig oss-link/arch/mips/ddb5xxx/ddb5477/irq_5477.c --- oss-link/arch/mips/ddb5xxx/ddb5477/irq_5477.c.orig Thu Oct 11 14:38:55 2001 +++ oss-link/arch/mips/ddb5xxx/ddb5477/irq_5477.c Tue Oct 30 10:35:55 2001 @@ -85,7 +85,8 @@ db_assert(irq >= vrc5477_irq_base); db_assert(irq < vrc5477_irq_base + NUM_5477_IRQ); - ll_vrc5477_irq_enable( irq - vrc5477_irq_base); + if(!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) + ll_vrc5477_irq_enable( irq - vrc5477_irq_base); } hw_irq_controller vrc5477_irq_controller = { diff -Nru oss-link/arch/mips/ddb5xxx/ddb5476/vrc5476_irq.c.orig oss-link/arch/mips/ddb5xxx/ddb5476/vrc5476_irq.c --- oss-link/arch/mips/ddb5xxx/ddb5476/vrc5476_irq.c.orig Thu Oct 11 14:38:55 2001 +++ oss-link/arch/mips/ddb5xxx/ddb5476/vrc5476_irq.c Tue Oct 30 10:38:29 2001 @@ -45,7 +45,11 @@ nile4_disable_irq(irq - irq_base); } -#define vrc5476_irq_end vrc5476_irq_enable +static void vrc5476_irq_end(uint irq) +{ + if(!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) + vrc5476_irq_enable(irq); +} static hw_irq_controller vrc5476_irq_controller = { "vrc5476", diff -Nru oss-link/arch/mips/kernel/irq_cpu.c.orig oss-link/arch/mips/kernel/irq_cpu.c --- oss-link/arch/mips/kernel/irq_cpu.c.orig Wed Sep 26 15:52:32 2001 +++ oss-link/arch/mips/kernel/irq_cpu.c Tue Oct 30 10:34:25 2001 @@ -65,7 +65,8 @@ static void mips_cpu_irq_end(unsigned int irq) { - mips_cpu_irq_enable(irq); + if(!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) + mips_cpu_irq_enable(irq); } static hw_irq_controller mips_cpu_irq_controller = { diff -Nru oss-link/arch/mips/vr4181/common/irq.c.orig oss-link/arch/mips/vr4181/common/irq.c --- oss-link/arch/mips/vr4181/common/irq.c.orig Tue Oct 2 16:27:11 2001 +++ oss-link/arch/mips/vr4181/common/irq.c Tue Oct 30 10:53:43 2001 @@ -77,7 +77,13 @@ #define sys_irq_shutdown sys_irq_disable #define sys_irq_ack sys_irq_disable -#define sys_irq_end sys_irq_enable + +static void +sys_irq_end(unsigned int irq) +{ + if(!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) + sys_irq_enable(); +} static hw_irq_controller sys_irq_controller = { "vr4181_sys_irq", @@ -148,7 +154,12 @@ } } -#define gpio_irq_end gpio_irq_enable +static void +gpio_irq_end(unsigned int irq) +{ + if(!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) + gpio_irq_enable(irq); +} static hw_irq_controller gpio_irq_controller = { "vr4181_gpio_irq",