Example #1
0
static void ni52_interrupt(int irq,struct pt_regs *reg_ptr)
{
  struct device *dev = (struct device *) irq2dev_map[irq];
  unsigned short stat;
  struct priv *p;

  if (dev == NULL) {
    printk ("ni52-interrupt: irq %d for unknown device.\n",(int) -(((struct pt_regs *)reg_ptr)->orig_eax+2));
    return;
  }
  p = (struct priv *) dev->priv;

  dev->interrupt = 1;

  while((stat=p->scb->status & STAT_MASK))
  {
    p->scb->cmd = stat;
    ni_attn586(); /* ack inter. */

   if(stat & STAT_CX)    /* command with I-bit set complete */
      ni52_xmt_int(dev);

    if(stat & STAT_FR)   /* received a frame */
      ni52_rcv_int(dev);

#ifndef NO_NOPCOMMANDS
    if(stat & STAT_CNA)  /* CU went 'not ready' */
    {
      if(dev->start)
        printk("%s: oops! CU has left active state. stat: %04x/%04x.\n",dev->name,(int) stat,(int) p->scb->status);
    }
#endif

    if(stat & STAT_RNR) /* RU went 'not ready' */
    {
      if(p->scb->status & RU_SUSPEND) /* special case: RU_SUSPEND */
      {
        WAIT_4_SCB_CMD();
        p->scb->cmd = RUC_RESUME;
        ni_attn586();
      }
      else
      {
        printk("%s: Receiver-Unit went 'NOT READY': %04x/%04x.\n",dev->name,(int) stat,(int) p->scb->status);
        ni52_rnr_int(dev); 
      }
    }
    WAIT_4_SCB_CMD(); /* wait for ack. (ni52_xmt_int can be faster than ack!!) */
    if(p->scb->cmd)   /* timed out? */
      break;
  }

  dev->interrupt = 0;
}
Example #2
0
static irqreturn_t ni52_interrupt(int irq,void *dev_id,struct pt_regs *reg_ptr)
{
	struct net_device *dev = dev_id;
	unsigned short stat;
	int cnt=0;
	struct priv *p;

	if (!dev) {
		printk ("ni5210-interrupt: irq %d for unknown device.\n",irq);
		return IRQ_NONE;
	}
	p = (struct priv *) dev->priv;

	if(debuglevel > 1)
		printk("I");

	WAIT_4_SCB_CMD(); /* wait for last command	*/

	while((stat=p->scb->cus & STAT_MASK))
	{
		p->scb->cmd_cuc = stat;
		ni_attn586();

		if(stat & STAT_FR)	 /* received a frame */
			ni52_rcv_int(dev);

		if(stat & STAT_RNR) /* RU went 'not ready' */
		{
			printk("(R)");
			if(p->scb->rus & RU_SUSPEND) /* special case: RU_SUSPEND */
			{
				WAIT_4_SCB_CMD();
				p->scb->cmd_ruc = RUC_RESUME;
				ni_attn586();
				WAIT_4_SCB_CMD_RUC();
			}
			else
			{
				printk("%s: Receiver-Unit went 'NOT READY': %04x/%02x.\n",dev->name,(int) stat,(int) p->scb->rus);
				ni52_rnr_int(dev);
			}
		}

		if(stat & STAT_CX)		/* command with I-bit set complete */
			 ni52_xmt_int(dev);

#ifndef NO_NOPCOMMANDS
		if(stat & STAT_CNA)	/* CU went 'not ready' */
		{
			if(netif_running(dev))
				printk("%s: oops! CU has left active state. stat: %04x/%02x.\n",dev->name,(int) stat,(int) p->scb->cus);
		}
#endif

		if(debuglevel > 1)
			printk("%d",cnt++);

		WAIT_4_SCB_CMD(); /* wait for ack. (ni52_xmt_int can be faster than ack!!) */
		if(p->scb->cmd_cuc)	 /* timed out? */
		{
			printk("%s: Acknowledge timed out.\n",dev->name);
			ni_disint();
			break;
		}
	}

	if(debuglevel > 1)
		printk("i");
	return IRQ_HANDLED;
}
Example #3
0
static irqreturn_t ni52_interrupt(int irq, void *dev_id)
{
	struct net_device *dev = dev_id;
	unsigned int stat;
	int cnt = 0;
	struct priv *p;

	p = netdev_priv(dev);

	if (debuglevel > 1)
		printk("I");

	spin_lock(&p->spinlock);

	wait_for_scb_cmd(dev); /*                       */

	while ((stat = readb(&p->scb->cus) & STAT_MASK)) {
		writeb(stat, &p->scb->cmd_cuc);
		ni_attn586();

		if (stat & STAT_FR)	 /*                  */
			ni52_rcv_int(dev);

		if (stat & STAT_RNR) { /*                     */
			printk("(R)");
			if (readb(&p->scb->rus) & RU_SUSPEND) {
				/*                          */
				wait_for_scb_cmd(dev);
				writeb(RUC_RESUME, &p->scb->cmd_ruc);
				ni_attn586();
				wait_for_scb_cmd_ruc(dev);
			} else {
				printk(KERN_ERR "%s: Receiver-Unit went 'NOT READY': %04x/%02x.\n",
					dev->name, stat, readb(&p->scb->rus));
				ni52_rnr_int(dev);
			}
		}

		/*                                 */
		if (stat & STAT_CX)
			 ni52_xmt_int(dev);

#ifndef NO_NOPCOMMANDS
		if (stat & STAT_CNA) {	/*                     */
			if (netif_running(dev))
				printk(KERN_ERR "%s: oops! CU has left active state. stat: %04x/%02x.\n",
					dev->name, stat, readb(&p->scb->cus));
		}
#endif

		if (debuglevel > 1)
			printk("%d", cnt++);

		/*                                                       */
		wait_for_scb_cmd(dev);
		if (readb(&p->scb->cmd_cuc)) {	 /*            */
			printk(KERN_ERR "%s: Acknowledge timed out.\n",
				dev->name);
			ni_disint();
			break;
		}
	}
	spin_unlock(&p->spinlock);

	if (debuglevel > 1)
		printk("i");
	return IRQ_HANDLED;
}
Example #4
0
static void ni52_interrupt(int reg_ptr)
{
  struct device *dev = (struct device *) irq2dev_map[-((struct pt_regs *)reg_ptr)->orig_eax-2];
  unsigned short stat;
  int pd = 0;
  struct priv *p;

#ifdef DEBUG2
  printk("(1)");
#endif

  if (dev == NULL) {
    printk ("ni52-interrupt: irq %d for unknown device.\n",(int) -(((struct pt_regs *)reg_ptr)->orig_eax+2));
    return;
  }
  p = (struct priv *) dev->priv;

  if(dev->interrupt)
  {
    printk("(ni52-I)");
    return;
  }

  dev->interrupt = 1;

  while((stat=p->scb->status & STAT_MASK))
  {
    p->scb->cmd = stat;
    ni_attn586(); /* ack inter. */

    if(pd) 
      printk("ni52-%04x/%04x-",(int) stat,(int) p->scb->status); /* debug */

    if(stat & (STAT_FR | STAT_RNR)) 
      ni52_rcv_int(dev);

    if(stat & STAT_CX) 
      ni52_xmt_int(dev);

#ifndef NO_NOPCOMMANDS
    if(stat & STAT_CNA)
#else
    if( (stat & STAT_CNA) && !(stat & STAT_CX) )
#endif
      printk("%s: oops! CU has left active state. stat: %04x/%04x.\n",dev->name,(int) stat,(int) p->scb->status);

    if(stat & STAT_RNR)
    {
      printk("%s: rnr: %04x/%04x.\n",dev->name,(int) stat,(int) p->scb->status);
      ni52_rnr_int(dev); 
      pd = 1; /* local debug on */
    }

#ifdef DEBUG2
    pd++;
#endif

    while(p->scb->cmd)
    {
      int i; /* wait for ack. (ni52_xmt_int can be faster than ack!!) */
      for(i=0;i<200;i++);
    }
  }

#ifdef DEBUG
  {
    static int old_ovr=0;
    int l;
    if((l = p->scb->ovrn_errs - old_ovr))
    {
      if(l > 0)
        p->stats.rx_over_errors += l;
      else
        old_ovr=0;
    }
  }
#endif

#ifdef DEBUG2
  printk("(2)");
#endif

  dev->interrupt = 0;
}