static void startrecv586(struct net_device *dev) { struct priv *p = netdev_priv(dev); wait_for_scb_cmd(dev); wait_for_scb_cmd_ruc(dev); writew(make16(p->rfd_first), &p->scb->rfa_offset); writeb(RUC_START, &p->scb->cmd_ruc); ni_attn586(); /* */ wait_for_scb_cmd_ruc(dev); /* */ }
static void startrecv586(struct net_device *dev) { struct priv *p = (struct priv *) dev->priv; wait_for_scb_cmd(dev); wait_for_scb_cmd_ruc(dev); writew(make16(p->rfd_first), &p->scb->rfa_offset); writeb(RUC_START, &p->scb->cmd_ruc); ni_attn586(); /* start cmd. */ wait_for_scb_cmd_ruc(dev); /* wait for accept cmd. (no timeout!!) */ }
static void ni52_rnr_int(struct net_device *dev) { struct priv *p = netdev_priv(dev); dev->stats.rx_errors++; wait_for_scb_cmd(dev); /* */ writeb(RUC_ABORT, &p->scb->cmd_ruc); /* */ ni_attn586(); wait_for_scb_cmd_ruc(dev); /* */ alloc_rfa(dev, p->rfd_first); /* */ startrecv586(dev); /* */ printk(KERN_ERR "%s: Receive-Unit restarted. Status: %04x\n", dev->name, readb(&p->scb->rus)); }
static void ni52_rnr_int(struct net_device *dev) { struct priv *p = netdev_priv(dev); p->stats.rx_errors++; wait_for_scb_cmd(dev); /* wait for the last cmd, WAIT_4_FULLSTAT?? */ writeb(RUC_ABORT, &p->scb->cmd_ruc); /* usually the RU is in the 'no resource'-state .. abort it now. */ ni_attn586(); wait_for_scb_cmd_ruc(dev); /* wait for accept cmd. */ alloc_rfa(dev, p->rfd_first); /* maybe add a check here, before restarting the RU */ startrecv586(dev); /* restart RU */ printk(KERN_ERR "%s: Receive-Unit restarted. Status: %04x\n", dev->name, readb(&p->scb->rus)); }
static void ni52_rcv_int(struct net_device *dev) { int status, cnt = 0; unsigned short totlen; struct sk_buff *skb; struct rbd_struct __iomem *rbd; struct priv *p = netdev_priv(dev); if (debuglevel > 0) printk("R"); for (; (status = readb(&p->rfd_top->stat_high)) & RFD_COMPL;) { rbd = make32(readw(&p->rfd_top->rbd_offset)); if (status & RFD_OK) { /* */ totlen = readw(&rbd->status); if (totlen & RBD_LAST) { /* */ totlen &= RBD_MASK; /* */ writew(0x00, &rbd->status); skb = netdev_alloc_skb(dev, totlen + 2); if (skb != NULL) { skb_reserve(skb, 2); skb_put(skb, totlen); memcpy_fromio(skb->data, p->base + readl(&rbd->buffer), totlen); skb->protocol = eth_type_trans(skb, dev); netif_rx(skb); dev->stats.rx_packets++; dev->stats.rx_bytes += totlen; } else dev->stats.rx_dropped++; } else { int rstat; /* */ totlen = 0; while (!((rstat = readw(&rbd->status)) & RBD_LAST)) { totlen += rstat & RBD_MASK; if (!rstat) { printk(KERN_ERR "%s: Whoops .. no end mark in RBD list\n", dev->name); break; } writew(0, &rbd->status); rbd = make32(readw(&rbd->next)); } totlen += rstat & RBD_MASK; writew(0, &rbd->status); printk(KERN_ERR "%s: received oversized frame! length: %d\n", dev->name, totlen); dev->stats.rx_dropped++; } } else {/* */ printk(KERN_ERR "%s: oops! rfd-error-status: %04x\n", dev->name, status); dev->stats.rx_errors++; } writeb(0, &p->rfd_top->stat_high); writeb(RFD_SUSP, &p->rfd_top->last); /* */ writew(0xffff, &p->rfd_top->rbd_offset); writeb(0, &p->rfd_last->last); /* */ p->rfd_last = p->rfd_top; p->rfd_top = make32(readw(&p->rfd_top->next)); /* */ writew(make16(p->rfd_top), &p->scb->rfa_offset); if (debuglevel > 0) printk("%d", cnt++); } if (automatic_resume) { wait_for_scb_cmd(dev); writeb(RUC_RESUME, &p->scb->cmd_ruc); ni_attn586(); wait_for_scb_cmd_ruc(dev); } #ifdef WAIT_4_BUSY { int i; for (i = 0; i < 1024; i++) { if (p->rfd_top->status) break; udelay(16); if (i == 1023) printk(KERN_ERR "%s: RU hasn't fetched next RFD (not busy/complete)\n", dev->name); } } #endif if (debuglevel > 0) printk("r"); }
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; }