aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorManfred Spraul <manfred@colorfullife.com>2005-08-06 17:47:55 -0400
committerJeff Garzik <jgarzik@pobox.com>2005-08-19 02:12:16 -0400
commit1b1b3c9b6d346d441a99e2de0b34f3ba93963ad8 (patch)
treee140e27b52b70ecad6c79c46ed7653b2c7002283 /drivers/net
parenta3bc068022b968a3042b48eb9a8e8b0418fb9cdd (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')
-rw-r--r--drivers/net/forcedeth.c5
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);