// a special frame around the default irq handler static irqreturn_t IRQHANDLER(pcan_pci_irqhandler, int irq, void *dev_id, struct pt_regs *regs) { struct pcandev *dev = (struct pcandev *)dev_id; int ret; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) ret = IRQHANDLER(sja1000_irqhandler, irq, dev_id, regs); #else IRQHANDLER(sja1000_irqhandler, irq, dev_id, regs); ret = 0; // supress warning about unused variable #endif pcan_pci_clear_stored_interrupt(dev); return PCAN_IRQ_RETVAL(ret); }
//---------------------------------------------------------------------------- // only one irq-handler per irq level for ISA shared interrupts static irqreturn_t IRQHANDLER(pcan_isa_irqhandler, int irq, void *dev_id, struct pt_regs *regs) { // loop the list of irq-handlers for all devices with the same // irq-level until at least all devices are one time idle. SAME_IRQ_LIST *my_anchor = (SAME_IRQ_LIST *)dev_id; struct list_head *ptr; struct pcandev *dev; int ret = 0; u16 loop_count = 0; u16 stop_count = 100; // DPRINTK(KERN_DEBUG "%s: pcan_isa_irqhandler(%p)\n", DEVICE_NAME, my_anchor); // loop over all ISA devices with same irq level for (ptr = my_anchor->same_irq_items.next; loop_count < my_anchor->same_irq_count; ptr = ptr->next) { if (ptr != &my_anchor->same_irq_items) { dev = ((SAME_IRQ_ITEM *)ptr)->dev; // DPRINTK(KERN_DEBUG "%s: dev=%p\n", DEVICE_NAME, dev); if (!IRQHANDLER(sja1000_base_irqhandler, irq, dev, regs)) loop_count++; else { ret = 1; loop_count = 0; // reset, I need at least my_anchor->same_irq_count loops without a pending request } if (!stop_count--) { printk(KERN_ERR "%s: Too much ISA interrupt load, processing halted!\n", DEVICE_NAME); break; } } } return PCAN_IRQ_RETVAL(ret); }
void EUSCIB3_IRQHandler( void ) { IRQHANDLER(3); }
void EUSCIB2_IRQHandler( void ) { IRQHANDLER(2); }
void EUSCIB1_IRQHandler( void ) { IRQHANDLER(1); }
void EUSCIB0_IRQHandler( void ) { IRQHANDLER(0); }
static void pcan_parport_irq_handler(void *dev_id) { IRQHANDLER(sja1000_irqhandler, 0, dev_id, NULL); }
static inline void IRQHANDLER(pcan_parport_irq_handler, int irq, void *dev_id, struct pt_regs *pt) { IRQHANDLER(sja1000_irqhandler, irq, dev_id, pt); }