diff options
author | Mike Frysinger <vapier@gentoo.org> | 2009-07-15 21:31:28 -0400 |
---|---|---|
committer | Ben Warren <biggerbadderben@gmail.com> | 2009-08-07 17:39:23 -0700 |
commit | 86848a74c3c8eb2f8dd179d039ee604dc45288cf (patch) | |
tree | f380764541e302d8a2810c817768058cdba4cdb0 | |
parent | 0ebf04c607b54a352629dcf7e76b76f1785dae54 (diff) | |
download | u-boot-imx-86848a74c3c8eb2f8dd179d039ee604dc45288cf.zip u-boot-imx-86848a74c3c8eb2f8dd179d039ee604dc45288cf.tar.gz u-boot-imx-86848a74c3c8eb2f8dd179d039ee604dc45288cf.tar.bz2 |
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 <awolski@poczta.fm>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Signed-off-by: Ben Warren <biggerbadderben@gmail.com>
-rw-r--r-- | include/net.h | 2 | ||||
-rw-r--r-- | net/eth.c | 52 |
2 files changed, 24 insertions, 30 deletions
diff --git a/include/net.h b/include/net.h index 4a03717..4873000 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 */ @@ -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); |