summaryrefslogtreecommitdiff
path: root/sys/dev/ic/dc.c
diff options
context:
space:
mode:
authorBrad Smith <brad@cvs.openbsd.org>2004-11-16 14:26:23 +0000
committerBrad Smith <brad@cvs.openbsd.org>2004-11-16 14:26:23 +0000
commitb39b9ec7e3b8568e892c39d092605c7e8b221c45 (patch)
tree0ddd603df711bd81c3e697500c5eeb66d5c83095 /sys/dev/ic/dc.c
parent5fe1ebb86d28d9ef634955df7a468c305f7d0c4a (diff)
if_dc.c rev 1.56
Do not call mii_pollstat() from within device tick routines; the status information is updated by mii_tick(). dcphy.c rev 1.13 Work around an Intel 21143 chip bug. Rev 1.56 of if_dc.c removed calls to mii_pollstat() from the dc_tick() routine. dc_tick() is called regularly to detect link up and link down status, especially when autonegotiating. The expectation was that mii_tick() (which is still called from dc_tick()) would update status information automatically in all cases where it would be sensible to do so. Unfortunately, with authentic 21143 chips this is not the case, and the driver never successfully autonegotiates. This is because (despite what it says in the 21143 manual) the chip always claims that link is not present while the autonegotiation enable bit is set. Autonegotation takes place and succeeds, but the driver tests the link bits before it switches off the autonegotiation enable bit, and success is not recognised. The simplest solution is to call dcphy_status() more often for MII_TICK calls by dropping out of the switch statement instead of exiting when we are autonegotiating and link appears to not be present. When autonegotiation succeeds, dcphy_status() will note the speed and fdx/hdx state and turn off the autonegotiation enable bit. The next call to dcphy_status() will notice that link is present, and the dc driver code will be notified. Macronix chips also use this code, but implement link detection as described in the manual, and hence don't need this patch. However, tests on a Macronix 98715AEC-C show that it does not adversely affect them. From FreeBSD ok deraadt@
Diffstat (limited to 'sys/dev/ic/dc.c')
-rw-r--r--sys/dev/ic/dc.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/sys/dev/ic/dc.c b/sys/dev/ic/dc.c
index b4ed082f430..ad5ba5b7c51 100644
--- a/sys/dev/ic/dc.c
+++ b/sys/dev/ic/dc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dc.c,v 1.73 2004/10/29 01:10:43 brad Exp $ */
+/* $OpenBSD: dc.c,v 1.74 2004/11/16 14:26:21 brad Exp $ */
/*
* Copyright (c) 1997, 1998, 1999
@@ -2396,14 +2396,11 @@ dc_tick(xsc)
* that time, packets will stay in the send queue, and once the
* link comes up, they will be flushed out to the wire.
*/
- if (!sc->dc_link) {
- mii_pollstat(mii);
- if (mii->mii_media_status & IFM_ACTIVE &&
- IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
- sc->dc_link++;
- if (IFQ_IS_EMPTY(&ifp->if_snd) == 0)
- dc_start(ifp);
- }
+ if (!sc->dc_link && mii->mii_media_status & IFM_ACTIVE &&
+ IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
+ sc->dc_link++;
+ if (IFQ_IS_EMPTY(&ifp->if_snd) == 0)
+ dc_start(ifp);
}
if (sc->dc_flags & DC_21143_NWAY && !sc->dc_link)