aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrancois Romieu <romieu@fr.zoreil.com>2007-08-26 14:08:19 -0400
committerFrancois Romieu <romieu@electric-eye.fr.zoreil.com>2007-09-19 15:52:18 -0400
commitd78ae2dcc2acebb9a1048278f47f762c069db75c (patch)
treeef8c8ec2736e5ce567e5c20287bc11dd4d4ed064
parent65d916d95314566f426cc40ff0f17b754a773b0b (diff)
r8169: workaround against ignored TxPoll writes (8168)
The 8168 ignores the requests to fetch the Tx descriptors when the relevant TxPoll bit is already set. It easily kills the performances of the 8168. David Gundersen has noticed that it is enough to wait for the completion of the DMA transfer (NPQ bit is cleared) before writing the TxPoll register again. The extra IO traffic added by the proposed workaround could be minimalized but it is not a high-priority task. Fix for: http://bugzilla.kernel.org/show_bug.cgi?id=7924 http://bugzilla.kernel.org/show_bug.cgi?id=8688 (http://bugzilla.kernel.org/show_bug.cgi?id=7555 ?) Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> Cc: David Gundersen <gundy@iinet.net.au> Cc: Edward Hsu <edward_hsu@realtek.com.tw>
-rw-r--r--drivers/net/r8169.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
index d9bb51bb4b9d..c921ec32c232 100644
--- a/drivers/net/r8169.c
+++ b/drivers/net/r8169.c
@@ -2570,6 +2570,15 @@ static void rtl8169_tx_interrupt(struct net_device *dev,
2570 (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) { 2570 (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) {
2571 netif_wake_queue(dev); 2571 netif_wake_queue(dev);
2572 } 2572 }
2573 /*
2574 * 8168 hack: TxPoll requests are lost when the Tx packets are
2575 * too close. Let's kick an extra TxPoll request when a burst
2576 * of start_xmit activity is detected (if it is not detected,
2577 * it is slow enough). -- FR
2578 */
2579 smp_rmb();
2580 if (tp->cur_tx != dirty_tx)
2581 RTL_W8(TxPoll, NPQ);
2573 } 2582 }
2574} 2583}
2575 2584