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 | olio-uboot-2014.01-86848a74c3c8eb2f8dd179d039ee604dc45288cf.tar.xz olio-uboot-2014.01-86848a74c3c8eb2f8dd179d039ee604dc45288cf.zip | |
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 4a03717ae..4873000c0 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); |