static int cpsw_ndo_stop(struct net_device *ndev) { struct cpsw_priv *priv = netdev_priv(ndev); cpsw_info(priv, ifdown, "shutting down cpsw device\n"); cpsw_intr_disable(priv); cpdma_ctlr_int_ctrl(priv->dma, false); cpdma_ctlr_stop(priv->dma); netif_stop_queue(priv->ndev); napi_disable(&priv->napi); netif_carrier_off(priv->ndev); cpsw_ale_stop(priv->ale); for_each_slave(priv, cpsw_slave_stop, priv); clk_disable(priv->clk); return 0; }
int cpdma_ctlr_destroy(struct cpdma_ctlr *ctlr) { unsigned long flags; int ret = 0, i; if (!ctlr) return -EINVAL; spin_lock_irqsave(&ctlr->lock, flags); if (ctlr->state != CPDMA_STATE_IDLE) cpdma_ctlr_stop(ctlr); for (i = 0; i < ARRAY_SIZE(ctlr->channels); i++) cpdma_chan_destroy(ctlr->channels[i]); cpdma_desc_pool_destroy(ctlr->pool); spin_unlock_irqrestore(&ctlr->lock, flags); kfree(ctlr); return ret; }
int cpdma_ctlr_destroy(struct cpdma_ctlr *ctlr) { rtdm_lockctx_t context; int ret = 0, i; if (!ctlr) return -EINVAL; rtdm_lock_get_irqsave(&ctlr->lock, context); if (ctlr->state != CPDMA_STATE_IDLE) cpdma_ctlr_stop(ctlr); for (i = 0; i < ARRAY_SIZE(ctlr->channels); i++) { if (ctlr->channels[i]) cpdma_chan_destroy(ctlr->channels[i]); } cpdma_desc_pool_destroy(ctlr->pool); rtdm_lock_put_irqrestore(&ctlr->lock, context); kfree(ctlr); return ret; }