From 86848a74c3c8eb2f8dd179d039ee604dc45288cf Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Wed, 15 Jul 2009 21:31:28 -0400 Subject: [PATCH] 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 --- include/net.h | 2 +- net/eth.c | 52 +++++++++++++++++++++++---------------------------- 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/include/net.h b/include/net.h index 4a03717ae9..4873000c0d 100644 --- a/include/net.h +++ b/include/net.h @@ -119,10 +119,10 @@ extern struct eth_device *eth_get_dev(void); /* get the current device MAC */ extern struct eth_device *eth_get_dev_by_name(char *devname); /* get device */ extern struct eth_device *eth_get_dev_by_index(int index); /* get dev @ index */ extern int eth_get_dev_index (void); /* get the device index */ -extern void eth_set_enetaddr(int num, char* a); /* Set new MAC address */ extern void eth_parse_enetaddr(const char *addr, uchar *enetaddr); extern int eth_getenv_enetaddr(char *name, uchar *enetaddr); extern int eth_setenv_enetaddr(char *name, const uchar *enetaddr); +extern int eth_getenv_enetaddr_by_index(int index, uchar *enetaddr); extern int eth_init(bd_t *bis); /* Initialize the device */ extern int eth_send(volatile void *packet, int length); /* Send a packet */ diff --git a/net/eth.c b/net/eth.c index b4f3b1aa85..9b503124fb 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); -- 2.30.2