sky2: Avoid race in sky2_change_mtu
authorMike McCormack <mikem@ring3k.org>
Thu, 13 May 2010 06:12:49 +0000 (06:12 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 14 May 2010 10:06:20 +0000 (03:06 -0700)
netif_stop_queue does not ensure all in-progress transmits are complete,
 so use netif_tx_disable() instead.

Secondly, make sure NAPI polls are disabled before stopping the tx queue,
 otherwise sky2_status_intr might trigger a TX queue wakeup between when
 we stop the queue and NAPI is disabled.

Signed-off-by: Mike McCormack <mikem@ring3k.org>
Acked-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/sky2.c

index 15da5e419eb1302ca66dcf3853c719719e0d01de..efc31e93eb785c12caae7991848a1c0af9bb0734 100644 (file)
@@ -2275,8 +2275,8 @@ static int sky2_change_mtu(struct net_device *dev, int new_mtu)
        sky2_write32(hw, B0_IMSK, 0);
 
        dev->trans_start = jiffies;     /* prevent tx timeout */
-       netif_stop_queue(dev);
        napi_disable(&hw->napi);
+       netif_tx_disable(dev);
 
        synchronize_irq(hw->pdev->irq);