fec: Invert the order of function calls in fec_restart()
authorFabio Estevam <fabio.estevam@freescale.com>
Wed, 15 May 2013 07:06:27 +0000 (07:06 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 15 May 2013 21:42:15 +0000 (14:42 -0700)
commit 54309fa6 ("net: fec: fix kernel oops when plug/unplug cable many times")
introduced the following 'if' block in the beginning of fec_start():

if (netif_running(ndev)) {
netif_device_detach(ndev);
napi_disable(&fep->napi);
netif_stop_queue(ndev);
netif_tx_lock_bh(ndev);
}

Then later in the end of fec_restart() there is another block that calls the
opposite of each one of these functions.

The correct approach would be to also call them with in the reverse order, so
that we have as result:

if (netif_running(ndev)) {
netif_tx_unlock_bh(ndev);
netif_wake_queue(ndev);
napi_enable(&fep->napi);
netif_device_attach(ndev);
}

Suggested-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/fec_main.c

index 658fbc16d8d22e4336393efde24c2ba478109f3b..570dfad8403aecd2290bbec9726fc73c47832773 100644 (file)
@@ -616,10 +616,10 @@ fec_restart(struct net_device *ndev, int duplex)
        writel(FEC_DEFAULT_IMASK, fep->hwp + FEC_IMASK);
 
        if (netif_running(ndev)) {
-               netif_device_attach(ndev);
-               napi_enable(&fep->napi);
-               netif_wake_queue(ndev);
                netif_tx_unlock_bh(ndev);
+               netif_wake_queue(ndev);
+               napi_enable(&fep->napi);
+               netif_device_attach(ndev);
        }
 }