From 86848a74c3c8eb2f8dd179d039ee604dc45288cf Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Wed, 15 Jul 2009 21:31:28 -0400 Subject: net: sync env ethaddr to device enetaddr in eth_init() In the previous enetaddr refactoring, the assumption with commit 56b555a644 was that the eth layer would handle the env -> device enetaddr syncing. This was not the case as eth_initialize() is called only once and the sync occurs there. So make sure the eth_init() function does the env -> device sync with every network init. Reported-by: Andrzej Wolski Signed-off-by: Mike Frysinger Signed-off-by: Ben Warren --- net/eth.c | 52 +++++++++++++++++++++++----------------------------- 1 file changed, 23 insertions(+), 29 deletions(-) (limited to 'net') diff --git a/net/eth.c b/net/eth.c index b4f3b1aa8..9b503124f 100644 --- a/net/eth.c +++ b/net/eth.c @@ -53,6 +53,13 @@ int eth_setenv_enetaddr(char *name, const uchar *enetaddr) return setenv(name, buf); } + +int eth_getenv_enetaddr_by_index(int index, uchar *enetaddr) +{ + char enetvar[32]; + sprintf(enetvar, index ? "eth%daddr" : "ethaddr", index); + return eth_getenv_enetaddr(enetvar, enetaddr); +} #endif #if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI) @@ -180,7 +187,6 @@ int eth_register(struct eth_device* dev) int eth_initialize(bd_t *bis) { - char enetvar[32]; unsigned char env_enetaddr[6]; int eth_number = 0; @@ -221,8 +227,7 @@ int eth_initialize(bd_t *bis) puts (" [PRIME]"); } - sprintf(enetvar, eth_number ? "eth%daddr" : "ethaddr", eth_number); - eth_getenv_enetaddr(enetvar, env_enetaddr); + eth_getenv_enetaddr_by_index(eth_number, env_enetaddr); if (memcmp(env_enetaddr, "\0\0\0\0\0\0", 6)) { if (memcmp(dev->enetaddr, "\0\0\0\0\0\0", 6) && @@ -259,31 +264,6 @@ int eth_initialize(bd_t *bis) return eth_number; } -void eth_set_enetaddr(int num, char *addr) { - struct eth_device *dev; - unsigned char enetaddr[6]; - - debug("eth_set_enetaddr(num=%d, addr=%s)\n", num, addr); - - if (!eth_devices) - return; - - eth_parse_enetaddr(addr, enetaddr); - - dev = eth_devices; - while(num-- > 0) { - dev = dev->next; - - if (dev == eth_devices) - return; - } - - debug("Setting new HW address on %s\n" - "New Address is %pM\n", - dev->name, enetaddr); - - memcpy(dev->enetaddr, enetaddr, 6); -} #ifdef CONFIG_MCAST_TFTP /* Multicast. * mcast_addr: multicast ipaddr from which multicast Mac is made @@ -332,13 +312,27 @@ u32 ether_crc (size_t len, unsigned char const *p) int eth_init(bd_t *bis) { - struct eth_device* old_current; + int eth_number; + struct eth_device *old_current, *dev; if (!eth_current) { puts ("No ethernet found.\n"); return -1; } + /* Sync environment with network devices */ + eth_number = 0; + dev = eth_devices; + do { + uchar env_enetaddr[6]; + + if (eth_getenv_enetaddr_by_index(eth_number, env_enetaddr)) + memcpy(dev->enetaddr, env_enetaddr, 6); + + ++eth_number; + dev = dev->next; + } while (dev != eth_devices); + old_current = eth_current; do { debug("Trying %s\n", eth_current->name); -- cgit v1.2.3