8139too: fix system hang when there is a tx timeout event.
authorChun-Hao Lin <hau@realtek.com>
Mon, 1 Aug 2016 05:45:30 +0000 (13:45 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 2 Aug 2016 04:38:53 +0000 (21:38 -0700)
If tx timeout event occur, kernel will call rtl8139_tx_timeout_task() to reset
hardware. But in this function, driver does not stop tx and rx function before
reset hardware, that will cause system hang.

In this patch, add stop tx and rx function before reset hardware.

Signed-off-by: Chunhao Lin <hau@realtek.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/realtek/8139too.c

index ef668d300800c61b18dc97af10afe2f78d20f870..da4c2d8a4173f89ca8b18e8a81be7c053c0f48a5 100644 (file)
@@ -1667,6 +1667,10 @@ static void rtl8139_tx_timeout_task (struct work_struct *work)
        int i;
        u8 tmp8;
 
+       napi_disable(&tp->napi);
+       netif_stop_queue(dev);
+       synchronize_sched();
+
        netdev_dbg(dev, "Transmit timeout, status %02x %04x %04x media %02x\n",
                   RTL_R8(ChipCmd), RTL_R16(IntrStatus),
                   RTL_R16(IntrMask), RTL_R8(MediaStatus));
@@ -1696,10 +1700,10 @@ static void rtl8139_tx_timeout_task (struct work_struct *work)
        spin_unlock_irq(&tp->lock);
 
        /* ...and finally, reset everything */
-       if (netif_running(dev)) {
-               rtl8139_hw_start (dev);
-               netif_wake_queue (dev);
-       }
+       napi_enable(&tp->napi);
+       rtl8139_hw_start(dev);
+       netif_wake_queue(dev);
+
        spin_unlock_bh(&tp->rx_lock);
 }