]> git.baikalelectronics.ru Git - kernel.git/commit
smsc911x: reset last known duplex and carrier on open
authorSteve Glendinning <steve.glendinning@smsc.com>
Thu, 19 Mar 2009 06:37:18 +0000 (23:37 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 19 Mar 2009 06:37:18 +0000 (23:37 -0700)
commitdf6df1621a70d9f55c5c0ee79d54cacdeca7bb7d
tree6904225f0189f7d5229dd529f64de71c97c55e7b
parentb3e4e82d8cb1d764cb72d29202486eaaa228b096
smsc911x: reset last known duplex and carrier on open

smsc911x_phy_adjust_link is called periodically by the phy layer (as
it's run in polling mode), and it only updates the hardware when it sees
a change in duplex or carrier.  This patch clears the last known values
every time the interface is brought up, instead of only when the module
is loaded.

Without this patch the adjust_link function never updates the hardware
after an ifconfig down; ifconfig up.  On a full duplex link this causes
the tx error counter to increment, even though packets are correctly
transmitted, as the default MAC_CR register setting is for half duplex.

The tx errors are "no carrier" errors, which should be ignored in
full-duplex mode.  When MAC_CR is set to "full duplex" mode they are
correctly ignored by the hardware.

Note that even with this patch the tx error counter can increment if
packets are transmitted between "ifconfig up" and the first phy poll
interval.  An improved solution would use the phy interrupt with phylib,
but I haven't managed to make this work 100% robustly yet.

Signed-off-by: Steve Glendinning <steve.glendinning@smsc.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/smsc911x.c