struct candevice_t *candev=chip->hostdevice;
int i;
unsigned long icr;
+ int test_irq_again;
icr=readl(candev->dev_base_addr + PITA2_ICR);
- if(!(icr & PITA2_ICR_INT0)) return IRQ_NONE;
+ if(!(icr & PITA2_ICR_INT0)) return CAN_IRQ_NONE;
/* correct way to handle interrupts from all chips connected to the one PITA-2 */
do {
writel(PITA2_ICR_INT0_En | PITA2_ICR_INT0, candev->dev_base_addr + PITA2_ICR);
+ test_irq_again=0;
for(i=0;i<candev->nr_all_chips;i++){
chip=candev->chip[i];
if(!chip || !(chip->flags&CHIP_CONFIGURED))
continue;
- sja1000p_irq_handler(irq, chip, regs);
+ if(sja1000p_irq_handler(irq, chip, regs))
+ test_irq_again=1;
}
icr=readl(candev->dev_base_addr + PITA2_ICR);
- } while(icr & PITA2_ICR_INT0);
- return IRQ_HANDLED;
+ } while((icr & PITA2_ICR_INT0)||test_irq_again);
+ return CAN_IRQ_HANDLED;
}
int ems_cpcpci_reset(struct candevice_t *candev)