[U-Boot] [PATCH] ftgmac100: Add DM support to the current driver

Cédric Le Goater clg at kaod.org
Fri Aug 24 20:21:39 UTC 2018


The conversion is inspired by the FTMAC100 driver and the driver was
tested on QEMU with an Aspeed SoC machine. Some extra changes required
by the Aspeed SoCs will be proposed in a subsequent patch.

Signed-off-by: Cédric Le Goater <clg at kaod.org>
---
 drivers/net/ftgmac100.c | 351 +++++++++++++++++++++++++++++++---------
 drivers/net/Kconfig     |   6 +
 2 files changed, 282 insertions(+), 75 deletions(-)

diff --git a/drivers/net/ftgmac100.c b/drivers/net/ftgmac100.c
index c996f5f4a167..e33c87ca02fa 100644
--- a/drivers/net/ftgmac100.c
+++ b/drivers/net/ftgmac100.c
@@ -16,8 +16,13 @@
 #include <asm/io.h>
 #include <asm/dma-mapping.h>
 #include <linux/mii.h>
+#include <phy.h>
 
 #include "ftgmac100.h"
+#ifdef CONFIG_DM_ETH
+#include <dm.h>
+DECLARE_GLOBAL_DATA_PTR;
+#endif
 
 #define ETH_ZLEN	60
 #define CFG_XBUF_SIZE	1536
@@ -36,15 +41,18 @@ struct ftgmac100_data {
 	int tx_index;
 	int rx_index;
 	int phy_addr;
+
+	const char *name;
+	phys_addr_t iobase;
 };
 
 /*
  * struct mii_bus functions
  */
-static int ftgmac100_mdiobus_read(struct eth_device *dev, int phy_addr,
-	int regnum)
+static int ftgmac100_mdiobus_read(struct ftgmac100_data *priv, int phy_addr,
+				  int regnum)
 {
-	struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)dev->iobase;
+	struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)priv->iobase;
 	int phycr;
 	int i;
 
@@ -76,10 +84,10 @@ static int ftgmac100_mdiobus_read(struct eth_device *dev, int phy_addr,
 	return -1;
 }
 
-static int ftgmac100_mdiobus_write(struct eth_device *dev, int phy_addr,
-	int regnum, u16 value)
+static int ftgmac100_mdiobus_write(struct ftgmac100_data *priv, int phy_addr,
+				   int regnum, u16 value)
 {
-	struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)dev->iobase;
+	struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)priv->iobase;
 	int phycr;
 	int data;
 	int i;
@@ -114,9 +122,10 @@ static int ftgmac100_mdiobus_write(struct eth_device *dev, int phy_addr,
 	return -1;
 }
 
-int ftgmac100_phy_read(struct eth_device *dev, int addr, int reg, u16 *value)
+int ftgmac100_phy_read(struct ftgmac100_data *priv, int addr, int reg,
+		       u16 *value)
 {
-	*value = ftgmac100_mdiobus_read(dev , addr, reg);
+	*value = ftgmac100_mdiobus_read(priv, addr, reg);
 
 	if (*value == -1)
 		return -1;
@@ -124,31 +133,31 @@ int ftgmac100_phy_read(struct eth_device *dev, int addr, int reg, u16 *value)
 	return 0;
 }
 
-int  ftgmac100_phy_write(struct eth_device *dev, int addr, int reg, u16 value)
+int  ftgmac100_phy_write(struct ftgmac100_data *priv, int addr, int reg,
+			 u16 value)
 {
-	if (ftgmac100_mdiobus_write(dev, addr, reg, value) == -1)
+	if (ftgmac100_mdiobus_write(priv, addr, reg, value) == -1)
 		return -1;
 
 	return 0;
 }
 
-static int ftgmac100_phy_reset(struct eth_device *dev)
+static int ftgmac100_phy_reset(struct ftgmac100_data *priv)
 {
-	struct ftgmac100_data *priv = dev->priv;
 	int i;
 	u16 status, adv;
 
 	adv = ADVERTISE_CSMA | ADVERTISE_ALL;
 
-	ftgmac100_phy_write(dev, priv->phy_addr, MII_ADVERTISE, adv);
+	ftgmac100_phy_write(priv, priv->phy_addr, MII_ADVERTISE, adv);
 
-	printf("%s: Starting autonegotiation...\n", dev->name);
+	printf("%s: Starting autonegotiation...\n", priv->name);
 
-	ftgmac100_phy_write(dev, priv->phy_addr,
-		MII_BMCR, (BMCR_ANENABLE | BMCR_ANRESTART));
+	ftgmac100_phy_write(priv, priv->phy_addr,
+			    MII_BMCR, (BMCR_ANENABLE | BMCR_ANRESTART));
 
 	for (i = 0; i < 100000 / 100; i++) {
-		ftgmac100_phy_read(dev, priv->phy_addr, MII_BMSR, &status);
+		ftgmac100_phy_read(priv, priv->phy_addr, MII_BMSR, &status);
 
 		if (status & BMSR_ANEGCOMPLETE)
 			break;
@@ -156,29 +165,30 @@ static int ftgmac100_phy_reset(struct eth_device *dev)
 	}
 
 	if (status & BMSR_ANEGCOMPLETE) {
-		printf("%s: Autonegotiation complete\n", dev->name);
+		printf("%s: Autonegotiation complete\n", priv->name);
 	} else {
 		printf("%s: Autonegotiation timed out (status=0x%04x)\n",
-		       dev->name, status);
+		       priv->name, status);
 		return 0;
 	}
 
 	return 1;
 }
 
-static int ftgmac100_phy_init(struct eth_device *dev)
+static int ftgmac100_phy_init(struct ftgmac100_data *priv)
 {
-	struct ftgmac100_data *priv = dev->priv;
-
 	int phy_addr;
-	u16 phy_id, status, adv, lpa, stat_ge;
+	u16 phy_id, status, adv, lpa;
 	int media, speed, duplex;
 	int i;
+#ifdef CONFIG_FTGMAC100_EGIGA
+	unsigned short stat_ge;
+#endif
 
 	/* Check if the PHY is up to snuff... */
-	for (phy_addr = 0; phy_addr < CONFIG_PHY_MAX_ADDR; phy_addr++) {
+	for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) {
 
-		ftgmac100_phy_read(dev, phy_addr, MII_PHYSID1, &phy_id);
+		ftgmac100_phy_read(priv, phy_addr, MII_PHYSID1, &phy_id);
 
 		/*
 		 * When it is unable to found PHY,
@@ -186,26 +196,26 @@ static int ftgmac100_phy_init(struct eth_device *dev)
 		 */
 		if (phy_id != 0xffff && phy_id != 0x0) {
 			printf("%s: found PHY at 0x%02x\n",
-				dev->name, phy_addr);
+				priv->name, phy_addr);
 			priv->phy_addr = phy_addr;
 			break;
 		}
 	}
 
 	if (phy_id == 0xffff || phy_id == 0x0) {
-		printf("%s: no PHY present\n", dev->name);
+		printf("%s: no PHY present\n", priv->name);
 		return 0;
 	}
 
-	ftgmac100_phy_read(dev, priv->phy_addr, MII_BMSR, &status);
+	ftgmac100_phy_read(priv, priv->phy_addr, MII_BMSR, &status);
 
 	if (!(status & BMSR_LSTATUS)) {
 		/* Try to re-negotiate if we don't have link already. */
-		ftgmac100_phy_reset(dev);
+		ftgmac100_phy_reset(priv);
 
 		for (i = 0; i < 100000 / 100; i++) {
-			ftgmac100_phy_read(dev, priv->phy_addr,
-				MII_BMSR, &status);
+			ftgmac100_phy_read(priv, priv->phy_addr,
+					   MII_BMSR, &status);
 			if (status & BMSR_LSTATUS)
 				break;
 			udelay(100);
@@ -213,14 +223,14 @@ static int ftgmac100_phy_init(struct eth_device *dev)
 	}
 
 	if (!(status & BMSR_LSTATUS)) {
-		printf("%s: link down\n", dev->name);
+		printf("%s: link down\n", priv->name);
 		return 0;
 	}
 
 #ifdef CONFIG_FTGMAC100_EGIGA
 	/* 1000 Base-T Status Register */
-	ftgmac100_phy_read(dev, priv->phy_addr,
-		MII_STAT1000, &stat_ge);
+	ftgmac100_phy_read(priv, priv->phy_addr,
+			   MII_STAT1000, &stat_ge);
 
 	speed = (stat_ge & (LPA_1000FULL | LPA_1000HALF)
 		 ? 1 : 0);
@@ -230,39 +240,39 @@ static int ftgmac100_phy_init(struct eth_device *dev)
 
 	if (speed) { /* Speed is 1000 */
 		printf("%s: link up, 1000bps %s-duplex\n",
-			dev->name, duplex ? "full" : "half");
+			priv->name, duplex ? "full" : "half");
 		return 0;
 	}
 #endif
 
-	ftgmac100_phy_read(dev, priv->phy_addr, MII_ADVERTISE, &adv);
-	ftgmac100_phy_read(dev, priv->phy_addr, MII_LPA, &lpa);
+	ftgmac100_phy_read(priv, priv->phy_addr, MII_ADVERTISE, &adv);
+	ftgmac100_phy_read(priv, priv->phy_addr, MII_LPA, &lpa);
 
 	media = mii_nway_result(lpa & adv);
 	speed = (media & (ADVERTISE_100FULL | ADVERTISE_100HALF) ? 1 : 0);
 	duplex = (media & ADVERTISE_FULL) ? 1 : 0;
 
 	printf("%s: link up, %sMbps %s-duplex\n",
-	       dev->name, speed ? "100" : "10", duplex ? "full" : "half");
+	       priv->name, speed ? "100" : "10", duplex ? "full" : "half");
 
 	return 1;
 }
 
-static int ftgmac100_update_link_speed(struct eth_device *dev)
+static int ftgmac100_update_link_speed(struct ftgmac100_data *priv)
 {
-	struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)dev->iobase;
-	struct ftgmac100_data *priv = dev->priv;
+	struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)priv->iobase;
 
 	unsigned short stat_fe;
-	unsigned short stat_ge;
 	unsigned int maccr;
 
 #ifdef CONFIG_FTGMAC100_EGIGA
+	unsigned short stat_ge;
+
 	/* 1000 Base-T Status Register */
-	ftgmac100_phy_read(dev, priv->phy_addr, MII_STAT1000, &stat_ge);
+	ftgmac100_phy_read(priv, priv->phy_addr, MII_STAT1000, &stat_ge);
 #endif
 
-	ftgmac100_phy_read(dev, priv->phy_addr, MII_BMSR, &stat_fe);
+	ftgmac100_phy_read(priv, priv->phy_addr, MII_BMSR, &stat_fe);
 
 	if (!(stat_fe & BMSR_LSTATUS))	/* link status up? */
 		return 0;
@@ -315,9 +325,9 @@ static int ftgmac100_update_link_speed(struct eth_device *dev)
 /*
  * Reset MAC
  */
-static void ftgmac100_reset(struct eth_device *dev)
+static void ftgmac100_reset(struct ftgmac100_data *priv)
 {
-	struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)dev->iobase;
+	struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)priv->iobase;
 
 	debug("%s()\n", __func__);
 
@@ -330,10 +340,10 @@ static void ftgmac100_reset(struct eth_device *dev)
 /*
  * Set MAC address
  */
-static void ftgmac100_set_mac(struct eth_device *dev,
-	const unsigned char *mac)
+static void ftgmac100_set_mac(struct ftgmac100_data *priv,
+			      const unsigned char *mac)
 {
-	struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)dev->iobase;
+	struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)priv->iobase;
 	unsigned int maddr = mac[0] << 8 | mac[1];
 	unsigned int laddr = mac[2] << 24 | mac[3] << 16 | mac[4] << 8 | mac[5];
 
@@ -343,29 +353,22 @@ static void ftgmac100_set_mac(struct eth_device *dev,
 	writel(laddr, &ftgmac100->mac_ladr);
 }
 
-static void ftgmac100_set_mac_from_env(struct eth_device *dev)
-{
-	eth_env_get_enetaddr("ethaddr", dev->enetaddr);
-
-	ftgmac100_set_mac(dev, dev->enetaddr);
-}
-
 /*
  * disable transmitter, receiver
  */
-static void ftgmac100_halt(struct eth_device *dev)
+static void _ftgmac100_halt(struct ftgmac100_data *priv)
 {
-	struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)dev->iobase;
+	struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)priv->iobase;
 
 	debug("%s()\n", __func__);
 
 	writel(0, &ftgmac100->maccr);
 }
 
-static int ftgmac100_init(struct eth_device *dev, bd_t *bd)
+static int _ftgmac100_init(struct ftgmac100_data *priv,
+			   unsigned char enetaddr[6])
 {
-	struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)dev->iobase;
-	struct ftgmac100_data *priv = dev->priv;
+	struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)priv->iobase;
 	struct ftgmac100_txdes *txdes;
 	struct ftgmac100_rxdes *rxdes;
 	unsigned int maccr;
@@ -374,6 +377,8 @@ static int ftgmac100_init(struct eth_device *dev, bd_t *bd)
 
 	debug("%s()\n", __func__);
 
+	ftgmac100_reset(priv);
+
 	if (!priv->txdes) {
 		txdes = dma_alloc_coherent(
 			sizeof(*txdes) * PKTBUFSTX, &priv->txdes_dma);
@@ -395,7 +400,7 @@ static int ftgmac100_init(struct eth_device *dev, bd_t *bd)
 	rxdes = priv->rxdes;
 
 	/* set the ethernet address */
-	ftgmac100_set_mac_from_env(dev);
+	ftgmac100_set_mac(priv, enetaddr);
 
 	/* disable all interrupts */
 	writel(0, &ftgmac100->ier);
@@ -453,20 +458,33 @@ static int ftgmac100_init(struct eth_device *dev, bd_t *bd)
 
 	writel(maccr, &ftgmac100->maccr);
 
-	if (!ftgmac100_phy_init(dev)) {
-		if (!ftgmac100_update_link_speed(dev))
+	if (!ftgmac100_phy_init(priv)) {
+		if (!ftgmac100_update_link_speed(priv))
 			return -1;
 	}
 
 	return 0;
 }
 
+/*
+ * Free receiving buffer
+ */
+static int _ftgmac100_free_pkt(struct ftgmac100_data *priv)
+{
+	struct ftgmac100_rxdes *curr_des;
+
+	curr_des = &priv->rxdes[priv->rx_index];
+	/* release buffer to DMA */
+	curr_des->rxdes0 &= ~FTGMAC100_RXDES0_RXPKT_RDY;
+	priv->rx_index = (priv->rx_index + 1) % PKTBUFSRX;
+	return 0;
+}
+
 /*
  * Get a data block via Ethernet
  */
-static int ftgmac100_recv(struct eth_device *dev)
+static int __ftgmac100_recv(struct ftgmac100_data *priv)
 {
-	struct ftgmac100_data *priv = dev->priv;
 	struct ftgmac100_rxdes *curr_des;
 	unsigned short rxlen;
 
@@ -486,7 +504,7 @@ static int ftgmac100_recv(struct eth_device *dev)
 	rxlen = FTGMAC100_RXDES0_VDBC(curr_des->rxdes0);
 
 	debug("%s(): RX buffer %d, %x received\n",
-	       __func__, priv->rx_index, rxlen);
+	      __func__, priv->rx_index, rxlen);
 
 	/* invalidate d-cache */
 	dma_map_single((void *)curr_des->rxdes2, rxlen, DMA_FROM_DEVICE);
@@ -505,10 +523,10 @@ static int ftgmac100_recv(struct eth_device *dev)
 /*
  * Send a data block via Ethernet
  */
-static int ftgmac100_send(struct eth_device *dev, void *packet, int length)
+static int _ftgmac100_send(struct ftgmac100_data *priv, void *packet,
+			   int length)
 {
-	struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)dev->iobase;
-	struct ftgmac100_data *priv = dev->priv;
+	struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)priv->iobase;
 	struct ftgmac100_txdes *curr_des = &priv->txdes[priv->tx_index];
 
 	if (curr_des->txdes0 & FTGMAC100_TXDES0_TXDMA_OWN) {
@@ -526,9 +544,9 @@ static int ftgmac100_send(struct eth_device *dev, void *packet, int length)
 	/* only one descriptor on TXBUF */
 	curr_des->txdes0 &= FTGMAC100_TXDES0_EDOTR;
 	curr_des->txdes0 |= FTGMAC100_TXDES0_FTS |
-			    FTGMAC100_TXDES0_LTS |
-			    FTGMAC100_TXDES0_TXBUF_SIZE(length) |
-			    FTGMAC100_TXDES0_TXDMA_OWN ;
+		FTGMAC100_TXDES0_LTS |
+		FTGMAC100_TXDES0_TXBUF_SIZE(length) |
+		FTGMAC100_TXDES0_TXDMA_OWN;
 
 	/* start transmit */
 	writel(1, &ftgmac100->txpd);
@@ -540,6 +558,59 @@ static int ftgmac100_send(struct eth_device *dev, void *packet, int length)
 	return 0;
 }
 
+#ifndef CONFIG_DM_ETH
+/*
+ * disable transmitter, receiver
+ */
+static void ftgmac100_halt(struct eth_device *dev)
+{
+	struct ftgmac100_data *priv = dev->priv;
+
+	return _ftgmac100_halt(priv);
+}
+
+static int ftgmac100_init(struct eth_device *dev, bd_t *bd)
+{
+	struct ftgmac100_data *priv = dev->priv;
+
+	return _ftgmac100_init(priv, dev->enetaddr);
+}
+
+static int _ftgmac100_recv(struct ftgmac100_data *priv)
+{
+	struct ftgmac100_rxdes *curr_des;
+	unsigned short len;
+
+	curr_des = &priv->rxdes[priv->rx_index];
+	len = __ftgmac100_recv(priv);
+	if (len) {
+		/* pass the packet up to the protocol layers. */
+		net_process_received_packet((void *)curr_des->rxdes2, len);
+		_ftgmac100_free_pkt(priv);
+	}
+	return len ? 1 : 0;
+}
+
+/*
+ * Get a data block via Ethernet
+ */
+static int ftgmac100_recv(struct eth_device *dev)
+{
+	struct ftgmac100_data *priv = dev->priv;
+
+	return _ftgmac100_recv(priv);
+}
+
+/*
+ * Send a data block via Ethernet
+ */
+static int ftgmac100_send(struct eth_device *dev, void *packet, int length)
+{
+	struct ftgmac100_data *priv = dev->priv;
+
+	return _ftgmac100_send(priv, packet, length);
+}
+
 int ftgmac100_initialize(bd_t *bd)
 {
 	struct eth_device *dev;
@@ -571,8 +642,6 @@ int ftgmac100_initialize(bd_t *bd)
 
 	eth_register(dev);
 
-	ftgmac100_reset(dev);
-
 	return 1;
 
 free_dev:
@@ -580,3 +649,135 @@ free_dev:
 out:
 	return 0;
 }
+#endif
+
+#ifdef CONFIG_DM_ETH
+static int ftgmac100_start(struct udevice *dev)
+{
+	struct eth_pdata *plat = dev_get_platdata(dev);
+	struct ftgmac100_data *priv = dev_get_priv(dev);
+
+	return _ftgmac100_init(priv, plat->enetaddr);
+}
+
+static void ftgmac100_stop(struct udevice *dev)
+{
+	struct ftgmac100_data *priv = dev_get_priv(dev);
+
+	_ftgmac100_halt(priv);
+}
+
+static int ftgmac100_send(struct udevice *dev, void *packet, int length)
+{
+	struct ftgmac100_data *priv = dev_get_priv(dev);
+	int ret;
+
+	ret = _ftgmac100_send(priv, packet, length);
+	return ret ? 0 : -ETIMEDOUT;
+}
+
+static int ftgmac100_recv(struct udevice *dev, int flags, uchar **packetp)
+{
+	struct ftgmac100_data *priv = dev_get_priv(dev);
+	struct ftgmac100_rxdes *curr_des;
+	int len;
+
+	curr_des = &priv->rxdes[priv->rx_index];
+	len = __ftgmac100_recv(priv);
+	if (len)
+		*packetp = (uchar *)(unsigned long)curr_des->rxdes2;
+
+	return len ? len : -EAGAIN;
+}
+
+static int ftgmac100_free_pkt(struct udevice *dev, uchar *packet, int length)
+{
+	struct ftgmac100_data *priv = dev_get_priv(dev);
+
+	_ftgmac100_free_pkt(priv);
+	return 0;
+}
+
+static const char *dtbmacaddr(u32 ifno)
+{
+	int node, len;
+	char enet[16];
+	const char *mac;
+	const char *path;
+
+	if (!gd->fdt_blob) {
+		printf("%s: don't have a valid gd->fdt_blob!\n", __func__);
+		return NULL;
+	}
+	node = fdt_path_offset(gd->fdt_blob, "/aliases");
+	if (node < 0)
+		return NULL;
+
+	sprintf(enet, "ethernet%d", ifno);
+	path = fdt_getprop(gd->fdt_blob, node, enet, NULL);
+	if (!path) {
+		printf("no alias for %s\n", enet);
+		return NULL;
+	}
+	node = fdt_path_offset(gd->fdt_blob, path);
+	mac = fdt_getprop(gd->fdt_blob, node, "mac-address", &len);
+	if (mac && is_valid_ethaddr((u8 *)mac))
+		return mac;
+
+	return NULL;
+}
+
+static int ftgmac100_ofdata_to_platdata(struct udevice *dev)
+{
+	struct ftgmac100_data *priv = dev_get_priv(dev);
+	struct eth_pdata *pdata = dev_get_platdata(dev);
+	const char *mac;
+
+	pdata->iobase = devfdt_get_addr(dev);
+	priv->iobase = pdata->iobase;
+	mac = dtbmacaddr(0);
+	if (mac)
+		memcpy(pdata->enetaddr, mac, 6);
+
+	return 0;
+}
+
+static int ftgmac100_probe(struct udevice *dev)
+{
+	struct ftgmac100_data *priv = dev_get_priv(dev);
+
+	priv->name = dev->name;
+	return 0;
+}
+
+static int ftgmac100_bind(struct udevice *dev)
+{
+	return device_set_name(dev, dev->name);
+}
+
+static const struct eth_ops ftgmac100_ops = {
+	.start	= ftgmac100_start,
+	.send	= ftgmac100_send,
+	.recv	= ftgmac100_recv,
+	.stop	= ftgmac100_stop,
+	.free_pkt = ftgmac100_free_pkt,
+};
+
+static const struct udevice_id ftgmac100_ids[] = {
+	{ .compatible = "faraday,ftgmac100" },
+	{ }
+};
+
+U_BOOT_DRIVER(ftgmac100) = {
+	.name	= "ftgmac100",
+	.id	= UCLASS_ETH,
+	.of_match = ftgmac100_ids,
+	.bind	= ftgmac100_bind,
+	.ofdata_to_platdata = ftgmac100_ofdata_to_platdata,
+	.probe	= ftgmac100_probe,
+	.ops	= &ftgmac100_ops,
+	.priv_auto_alloc_size = sizeof(struct ftgmac100_data),
+	.platdata_auto_alloc_size = sizeof(struct eth_pdata),
+	.flags	= DM_FLAG_ALLOC_PRIV_DMA,
+};
+#endif
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 5441da47d13e..ec6778db4132 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -186,6 +186,12 @@ config FTMAC100
 	help
 	  This MAC is present in Andestech SoCs.
 
+config FTGMAC100
+	bool "Ftgmac100 Ethernet Support"
+	help
+          This driver supports the Faraday's FTGMAC100 Gigabit SoC
+          Ethernet.
+
 config MVGBE
 	bool "Marvell Orion5x/Kirkwood network interface support"
 	depends on KIRKWOOD || ORION5X
-- 
2.17.1



More information about the U-Boot mailing list