提交 0a2f0d2d 编写于 作者: C Chun-Hao Lin 提交者: David S. Miller

8139too: fix system hang when there is a tx timeout event.

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: NChunhao Lin <hau@realtek.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 1b4985b5
...@@ -1667,6 +1667,10 @@ static void rtl8139_tx_timeout_task (struct work_struct *work) ...@@ -1667,6 +1667,10 @@ static void rtl8139_tx_timeout_task (struct work_struct *work)
int i; int i;
u8 tmp8; u8 tmp8;
napi_disable(&tp->napi);
netif_stop_queue(dev);
synchronize_sched();
netdev_dbg(dev, "Transmit timeout, status %02x %04x %04x media %02x\n", netdev_dbg(dev, "Transmit timeout, status %02x %04x %04x media %02x\n",
RTL_R8(ChipCmd), RTL_R16(IntrStatus), RTL_R8(ChipCmd), RTL_R16(IntrStatus),
RTL_R16(IntrMask), RTL_R8(MediaStatus)); RTL_R16(IntrMask), RTL_R8(MediaStatus));
...@@ -1696,10 +1700,10 @@ static void rtl8139_tx_timeout_task (struct work_struct *work) ...@@ -1696,10 +1700,10 @@ static void rtl8139_tx_timeout_task (struct work_struct *work)
spin_unlock_irq(&tp->lock); spin_unlock_irq(&tp->lock);
/* ...and finally, reset everything */ /* ...and finally, reset everything */
if (netif_running(dev)) { napi_enable(&tp->napi);
rtl8139_hw_start (dev); rtl8139_hw_start(dev);
netif_wake_queue (dev); netif_wake_queue(dev);
}
spin_unlock_bh(&tp->rx_lock); spin_unlock_bh(&tp->rx_lock);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册