static void diva_irq_ipacx_pci(int intno, void *dev_id, struct pt_regs *regs) { struct IsdnCardState *cs = dev_id; u_char val; u_char *cfg; if (!cs) { printk(KERN_WARNING "Diva: Spurious interrupt!\n"); return; } cfg = (u_char *) cs->hw.diva.pci_cfg; val = *cfg; if (!(val &PITA_INT0_STATUS)) return; // other shared IRQ interrupt_ipacx(cs); // handler for chip *cfg = PITA_INT0_STATUS; // Reset PLX interrupt }
static irqreturn_t diva_irq_ipacx_pci(int intno, void *dev_id) { struct IsdnCardState *cs = dev_id; u_char val; u_char *cfg; u_long flags; spin_lock_irqsave(&cs->lock, flags); cfg = (u_char *) cs->hw.diva.pci_cfg; val = *cfg; if (!(val & PITA_INT0_STATUS)) { spin_unlock_irqrestore(&cs->lock, flags); return IRQ_NONE; // other shared IRQ } interrupt_ipacx(cs); // handler for chip *cfg = PITA_INT0_STATUS; // Reset PLX interrupt spin_unlock_irqrestore(&cs->lock, flags); return IRQ_HANDLED; }