Author: marius
Date: Sun Oct 24 12:51:02 2010
New Revision: 214264
URL: http://svn.freebsd.org/changeset/base/214264

Log:
  - Add IFM_10_2 and IFM_10_5 media via tlphy(4) only in case the respective
    interface also has such connectors.
  - In tl_attach() unify three different ways of obtaining the device and
    vendor IDs and remove the now obsolete tl_dinfo from tl_softc.
  - Given that tlphy(4) only handles the integrated PHYs of NICs driven by
    tl(4) make it only probe on the latter.
  - Switch mlphy(4) and tlphy(4) to use mii_phy_add_media()/mii_phy_setmedia().
  - Simplify looking for the respective companion PHY in mlphy(4) and tlphy(4)
    by ignoring the native one by just comparing the device_t's directly rather
    than the device name.

Modified:
  head/sys/dev/mii/mlphy.c
  head/sys/dev/mii/tlphy.c
  head/sys/dev/tl/if_tl.c
  head/sys/dev/tl/if_tlreg.h

Modified: head/sys/dev/mii/mlphy.c
==============================================================================
--- head/sys/dev/mii/mlphy.c    Sun Oct 24 11:38:25 2010        (r214263)
+++ head/sys/dev/mii/mlphy.c    Sun Oct 24 12:51:02 2010        (r214264)
@@ -70,6 +70,7 @@ __FBSDID("$FreeBSD$");
 
 struct mlphy_softc     {
        struct mii_softc        ml_mii;
+       device_t                ml_dev;
        int                     ml_state;
        int                     ml_linked;
 };
@@ -96,6 +97,7 @@ static driver_t mlphy_driver = {
 
 DRIVER_MODULE(mlphy, miibus, mlphy_driver, mlphy_devclass, 0, 0);
 
+static struct mii_softc *mlphy_find_other(struct mlphy_softc *);
 static int     mlphy_service(struct mii_softc *, struct mii_data *, int);
 static void    mlphy_reset(struct mii_softc *);
 static void    mlphy_status(struct mii_softc *);
@@ -105,10 +107,8 @@ mlphy_probe(dev)
        device_t                dev;
 {
        struct mii_attach_args  *ma;
-       device_t                parent;
 
        ma = device_get_ivars(dev);
-       parent = device_get_parent(device_get_parent(dev));
 
        /*
         * Micro Linear PHY reports oui == 0 model == 0
@@ -122,7 +122,8 @@ mlphy_probe(dev)
         * encountered the 6692 on an Olicom card with a ThunderLAN
         * controller chip.
         */
-       if (strcmp(device_get_name(parent), "tl") != 0)
+       if (strcmp(device_get_name(device_get_parent(device_get_parent(dev))),
+           "tl") != 0)
                return (ENXIO);
 
        device_set_desc(dev, "Micro Linear 6692 media interface");
@@ -141,6 +142,7 @@ mlphy_attach(dev)
 
        msc = device_get_softc(dev);
        sc = &msc->ml_mii;
+       msc->ml_dev = dev;
        ma = device_get_ivars(dev);
        sc->mii_dev = device_get_parent(dev);
        mii = ma->mii_data;
@@ -155,14 +157,15 @@ mlphy_attach(dev)
 #define        ADD(m, c)       ifmedia_add(&mii->mii_media, (m), (c), NULL)
 
        ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, IFM_LOOP, sc->mii_inst),
-           BMCR_LOOP|BMCR_S100);
+           MII_MEDIA_100_TX);
 
        mii_phy_reset(sc);
 
        sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask;
+       /* Let the companion PHY (if any) only handle the media we don't. */
        ma->mii_capmask = ~sc->mii_capabilities;
        device_printf(dev, " ");
-       mii_add_media(sc);
+       mii_phy_add_media(sc);
        printf("\n");
 #undef ADD
        MIIBUS_MEDIAINIT(sc->mii_dev);
@@ -170,20 +173,21 @@ mlphy_attach(dev)
 }
 
 static struct mii_softc *
-mlphy_find_other(device_t mii)
+mlphy_find_other(struct mlphy_softc *msc)
 {
        device_t                *devlist;
        struct mii_softc *retval;
        int i, devs;
 
        retval = NULL;
-       if (device_get_children(mii, &devlist, &devs))
+       if (device_get_children(msc->ml_mii.mii_dev, &devlist, &devs) != 0)
                return (NULL);
-       for (i = 0; i < devs; i++)
-               if (strcmp(device_get_name(devlist[i]), "mlphy")) {
+       for (i = 0; i < devs; i++) {
+               if (devlist[i] != msc->ml_dev) {
                        retval = device_get_softc(devlist[i]);
                        break;
                }
+       }
        free(devlist, M_TEMP);
        return (retval);
 }
@@ -204,7 +208,7 @@ mlphy_service(xsc, mii, cmd)
         * See if there's another PHY on this bus with us.
         * If so, we may need it for 10Mbps modes.
         */
-       other = mlphy_find_other(msc->ml_mii.mii_dev);
+       other = mlphy_find_other(msc);
 
        switch (cmd) {
        case MII_POLLSTAT:
@@ -229,7 +233,7 @@ mlphy_service(xsc, mii, cmd)
                                mii_phy_reset(other);
                                PHY_WRITE(other, MII_BMCR, BMCR_ISO);
                        }
-                       (void) mii_phy_auto(sc);
+                       (void)mii_phy_auto(sc);
                        msc->ml_linked = 0;
                        return (0);
                case IFM_10_T:
@@ -246,8 +250,7 @@ mlphy_service(xsc, mii, cmd)
                                mii_phy_reset(other);
                                PHY_WRITE(other, MII_BMCR, ife->ifm_data);
                        }
-                       PHY_WRITE(sc, MII_ANAR, mii_anar(ife->ifm_media));
-                       PHY_WRITE(sc, MII_BMCR, ife->ifm_data);
+                       mii_phy_setmedia(sc);
                        msc->ml_state = 0;
                        break;
                case IFM_100_TX:
@@ -262,17 +265,11 @@ mlphy_service(xsc, mii, cmd)
                                mii_phy_reset(other);
                                PHY_WRITE(other, MII_BMCR, BMCR_ISO);
                        }
-                       PHY_WRITE(sc, MII_ANAR, mii_anar(ife->ifm_media));
-                       PHY_WRITE(sc, MII_BMCR, ife->ifm_data);
+                       mii_phy_setmedia(sc);
                        msc->ml_state = 0;
                        break;
-               case IFM_100_T4:
-                       /*
-                        * XXX Not supported as a manual setting right now.
-                        */
-                       return (EINVAL);
                default:
-                       break;
+                       return (EINVAL);
 
                }
                break;
@@ -381,7 +378,7 @@ mlphy_status(sc)
        struct mii_softc        *other = NULL;
 
        /* See if there's another PHY on the bus with us. */
-       other = mlphy_find_other(msc->ml_mii.mii_dev);
+       other = mlphy_find_other(msc);
        if (other == NULL)
                return;
 

Modified: head/sys/dev/mii/tlphy.c
==============================================================================
--- head/sys/dev/mii/tlphy.c    Sun Oct 24 11:38:25 2010        (r214263)
+++ head/sys/dev/mii/tlphy.c    Sun Oct 24 12:51:02 2010        (r214264)
@@ -124,6 +124,9 @@ static int
 tlphy_probe(device_t dev)
 {
 
+       if (strcmp(device_get_name(device_get_parent(device_get_parent(dev))),
+           "tl") != 0)
+               return (ENXIO);
        return (mii_phy_dev_probe(dev, tlphys, BUS_PROBE_DEFAULT));
 }
 
@@ -150,11 +153,17 @@ tlphy_attach(device_t dev)
        sc->sc_mii.mii_service = tlphy_service;
        sc->sc_mii.mii_pdata = mii;
 
+       /*
+        * Note that if we're on a device that also supports 100baseTX,
+        * we are not going to want to use the built-in 10baseT port,
+        * since there will be another PHY on the MII wired up to the
+        * UTP connector.
+        */
        capmask = BMSR_DEFCAPMASK;
        if (mii->mii_instance &&
            device_get_children(sc->sc_mii.mii_dev, &devlist, &devs) == 0) {
                for (i = 0; i < devs; i++) {
-                       if (strcmp(device_get_name(devlist[i]), "tlphy")) {
+                       if (devlist[i] != dev) {
                                other = device_get_softc(devlist[i]);
                                capmask &= ~other->mii_capabilities;
                                break;
@@ -167,38 +176,36 @@ tlphy_attach(device_t dev)
 
        mii_phy_reset(&sc->sc_mii);
 
-       /*
-        * Note that if we're on a device that also supports 100baseTX,
-        * we are not going to want to use the built-in 10baseT port,
-        * since there will be another PHY on the MII wired up to the
-        * UTP connector.  The parent indicates this to us by specifying
-        * the TLPHY_MEDIA_NO_10_T bit.
-        */
        sc->sc_mii.mii_capabilities =
            PHY_READ(&sc->sc_mii, MII_BMSR) & capmask;
 
 #define        ADD(m, c)       ifmedia_add(&mii->mii_media, (m), (c), NULL)
 
-       ADD(IFM_MAKEWORD(IFM_ETHER, IFM_NONE, 0, sc->sc_mii.mii_inst),
-           BMCR_ISO);
-
-       ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, IFM_LOOP,
-           sc->sc_mii.mii_inst), BMCR_LOOP);
+       ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, IFM_LOOP, sc->sc_mii.mii_inst),
+           MII_MEDIA_100_TX);
 
 #define        PRINT(s)        printf("%s%s", sep, s); sep = ", "
 
-       device_printf(dev, " ");
-       ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_2, 0, sc->sc_mii.mii_inst), 0);
-       PRINT("10base2/BNC");
-       ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_5, 0, sc->sc_mii.mii_inst), 0);
-       PRINT("10base5/AUI");
-
-       if (sc->sc_mii.mii_capabilities & BMSR_MEDIAMASK) {
+       if ((sc->sc_mii.mii_flags & (MIIF_MACPRIV0 | MIIF_MACPRIV1)) != 0 &&
+           (sc->sc_mii.mii_capabilities & BMSR_MEDIAMASK) != 0)
+               device_printf(dev, " ");
+       if ((sc->sc_mii.mii_flags & MIIF_MACPRIV0) != 0) {
+               ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_2, 0, sc->sc_mii.mii_inst),
+                   0);
+               PRINT("10base2/BNC");
+       }
+       if ((sc->sc_mii.mii_flags & MIIF_MACPRIV1) != 0) {
+               ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_5, 0, sc->sc_mii.mii_inst),
+                   0);
+               PRINT("10base5/AUI");
+       }
+       if ((sc->sc_mii.mii_capabilities & BMSR_MEDIAMASK) != 0) {
                printf("%s", sep);
-               mii_add_media(&sc->sc_mii);
+               mii_phy_add_media(&sc->sc_mii);
        }
-
-       printf("\n");
+       if ((sc->sc_mii.mii_flags & (MIIF_MACPRIV0 | MIIF_MACPRIV1)) != 0 &&
+           (sc->sc_mii.mii_capabilities & BMSR_MEDIAMASK) != 0)
+               printf("\n");
 #undef ADD
 #undef PRINT
        MIIBUS_MEDIAINIT(sc->sc_mii.mii_dev);
@@ -233,7 +240,7 @@ tlphy_service(struct mii_softc *self, st
                         * an autonegotiation cycle, so there's no such
                         * thing as "already in auto mode".
                         */
-                       (void) tlphy_auto(sc);
+                       (void)tlphy_auto(sc);
                        break;
                case IFM_10_2:
                case IFM_10_5:
@@ -244,9 +251,7 @@ tlphy_service(struct mii_softc *self, st
                default:
                        PHY_WRITE(&sc->sc_mii, MII_TLPHY_CTRL, 0);
                        DELAY(100000);
-                       PHY_WRITE(&sc->sc_mii, MII_ANAR,
-                           mii_anar(ife->ifm_media));
-                       PHY_WRITE(&sc->sc_mii, MII_BMCR, ife->ifm_data);
+                       mii_phy_setmedia(&sc->sc_mii);
                }
                break;
 
@@ -283,7 +288,7 @@ tlphy_service(struct mii_softc *self, st
 
                sc->sc_mii.mii_ticks = 0;
                mii_phy_reset(&sc->sc_mii);
-               tlphy_auto(sc);
+               (void)tlphy_auto(sc);
                return (0);
        }
 

Modified: head/sys/dev/tl/if_tl.c
==============================================================================
--- head/sys/dev/tl/if_tl.c     Sun Oct 24 11:38:25 2010        (r214263)
+++ head/sys/dev/tl/if_tl.c     Sun Oct 24 12:51:02 2010        (r214264)
@@ -1104,12 +1104,11 @@ static int
 tl_attach(dev)
        device_t                dev;
 {
-       int                     i;
        u_int16_t               did, vid;
        struct tl_type          *t;
        struct ifnet            *ifp;
        struct tl_softc         *sc;
-       int                     unit, error = 0, rid;
+       int                     error, flags, i, rid, unit;
        u_char                  eaddr[6];
 
        vid = pci_get_vendor(dev);
@@ -1207,10 +1206,9 @@ tl_attach(dev)
 
        bzero(sc->tl_ldata, sizeof(struct tl_list_data));
 
-       sc->tl_dinfo = t;
-       if (t->tl_vid == COMPAQ_VENDORID || t->tl_vid == TI_VENDORID)
+       if (vid == COMPAQ_VENDORID || vid == TI_VENDORID)
                sc->tl_eeaddr = TL_EEPROM_EADDR;
-       if (t->tl_vid == OLICOM_VENDORID)
+       if (vid == OLICOM_VENDORID)
                sc->tl_eeaddr = TL_EEPROM_EADDR_OC;
 
        /* Reset the adapter. */
@@ -1241,7 +1239,7 @@ tl_attach(dev)
          * word. To make things even more confusing, neither 00:00:28
          * nor 00:00:24 appear in the IEEE OUI database.
          */
-        if (sc->tl_dinfo->tl_vid == OLICOM_VENDORID) {
+        if (vid == OLICOM_VENDORID) {
                 for (i = 0; i < ETHER_ADDR_LEN; i += 2) {
                         u_int16_t               *p;
                         p = (u_int16_t *)&eaddr[i];
@@ -1279,6 +1277,20 @@ tl_attach(dev)
         * XXX mii_attach() can fail for reason different than
         * no PHYs found!
         */
+       flags = 0;
+       if (vid == COMPAQ_VENDORID) {
+               if (did == COMPAQ_DEVICEID_NETEL_10_100_PROLIANT ||
+                   did == COMPAQ_DEVICEID_NETFLEX_3P_INTEGRATED ||
+                   did == COMPAQ_DEVICEID_NETFLEX_3P_BNC ||
+                   did == COMPAQ_DEVICEID_NETEL_10_T2_UTP_COAX)
+                       flags |= MIIF_MACPRIV0;
+               if (did == COMPAQ_DEVICEID_NETEL_10 ||
+                   did == COMPAQ_DEVICEID_NETEL_10_100_DUAL ||
+                   did == COMPAQ_DEVICEID_NETFLEX_3P ||
+                   did == COMPAQ_DEVICEID_NETEL_10_100_EMBEDDED)
+                       flags |= MIIF_MACPRIV1;
+       } else if (vid == OLICOM_VENDORID && did == OLICOM_DEVICEID_OC2183)
+                       flags |= MIIF_MACPRIV0 | MIIF_MACPRIV1;
        if (mii_attach(dev, &sc->tl_miibus, ifp, tl_ifmedia_upd,
            tl_ifmedia_sts, BMSR_DEFCAPMASK, MII_PHY_ANY, MII_OFFSET_ANY, 0)) {
                struct ifmedia          *ifm;

Modified: head/sys/dev/tl/if_tlreg.h
==============================================================================
--- head/sys/dev/tl/if_tlreg.h  Sun Oct 24 11:38:25 2010        (r214263)
+++ head/sys/dev/tl/if_tlreg.h  Sun Oct 24 12:51:02 2010        (r214264)
@@ -116,7 +116,6 @@ struct tl_softc {
        struct resource         *tl_irq;
        struct resource         *tl_res;
        device_t                tl_miibus;
-       struct tl_type          *tl_dinfo;      /* ThunderLAN adapter info */
        u_int8_t                tl_eeaddr;
        struct tl_list_data     *tl_ldata;      /* TX/RX lists and mbufs */
        struct tl_chain_data    tl_cdata;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to