static int greth_open(struct net_device *dev) { struct greth_private *greth = netdev_priv(dev); int err; err = greth_init_rings(greth); if (err) { if (netif_msg_ifup(greth)) dev_err(&dev->dev, "Could not allocate memory for DMA rings\n"); return err; } err = request_irq(greth->irq, greth_interrupt, 0, "eth", (void *) dev); if (err) { if (netif_msg_ifup(greth)) dev_err(&dev->dev, "Could not allocate interrupt %d\n", dev->irq); greth_clean_rings(greth); return err; } if (netif_msg_ifup(greth)) dev_dbg(&dev->dev, " starting queue\n"); netif_start_queue(dev); GRETH_REGSAVE(greth->regs->status, 0xFF); napi_enable(&greth->napi); greth_enable_irqs(greth); greth_enable_tx(greth); greth_enable_rx(greth); return 0; }
static int greth_poll(struct napi_struct *napi, int budget) { struct greth_private *greth; int work_done = 0; greth = container_of(napi, struct greth_private, napi); if (greth->gbit_mac) { greth_clean_tx_gbit(greth->netdev); } else { greth_clean_tx(greth->netdev); } restart_poll: if (greth->gbit_mac) { work_done += greth_rx_gbit(greth->netdev, budget - work_done); } else { work_done += greth_rx(greth->netdev, budget - work_done); } if (work_done < budget) { napi_complete(napi); if (greth_pending_packets(greth)) { napi_reschedule(napi); goto restart_poll; } } greth_enable_irqs(greth); return work_done; }