svn commit: r229333 - stable/9/sys/dev/dc
Pyun YongHyeon
yongari at FreeBSD.org
Mon Jan 2 23:17:46 UTC 2012
Author: yongari
Date: Mon Jan 2 23:17:45 2012
New Revision: 229333
URL: http://svn.freebsd.org/changeset/base/229333
Log:
MFC r226699:
When driver is run for the first time there would be no established
link such that calling dc_setcfg() right after media change would
be meaningless unless controller in question is not Davicom DM9102.
Ideally dc_setcfg() should be called when speed/duplex is resolved
otherwise it would reprogram controller with wrong speed/duplex
information. Because MII status change callback already calls
dc_setcfg() I think calling dc_setcfg() in dc_init_locked() is
wrong. For instance, it would take some time to establish a link
after mii_mediachg(), so blindly calling dc_setcfg() right after
mii_mediachg() will always yield wrong media configuration.
Extend dc_ifmedia_upd() to handle media change and still allow
21143 and Davidcom controllers program speed/duplex regardless of
current resolved speed/duplex of link. In theory 21143 may not need
to call dc_setcfg() right after media change, but leave it as it is
because there are too many variants to test that change. Probably
dc(4) shall need a PHY reset in dc_ifmedia_upd() but it's hard to
verify correctness of the change.
This change reliably makes ULi M5263 establish a link.
While I'm here correctly report media change result. Previously it
always reported a success.
Modified:
stable/9/sys/dev/dc/if_dc.c
Directory Properties:
stable/9/sys/ (props changed)
stable/9/sys/amd64/include/xen/ (props changed)
stable/9/sys/boot/ (props changed)
stable/9/sys/boot/i386/efi/ (props changed)
stable/9/sys/boot/ia64/efi/ (props changed)
stable/9/sys/boot/ia64/ski/ (props changed)
stable/9/sys/boot/powerpc/boot1.chrp/ (props changed)
stable/9/sys/boot/powerpc/ofw/ (props changed)
stable/9/sys/cddl/contrib/opensolaris/ (props changed)
stable/9/sys/conf/ (props changed)
stable/9/sys/contrib/dev/acpica/ (props changed)
stable/9/sys/contrib/octeon-sdk/ (props changed)
stable/9/sys/contrib/pf/ (props changed)
stable/9/sys/contrib/x86emu/ (props changed)
Modified: stable/9/sys/dev/dc/if_dc.c
==============================================================================
--- stable/9/sys/dev/dc/if_dc.c Mon Jan 2 22:58:32 2012 (r229332)
+++ stable/9/sys/dev/dc/if_dc.c Mon Jan 2 23:17:45 2012 (r229333)
@@ -253,6 +253,7 @@ static void dc_stop(struct dc_softc *);
static void dc_watchdog(void *);
static int dc_shutdown(device_t);
static int dc_ifmedia_upd(struct ifnet *);
+static int dc_ifmedia_upd_locked(struct dc_softc *);
static void dc_ifmedia_sts(struct ifnet *, struct ifmediareq *);
static int dc_dma_alloc(struct dc_softc *);
@@ -3600,8 +3601,7 @@ dc_init_locked(struct dc_softc *sc)
ifp->if_drv_flags |= IFF_DRV_RUNNING;
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
- mii_mediachg(mii);
- dc_setcfg(sc, sc->dc_if_media);
+ dc_ifmedia_upd_locked(sc);
/* Clear missed frames and overflow counter. */
CSR_READ_4(sc, DC_FRAMESDISCARDED);
@@ -3627,25 +3627,37 @@ static int
dc_ifmedia_upd(struct ifnet *ifp)
{
struct dc_softc *sc;
- struct mii_data *mii;
- struct ifmedia *ifm;
+ int error;
sc = ifp->if_softc;
- mii = device_get_softc(sc->dc_miibus);
DC_LOCK(sc);
- mii_mediachg(mii);
- ifm = &mii->mii_media;
-
- if (DC_IS_INTEL(sc))
- dc_setcfg(sc, ifm->ifm_media);
- else if (DC_IS_DAVICOM(sc) &&
- IFM_SUBTYPE(ifm->ifm_media) == IFM_HPNA_1)
- dc_setcfg(sc, ifm->ifm_media);
- else
- sc->dc_link = 0;
+ error = dc_ifmedia_upd_locked(sc);
DC_UNLOCK(sc);
+ return (error);
+}
- return (0);
+static int
+dc_ifmedia_upd_locked(struct dc_softc *sc)
+{
+ struct mii_data *mii;
+ struct ifmedia *ifm;
+ int error;
+
+ DC_LOCK_ASSERT(sc);
+
+ sc->dc_link = 0;
+ mii = device_get_softc(sc->dc_miibus);
+ error = mii_mediachg(mii);
+ if (error == 0) {
+ ifm = &mii->mii_media;
+ if (DC_IS_INTEL(sc))
+ dc_setcfg(sc, ifm->ifm_media);
+ else if (DC_IS_DAVICOM(sc) &&
+ IFM_SUBTYPE(ifm->ifm_media) == IFM_HPNA_1)
+ dc_setcfg(sc, ifm->ifm_media);
+ }
+
+ return (error);
}
/*
More information about the svn-src-stable-9
mailing list