svn commit: r290516 - head/sys/arm/at91
Warner Losh
imp at FreeBSD.org
Sat Nov 7 22:52:08 UTC 2015
Author: imp
Date: Sat Nov 7 22:52:06 2015
New Revision: 290516
URL: https://svnweb.freebsd.org/changeset/base/290516
Log:
Implement the phy-mode property for ate and macb. If it is set to
"rmii", use rmii mode for the MAC, otherwise use MII mode. The code is
somewhat duplicated between these drivers for this.
Also, add AT91RM9200 compatibility strings to the ate driver. In the
future, there's a good chance that ate will lose the MACB support and
only attach to the AT91RM9200 EMAC device since the macb works now
that RMII support has been added to it.
Modified:
head/sys/arm/at91/if_ate.c
head/sys/arm/at91/if_macb.c
Modified: head/sys/arm/at91/if_ate.c
==============================================================================
--- head/sys/arm/at91/if_ate.c Sat Nov 7 22:06:49 2015 (r290515)
+++ head/sys/arm/at91/if_ate.c Sat Nov 7 22:52:06 2015 (r290516)
@@ -228,23 +228,82 @@ static void ate_rxfilter(struct ate_soft
static int ate_miibus_readreg(device_t dev, int phy, int reg);
static int ate_miibus_writereg(device_t dev, int phy, int reg, int data);
+
/*
* The AT91 family of products has the ethernet interface called EMAC.
* However, it isn't self identifying. It is anticipated that the parent bus
* code will take care to only add ate devices where they really are. As
* such, we do nothing here to identify the device and just set its name.
+ * However, FDT makes it self-identifying.
*/
static int
ate_probe(device_t dev)
{
#ifdef FDT
- if (!ofw_bus_is_compatible(dev, "cdns,at32ap7000-macb"))
+ if (!ofw_bus_is_compatible(dev, "cdns,at91rm9200-emac") &&
+ !ofw_bus_is_compatible(dev, "cdns,emac") &&
+ !ofw_bus_is_compatible(dev, "cdns,at32ap7000-macb"))
return (ENXIO);
#endif
device_set_desc(dev, "EMAC");
return (0);
}
+#ifdef FDT
+/*
+ * We have to know if we're using MII or RMII attachment
+ * for the MACB to talk to the PHY correctly. With FDT,
+ * we must use rmii if there's a proprety phy-mode
+ * equal to "rmii". Otherwise we MII mode is used.
+ */
+static void
+ate_set_rmii(struct ate_softc *sc)
+{
+ phandle_t node;
+ char prop[10];
+ ssize_t len;
+
+ node = ofw_bus_get_node(sc->dev);
+ memset(prop, 0 ,sizeof(prop));
+ len = OF_getproplen(node, "phy-mode");
+ if (len != 4)
+ return;
+ if (OF_getprop(node, "phy-mode", prop, len) != len)
+ return;
+ if (strncmp(prop, "rmii", 4) == 0)
+ sc->use_rmii = 1;
+}
+
+#else
+/*
+ * We have to know if we're using MII or RMII attachment
+ * for the MACB to talk to the PHY correctly. Without FDT,
+ * there's no good way to do this. So, if the config file
+ * has 'option AT91_ATE_USE_RMII', then we'll force RMII.
+ * Otherwise, we'll use what the bootloader setup. Either
+ * it setup RMII or MII, in which case we'll get it right,
+ * or it did nothing, and we'll fall back to MII and the
+ * option would override if present.
+ */
+static void
+ata_set_rmii(struct ate_softc *sc)
+{
+
+ /* Default to what boot rom did */
+ if (!sc->is_emacb)
+ sc->use_rmii =
+ (RD4(sc, ETH_CFG) & ETH_CFG_RMII) == ETH_CFG_RMII;
+ else
+ sc->use_rmii =
+ (RD4(sc, ETHB_UIO) & ETHB_UIO_RMII) == ETHB_UIO_RMII;
+
+#ifdef AT91_ATE_USE_RMII
+ /* Compile time override */
+ sc->use_rmii = 1;
+#endif
+}
+#endif
+
static int
ate_attach(device_t dev)
{
@@ -278,25 +337,19 @@ ate_attach(device_t dev)
}
/* New or old version, chooses buffer size. */
+#ifdef FDT
+ sc->is_emacb = ofw_bus_is_compatible(dev, "cdns,at32ap7000-macb");
+#else
sc->is_emacb = at91_is_sam9() || at91_is_sam9xe();
+#endif
sc->rx_buf_size = RX_BUF_SIZE(sc);
err = ate_activate(dev);
if (err)
goto out;
- /* Default to what boot rom did */
- if (!sc->is_emacb)
- sc->use_rmii =
- (RD4(sc, ETH_CFG) & ETH_CFG_RMII) == ETH_CFG_RMII;
- else
- sc->use_rmii =
- (RD4(sc, ETHB_UIO) & ETHB_UIO_RMII) == ETHB_UIO_RMII;
+ ate_set_rmii(sc);
-#ifdef AT91_ATE_USE_RMII
- /* Compile time override */
- sc->use_rmii = 1;
-#endif
/* Sysctls */
sctx = device_get_sysctl_ctx(dev);
soid = device_get_sysctl_tree(dev);
Modified: head/sys/arm/at91/if_macb.c
==============================================================================
--- head/sys/arm/at91/if_macb.c Sat Nov 7 22:06:49 2015 (r290515)
+++ head/sys/arm/at91/if_macb.c Sat Nov 7 22:52:06 2015 (r290516)
@@ -1294,6 +1294,52 @@ macb_get_mac(struct macb_softc *sc, u_ch
}
+#ifdef FDT
+/*
+ * We have to know if we're using MII or RMII attachment
+ * for the MACB to talk to the PHY correctly. With FDT,
+ * we must use rmii if there's a proprety phy-mode
+ * equal to "rmii". Otherwise we MII mode is used.
+ */
+static void
+macb_set_rmii(struct macb_softc *sc)
+{
+ phandle_t node;
+ char prop[10];
+ ssize_t len;
+
+ node = ofw_bus_get_node(sc->dev);
+ memset(prop, 0 ,sizeof(prop));
+ len = OF_getproplen(node, "phy-mode");
+ if (len != 4)
+ return;
+ if (OF_getprop(node, "phy-mode", prop, len) != len)
+ return;
+ if (strncmp(prop, "rmii", 4) == 0)
+ sc->use_rmii = USRIO_RMII;
+}
+#else
+/*
+ * We have to know if we're using MII or RMII attachment
+ * for the MACB to talk to the PHY correctly. Without FDT,
+ * there's no good way to do this. So, if the config file
+ * has 'option AT91_MACB_USE_RMII', then we'll force RMII.
+ * Otherwise, we'll use what the bootloader setup. Either
+ * it setup RMII or MII, in which case we'll get it right,
+ * or it did nothing, and we'll fall back to MII and the
+ * option would override if present.
+ */
+static void
+macb_set_rmii(struct macb_softc *sc)
+{
+#ifdef AT91_MACB_USE_RMII
+ sc->use_rmii = USRIO_RMII;
+#else
+ sc->use_rmii = read_4(sc, EMAC_USRIO) & USRIO_RMII;
+#endif
+}
+#endif
+
static int
macb_attach(device_t dev)
{
@@ -1360,12 +1406,7 @@ macb_attach(device_t dev)
sc->clock = sc->clock << 10;
-#ifdef AT91_MACB_USE_RMII
- sc->use_rmii = USRIO_RMII;
-#else
- sc->use_rmii = read_4(sc, EMAC_USRIO) & USRIO_RMII;
-#endif
-
+ macb_set_rmii(sc);
write_4(sc, EMAC_NCFGR, sc->clock);
write_4(sc, EMAC_USRIO, USRIO_CLOCK | sc->use_rmii); //enable clock
More information about the svn-src-head
mailing list