dwc_eth_qos: release descriptors outside netif_tx_lock
authorLars Persson <lars.persson@axis.com>
Mon, 29 Feb 2016 15:22:31 +0000 (16:22 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 2 Mar 2016 19:57:14 +0000 (14:57 -0500)
To prepare for using the CMA, we can not be in atomic context when
de-allocating DMA buffers.

The tx lock was needed only to protect the hw reset against the xmit
handler. Now we briefly grab the tx lock while stopping the queue to
make sure no thread is inside or will enter the xmit handler.

Signed-off-by: Lars Persson <larper@axis.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/synopsys/dwc_eth_qos.c

index 926db2d58fb58159b747cf0b3013891f85ece501..53d48c0f41bc18ddbfabba8c136d0d88babe3cef 100644 (file)
@@ -1918,15 +1918,17 @@ static int dwceqos_stop(struct net_device *ndev)
        phy_stop(lp->phy_dev);
 
        tasklet_disable(&lp->tx_bdreclaim_tasklet);
-       netif_stop_queue(ndev);
        napi_disable(&lp->napi);
 
-       dwceqos_drain_dma(lp);
+       /* Stop all tx before we drain the tx dma. */
+       netif_tx_lock_bh(lp->ndev);
+       netif_stop_queue(ndev);
+       netif_tx_unlock_bh(lp->ndev);
 
-       netif_tx_lock(lp->ndev);
+       dwceqos_drain_dma(lp);
        dwceqos_reset_hw(lp);
+
        dwceqos_descriptor_free(lp);
-       netif_tx_unlock(lp->ndev);
 
        return 0;
 }