Flow-control representation in ethtool (mii.c fix?)
From: artpol
Date: Tue Apr 26 2011 - 12:00:48 EST
Hello, All.
I was dealing with flow-control on my ethernet card:
eth0: RTL8168d/8111d
# uname -r
2.6.35-28-generic-pae (Ubuntu 10.10 current kernel)
And found following problem:
~# ethtool eth0
Settings for eth0:
Supported ports: [ TP MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full
Advertised pause frame use: No
...
Link partner advertised pause frame use: No
As you can see no pause frame is advertised. But mii-tool shows
different result:
~# mii-tool eth0
eth0: negotiated 100baseTx-FD flow-control, link ok
And the same shows remote embedded device whith which I work.
Inspection of kernel sources shows that GSET ethtool command leads
r8169.c to call mii_ethtool_gset(). And looking there I found that this
function simply ignore Pause-related settings. Searching kernel sources
shows that a lot of ethernet drivers use this function
(grep -R mii_ethtool_gset drivers/net/*)
In latest kernel (2.6.38.4) I also see that this thing doesn't fixed. So
I'd like to know is there some background behind this current design or
not. If not I suggest simple patch attached to this mail. I've test it
on kernel 2.6.38.4 and it works for me:
Settings for eth0:
Supported ports: [ TP MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full
Advertised pause frame use: Symmetric Receive-only
Advertised auto-negotiation: Yes
Link partner advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
Link partner advertised pause frame use: Symmetric
Link partner advertised auto-negotiation: Yes
....
--
Artem Polyakov.
diff -Naur linux-2.6.38.4_old/drivers/net/mii.c linux-2.6.38.4_new/drivers/net/mii.c
--- linux-2.6.38.4_old/drivers/net/mii.c 2011-04-22 04:34:46.000000000 +0700
+++ linux-2.6.38.4_new/drivers/net/mii.c 2011-04-25 22:55:40.342981965 +0700
@@ -49,6 +49,10 @@
result |= ADVERTISED_100baseT_Half;
if (advert & ADVERTISE_100FULL)
result |= ADVERTISED_100baseT_Full;
+ if (advert & ADVERTISE_PAUSE_CAP)
+ result |= ADVERTISED_Pause;
+ if (advert & ADVERTISE_PAUSE_ASYM)
+ result |= ADVERTISED_Asym_Pause;
return result;
}