Module Name: src Committed By: msaitoh Date: Fri Oct 28 05:21:49 UTC 2016
Modified Files: src/sys/dev/pci: if_wm.c Log Message: - Remove an 82578 workaround which was for PCH rev < 3. FreeBSD removed this workaround in r228386. - Add an 82578 workaround which is for PHY rev < 2. From FreeBSD and Linux. - Add some DPRINTF()s. To generate a diff of this commit: cvs rdiff -u -r1.429 -r1.430 src/sys/dev/pci/if_wm.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/if_wm.c diff -u src/sys/dev/pci/if_wm.c:1.429 src/sys/dev/pci/if_wm.c:1.430 --- src/sys/dev/pci/if_wm.c:1.429 Fri Oct 28 04:14:13 2016 +++ src/sys/dev/pci/if_wm.c Fri Oct 28 05:21:48 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: if_wm.c,v 1.429 2016/10/28 04:14:13 knakahara Exp $ */ +/* $NetBSD: if_wm.c,v 1.430 2016/10/28 05:21:48 msaitoh Exp $ */ /* * Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc. @@ -84,7 +84,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.429 2016/10/28 04:14:13 knakahara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.430 2016/10/28 05:21:48 msaitoh Exp $"); #ifdef _KERNEL_OPT #include "opt_net_mpsafe.h" @@ -12120,6 +12120,9 @@ wm_lplu_d0_disable(struct wm_softc *sc) { uint32_t reg; + DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n", + device_xname(sc->sc_dev), __func__)); + reg = CSR_READ(sc, WMREG_PHY_CTRL); reg &= ~(PHY_CTRL_GBE_DIS | PHY_CTRL_D0A_LPLU); CSR_WRITE(sc, WMREG_PHY_CTRL, reg); @@ -12130,6 +12133,9 @@ wm_lplu_d0_disable_pch(struct wm_softc * { uint32_t reg; + DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n", + device_xname(sc->sc_dev), __func__)); + reg = wm_gmii_hv_readreg(sc->sc_dev, 1, HV_OEM_BITS); reg &= ~(HV_OEM_BITS_A1KDIS | HV_OEM_BITS_LPLU); reg |= HV_OEM_BITS_ANEGNOW; @@ -12240,6 +12246,8 @@ static void wm_hv_phy_workaround_ich8lan(struct wm_softc *sc) { + DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n", + device_xname(sc->sc_dev), __func__)); KASSERT(sc->sc_type == WM_T_PCH); if (sc->sc_phytype == WMPHY_82577) @@ -12251,20 +12259,23 @@ wm_hv_phy_workaround_ich8lan(struct wm_s /* 82578 */ if (sc->sc_phytype == WMPHY_82578) { - /* PCH rev. < 3 */ - if (sc->sc_rev < 3) { - /* XXX 6 bit shift? Why? Is it page2? */ - wm_gmii_hv_writereg(sc->sc_dev, 1, ((1 << 6) | 0x29), - 0x66c0); - wm_gmii_hv_writereg(sc->sc_dev, 1, ((1 << 6) | 0x1e), - 0xffff); - } + struct mii_softc *child; - /* XXX phy rev. < 2 */ + /* + * Return registers to default by doing a soft reset then + * writing 0x3140 to the control register + * 0x3140 == BMCR_SPEED0 | BMCR_AUTOEN | BMCR_FDX | BMCR_SPEED1 + */ + child = LIST_FIRST(&sc->sc_mii.mii_phys); + if ((child != NULL) && (child->mii_mpd_rev < 2)) { + printf("XXX 82578 rev < 2\n"); + PHY_RESET(child); + sc->sc_mii.mii_writereg(sc->sc_dev, 2, MII_BMCR, + 0x3140); + } } /* Select page 0 */ - sc->phy.acquire(sc); wm_gmii_mdic_writereg(sc->sc_dev, 1, MII_IGPHY_PAGE_SELECT, 0); sc->phy.release(sc); @@ -12280,6 +12291,8 @@ static void wm_lv_phy_workaround_ich8lan(struct wm_softc *sc) { + DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n", + device_xname(sc->sc_dev), __func__)); KASSERT(sc->sc_type == WM_T_PCH2); wm_set_mdio_slow_mode_hv(sc);