amd-xgbe: Call netif_napi_del on ndo_stop operation
authorLendacky, Thomas <Thomas.Lendacky@amd.com>
Wed, 2 Jul 2014 18:04:40 +0000 (13:04 -0500)
committerDavid S. Miller <davem@davemloft.net>
Tue, 8 Jul 2014 04:38:06 +0000 (21:38 -0700)
Currently the napi context is added using netif_napi_add each time
the ndo_open operation is called.  However, there is not a
corresponding netif_napi_del call during the ndo_stop operation. If
the device ndo_open operation was called more than once an infinite
loop occurs during module unload.  Add a call to netif_napi_del during
the ndo_stop operation.

Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/amd/xgbe/xgbe-drv.c

index 72dd611..b5fdf66 100644 (file)
@@ -412,9 +412,12 @@ static void xgbe_napi_enable(struct xgbe_prv_data *pdata, unsigned int add)
        napi_enable(&pdata->napi);
 }
 
-static void xgbe_napi_disable(struct xgbe_prv_data *pdata)
+static void xgbe_napi_disable(struct xgbe_prv_data *pdata, unsigned int del)
 {
        napi_disable(&pdata->napi);
+
+       if (del)
+               netif_napi_del(&pdata->napi);
 }
 
 void xgbe_init_tx_coalesce(struct xgbe_prv_data *pdata)
@@ -518,7 +521,7 @@ int xgbe_powerdown(struct net_device *netdev, unsigned int caller)
                netif_device_detach(netdev);
 
        netif_tx_stop_all_queues(netdev);
-       xgbe_napi_disable(pdata);
+       xgbe_napi_disable(pdata, 0);
 
        /* Powerdown Tx/Rx */
        hw_if->powerdown_tx(pdata);
@@ -607,7 +610,7 @@ static void xgbe_stop(struct xgbe_prv_data *pdata)
        phy_stop(pdata->phydev);
 
        netif_tx_stop_all_queues(netdev);
-       xgbe_napi_disable(pdata);
+       xgbe_napi_disable(pdata, 1);
 
        xgbe_stop_tx_timers(pdata);