svn commit: r214264 - in head/sys/dev: mii tl

Marius Strobl marius at FreeBSD.org
Sun Oct 24 12:51:03 UTC 2010


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;


More information about the svn-src-all mailing list