// 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);
}
Example #3
0
 void EUSCIB3_IRQHandler( void ) 
 {
     IRQHANDLER(3);
 }
Example #4
0
 void EUSCIB2_IRQHandler( void ) 
 {
     IRQHANDLER(2);
 }
Example #5
0
	void EUSCIB1_IRQHandler( void ) 
	{
		IRQHANDLER(1);
	}
Example #6
0
 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);
}