diff -Naur a/drivers/soc/asic3_base.c b/drivers/soc/asic3_base.c --- a/drivers/soc/asic3_base.c 2007-02-16 09:07:09.000000000 +0100 +++ b/drivers/soc/asic3_base.c 2007-02-16 17:58:21.000000000 +0100 @@ -432,7 +432,8 @@ static void asic3_irq_demux (unsigned int irq, struct irq_desc *desc) { - int i; + int i, loop; + u32 status; struct asic3_data *asic; /* Acknowledge the parrent (i.e. CPU's) IRQ */ @@ -440,9 +441,8 @@ asic = desc->handler_data; - // printk( KERN_NOTICE "asic3_irq_demux: irq=%d\n", irq ); - for (i = 0 ; i < MAX_ASIC_ISR_LOOPS; i++) { - u32 status; +// printk( KERN_NOTICE "asic3_irq_demux: irq=%d\n", irq ); + for (loop = 0 ; loop < MAX_ASIC_ISR_LOOPS; loop++) { int bank; status = __asic3_read_register (asic, _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_PIntStat); @@ -452,7 +452,7 @@ for (bank = 0; bank < 4; bank++) { if (status & (1 << bank)) { - unsigned long base, i, istat; + unsigned long base, istat; base = _IPAQ_ASIC3_GPIO_A_Base + (bank * (_IPAQ_ASIC3_GPIO_B_Base - _IPAQ_ASIC3_GPIO_A_Base)); istat = __asic3_read_register (asic, base + _IPAQ_ASIC3_GPIO_IntStatus); @@ -480,22 +480,18 @@ } /* Handle remaining IRQs in the status register */ - { - int i; - - for (i = ASIC3_LED0_IRQ; i <= ASIC3_OWM_IRQ; i++) { - /* They start at bit 4 and go up */ - if (status & (1 << (i - ASIC3_LED0_IRQ + 4))) { - desc = irq_desc + asic->irq_base + i; - desc->handle_irq (asic->irq_base + i, desc); - } + for (i = ASIC3_LED0_IRQ; i <= ASIC3_OWM_IRQ; i++) { + /* They start at bit 4 and go up */ + if (status & (1 << (i - ASIC3_LED0_IRQ + 4))) { + desc = irq_desc + asic->irq_base + i; + desc->handle_irq (asic->irq_base + i, desc); } } } - if (i >= MAX_ASIC_ISR_LOOPS) - printk("%s: interrupt processing overrun\n", __FUNCTION__); + if (loop >= MAX_ASIC_ISR_LOOPS && status) + printk("%s: interrupt processing overrun, pending=0x%x\n", __FUNCTION__, status); } static inline int