Module Name: src Committed By: msaitoh Date: Thu Apr 11 04:50:47 UTC 2019
Modified Files: src/sys/dev/ic: gem.c Log Message: Fix yet another fiber mediachange fix. Not tested. - Don't clear bits other than IFM_[FH]DX. - Always reset PCS when any IFM_[FH]DX bit is changed. To generate a diff of this commit: cvs rdiff -u -r1.115 -r1.116 src/sys/dev/ic/gem.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/ic/gem.c diff -u src/sys/dev/ic/gem.c:1.115 src/sys/dev/ic/gem.c:1.116 --- src/sys/dev/ic/gem.c:1.115 Tue Apr 9 07:23:41 2019 +++ src/sys/dev/ic/gem.c Thu Apr 11 04:50:47 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: gem.c,v 1.115 2019/04/09 07:23:41 msaitoh Exp $ */ +/* $NetBSD: gem.c,v 1.116 2019/04/11 04:50:47 msaitoh Exp $ */ /* * @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: gem.c,v 1.115 2019/04/09 07:23:41 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: gem.c,v 1.116 2019/04/11 04:50:47 msaitoh Exp $"); #include "opt_inet.h" @@ -2570,22 +2570,22 @@ gem_ser_mediachange(struct ifnet *ifp) return 0; } if (s == IFM_1000_SX) { - t = IFM_OPTIONS(sc->sc_mii.mii_media.ifm_media); - if (t == IFM_FDX || t == IFM_HDX) { - if (sc->sc_mii_media != t) { - sc->sc_mii_media = t; -#ifdef GEM_DEBUG - aprint_debug_dev(sc->sc_dev, - "setting media to 1000baseSX-%s\n", - t == IFM_FDX ? "FDX" : "HDX"); + t = IFM_OPTIONS(sc->sc_mii.mii_media.ifm_media) + & (IFM_FDX | IFM_HDX); + if ((sc->sc_mii_media & (IFM_FDX | IFM_HDX)) != t) { + sc->sc_mii_media &= ~(IFM_FDX | IFM_HDX); + sc->sc_mii_media |= t; +#ifdef GEM_DEBUG + aprint_debug_dev(sc->sc_dev, + "setting media to 1000baseSX-%s\n", + t == IFM_FDX ? "FDX" : "HDX"); #endif - if (ifp->if_flags & IFF_UP) { - gem_pcs_stop(sc, 0); - gem_pcs_start(sc); - } + if (ifp->if_flags & IFF_UP) { + gem_pcs_stop(sc, 0); + gem_pcs_start(sc); } - return 0; } + return 0; } return EINVAL; }