Re: [2.4.32 - 2.6.15.4] e1000 - Fix mii interface
From: Willy TARREAU <hidden>
Date: 2006-02-26 10:42:19
Also in:
lkml
Hello Paul, On Sat, Feb 25, 2006 at 11:08:49AM +0100, Paul Rolland wrote:
Hello, This patch is based on Linux 2.4.32, and I've verified the same problem exists on 2.6.15.4.
it's mangled, tabs have been turned into whitespaces. I fixed it so please use the appended one.
quoted hunk ↗ jump to hunk
Working on a machine with a 2.4.32 kernel, I was surprised to see the driver complaining when setting the speed to 100FD using mii-tool, but accepting the setting with ethtool. Digging into the code, I found that there is some confusion with : - DUPLEX_FULL and FULL_DUPLEX, - DUPLEX_HALF and HALF_DUPLEX in the code : ... spddplx += (mii_reg & 0x100) ? FULL_DUPLEX : HALF_DUPLEX; retval = e1000_set_spd_dplx(adapter, spddplx); ... and int e1000_set_spd_dplx(struct e1000_adapter *adapter, uint16_t spddplx) { adapter->hw.autoneg = 0; switch(spddplx) { case SPEED_10 + DUPLEX_HALF: adapter->hw.forced_speed_duplex = e1000_10_half; break; .... when the constants don't have the same value. This patch is simply changing the code in the e1000_set_spd_dplx to use the same constants as does the caller of the function : FULL_DUPLEX and HALF_DUPLEX whose values are not 0, to make sure we have had a successfull init (DUPLEX_HALF value is 0, and the DUPLEX_xxx are defined in ethtool.h, thus are probably not meant to be used in the mii interface). Signed-off-by: Paul Rolland <redacted> diff -urN linux-2.4.32-orig/drivers/net/e1000/e1000_main.c linux-2.4.32/drivers/net/e1000/e1000_main.c--- linux-2.4.32-orig/drivers/net/e1000/e1000_main.c Mon Apr 4 01:42:192005+++ linux-2.4.32/drivers/net/e1000/e1000_main.c Sat Feb 25 09:36:23 2006@@ -2944,23 +2944,23 @@ adapter->hw.autoneg = 0; switch(spddplx) { - case SPEED_10 + DUPLEX_HALF: + case SPEED_10 + HALF_DUPLEX: adapter->hw.forced_speed_duplex = e1000_10_half; break; - case SPEED_10 + DUPLEX_FULL: + case SPEED_10 + FULL_DUPLEX: adapter->hw.forced_speed_duplex = e1000_10_full; break; - case SPEED_100 + DUPLEX_HALF: + case SPEED_100 + HALF_DUPLEX: adapter->hw.forced_speed_duplex = e1000_100_half; break; - case SPEED_100 + DUPLEX_FULL: + case SPEED_100 + FULL_DUPLEX: adapter->hw.forced_speed_duplex = e1000_100_full; break; - case SPEED_1000 + DUPLEX_FULL: + case SPEED_1000 + FULL_DUPLEX: adapter->hw.autoneg = 1; adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL; break; - case SPEED_1000 + DUPLEX_HALF: /* not supported */ + case SPEED_1000 + HALF_DUPLEX: /* not supported */ default: DPRINTK(PROBE, ERR, "Unsupported Speed/Duplexity configuration\n");Paul Rolland, rol(at)as2917.net ex-AS2917 Network administrator and Peering Coordinator
Regards, Willy diff -urN linux-2.4.32-orig/drivers/net/e1000/e1000_main.c linux-2.4.32/drivers/net/e1000/e1000_main.c
--- linux-2.4.32-orig/drivers/net/e1000/e1000_main.c Mon Apr 4 01:42:19 2005
+++ linux-2.4.32/drivers/net/e1000/e1000_main.c Sat Feb 25 09:36:23 2006@@ -2944,23 +2944,23 @@ adapter->hw.autoneg = 0; switch(spddplx) { - case SPEED_10 + DUPLEX_HALF: + case SPEED_10 + HALF_DUPLEX: adapter->hw.forced_speed_duplex = e1000_10_half; break; - case SPEED_10 + DUPLEX_FULL: + case SPEED_10 + FULL_DUPLEX: adapter->hw.forced_speed_duplex = e1000_10_full; break; - case SPEED_100 + DUPLEX_HALF: + case SPEED_100 + HALF_DUPLEX: adapter->hw.forced_speed_duplex = e1000_100_half; break; - case SPEED_100 + DUPLEX_FULL: + case SPEED_100 + FULL_DUPLEX: adapter->hw.forced_speed_duplex = e1000_100_full; break; - case SPEED_1000 + DUPLEX_FULL: + case SPEED_1000 + FULL_DUPLEX: adapter->hw.autoneg = 1; adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL; break; - case SPEED_1000 + DUPLEX_HALF: /* not supported */ + case SPEED_1000 + HALF_DUPLEX: /* not supported */ default: DPRINTK(PROBE, ERR, "Unsupported Speed/Duplexity configuration\n");