Module Name: src Committed By: msaitoh Date: Sun Mar 7 07:53:38 UTC 2010
Modified Files: src/sys/dev/mii: igphy.c src/sys/dev/pci: if_wm.c if_wmreg.h Added Files: src/sys/dev/mii: igphyvar.h Log Message: Add two workarounds for ICH8 with igp3. - Workaround for 82566 Kumeran PCS lock loss. - WOL from S5 stops working. To generate a diff of this commit: cvs rdiff -u -r1.20 -r1.21 src/sys/dev/mii/igphy.c cvs rdiff -u -r0 -r1.1 src/sys/dev/mii/igphyvar.h cvs rdiff -u -r1.201 -r1.202 src/sys/dev/pci/if_wm.c cvs rdiff -u -r1.38 -r1.39 src/sys/dev/pci/if_wmreg.h 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/mii/igphy.c diff -u src/sys/dev/mii/igphy.c:1.20 src/sys/dev/mii/igphy.c:1.21 --- src/sys/dev/mii/igphy.c:1.20 Wed Dec 16 14:37:26 2009 +++ src/sys/dev/mii/igphy.c Sun Mar 7 07:53:37 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: igphy.c,v 1.20 2009/12/16 14:37:26 msaitoh Exp $ */ +/* $NetBSD: igphy.c,v 1.21 2010/03/07 07:53:37 msaitoh Exp $ */ /* * The Intel copyright applies to the analog register setup, and the @@ -70,7 +70,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: igphy.c,v 1.20 2009/12/16 14:37:26 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: igphy.c,v 1.21 2010/03/07 07:53:37 msaitoh Exp $"); #include "opt_mii.h" @@ -88,15 +88,9 @@ #include <dev/mii/miivar.h> #include <dev/mii/miidevs.h> #include <dev/mii/igphyreg.h> +#include <dev/mii/igphyvar.h> #include <dev/pci/if_wmvar.h> -struct igphy_softc { - struct mii_softc sc_mii; - int sc_smartspeed; - uint32_t sc_mactype; - uint32_t sc_macflags; -}; - static void igphy_reset(struct mii_softc *); static void igphy_load_dspcode(struct mii_softc *); static void igphy_load_dspcode_igp3(struct mii_softc *); Index: src/sys/dev/pci/if_wm.c diff -u src/sys/dev/pci/if_wm.c:1.201 src/sys/dev/pci/if_wm.c:1.202 --- src/sys/dev/pci/if_wm.c:1.201 Sun Mar 7 07:09:00 2010 +++ src/sys/dev/pci/if_wm.c Sun Mar 7 07:53:37 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: if_wm.c,v 1.201 2010/03/07 07:09:00 msaitoh Exp $ */ +/* $NetBSD: if_wm.c,v 1.202 2010/03/07 07:53:37 msaitoh Exp $ */ /* * Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc. @@ -76,7 +76,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.201 2010/03/07 07:09:00 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.202 2010/03/07 07:53:37 msaitoh Exp $"); #include "rnd.h" @@ -118,9 +118,11 @@ #include <dev/mii/mii.h> #include <dev/mii/miivar.h> +#include <dev/mii/miidevs.h> #include <dev/mii/mii_bitbang.h> #include <dev/mii/ikphyreg.h> #include <dev/mii/igphyreg.h> +#include <dev/mii/igphyvar.h> #include <dev/mii/inbmphyreg.h> #include <dev/pci/pcireg.h> @@ -576,6 +578,8 @@ static int wm_check_reset_block(struct wm_softc *); static void wm_get_hw_control(struct wm_softc *); static int wm_check_for_link(struct wm_softc *); +static void wm_kmrn_lock_loss_workaround_ich8lan(struct wm_softc *); +static void wm_gig_downshift_workaround_ich8lan(struct wm_softc *); static void wm_hv_phy_workaround_ich8lan(struct wm_softc *); static void wm_k1_gig_workaround_hv(struct wm_softc *, int); static void wm_configure_k1_ich8lan(struct wm_softc *, int); @@ -3179,6 +3183,9 @@ sc->sc_ctrl |= CTRL_FD; CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl); } + } else if ((sc->sc_type == WM_T_ICH8) + && (sc->sc_phytype == WMPHY_IGP_3)) { + wm_kmrn_lock_loss_workaround_ich8lan(sc); } else if (sc->sc_type == WM_T_PCH) { wm_k1_gig_workaround_hv(sc, ((sc->sc_mii.mii_media_status & IFM_ACTIVE) != 0)); @@ -5433,7 +5440,20 @@ ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE); sc->sc_phytype = WMPHY_NONE; } else { - ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO); + /* Check PHY type */ + uint32_t model; + struct mii_softc *child; + + child = LIST_FIRST(&sc->sc_mii.mii_phys); + if (device_is_a(child->mii_dev, "igphy")) { + struct igphy_softc *isc = (struct igphy_softc *)child; + + model = isc->sc_mii.mii_mpd_model; + if (model == MII_MODEL_yyINTEL_I82566) + sc->sc_phytype = WMPHY_IGP_3; + } + + ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER | IFM_AUTO); } } @@ -6848,6 +6868,68 @@ return 0; } +/* Work-around for 82566 Kumeran PCS lock loss */ +static void +wm_kmrn_lock_loss_workaround_ich8lan(struct wm_softc *sc) +{ + int miistatus, active, i; + int reg; + + miistatus = sc->sc_mii.mii_media_status; + + /* If the link is not up, do nothing */ + if ((miistatus & IFM_ACTIVE) != 0) + return; + + active = sc->sc_mii.mii_media_active; + + /* Nothing to do if the link is other than 1Gbps */ + if (IFM_SUBTYPE(active) != IFM_1000_T) + return; + + for (i = 0; i < 10; i++) { + /* read twice */ + reg = wm_gmii_i80003_readreg(sc->sc_dev, 1, IGP3_KMRN_DIAG); + reg = wm_gmii_i80003_readreg(sc->sc_dev, 1, IGP3_KMRN_DIAG); + if ((reg & IGP3_KMRN_DIAG_PCS_LOCK_LOSS) != 0) + goto out; /* GOOD! */ + + /* Reset the PHY */ + wm_gmii_reset(sc); + delay(5*1000); + } + + /* Disable GigE link negotiation */ + reg = CSR_READ(sc, WMREG_PHY_CTRL); + reg |= PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS; + CSR_WRITE(sc, WMREG_PHY_CTRL, reg); + + /* + * Call gig speed drop workaround on Gig disable before accessing + * any PHY registers. + */ + wm_gig_downshift_workaround_ich8lan(sc); + +out: + return; +} + +/* WOL from S5 stops working */ +static void +wm_gig_downshift_workaround_ich8lan(struct wm_softc *sc) +{ + uint16_t kmrn_reg; + + /* Only for igp3 */ + if (sc->sc_phytype == WMPHY_IGP_3) { + kmrn_reg = wm_kmrn_readreg(sc, KUMCTRLSTA_OFFSET_DIAG); + kmrn_reg |= KUMCTRLSTA_DIAG_NELPBK; + wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_DIAG, kmrn_reg); + kmrn_reg &= ~KUMCTRLSTA_DIAG_NELPBK; + wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_DIAG, kmrn_reg); + } +} + /* * Workaround for pch's PHYs * XXX should be moved to new PHY driver? Index: src/sys/dev/pci/if_wmreg.h diff -u src/sys/dev/pci/if_wmreg.h:1.38 src/sys/dev/pci/if_wmreg.h:1.39 --- src/sys/dev/pci/if_wmreg.h:1.38 Tue Feb 16 15:17:17 2010 +++ src/sys/dev/pci/if_wmreg.h Sun Mar 7 07:53:37 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: if_wmreg.h,v 1.38 2010/02/16 15:17:17 msaitoh Exp $ */ +/* $NetBSD: if_wmreg.h,v 1.39 2010/03/07 07:53:37 msaitoh Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -757,6 +757,9 @@ #define KUMCTRLSTA_INB_CTRL_LINK_TMOUT_DFLT 0x00000500 #define KUMCTRLSTA_INB_CTRL_DIS_PADDING 0x00000010 +/* Diag */ +#define KUMCTRLSTA_DIAG_NELPBK 0x1000 + /* K1 Config */ #define KUMCTRLSTA_K1_ENABLE 0x0002 @@ -833,6 +836,11 @@ #define E1000_EXTCNF_CTRL_SWFLAG EXTCNFCTR_MDIO_SW_OWNERSHIP #define WMREG_PHY_CTRL 0x0f10 /* PHY control */ +#define PHY_CTRL_SPD_EN (1 << 0) +#define PHY_CTRL_D0A_LPLU (1 << 1) +#define PHY_CTRL_NOND0A_LPLU (1 << 2) +#define PHY_CTRL_NOND0A_GBE_DIS (1 << 3) +#define PHY_CTRL_GBE_DIS (1 << 4) /* ich8 flash control */ #define ICH_FLASH_COMMAND_TIMEOUT 5000 /* 5000 uSecs - adjusted */ Added files: Index: src/sys/dev/mii/igphyvar.h diff -u /dev/null src/sys/dev/mii/igphyvar.h:1.1 --- /dev/null Sun Mar 7 07:53:38 2010 +++ src/sys/dev/mii/igphyvar.h Sun Mar 7 07:53:37 2010 @@ -0,0 +1,39 @@ +/* $NetBSD: igphyvar.h,v 1.1 2010/03/07 07:53:37 msaitoh Exp $ */ + +/*- + * Copyright (c) 2010 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _DEV_MII_IGPHYVAR_H_ +#define _DEV_MII_IGPHYVAR_H_ + +struct igphy_softc { + struct mii_softc sc_mii; + int sc_smartspeed; + uint32_t sc_mactype; + uint32_t sc_macflags; +}; + +#endif /* _DEV_MII_IGPHYVAR_H_ */