svn commit: r207185 - user/jmallett/octeon/sys/mips/cavium/octe
Juli Mallett
jmallett at FreeBSD.org
Sun Apr 25 05:09:09 UTC 2010
Author: jmallett
Date: Sun Apr 25 05:09:08 2010
New Revision: 207185
URL: http://svn.freebsd.org/changeset/base/207185
Log:
o) Allow miibus attachment to fail, falling back to non-MII media handling.
o) Only allow miibus access to *our* PHY on the shared MII bus.
XXX The PHY numbering that we get from the Simple Executive seems to be off or
we're not configuring something right at the MII layer or something; the
miibus correctly finds the RTL8212 chips on the CAM-0100 and says they are
at PHY 2 and PHY 3. Except octe0 and octe1 think their PHYs are #4 and #9
respectively.
Modified:
user/jmallett/octeon/sys/mips/cavium/octe/octe.c
Modified: user/jmallett/octeon/sys/mips/cavium/octe/octe.c
==============================================================================
--- user/jmallett/octeon/sys/mips/cavium/octe/octe.c Sun Apr 25 04:04:22 2010 (r207184)
+++ user/jmallett/octeon/sys/mips/cavium/octe/octe.c Sun Apr 25 05:09:08 2010 (r207185)
@@ -145,20 +145,21 @@ octe_attach(device_t dev)
if_initname(ifp, device_get_name(dev), device_get_unit(dev));
- ifmedia_init(&priv->media, 0, octe_medchange, octe_medstat);
- if (priv->phy_id == -1) {
- ifmedia_add(&priv->media, IFM_ETHER | IFM_AUTO, 0, NULL);
- ifmedia_set(&priv->media, IFM_ETHER | IFM_AUTO);
- } else {
+ if (priv->phy_id != -1) {
error = mii_phy_probe(dev, &priv->miibus, octe_mii_medchange,
octe_mii_medstat);
if (error != 0) {
- device_printf(dev, "could not find PHY!\n");
- /* XXX Cleanup. */
- return (error);
+ device_printf(dev, "missing phy %u\n", priv->phy_id);
}
}
+ if (priv->miibus == NULL) {
+ ifmedia_init(&priv->media, 0, octe_medchange, octe_medstat);
+
+ ifmedia_add(&priv->media, IFM_ETHER | IFM_AUTO, 0, NULL);
+ ifmedia_set(&priv->media, IFM_ETHER | IFM_AUTO);
+ }
+
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
ifp->if_init = octe_init;
ifp->if_ioctl = octe_ioctl;
@@ -199,6 +200,9 @@ octe_miibus_readreg(device_t dev, int ph
priv = device_get_softc(dev);
+ if (phy != priv->phy_id)
+ return (0);
+
return (cvm_oct_mdio_read(priv->ifp, phy, reg));
}
@@ -209,6 +213,9 @@ octe_miibus_writereg(device_t dev, int p
priv = device_get_softc(dev);
+ KASSERT(phy == priv->phy_id,
+ ("write to phy %u but our phy is %u", phy, priv->phy_id));
+
cvm_oct_mdio_write(priv->ifp, phy, reg, val);
return (0);
More information about the svn-src-user
mailing list