diff options
author | Manfred Spraul <manfred@colorfullife.com> | 2005-08-06 17:47:55 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-08-19 02:12:16 -0400 |
commit | 1b1b3c9b6d346d441a99e2de0b34f3ba93963ad8 (patch) | |
tree | e140e27b52b70ecad6c79c46ed7653b2c7002283 /drivers/net/forcedeth.c | |
parent | a3bc068022b968a3042b48eb9a8e8b0418fb9cdd (diff) |
[PATCH] forcedeth: Initialize link settings in every nv_open()
Rüdiger found a bug in nv_open that explains some of the reports
with duplex mismatches:
nv_open calls nv_update_link_speed for initializing the hardware link speed
registers. If current link setting matches the values in np->linkspeed and
np->duplex, then the function does nothing.
Usually, doing nothing is the right thing, but not in nv_open: During
nv_open, the registers must be initialized because the nic was reset.
The attached patch fixes that by setting np->linkspeed to an invalid value
before calling nv_update_link_speed from nv_open.
Signed-Off-By: Manfred Spraul <manfred@colorfullife.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
Diffstat (limited to 'drivers/net/forcedeth.c')
-rw-r--r-- | drivers/net/forcedeth.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index f165ae973985..7d93948aec83 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
@@ -93,6 +93,8 @@ | |||
93 | * 0.40: 19 Jul 2005: Add support for mac address change. | 93 | * 0.40: 19 Jul 2005: Add support for mac address change. |
94 | * 0.41: 30 Jul 2005: Write back original MAC in nv_close instead | 94 | * 0.41: 30 Jul 2005: Write back original MAC in nv_close instead |
95 | * of nv_remove | 95 | * of nv_remove |
96 | * 0.42: 06 Aug 2005: Fix lack of link speed initialization | ||
97 | * in the second (and later) nv_open call | ||
96 | * | 98 | * |
97 | * Known bugs: | 99 | * Known bugs: |
98 | * We suspect that on some hardware no TX done interrupts are generated. | 100 | * We suspect that on some hardware no TX done interrupts are generated. |
@@ -2178,6 +2180,9 @@ static int nv_open(struct net_device *dev) | |||
2178 | writel(NVREG_MIISTAT_MASK, base + NvRegMIIStatus); | 2180 | writel(NVREG_MIISTAT_MASK, base + NvRegMIIStatus); |
2179 | dprintk(KERN_INFO "startup: got 0x%08x.\n", miistat); | 2181 | dprintk(KERN_INFO "startup: got 0x%08x.\n", miistat); |
2180 | } | 2182 | } |
2183 | /* set linkspeed to invalid value, thus force nv_update_linkspeed | ||
2184 | * to init hw */ | ||
2185 | np->linkspeed = 0; | ||
2181 | ret = nv_update_linkspeed(dev); | 2186 | ret = nv_update_linkspeed(dev); |
2182 | nv_start_rx(dev); | 2187 | nv_start_rx(dev); |
2183 | nv_start_tx(dev); | 2188 | nv_start_tx(dev); |