> Date: Wed, 4 Apr 2018 11:56:28 +0200 (CEST)
> From: Mark Kettenis
>
> With the growing popularity of SoCs, external PHYs are making a bit of
> a comeback. In quite a few cases I'm seeing rgephy(4) show up twice,
> once on address 0 and once on some other address. But there is only
> one PHY soldered onto the board. This is a little bit annoying but
> mostly harmless. The mii(4) layer will use the first one that shows
> up and everything works. But now I'm seeing the same thing happening
> with a Micrel PHY that shows up as ukphy(4). And here it is causing
> issues since the mii(4) attempts to "isolate" PHYs that it isn't using
> and the Micrel PHY actually implements that functionality.
>
> One way to solve the issue is to add the MIIF_NOISOLATE flag to the
> mii_attach() call. However that still means the PHY shows up twice in
> dmesg. So here is an alternative solution. The mii_attach() function
> has an offloc argument that kan be used to tell the mii(4) layer to
> attach the first, second, third, etc. PHY it finds when scanning the
> bus. The diff below makes dwge(4) set offloc to 0 (to attach the
> first PHY found) if phyloc is set to MII_PHY_ANY. This means we
> attach the PHY with address 0 instead of its real address, but that is
> ok.
>
> This code is a little bit ugly. An alternative would be to modify
> mii_attach(4) such that it no longer panics if phyloc != MII_PHY_ANY
> and offloc != MII_OFFSET_ANY. Then we could simply set offloc to 0 in
> the mii_attach() call.
>
> comments? ok?
Nobody?
> Index: dev/ic/dwc_gmac.c
> ===
> RCS file: /cvs/src/sys/dev/ic/dwc_gmac.c,v
> retrieving revision 1.8
> diff -u -p -r1.8 dwc_gmac.c
> --- dev/ic/dwc_gmac.c 29 Jun 2017 17:36:16 - 1.8
> +++ dev/ic/dwc_gmac.c 4 Apr 2018 09:47:29 -
> @@ -222,8 +222,8 @@ dwc_gmac_attach(struct dwc_gmac_softc *s
>
> ifmedia_init(>mii_media, 0, dwc_gmac_ifmedia_upd,
> dwc_gmac_ifmedia_sts);
> - mii_attach((void *)sc, mii, 0x, phyloc, MII_OFFSET_ANY,
> - MIIF_DOPAUSE);
> + mii_attach((void *)sc, mii, 0x, phyloc,
> + (phyloc == MII_PHY_ANY) ? 0 : MII_OFFSET_ANY, MIIF_DOPAUSE);
>
> if (LIST_EMPTY(>mii_phys)) {
> printf("%s: no PHY found!\n", sc->sc_dev.dv_xname);
>
>