Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/netbsd-8]: src/sys/dev/mii Pull up the following revision, requested by ...



details:   https://anonhg.NetBSD.org/src/rev/50c098da2796
branches:  netbsd-8
changeset: 453064:50c098da2796
user:      martin <martin%NetBSD.org@localhost>
date:      Thu Aug 01 14:27:30 2019 +0000

description:
Pull up the following revision, requested by msaitoh in ticket #1316:

        sys/dev/mii/makphy.c                            1.54,1.57-1.60 via patch
        sys/dev/mii/makphyvar.h                         1.1-1.2
        sys/dev/mii/ihphy.c                             1.12,1.14 via patch

- Support Intel I21[01].
- 88E1000(S) has no page select register, so don't access it.
  Note that qemu doesn't implement the register and the access fails.
- Check the result of the ESSR register access because Qemu doesn't
  implement the register.
- KNF.

diffstat:

 sys/dev/mii/ihphy.c  |  32 ++++++-----------
 sys/dev/mii/makphy.c |  94 +++++++++++++++++++++++++++++++++++++--------------
 2 files changed, 79 insertions(+), 47 deletions(-)

diffs (300 lines):

diff -r 82753496c4eb -r 50c098da2796 sys/dev/mii/ihphy.c
--- a/sys/dev/mii/ihphy.c       Thu Aug 01 14:24:21 2019 +0000
+++ b/sys/dev/mii/ihphy.c       Thu Aug 01 14:27:30 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ihphy.c,v 1.10 2016/11/02 07:01:54 msaitoh Exp $       */
+/*     $NetBSD: ihphy.c,v 1.10.8.1 2019/08/01 14:27:30 martin Exp $    */
 
 /*-
  * Copyright (c) 1998, 1999, 2000 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ihphy.c,v 1.10 2016/11/02 07:01:54 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ihphy.c,v 1.10.8.1 2019/08/01 14:27:30 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -100,6 +100,10 @@
          MII_STR_INTEL_I82579 },
        { MII_OUI_INTEL,                MII_MODEL_INTEL_I217,
          MII_STR_INTEL_I217 },
+       { MII_OUI_INTEL,                MII_MODEL_INTEL_I82580,
+         MII_STR_INTEL_I82580},
+       { MII_OUI_INTEL,                MII_MODEL_INTEL_I350,
+         MII_STR_INTEL_I350},
 
        { 0,                            0,
          NULL },
@@ -153,9 +157,7 @@
                mii_phy_add_media(sc);
        aprint_normal("\n");
 
-       /*
-        * Link setup (as done by Intel's Linux driver for the 82577).
-        */
+       /* Link setup (as done by Intel's Linux driver for the 82577). */
        reg = PHY_READ(sc, IHPHY_MII_CFG);
        reg |= IHPHY_CFG_TX_CRS;
        reg |= IHPHY_CFG_DOWN_SHIFT;
@@ -170,9 +172,7 @@
 
        switch (cmd) {
        case MII_POLLSTAT:
-               /*
-                * If we're not polling our PHY instance, just return.
-                */
+               /* If we're not polling our PHY instance, just return. */
                if (IFM_INST(ife->ifm_media) != sc->mii_inst)
                        return 0;
                break;
@@ -188,15 +188,11 @@
                        return 0;
                }
 
-               /*
-                * If the interface is not up, don't do anything.
-                */
+               /* If the interface is not up, don't do anything. */
                if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
                        break;
 
-               /*
-                * If media is deselected, disable link (standby).
-                */
+               /* If media is deselected, disable link (standby). */
                reg = PHY_READ(sc, IHPHY_MII_ECR);
                if (IFM_SUBTYPE(ife->ifm_media) == IFM_NONE)
                        reg &= ~IHPHY_ECR_LNK_EN;
@@ -204,17 +200,13 @@
                        reg |= IHPHY_ECR_LNK_EN;
                PHY_WRITE(sc, IHPHY_MII_ECR, reg);
 
-               /*
-                * XXX Adjust MDI/MDIX configuration?  Other settings?
-                */
+               /* XXX Adjust MDI/MDIX configuration?  Other settings? */
 
                mii_phy_setmedia(sc);
                break;
 
        case MII_TICK:
-               /*
-                * If we're not currently selected, just return.
-                */
+               /* If we're not currently selected, just return. */
                if (IFM_INST(ife->ifm_media) != sc->mii_inst)
                        return 0;
 
diff -r 82753496c4eb -r 50c098da2796 sys/dev/mii/makphy.c
--- a/sys/dev/mii/makphy.c      Thu Aug 01 14:24:21 2019 +0000
+++ b/sys/dev/mii/makphy.c      Thu Aug 01 14:27:30 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: makphy.c,v 1.42.8.2 2019/03/07 17:19:38 martin Exp $   */
+/*     $NetBSD: makphy.c,v 1.42.8.3 2019/08/01 14:27:30 martin Exp $   */
 
 /*-
  * Copyright (c) 1998, 1999, 2000, 2001 The NetBSD Foundation, Inc.
@@ -59,7 +59,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: makphy.c,v 1.42.8.2 2019/03/07 17:19:38 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: makphy.c,v 1.42.8.3 2019/08/01 14:27:30 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -76,11 +76,12 @@
 #include <dev/mii/miidevs.h>
 
 #include <dev/mii/makphyreg.h>
+#include <dev/mii/makphyvar.h>
 
 static int     makphymatch(device_t, cfdata_t, void *);
 static void    makphyattach(device_t, device_t, void *);
 
-CFATTACH_DECL_NEW(makphy, sizeof(struct mii_softc),
+CFATTACH_DECL_NEW(makphy, sizeof(struct makphy_softc),
     makphymatch, makphyattach, mii_phy_detach, mii_phy_activate);
 
 static int     makphy_service(struct mii_softc *, struct mii_data *, int);
@@ -168,15 +169,30 @@
 #define MAKARG_PDOWN   true    /* Power DOWN */
 #define MAKARG_PUP     false   /* Power UP */
 
+static bool
+makphy_isi210(device_t parent, struct mii_attach_args *ma)
+{
+
+       /* I21[01]'s model number is 0 */
+       if ((MII_OUI(ma->mii_id1, ma->mii_id2) == MII_OUI_xxMARVELL)
+           && (MII_MODEL(ma->mii_id2) == MII_MODEL_xxMARVELL_I210)
+           && (device_is_a(parent, "wm")))
+               return true;
+       return false;
+}
+
 static int
 makphymatch(device_t parent, cfdata_t match, void *aux)
 {
        struct mii_attach_args *ma = aux;
 
        if (mii_phy_match(ma, makphys) != NULL)
-               return (10);
+               return 10;
 
-       return (0);
+       if (makphy_isi210(parent, ma))
+               return 10;
+
+       return 0;
 }
 
 static void
@@ -186,14 +202,24 @@
        struct mii_attach_args *ma = aux;
        struct mii_data *mii = ma->mii_data;
        const struct mii_phydesc *mpd;
+       struct makphy_softc *maksc = (struct makphy_softc *)sc;
+       const char *name;
+       int model, val;
 
        mpd = mii_phy_match(ma, makphys);
        aprint_naive(": Media interface\n");
-       aprint_normal(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2));
+       if (mpd)
+               name = mpd->mpd_name;
+       else if (makphy_isi210(parent, ma)) {
+               name = MII_STR_xxMARVELL_I210;
+               maksc->sc_flags |= MAKPHY_F_I210;
+       } else
+               panic("Unknown PHY");
+       aprint_normal(": %s, rev. %d\n", name, MII_REV(ma->mii_id2));
 
        sc->mii_dev = self;
        sc->mii_mpd_oui = MII_OUI(ma->mii_id1, ma->mii_id2);
-       sc->mii_mpd_model = MII_MODEL(ma->mii_id2);
+       sc->mii_mpd_model = model = MII_MODEL(ma->mii_id2);
        sc->mii_mpd_rev = MII_REV(ma->mii_id2);
        sc->mii_inst = mii->mii_instance;
        sc->mii_phy = ma->mii_phyno;
@@ -202,13 +228,29 @@
        sc->mii_flags = ma->mii_flags;
        sc->mii_anegticks = MII_ANEGTICKS;
 
-       /* Make sure page 0 is selected. */
-       PHY_WRITE(sc, MAKPHY_EADR, 0);
+       switch (model) {
+       case MII_MODEL_xxMARVELL_E1000:
+               if ((maksc->sc_flags & MAKPHY_F_I210) != 0)
+                       goto page0;
+               /* FALLTHROUGH */
+       case MII_MODEL_xxMARVELL_E1000_3:
+       case MII_MODEL_xxMARVELL_E1000S:
+       case MII_MODEL_xxMARVELL_E1000_5:
+               /* 88E1000 series has no EADR */
+               break;
+       default:
+page0:
+               /* Make sure page 0 is selected. */
+               PHY_WRITE(sc, MAKPHY_EADR, 0);
+               break;
+       }
 
-       switch (sc->mii_mpd_model) {
+       switch (model) {
        case MII_MODEL_xxMARVELL_E1011:
        case MII_MODEL_xxMARVELL_E1112:
-               if (PHY_READ(sc, MAKPHY_ESSR) & ESSR_FIBER_LINK)
+               val = PHY_READ(sc, MAKPHY_ESSR);
+               if ((val != 0) && (((u_int)val & 0x0000ffffU) != 0x0000ffffU)
+                   && ((val & ESSR_FIBER_LINK) != 0))
                        sc->mii_flags |= MIIF_HAVEFIBER;
                break;
        default:
@@ -233,6 +275,7 @@
 static void
 makphy_reset(struct mii_softc *sc)
 {
+       struct makphy_softc *maksc = (struct makphy_softc *)sc;
        uint16_t reg;
 
        mii_phy_reset(sc);
@@ -245,6 +288,9 @@
        /* Assert CRS on transmit. */
        switch (sc->mii_mpd_model) {
        case MII_MODEL_MARVELL_E1000_0:
+               if ((maksc->sc_flags & MAKPHY_F_I210) != 0)
+                       break;
+               /* FALLTHROUGH */
        case MII_MODEL_MARVELL_E1000_3:
        case MII_MODEL_MARVELL_E1000_5:
        case MII_MODEL_MARVELL_E1000_6:
@@ -311,15 +357,13 @@
        int bmcr;
 
        if (!device_is_active(sc->mii_dev))
-               return (ENXIO);
+               return ENXIO;
 
        switch (cmd) {
        case MII_POLLSTAT:
-               /*
-                * If we're not polling our PHY instance, just return.
-                */
+               /* If we're not polling our PHY instance, just return. */
                if (IFM_INST(ife->ifm_media) != sc->mii_inst)
-                       return (0);
+                       return 0;
                break;
 
        case MII_MEDIACHG:
@@ -330,12 +374,10 @@
                if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
                        bmcr = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, bmcr | BMCR_ISO);
-                       return (0);
+                       return 0;
                }
 
-               /*
-                * If the interface is not up, don't do anything.
-                */
+               /* If the interface is not up, don't do anything. */
                if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
                        break;
 
@@ -358,19 +400,17 @@
                break;
 
        case MII_TICK:
-               /*
-                * If we're not currently selected, just return.
-                */
+               /* If we're not currently selected, just return. */
                if (IFM_INST(ife->ifm_media) != sc->mii_inst)
-                       return (0);
+                       return 0;
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
-                       return (0);
+                       return 0;
                break;
 
        case MII_DOWN:
                mii_phy_down(sc);
-               return (0);
+               return 0;
        }
 
        /* Update the media status. */
@@ -378,7 +418,7 @@
 
        /* Callback if something changed. */
        mii_phy_update(sc, cmd);
-       return (0);
+       return 0;
 }
 
 static void



Home | Main Index | Thread Index | Old Index