static int hss_hdlc_close(struct net_device *dev) { struct port *port = dev_to_port(dev); unsigned long flags; int i, buffs = RX_DESCS; spin_lock_irqsave(&npe_lock, flags); ports_open--; qmgr_disable_irq(queue_ids[port->id].rx); netif_stop_queue(dev); napi_disable(&port->napi); hss_stop_hdlc(port); while (queue_get_desc(queue_ids[port->id].rxfree, port, 0) >= 0) buffs--; while (queue_get_desc(queue_ids[port->id].rx, port, 0) >= 0) buffs--; if (buffs) netdev_crit(dev, "unable to drain RX queue, %i buffer(s) left in NPE\n", buffs); buffs = TX_DESCS; while (queue_get_desc(queue_ids[port->id].tx, port, 1) >= 0) buffs--; i = 0; do { while (queue_get_desc(port->plat->txreadyq, port, 1) >= 0) buffs--; if (!buffs) break; } while (++i < MAX_CLOSE_WAIT); if (buffs) netdev_crit(dev, "unable to drain TX queue, %i buffer(s) left in NPE\n", buffs); #if DEBUG_CLOSE if (!buffs) printk(KERN_DEBUG "Draining TX queues took %i cycles\n", i); #endif qmgr_disable_irq(queue_ids[port->id].txdone); if (port->plat->close) port->plat->close(port->id, dev); spin_unlock_irqrestore(&npe_lock, flags); destroy_hdlc_queues(port); release_hdlc_queues(port); hdlc_close(dev); return 0; }
static int bcmgenet_poll_wol_status(struct bcmgenet_priv *priv) { struct net_device *dev = priv->dev; int retries = 0; while (!(bcmgenet_rbuf_readl(priv, RBUF_STATUS) & RBUF_STATUS_WOL)) { retries++; if (retries > 5) { netdev_crit(dev, "polling wol mode timeout\n"); return -ETIMEDOUT; } mdelay(1); } return retries; }