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; }
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; }
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; }
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; }