When the ethaddr is changed in the env, update the device pdata at the same time (only if it is probed for the DM case; only if registered for the non-DM case). Again this gets us closer to completely non-polled env needed to simplify the net_loop.
This requires that the NET feature select the REGEX feature. Signed-off-by: Joe Hershberger <joe.hershber...@ni.com> --- Changes in v4: None Changes in v3: -New for version 3 Changes in v2: None include/env_callback.h | 3 +- net/Kconfig | 1 + net/eth.c | 83 ++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 63 insertions(+), 24 deletions(-) diff --git a/include/env_callback.h b/include/env_callback.h index 91f3cc0..ab5d42d 100644 --- a/include/env_callback.h +++ b/include/env_callback.h @@ -52,7 +52,8 @@ "serverip:serverip," \ "nvlan:nvlan," \ "vlan:vlan," \ - DNS_CALLBACK + DNS_CALLBACK \ + "eth\\d?addr:ethaddr," #else #define NET_CALLBACKS #endif diff --git a/net/Kconfig b/net/Kconfig index 22b9eaa..22008d0 100644 --- a/net/Kconfig +++ b/net/Kconfig @@ -4,6 +4,7 @@ menuconfig NET bool "Networking support" + select REGEX if NET diff --git a/net/eth.c b/net/eth.c index 3c30232..5d97775 100644 --- a/net/eth.c +++ b/net/eth.c @@ -9,11 +9,13 @@ #include <common.h> #include <command.h> #include <dm.h> +#include <environment.h> #include <net.h> #include <miiphy.h> #include <phy.h> #include <asm/errno.h> #include <dm/device-internal.h> +#include <dm/uclass-internal.h> DECLARE_GLOBAL_DATA_PTR; @@ -269,6 +271,33 @@ int eth_get_dev_index(void) return -1; } +static int on_ethaddr(const char *name, const char *value, enum env_op op, + int flags) +{ + int index; + int retval; + struct udevice *dev; + + /* look for an index after "eth" */ + index = simple_strtoul(name + 3, NULL, 10); + + retval = uclass_find_device_by_seq(UCLASS_ETH, index, false, &dev); + if (!retval) { + struct eth_pdata *pdata = dev->platdata; + switch (op) { + case env_op_create: + case env_op_overwrite: + eth_parse_enetaddr(value, pdata->enetaddr); + break; + case env_op_delete: + memset(pdata->enetaddr, 0, 6); + } + } + + return 0; +} +U_BOOT_ENV_CALLBACK(ethaddr, on_ethaddr); + int eth_init(void) { struct udevice *current; @@ -286,16 +315,6 @@ int eth_init(void) debug("Trying %s\n", current->name); if (device_active(current)) { - uchar env_enetaddr[6]; - struct eth_pdata *pdata = current->platdata; - - /* Sync environment with network device */ - if (eth_getenv_enetaddr_by_index("eth", current->seq, - env_enetaddr)) - memcpy(pdata->enetaddr, env_enetaddr, 6); - else - memset(pdata->enetaddr, 0, 6); - ret = eth_get_ops(current)->start(current); if (ret >= 0) { struct eth_device_priv *priv = @@ -619,6 +638,36 @@ int eth_get_dev_index(void) return eth_current->index; } +static int on_ethaddr(const char *name, const char *value, enum env_op op, + int flags) +{ + int index; + struct eth_device *dev; + + if (!eth_devices) + return 0; + + /* look for an index after "eth" */ + index = simple_strtoul(name + 3, NULL, 10); + + dev = eth_devices; + do { + if (dev->index == index) { + switch (op) { + case env_op_create: + case env_op_overwrite: + eth_parse_enetaddr(value, dev->enetaddr); + break; + case env_op_delete: + memset(dev->enetaddr, 0, 6); + } + } + } while (dev != eth_devices); + + return 0; +} +U_BOOT_ENV_CALLBACK(ethaddr, on_ethaddr); + int eth_write_hwaddr(struct eth_device *dev, const char *base_name, int eth_number) { @@ -811,25 +860,13 @@ u32 ether_crc(size_t len, unsigned char const *p) int eth_init(void) { - struct eth_device *old_current, *dev; + struct eth_device *old_current; if (!eth_current) { puts("No ethernet found.\n"); return -ENODEV; } - /* Sync environment with network devices */ - dev = eth_devices; - do { - uchar env_enetaddr[6]; - - if (eth_getenv_enetaddr_by_index("eth", dev->index, - env_enetaddr)) - memcpy(dev->enetaddr, env_enetaddr, 6); - - dev = dev->next; - } while (dev != eth_devices); - old_current = eth_current; do { debug("Trying %s\n", eth_current->name); -- 1.7.11.5 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot