Merge branch 'master' of git://git.denx.de/u-boot-net
authorTom Rini <trini@konsulko.com>
Thu, 24 Jan 2019 20:30:06 +0000 (15:30 -0500)
committerTom Rini <trini@konsulko.com>
Thu, 24 Jan 2019 20:30:06 +0000 (15:30 -0500)
23 files changed:
README
drivers/net/designware.c
drivers/net/macb.c
drivers/net/mvgbe.c
drivers/net/mvneta.c
drivers/net/mvpp2.c
drivers/net/phy/aquantia.c
drivers/net/phy/micrel_ksz90x1.c
drivers/net/phy/phy.c
drivers/net/phy/realtek.c
drivers/net/rtl8139.c
drivers/net/tsec.c
drivers/usb/gadget/ether.c
include/env_callback.h
include/env_flags.h
include/net.h
include/phy.h
net/eth-uclass.c
net/eth_legacy.c
net/net.c
net/tftp.c
scripts/config_whitelist.txt
test/dm/eth.c

diff --git a/README b/README
index 17d56b8..aed6b96 100644 (file)
--- a/README
+++ b/README
@@ -1429,15 +1429,6 @@ The following options need to be configured:
                forwarded through a router.
                (Environment variable "netmask")
 
-- Multicast TFTP Mode:
-               CONFIG_MCAST_TFTP
-
-               Defines whether you want to support multicast TFTP as per
-               rfc-2090; for example to work with atftp.  Lets lots of targets
-               tftp down the same boot image concurrently.  Note: the Ethernet
-               driver in use must provide a function: mcast() to join/leave a
-               multicast group.
-
 - BOOTP Recovery Mode:
                CONFIG_BOOTP_RANDOM_DELAY
 
index 4fa26ab..2c5d956 100644 (file)
@@ -380,24 +380,28 @@ static int _dw_eth_send(struct dw_eth_dev *priv, void *packet, int length)
                return -EPERM;
        }
 
-       length = max(length, ETH_ZLEN);
-
        memcpy((void *)data_start, packet, length);
+       if (length < ETH_ZLEN) {
+               memset(&((char *)data_start)[length], 0, ETH_ZLEN - length);
+               length = ETH_ZLEN;
+       }
 
        /* Flush data to be sent */
        flush_dcache_range(data_start, data_end);
 
 #if defined(CONFIG_DW_ALTDESCRIPTOR)
        desc_p->txrx_status |= DESC_TXSTS_TXFIRST | DESC_TXSTS_TXLAST;
-       desc_p->dmamac_cntl |= (length << DESC_TXCTRL_SIZE1SHFT) &
-                              DESC_TXCTRL_SIZE1MASK;
+       desc_p->dmamac_cntl = (desc_p->dmamac_cntl & ~DESC_TXCTRL_SIZE1MASK) |
+                             ((length << DESC_TXCTRL_SIZE1SHFT) &
+                             DESC_TXCTRL_SIZE1MASK);
 
        desc_p->txrx_status &= ~(DESC_TXSTS_MSK);
        desc_p->txrx_status |= DESC_TXSTS_OWNBYDMA;
 #else
-       desc_p->dmamac_cntl |= ((length << DESC_TXCTRL_SIZE1SHFT) &
-                              DESC_TXCTRL_SIZE1MASK) | DESC_TXCTRL_TXLAST |
-                              DESC_TXCTRL_TXFIRST;
+       desc_p->dmamac_cntl = (desc_p->dmamac_cntl & ~DESC_TXCTRL_SIZE1MASK) |
+                             ((length << DESC_TXCTRL_SIZE1SHFT) &
+                             DESC_TXCTRL_SIZE1MASK) | DESC_TXCTRL_TXLAST |
+                             DESC_TXCTRL_TXFIRST;
 
        desc_p->txrx_status = DESC_TXSTS_OWNBYDMA;
 #endif
index 94c89c7..c9ee222 100644 (file)
@@ -1151,7 +1151,9 @@ static int macb_eth_ofdata_to_platdata(struct udevice *dev)
 {
        struct eth_pdata *pdata = dev_get_platdata(dev);
 
-       pdata->iobase = devfdt_get_addr(dev);
+       pdata->iobase = (phys_addr_t)dev_remap_addr(dev);
+       if (!pdata->iobase)
+               return -EINVAL;
 
        return macb_late_eth_ofdata_to_platdata(dev);
 }
index 74fed7a..037e59e 100644 (file)
@@ -1005,10 +1005,8 @@ static int mvgbe_ofdata_to_platdata(struct udevice *dev)
        phy_mode = fdt_getprop(gd->fdt_blob, pnode, "phy-mode", NULL);
        if (phy_mode)
                pdata->phy_interface = phy_get_interface_by_name(phy_mode);
-       if (pdata->phy_interface == -1) {
-               debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
-               return -EINVAL;
-       }
+       else
+               pdata->phy_interface = PHY_INTERFACE_MODE_GMII;
 
        dmvgbe->phy_interface = pdata->phy_interface;
 
index 8cb04b5..333be8f 100644 (file)
@@ -27,6 +27,7 @@
 #include <asm/arch/soc.h>
 #include <linux/compat.h>
 #include <linux/mbus.h>
+#include <asm-generic/gpio.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -274,6 +275,9 @@ struct mvneta_port {
        int init;
        int phyaddr;
        struct phy_device *phydev;
+#ifdef CONFIG_DM_GPIO
+       struct gpio_desc phy_reset_gpio;
+#endif
        struct mii_dev *bus;
 };
 
@@ -1749,6 +1753,17 @@ static int mvneta_probe(struct udevice *dev)
        if (ret)
                return ret;
 
+#ifdef CONFIG_DM_GPIO
+       gpio_request_by_name(dev, "phy-reset-gpios", 0,
+                            &pp->phy_reset_gpio, GPIOD_IS_OUT);
+
+       if (dm_gpio_is_valid(&pp->phy_reset_gpio)) {
+               dm_gpio_set_value(&pp->phy_reset_gpio, 1);
+               mdelay(10);
+               dm_gpio_set_value(&pp->phy_reset_gpio, 0);
+       }
+#endif
+
        return board_network_enable(bus);
 }
 
index 9b3ab25..bcc6fe9 100644 (file)
@@ -897,7 +897,6 @@ struct mvpp2 {
        void __iomem *base;
        void __iomem *lms_base;
        void __iomem *iface_base;
-       void __iomem *mdio_base;
 
        void __iomem *mpcs_base;
        void __iomem *xpcs_base;
@@ -928,8 +927,6 @@ struct mvpp2 {
        /* Maximum number of RXQs per port */
        unsigned int max_port_rxqs;
 
-       struct mii_dev *bus;
-
        int probe_done;
        u8 num_ports;
 };
@@ -955,6 +952,7 @@ struct mvpp2_port {
 
        /* Per-port registers' base address */
        void __iomem *base;
+       void __iomem *mdio_base;
 
        struct mvpp2_rx_queue **rxqs;
        struct mvpp2_tx_queue **txqs;
@@ -977,6 +975,7 @@ struct mvpp2_port {
        phy_interface_t phy_interface;
        int phy_node;
        int phyaddr;
+       struct mii_dev *bus;
 #ifdef CONFIG_DM_GPIO
        struct gpio_desc phy_reset_gpio;
        struct gpio_desc phy_tx_disable_gpio;
@@ -4500,7 +4499,7 @@ static int mvpp2_phy_connect(struct udevice *dev, struct mvpp2_port *port)
        struct phy_device *phy_dev;
 
        if (!port->init || port->link == 0) {
-               phy_dev = phy_connect(port->priv->bus, port->phyaddr, dev,
+               phy_dev = phy_connect(port->bus, port->phyaddr, dev,
                                      port->phy_interface);
                port->phy_dev = phy_dev;
                if (!phy_dev) {
@@ -4705,39 +4704,34 @@ static int phy_info_parse(struct udevice *dev, struct mvpp2_port *port)
 {
        int port_node = dev_of_offset(dev);
        const char *phy_mode_str;
-       int phy_node, mdio_off, cp_node;
+       int phy_node;
        u32 id;
        u32 phyaddr = 0;
        int phy_mode = -1;
-       phys_addr_t mdio_addr;
+
+       /* Default mdio_base from the same eth base */
+       if (port->priv->hw_version == MVPP21)
+               port->mdio_base = port->priv->lms_base + MVPP21_SMI;
+       else
+               port->mdio_base = port->priv->iface_base + MVPP22_SMI;
 
        phy_node = fdtdec_lookup_phandle(gd->fdt_blob, port_node, "phy");
 
        if (phy_node > 0) {
+               ofnode phy_ofnode;
+               fdt_addr_t phy_base;
+
                phyaddr = fdtdec_get_int(gd->fdt_blob, phy_node, "reg", 0);
                if (phyaddr < 0) {
                        dev_err(&pdev->dev, "could not find phy address\n");
                        return -1;
                }
-               mdio_off = fdt_parent_offset(gd->fdt_blob, phy_node);
-
-               /* TODO: This WA for mdio issue. U-boot 2017 don't have
-                * mdio driver and on MACHIATOBin board ports from CP1
-                * connected to mdio on CP0.
-                * WA is to get mdio address from phy handler parent
-                * base address. WA should be removed after
-                * mdio driver implementation.
-                */
-               mdio_addr = fdtdec_get_uint(gd->fdt_blob,
-                                           mdio_off, "reg", 0);
-
-               cp_node = fdt_parent_offset(gd->fdt_blob, mdio_off);
-               mdio_addr |= fdt_get_base_address((void *)gd->fdt_blob,
-                                                 cp_node);
 
-               port->priv->mdio_base = (void *)mdio_addr;
+               phy_ofnode = ofnode_get_parent(offset_to_ofnode(phy_node));
+               phy_base = ofnode_get_addr(phy_ofnode);
+               port->mdio_base = (void *)phy_base;
 
-               if (port->priv->mdio_base < 0) {
+               if (port->mdio_base < 0) {
                        dev_err(&pdev->dev, "could not find mdio base address\n");
                        return -1;
                }
@@ -5059,7 +5053,7 @@ static int mvpp2_init(struct udevice *dev, struct mvpp2 *priv)
 
 /* SMI / MDIO functions */
 
-static int smi_wait_ready(struct mvpp2 *priv)
+static int smi_wait_ready(struct mvpp2_port *priv)
 {
        u32 timeout = MVPP2_SMI_TIMEOUT;
        u32 smi_reg;
@@ -5084,7 +5078,7 @@ static int smi_wait_ready(struct mvpp2 *priv)
  */
 static int mpp2_mdio_read(struct mii_dev *bus, int addr, int devad, int reg)
 {
-       struct mvpp2 *priv = bus->priv;
+       struct mvpp2_port *priv = bus->priv;
        u32 smi_reg;
        u32 timeout;
 
@@ -5139,7 +5133,7 @@ static int mpp2_mdio_read(struct mii_dev *bus, int addr, int devad, int reg)
 static int mpp2_mdio_write(struct mii_dev *bus, int addr, int devad, int reg,
                           u16 value)
 {
-       struct mvpp2 *priv = bus->priv;
+       struct mvpp2_port *priv = bus->priv;
        u32 smi_reg;
 
        /* check parameters */
@@ -5338,7 +5332,6 @@ static int mvpp22_smi_phy_addr_cfg(struct mvpp2_port *port)
 static int mvpp2_base_probe(struct udevice *dev)
 {
        struct mvpp2 *priv = dev_get_priv(dev);
-       struct mii_dev *bus;
        void *bd_space;
        u32 size = 0;
        int i;
@@ -5397,15 +5390,11 @@ static int mvpp2_base_probe(struct udevice *dev)
                priv->lms_base = (void *)devfdt_get_addr_index(dev, 1);
                if (IS_ERR(priv->lms_base))
                        return PTR_ERR(priv->lms_base);
-
-               priv->mdio_base = priv->lms_base + MVPP21_SMI;
        } else {
                priv->iface_base = (void *)devfdt_get_addr_index(dev, 1);
                if (IS_ERR(priv->iface_base))
                        return PTR_ERR(priv->iface_base);
 
-               priv->mdio_base = priv->iface_base + MVPP22_SMI;
-
                /* Store common base addresses for all ports */
                priv->mpcs_base = priv->iface_base + MVPP22_MPCS;
                priv->xpcs_base = priv->iface_base + MVPP22_XPCS;
@@ -5417,26 +5406,14 @@ static int mvpp2_base_probe(struct udevice *dev)
        else
                priv->max_port_rxqs = 32;
 
-       /* Finally create and register the MDIO bus driver */
-       bus = mdio_alloc();
-       if (!bus) {
-               printf("Failed to allocate MDIO bus\n");
-               return -ENOMEM;
-       }
-
-       bus->read = mpp2_mdio_read;
-       bus->write = mpp2_mdio_write;
-       snprintf(bus->name, sizeof(bus->name), dev->name);
-       bus->priv = (void *)priv;
-       priv->bus = bus;
-
-       return mdio_register(bus);
+       return 0;
 }
 
 static int mvpp2_probe(struct udevice *dev)
 {
        struct mvpp2_port *port = dev_get_priv(dev);
        struct mvpp2 *priv = dev_get_priv(dev->parent);
+       struct mii_dev *bus;
        int err;
 
        /* Only call the probe function for the parent once */
@@ -5445,6 +5422,23 @@ static int mvpp2_probe(struct udevice *dev)
 
        port->priv = dev_get_priv(dev->parent);
 
+       /* Create and register the MDIO bus driver */
+       bus = mdio_alloc();
+       if (!bus) {
+               printf("Failed to allocate MDIO bus\n");
+               return -ENOMEM;
+       }
+
+       bus->read = mpp2_mdio_read;
+       bus->write = mpp2_mdio_write;
+       snprintf(bus->name, sizeof(bus->name), dev->name);
+       bus->priv = (void *)port;
+       port->bus = bus;
+
+       err = mdio_register(bus);
+       if (err)
+               return err;
+
        err = phy_info_parse(dev, port);
        if (err)
                return err;
index a0abb23..12df098 100644 (file)
@@ -3,6 +3,7 @@
  * Aquantia PHY drivers
  *
  * Copyright 2014 Freescale Semiconductor, Inc.
+ * Copyright 2018 NXP
  */
 #include <config.h>
 #include <common.h>
 #define AQUNTIA_SPEED_LSB_MASK 0x2000
 #define AQUNTIA_SPEED_MSB_MASK 0x40
 
+#define AQUANTIA_SYSTEM_INTERFACE_SR     0xe812
+#define AQUANTIA_VENDOR_PROVISIONING_REG 0xC441
+#define AQUANTIA_FIRMWARE_ID            0x20
+#define AQUANTIA_RESERVED_STATUS        0xc885
+#define AQUANTIA_FIRMWARE_MAJOR_MASK    0xff00
+#define AQUANTIA_FIRMWARE_MINOR_MASK    0xff
+#define AQUANTIA_FIRMWARE_BUILD_MASK    0xf0
+
+#define AQUANTIA_USX_AUTONEG_CONTROL_ENA 0x0008
+#define AQUANTIA_SI_IN_USE_MASK          0x0078
+#define AQUANTIA_SI_USXGMII              0x0018
+
 /* registers in MDIO_MMD_VEND1 region */
 #define GLOBAL_FIRMWARE_ID 0x20
 #define GLOBAL_FAULT 0xc850
@@ -244,6 +257,7 @@ static int aquantia_upload_firmware(struct phy_device *phydev)
 int aquantia_config(struct phy_device *phydev)
 {
        u32 val, id, rstatus, fault;
+       u32 reg_val1 = 0;
 
        id = phy_read(phydev, MDIO_MMD_VEND1, GLOBAL_FIRMWARE_ID);
        rstatus = phy_read(phydev, MDIO_MMD_VEND1, GLOBAL_RSTATUS_1);
@@ -284,6 +298,21 @@ int aquantia_config(struct phy_device *phydev)
                        phy_write(phydev, MDIO_MMD_PMAPMD, MII_BMCR,
                                  AQUNTIA_SPEED_LSB_MASK |
                                  AQUNTIA_SPEED_MSB_MASK);
+
+               val = phy_read(phydev, MDIO_MMD_PHYXS,
+                              AQUANTIA_SYSTEM_INTERFACE_SR);
+               /* If SI is USXGMII then start USXGMII autoneg */
+               if ((val & AQUANTIA_SI_IN_USE_MASK) == AQUANTIA_SI_USXGMII) {
+                       phy_write(phydev, MDIO_MMD_PHYXS,
+                                 AQUANTIA_VENDOR_PROVISIONING_REG,
+                                 AQUANTIA_USX_AUTONEG_CONTROL_ENA);
+                       printf("%s: system interface USXGMII\n",
+                              phydev->dev->name);
+               } else {
+                       printf("%s: system interface XFI\n",
+                              phydev->dev->name);
+               }
+
        } else if (phydev->interface == PHY_INTERFACE_MODE_SGMII_2500) {
                /* 2.5GBASE-T mode */
                phydev->advertising = SUPPORTED_1000baseT_Full;
@@ -299,6 +328,16 @@ int aquantia_config(struct phy_device *phydev)
                val = (val & ~AQUNTIA_SPEED_MSB_MASK) | AQUNTIA_SPEED_LSB_MASK;
                phy_write(phydev, MDIO_MMD_PMAPMD, MII_BMCR, val);
        }
+
+       val = phy_read(phydev, MDIO_MMD_VEND1, AQUANTIA_RESERVED_STATUS);
+       reg_val1 = phy_read(phydev, MDIO_MMD_VEND1, AQUANTIA_FIRMWARE_ID);
+
+       printf("%s: %s Firmware Version %x.%x.%x\n", phydev->dev->name,
+              phydev->drv->name,
+              (reg_val1 & AQUANTIA_FIRMWARE_MAJOR_MASK) >> 8,
+              reg_val1 & AQUANTIA_FIRMWARE_MINOR_MASK,
+              (val & AQUANTIA_FIRMWARE_BUILD_MASK) >> 4);
+
        return 0;
 }
 
index 3951535..63e7b02 100644 (file)
@@ -123,8 +123,8 @@ static int ksz90x1_of_config_group(struct phy_device *phydev,
                } else {
                        changed = 1;    /* Value was changed in OF */
                        /* Calculate the register value and fix corner cases */
-                       if (val[i] > ps_to_regval * 0xf) {
-                               max = (1 << ofcfg->grp[i].size) - 1;
+                       max = (1 << ofcfg->grp[i].size) - 1;
+                       if (val[i] > ps_to_regval * max) {
                                regval |= max << offset;
                        } else {
                                regval |= (val[i] / ps_to_regval) << offset;
index 236913a..0c8b29d 100644 (file)
@@ -620,7 +620,7 @@ static struct phy_driver *get_phy_driver(struct phy_device *phydev,
 }
 
 static struct phy_device *phy_device_create(struct mii_dev *bus, int addr,
-                                           u32 phy_id,
+                                           u32 phy_id, bool is_c45,
                                            phy_interface_t interface)
 {
        struct phy_device *dev;
@@ -650,6 +650,7 @@ static struct phy_device *phy_device_create(struct mii_dev *bus, int addr,
 
        dev->addr = addr;
        dev->phy_id = phy_id;
+       dev->is_c45 = is_c45;
        dev->bus = bus;
 
        dev->drv = get_phy_driver(dev, interface);
@@ -702,13 +703,17 @@ static struct phy_device *create_phy_by_mask(struct mii_dev *bus,
                                             phy_interface_t interface)
 {
        u32 phy_id = 0xffffffff;
+       bool is_c45;
 
        while (phy_mask) {
                int addr = ffs(phy_mask) - 1;
                int r = get_phy_id(bus, addr, devad, &phy_id);
                /* If the PHY ID is mostly f's, we didn't find anything */
-               if (r == 0 && (phy_id & 0x1fffffff) != 0x1fffffff)
-                       return phy_device_create(bus, addr, phy_id, interface);
+               if (r == 0 && (phy_id & 0x1fffffff) != 0x1fffffff) {
+                       is_c45 = (devad == MDIO_DEVAD_NONE) ? false : true;
+                       return phy_device_create(bus, addr, phy_id, is_c45,
+                                                interface);
+               }
                phy_mask &= ~(1 << addr);
        }
        return NULL;
@@ -895,8 +900,8 @@ static struct phy_device *phy_connect_fixed(struct mii_dev *bus,
        while (sn > 0) {
                name = fdt_get_name(gd->fdt_blob, sn, NULL);
                if (name && strcmp(name, "fixed-link") == 0) {
-                       phydev = phy_device_create(bus,
-                                                  sn, PHY_FIXED_ID, interface);
+                       phydev = phy_device_create(bus, sn, PHY_FIXED_ID, false,
+                                                  interface);
                        break;
                }
                sn = fdt_next_subnode(gd->fdt_blob, sn);
index b3e6578..dd45e11 100644 (file)
 #define MIIM_RTL8211F_TX_DELAY         0x100
 #define MIIM_RTL8211F_LCR              0x10
 
+static int rtl8211f_phy_extread(struct phy_device *phydev, int addr,
+                               int devaddr, int regnum)
+{
+       int oldpage = phy_read(phydev, MDIO_DEVAD_NONE,
+                              MIIM_RTL8211F_PAGE_SELECT);
+       int val;
+
+       phy_write(phydev, MDIO_DEVAD_NONE, MIIM_RTL8211F_PAGE_SELECT, devaddr);
+       val = phy_read(phydev, MDIO_DEVAD_NONE, regnum);
+       phy_write(phydev, MDIO_DEVAD_NONE, MIIM_RTL8211F_PAGE_SELECT, oldpage);
+
+       return val;
+}
+
+static int rtl8211f_phy_extwrite(struct phy_device *phydev, int addr,
+                                int devaddr, int regnum, u16 val)
+{
+       int oldpage = phy_read(phydev, MDIO_DEVAD_NONE,
+                              MIIM_RTL8211F_PAGE_SELECT);
+
+       phy_write(phydev, MDIO_DEVAD_NONE, MIIM_RTL8211F_PAGE_SELECT, devaddr);
+       phy_write(phydev, MDIO_DEVAD_NONE, regnum, val);
+       phy_write(phydev, MDIO_DEVAD_NONE, MIIM_RTL8211F_PAGE_SELECT, oldpage);
+
+       return 0;
+}
+
 static int rtl8211b_probe(struct phy_device *phydev)
 {
 #ifdef CONFIG_RTL8211X_PHY_FORCE_MASTER
@@ -336,6 +363,8 @@ static struct phy_driver RTL8211F_driver = {
        .config = &rtl8211f_config,
        .startup = &rtl8211f_startup,
        .shutdown = &genphy_shutdown,
+       .readext = &rtl8211f_phy_extread,
+       .writeext = &rtl8211f_phy_extwrite,
 };
 
 int phy_realtek_init(void)
index 590f8ce..1330997 100644 (file)
@@ -183,12 +183,10 @@ static void rtl_reset(struct eth_device *dev);
 static int rtl_transmit(struct eth_device *dev, void *packet, int length);
 static int rtl_poll(struct eth_device *dev);
 static void rtl_disable(struct eth_device *dev);
-#ifdef CONFIG_MCAST_TFTP/*  This driver already accepts all b/mcast */
-static int rtl_bcast_addr(struct eth_device *dev, const u8 *bcast_mac, u8 set)
+static int rtl_bcast_addr(struct eth_device *dev, const u8 *bcast_mac, int join)
 {
        return (0);
 }
-#endif
 
 static struct pci_device_id supported[] = {
        {PCI_VENDOR_ID_REALTEK, PCI_DEVICE_ID_REALTEK_8139},
@@ -229,9 +227,7 @@ int rtl8139_initialize(bd_t *bis)
                dev->halt = rtl_disable;
                dev->send = rtl_transmit;
                dev->recv = rtl_poll;
-#ifdef CONFIG_MCAST_TFTP
                dev->mcast = rtl_bcast_addr;
-#endif
 
                eth_register (dev);
 
index 03a46da..06a9b4f 100644 (file)
@@ -78,7 +78,30 @@ static void tsec_configure_serdes(struct tsec_private *priv)
                              0, TBI_CR, CONFIG_TSEC_TBICR_SETTINGS);
 }
 
-#ifdef CONFIG_MCAST_TFTP
+/* the 'way' for ethernet-CRC-32. Spliced in from Linux lib/crc32.c
+ * and this is the ethernet-crc method needed for TSEC -- and perhaps
+ * some other adapter -- hash tables
+ */
+#define CRCPOLY_LE 0xedb88320
+static u32 ether_crc(size_t len, unsigned char const *p)
+{
+       int i;
+       u32 crc;
+
+       crc = ~0;
+       while (len--) {
+               crc ^= *p++;
+               for (i = 0; i < 8; i++)
+                       crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0);
+       }
+       /* an reverse the bits, cuz of way they arrive -- last-first */
+       crc = (crc >> 16) | (crc << 16);
+       crc = (crc >> 8 & 0x00ff00ff) | (crc << 8 & 0xff00ff00);
+       crc = (crc >> 4 & 0x0f0f0f0f) | (crc << 4 & 0xf0f0f0f0);
+       crc = (crc >> 2 & 0x33333333) | (crc << 2 & 0xcccccccc);
+       crc = (crc >> 1 & 0x55555555) | (crc << 1 & 0xaaaaaaaa);
+       return crc;
+}
 
 /* CREDITS: linux gianfar driver, slightly adjusted... thanx. */
 
@@ -99,9 +122,10 @@ static void tsec_configure_serdes(struct tsec_private *priv)
  * the entry.
  */
 #ifndef CONFIG_DM_ETH
-static int tsec_mcast_addr(struct eth_device *dev, const u8 *mcast_mac, u8 set)
+static int tsec_mcast_addr(struct eth_device *dev, const u8 *mcast_mac,
+                          int join)
 #else
-static int tsec_mcast_addr(struct udevice *dev, const u8 *mcast_mac, int set)
+static int tsec_mcast_addr(struct udevice *dev, const u8 *mcast_mac, int join)
 #endif
 {
        struct tsec_private *priv = (struct tsec_private *)dev->priv;
@@ -115,14 +139,13 @@ static int tsec_mcast_addr(struct udevice *dev, const u8 *mcast_mac, int set)
 
        value = BIT(31 - whichbit);
 
-       if (set)
+       if (join)
                setbits_be32(&regs->hash.gaddr0 + whichreg, value);
        else
                clrbits_be32(&regs->hash.gaddr0 + whichreg, value);
 
        return 0;
 }
-#endif /* Multicast TFTP ? */
 
 /*
  * Initialized required registers to appropriate values, zeroing
@@ -720,9 +743,7 @@ static int tsec_initialize(bd_t *bis, struct tsec_info_struct *tsec_info)
        dev->halt = tsec_halt;
        dev->send = tsec_send;
        dev->recv = tsec_recv;
-#ifdef CONFIG_MCAST_TFTP
        dev->mcast = tsec_mcast_addr;
-#endif
 
        /* Tell U-Boot to get the addr from the env */
        for (i = 0; i < 6; i++)
@@ -862,9 +883,7 @@ static const struct eth_ops tsec_ops = {
        .recv = tsec_recv,
        .free_pkt = tsec_free_pkt,
        .stop = tsec_halt,
-#ifdef CONFIG_MCAST_TFTP
        .mcast = tsec_mcast_addr,
-#endif
 };
 
 static const struct udevice_id tsec_ids[] = {
index 3b3d9af..e4993dc 100644 (file)
@@ -2579,9 +2579,6 @@ int usb_eth_initialize(bd_t *bi)
        netdev->halt = usb_eth_halt;
        netdev->priv = l_priv;
 
-#ifdef CONFIG_MCAST_TFTP
-  #error not supported
-#endif
        eth_register(netdev);
        return 0;
 }
index 3c44ff5..507a52e 100644 (file)
 
 #ifdef CONFIG_REGEX
 #define ENV_DOT_ESCAPE "\\"
-#define ETHADDR_WILDCARD "\\d?"
 #else
 #define ENV_DOT_ESCAPE
-#define ETHADDR_WILDCARD
 #endif
 
 #ifdef CONFIG_CMD_DNS
index cc2c34f..23744e3 100644 (file)
@@ -38,7 +38,7 @@ enum env_flags_varaccess {
 
 #ifdef CONFIG_CMD_NET
 #ifdef CONFIG_REGEX
-#define ETHADDR_WILDCARD "\\d?"
+#define ETHADDR_WILDCARD "\\d*"
 #else
 #define ETHADDR_WILDCARD
 #endif
index 51c099d..dd52ed3 100644 (file)
@@ -140,9 +140,7 @@ struct eth_ops {
        int (*recv)(struct udevice *dev, int flags, uchar **packetp);
        int (*free_pkt)(struct udevice *dev, uchar *packet, int length);
        void (*stop)(struct udevice *dev);
-#ifdef CONFIG_MCAST_TFTP
        int (*mcast)(struct udevice *dev, const u8 *enetaddr, int join);
-#endif
        int (*write_hwaddr)(struct udevice *dev);
        int (*read_rom_hwaddr)(struct udevice *dev);
 };
@@ -175,9 +173,7 @@ struct eth_device {
        int (*send)(struct eth_device *, void *packet, int length);
        int (*recv)(struct eth_device *);
        void (*halt)(struct eth_device *);
-#ifdef CONFIG_MCAST_TFTP
-       int (*mcast)(struct eth_device *, const u8 *enetaddr, u8 set);
-#endif
+       int (*mcast)(struct eth_device *, const u8 *enetaddr, int join);
        int (*write_hwaddr)(struct eth_device *);
        struct eth_device *next;
        int index;
@@ -286,12 +282,7 @@ extern void (*push_packet)(void *packet, int length);
 int eth_rx(void);                      /* Check for received packets */
 void eth_halt(void);                   /* stop SCC */
 const char *eth_get_name(void);                /* get name of current device */
-
-#ifdef CONFIG_MCAST_TFTP
 int eth_mcast_join(struct in_addr mcast_addr, int join);
-u32 ether_crc(size_t len, unsigned char const *p);
-#endif
-
 
 /**********************************************************************/
 /*
@@ -578,10 +569,6 @@ extern struct in_addr      net_ntp_server;         /* the ip address to NTP */
 extern int net_ntp_time_offset;                        /* offset time from UTC */
 #endif
 
-#if defined(CONFIG_MCAST_TFTP)
-extern struct in_addr net_mcast_addr;
-#endif
-
 /* Initialize the network adapter */
 void net_init(void);
 int net_loop(enum proto_t);
index b86fdfb..f23ca63 100644 (file)
@@ -138,6 +138,7 @@ struct phy_device {
        int pause;
        int asym_pause;
        u32 phy_id;
+       bool is_c45;
        u32 flags;
 };
 
index 91d861b..2ef20df 100644 (file)
@@ -476,10 +476,8 @@ static int eth_post_probe(struct udevice *dev)
                        ops->free_pkt += gd->reloc_off;
                if (ops->stop)
                        ops->stop += gd->reloc_off;
-#ifdef CONFIG_MCAST_TFTP
                if (ops->mcast)
                        ops->mcast += gd->reloc_off;
-#endif
                if (ops->write_hwaddr)
                        ops->write_hwaddr += gd->reloc_off;
                if (ops->read_rom_hwaddr)
index 2a9caa3..e250a43 100644 (file)
@@ -291,7 +291,6 @@ int eth_initialize(void)
        return num_devices;
 }
 
-#ifdef CONFIG_MCAST_TFTP
 /* Multicast.
  * mcast_addr: multicast ipaddr from which multicast Mac is made
  * join: 1=join, 0=leave.
@@ -310,33 +309,6 @@ int eth_mcast_join(struct in_addr mcast_ip, int join)
        return eth_current->mcast(eth_current, mcast_mac, join);
 }
 
-/* the 'way' for ethernet-CRC-32. Spliced in from Linux lib/crc32.c
- * and this is the ethernet-crc method needed for TSEC -- and perhaps
- * some other adapter -- hash tables
- */
-#define CRCPOLY_LE 0xedb88320
-u32 ether_crc(size_t len, unsigned char const *p)
-{
-       int i;
-       u32 crc;
-       crc = ~0;
-       while (len--) {
-               crc ^= *p++;
-               for (i = 0; i < 8; i++)
-                       crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0);
-       }
-       /* an reverse the bits, cuz of way they arrive -- last-first */
-       crc = (crc >> 16) | (crc << 16);
-       crc = (crc >> 8 & 0x00ff00ff) | (crc << 8 & 0xff00ff00);
-       crc = (crc >> 4 & 0x0f0f0f0f) | (crc << 4 & 0xf0f0f0f0);
-       crc = (crc >> 2 & 0x33333333) | (crc << 2 & 0xcccccccc);
-       crc = (crc >> 1 & 0x55555555) | (crc << 1 & 0xaaaaaaaa);
-       return crc;
-}
-
-#endif
-
-
 int eth_init(void)
 {
        struct eth_device *old_current;
index a5a216c..58b0417 100644 (file)
--- a/net/net.c
+++ b/net/net.c
@@ -131,10 +131,6 @@ struct in_addr net_dns_server;
 struct in_addr net_dns_server2;
 #endif
 
-#ifdef CONFIG_MCAST_TFTP       /* Multicast TFTP */
-struct in_addr net_mcast_addr;
-#endif
-
 /** END OF BOOTP EXTENTIONS **/
 
 /* Our ethernet address */
@@ -657,6 +653,7 @@ restart:
                        /* Invalidate the last protocol */
                        eth_set_last_protocol(BOOTP);
                        debug_cond(DEBUG_INT_STATE, "--- net_loop Fail!\n");
+                       ret = -ENONET;
                        goto done;
 
                case NETLOOP_CONTINUE:
@@ -1215,9 +1212,6 @@ void net_process_received_packet(uchar *in_packet, int len)
                dst_ip = net_read_ip(&ip->ip_dst);
                if (net_ip.s_addr && dst_ip.s_addr != net_ip.s_addr &&
                    dst_ip.s_addr != 0xFFFFFFFF) {
-#ifdef CONFIG_MCAST_TFTP
-                       if (net_mcast_addr != dst_ip)
-#endif
                                return;
                }
                /* Read source IP address for later use */
index a9335b1..8fab6d2 100644 (file)
@@ -140,36 +140,6 @@ static char tftp_filename[MAX_LEN];
 static unsigned short tftp_block_size = TFTP_BLOCK_SIZE;
 static unsigned short tftp_block_size_option = TFTP_MTU_BLOCKSIZE;
 
-#ifdef CONFIG_MCAST_TFTP
-#include <malloc.h>
-#define MTFTP_BITMAPSIZE       0x1000
-static unsigned *tftp_mcast_bitmap;
-static int tftp_mcast_prev_hole;
-static int tftp_mcast_bitmap_size = MTFTP_BITMAPSIZE;
-static int tftp_mcast_disabled;
-static int tftp_mcast_master_client;
-static int tftp_mcast_active;
-static int tftp_mcast_port;
-/* can get 'last' block before done..*/
-static ulong tftp_mcast_ending_block;
-
-static void parse_multicast_oack(char *pkt, int len);
-
-static void mcast_cleanup(void)
-{
-       if (net_mcast_addr)
-               eth_mcast_join(net_mcast_addr, 0);
-       if (tftp_mcast_bitmap)
-               free(tftp_mcast_bitmap);
-       tftp_mcast_bitmap = NULL;
-       net_mcast_addr.s_addr = 0;
-       tftp_mcast_active = 0;
-       tftp_mcast_port = 0;
-       tftp_mcast_ending_block = -1;
-}
-
-#endif /* CONFIG_MCAST_TFTP */
-
 static inline int store_block(int block, uchar *src, unsigned int len)
 {
        ulong offset = block * tftp_block_size + tftp_block_wrap_offset;
@@ -211,10 +181,6 @@ static inline int store_block(int block, uchar *src, unsigned int len)
                memcpy(ptr, src, len);
                unmap_sysmem(ptr);
        }
-#ifdef CONFIG_MCAST_TFTP
-       if (tftp_mcast_active)
-               ext2_set_bit(block, tftp_mcast_bitmap);
-#endif
 
        if (net_boot_file_size < newsize)
                net_boot_file_size = newsize;
@@ -292,9 +258,6 @@ static void show_block_marker(void)
 static void restart(const char *msg)
 {
        printf("\n%s; starting again\n", msg);
-#ifdef CONFIG_MCAST_TFTP
-       mcast_cleanup();
-#endif
        net_start_again();
 }
 
@@ -349,12 +312,6 @@ static void tftp_send(void)
        int len = 0;
        ushort *s;
 
-#ifdef CONFIG_MCAST_TFTP
-       /* Multicast TFTP.. non-MasterClients do not ACK data. */
-       if (tftp_mcast_active && tftp_state == STATE_DATA &&
-           tftp_mcast_master_client == 0)
-               return;
-#endif
        /*
         *      We will always be sending some sort of packet, so
         *      cobble together the packet headers now.
@@ -389,30 +346,10 @@ static void tftp_send(void)
                /* try for more effic. blk size */
                pkt += sprintf((char *)pkt, "blksize%c%d%c",
                                0, tftp_block_size_option, 0);
-#ifdef CONFIG_MCAST_TFTP
-               /* Check all preconditions before even trying the option */
-               if (!tftp_mcast_disabled) {
-                       tftp_mcast_bitmap = malloc(tftp_mcast_bitmap_size);
-                       if (tftp_mcast_bitmap && eth_get_dev()->mcast) {
-                               free(tftp_mcast_bitmap);
-                               tftp_mcast_bitmap = NULL;
-                               pkt += sprintf((char *)pkt, "multicast%c%c",
-                                       0, 0);
-                       }
-               }
-#endif /* CONFIG_MCAST_TFTP */
                len = pkt - xp;
                break;
 
        case STATE_OACK:
-#ifdef CONFIG_MCAST_TFTP
-               /* My turn!  Start at where I need blocks I missed. */
-               if (tftp_mcast_active)
-                       tftp_cur_block = ext2_find_next_zero_bit(
-                               tftp_mcast_bitmap,
-                               tftp_mcast_bitmap_size * 8, 0);
-               /* fall through */
-#endif
 
        case STATE_RECV_WRQ:
        case STATE_DATA:
@@ -482,10 +419,6 @@ static void tftp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
        int i;
 
        if (dest != tftp_our_port) {
-#ifdef CONFIG_MCAST_TFTP
-               if (tftp_mcast_active &&
-                   (!tftp_mcast_port || dest != tftp_mcast_port))
-#endif
                        return;
        }
        if (tftp_state != STATE_SEND_RRQ && src != tftp_remote_port &&
@@ -566,12 +499,6 @@ static void tftp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
                        }
 #endif
                }
-#ifdef CONFIG_MCAST_TFTP
-               parse_multicast_oack((char *)pkt, len - 1);
-               if ((tftp_mcast_active) && (!tftp_mcast_master_client))
-                       tftp_state = STATE_DATA;        /* passive.. */
-               else
-#endif
 #ifdef CONFIG_CMD_TFTPPUT
                if (tftp_put_active) {
                        /* Get ready to send the first block */
@@ -599,11 +526,6 @@ static void tftp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
                        tftp_remote_port = src;
                        new_transfer();
 
-#ifdef CONFIG_MCAST_TFTP
-                       if (tftp_mcast_active) { /* start!=1 common if mcast */
-                               tftp_prev_block = tftp_cur_block - 1;
-                       } else
-#endif
                        if (tftp_cur_block != 1) {      /* Assertion */
                                puts("\nTFTP error: ");
                                printf("First block is not block 1 (%ld)\n",
@@ -633,44 +555,8 @@ static void tftp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
                 *      Acknowledge the block just received, which will prompt
                 *      the remote for the next one.
                 */
-#ifdef CONFIG_MCAST_TFTP
-               /* if I am the MasterClient, actively calculate what my next
-                * needed block is; else I'm passive; not ACKING
-                */
-               if (tftp_mcast_active) {
-                       if (len < tftp_block_size)  {
-                               tftp_mcast_ending_block = tftp_cur_block;
-                       } else if (tftp_mcast_master_client) {
-                               tftp_mcast_prev_hole = ext2_find_next_zero_bit(
-                                       tftp_mcast_bitmap,
-                                       tftp_mcast_bitmap_size * 8,
-                                       tftp_mcast_prev_hole);
-                               tftp_cur_block = tftp_mcast_prev_hole;
-                               if (tftp_cur_block >
-                                   ((tftp_mcast_bitmap_size * 8) - 1)) {
-                                       debug("tftpfile too big\n");
-                                       /* try to double it and retry */
-                                       tftp_mcast_bitmap_size <<= 1;
-                                       mcast_cleanup();
-                                       net_start_again();
-                                       return;
-                               }
-                               tftp_prev_block = tftp_cur_block;
-                       }
-               }
-#endif
                tftp_send();
 
-#ifdef CONFIG_MCAST_TFTP
-               if (tftp_mcast_active) {
-                       if (tftp_mcast_master_client &&
-                           (tftp_cur_block >= tftp_mcast_ending_block)) {
-                               puts("\nMulticast tftp done\n");
-                               mcast_cleanup();
-                               net_set_state(NETLOOP_SUCCESS);
-                       }
-               } else
-#endif
                if (len < tftp_block_size)
                        tftp_complete();
                break;
@@ -693,9 +579,6 @@ static void tftp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
                case TFTP_ERR_FILE_ALREADY_EXISTS:
                default:
                        puts("Starting again\n\n");
-#ifdef CONFIG_MCAST_TFTP
-                       mcast_cleanup();
-#endif
                        net_start_again();
                        break;
                }
@@ -873,9 +756,6 @@ void tftp_start(enum proto_t protocol)
        memset(net_server_ethaddr, 0, 6);
        /* Revert tftp_block_size to dflt */
        tftp_block_size = TFTP_BLOCK_SIZE;
-#ifdef CONFIG_MCAST_TFTP
-       mcast_cleanup();
-#endif
 #ifdef CONFIG_TFTP_TSIZE
        tftp_tsize = 0;
        tftp_tsize_num_hash = 0;
@@ -924,102 +804,3 @@ void tftp_start_server(void)
 }
 #endif /* CONFIG_CMD_TFTPSRV */
 
-#ifdef CONFIG_MCAST_TFTP
-/*
- * Credits: atftp project.
- */
-
-/*
- * Pick up BcastAddr, Port, and whether I am [now] the master-client.
- * Frame:
- *    +-------+-----------+---+-------~~-------+---+
- *    |  opc  | multicast | 0 | addr, port, mc | 0 |
- *    +-------+-----------+---+-------~~-------+---+
- * The multicast addr/port becomes what I listen to, and if 'mc' is '1' then
- * I am the new master-client so must send ACKs to DataBlocks.  If I am not
- * master-client, I'm a passive client, gathering what DataBlocks I may and
- * making note of which ones I got in my bitmask.
- * In theory, I never go from master->passive..
- * .. this comes in with pkt already pointing just past opc
- */
-static void parse_multicast_oack(char *pkt, int len)
-{
-       int i;
-       struct in_addr addr;
-       char *mc_adr;
-       char *port;
-       char *mc;
-
-       mc_adr = NULL;
-       port = NULL;
-       mc = NULL;
-       /* march along looking for 'multicast\0', which has to start at least
-        * 14 bytes back from the end.
-        */
-       for (i = 0; i < len - 14; i++)
-               if (strcmp(pkt + i, "multicast") == 0)
-                       break;
-       if (i >= (len - 14)) /* non-Multicast OACK, ign. */
-               return;
-
-       i += 10; /* strlen multicast */
-       mc_adr = pkt + i;
-       for (; i < len; i++) {
-               if (*(pkt + i) == ',') {
-                       *(pkt + i) = '\0';
-                       if (port) {
-                               mc = pkt + i + 1;
-                               break;
-                       } else {
-                               port = pkt + i + 1;
-                       }
-               }
-       }
-       if (!port || !mc_adr || !mc)
-               return;
-       if (tftp_mcast_active && tftp_mcast_master_client) {
-               printf("I got a OACK as master Client, WRONG!\n");
-               return;
-       }
-       /* ..I now accept packets destined for this MCAST addr, port */
-       if (!tftp_mcast_active) {
-               if (tftp_mcast_bitmap) {
-                       printf("Internal failure! no mcast.\n");
-                       free(tftp_mcast_bitmap);
-                       tftp_mcast_bitmap = NULL;
-                       tftp_mcast_disabled = 1;
-                       return;
-               }
-               /* I malloc instead of pre-declare; so that if the file ends
-                * up being too big for this bitmap I can retry
-                */
-               tftp_mcast_bitmap = malloc(tftp_mcast_bitmap_size);
-               if (!tftp_mcast_bitmap) {
-                       printf("No bitmap, no multicast. Sorry.\n");
-                       tftp_mcast_disabled = 1;
-                       return;
-               }
-               memset(tftp_mcast_bitmap, 0, tftp_mcast_bitmap_size);
-               tftp_mcast_prev_hole = 0;
-               tftp_mcast_active = 1;
-       }
-       addr = string_to_ip(mc_adr);
-       if (net_mcast_addr.s_addr != addr.s_addr) {
-               if (net_mcast_addr.s_addr)
-                       eth_mcast_join(net_mcast_addr, 0);
-               net_mcast_addr = addr;
-               if (eth_mcast_join(net_mcast_addr, 1)) {
-                       printf("Fail to set mcast, revert to TFTP\n");
-                       tftp_mcast_disabled = 1;
-                       mcast_cleanup();
-                       net_start_again();
-               }
-       }
-       tftp_mcast_master_client = simple_strtoul((char *)mc, NULL, 10);
-       tftp_mcast_port = (unsigned short)simple_strtoul(port, NULL, 10);
-       printf("Multicast: %s:%d [%d]\n", mc_adr, tftp_mcast_port,
-              tftp_mcast_master_client);
-       return;
-}
-
-#endif /* Multicast TFTP */
index e6ac098..d03ddd8 100644 (file)
@@ -1198,7 +1198,6 @@ CONFIG_MAX_FPGA_DEVICES
 CONFIG_MAX_MEM_MAPPED
 CONFIG_MAX_PKT
 CONFIG_MAX_RAM_BANK_SIZE
-CONFIG_MCAST_TFTP
 CONFIG_MCF5249
 CONFIG_MCF5253
 CONFIG_MCFFEC
index 850eabb..6e002b8 100644 (file)
@@ -237,7 +237,7 @@ static int _dm_test_net_retry(struct unit_test_state *uts)
        env_set("ethact", "eth@10004000");
        env_set("netretry", "no");
        sandbox_eth_skip_timeout();
-       ut_asserteq(-ETIMEDOUT, net_loop(PING));
+       ut_asserteq(-ENONET, net_loop(PING));
        ut_asserteq_str("eth@10004000", env_get("ethact"));
 
        return 0;