[RFT] r8169 changes against 2.6.22-rc6

From: Francois Romieu
Date: Thu Jun 28 2007 - 19:47:50 EST


The latest serie of r8169 changes is available against 2.6.22-rc6 as:
http://www.fr.zoreil.com/people/francois/misc/20070628-2.6.22-rc6-r8169-test.patch

or (tarball sits one level higher):

http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.22-rc6/r8169-20070628/

or (rebase prone branch)

git://electric-eye.fr.zoreil.com/home/romieu/linux-2.6.git#r8169

Please do not clone your whole git kernel tree from here, thanks.

Changes (most recent first):

- perform RX config change after mac filtering
- mac address change support
- display some extra debug information during startup
- add endianess annotations to [RT]xDesc
- align the IP header when there is no DMA constraint
- add bit description for the TxPoll register
- cleanup
- remove the media option
- small 8101 comment
- confusion between hardware and IP header alignment
- merge with version 8.001.00 of Realtek's r8168 driver
- merge with version 6.001.00 of Realtek's r8169 driver
- prettify mac_version
- populate the hw_start handler for the 8110
- populate the hw_start handler for the 8168
- add helpers for per-device hw_start handler
- add hooks for per-device hw_start handler
- Rx path update
- kill eth_copy_and_sum()
- de-obfuscate modulo arithmetic
- use netdev_alloc_skb

Use of this serie is strongly suggested if:
- you own an asrock ConRoe945G-DVI
- you need bonding
- you need to fix the performance regression due to misalignment

This serie should fix the non-wol related issues if you are an asus P5B
user.

Catastrophic events apart, the patches will be sent for review on netdev
tomorow and scheduled for inclusion in 2.6.23.

Success and failure reports or patches will be welcome. Please Cc: netdev
and include "r8169" in the Subject.

As a bonus, the patch below on top of the current serie could help Benjamin
(and probably others too). It's still WIP though.

diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
index 2fe3652..dc302c2 100644
--- a/drivers/net/r8169.c
+++ b/drivers/net/r8169.c
@@ -2518,7 +2518,7 @@ static inline u32 rtl8169_tso_csum(struct sk_buff *skb, struct net_device *dev)
static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
struct rtl8169_private *tp = netdev_priv(dev);
- unsigned int frags, entry = tp->cur_tx % NUM_TX_DESC;
+ unsigned int frags, cur_tx, entry = tp->cur_tx % NUM_TX_DESC;
struct TxDesc *txd = tp->TxDescArray + entry;
void __iomem *ioaddr = tp->mmio_addr;
dma_addr_t mapping;
@@ -2571,13 +2571,17 @@ static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev)

dev->trans_start = jiffies;

+ cur_tx = tp->cur_tx;
+
tp->cur_tx += frags + 1;

- smp_wmb();
+ mmiowb();

- RTL_W8(TxPoll, NPQ); /* set polling bit */
+ smp_mb();

- if (TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) {
+ if (cur_tx == tp->dirty_tx)
+ RTL_W8(TxPoll, NPQ);
+ else if (TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) {
netif_stop_queue(dev);
smp_rmb();
if (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)
@@ -2681,10 +2685,18 @@ static void rtl8169_tx_interrupt(struct net_device *dev,

if (tp->dirty_tx != dirty_tx) {
tp->dirty_tx = dirty_tx;
- smp_wmb();
- if (netif_queue_stopped(dev) &&
- (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) {
- netif_wake_queue(dev);
+ smp_mb();
+ if (unlikely(netif_queue_stopped(dev))) {
+ netif_tx_lock(dev);
+ if (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)
+ netif_wake_queue(dev);
+ if (dirty_tx != tp->cur_tx)
+ RTL_W8(TxPoll, NPQ);
+ netif_tx_unlock(dev);
+ } else if (dirty_tx != tp->cur_tx) {
+ netif_tx_lock(dev);
+ RTL_W8(TxPoll, NPQ);
+ netif_tx_unlock(dev);
}
}
}

--
Ueimor
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/