diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/eth.c | 64 | 
1 files changed, 39 insertions, 25 deletions
| @@ -54,10 +54,11 @@ int eth_setenv_enetaddr(char *name, const uchar *enetaddr)  	return setenv(name, buf);  } -int eth_getenv_enetaddr_by_index(int index, uchar *enetaddr) +int eth_getenv_enetaddr_by_index(const char *base_name, int index, +				 uchar *enetaddr)  {  	char enetvar[32]; -	sprintf(enetvar, index ? "eth%daddr" : "ethaddr", index); +	sprintf(enetvar, index ? "%s%daddr" : "%saddr", base_name, index);  	return eth_getenv_enetaddr(enetvar, enetaddr);  } @@ -188,6 +189,38 @@ static void eth_current_changed(void)  #endif  } +int eth_write_hwaddr(struct eth_device *dev, const char *base_name, +		   int eth_number) +{ +	unsigned char env_enetaddr[6]; +	int ret = 0; + +	if (!eth_getenv_enetaddr_by_index(base_name, eth_number, env_enetaddr)) +		return -1; + +	if (memcmp(env_enetaddr, "\0\0\0\0\0\0", 6)) { +		if (memcmp(dev->enetaddr, "\0\0\0\0\0\0", 6) && +			memcmp(dev->enetaddr, env_enetaddr, 6)) { +			printf("\nWarning: %s MAC addresses don't match:\n", +				dev->name); +			printf("Address in SROM is         %pM\n", +				dev->enetaddr); +			printf("Address in environment is  %pM\n", +				env_enetaddr); +		} + +		memcpy(dev->enetaddr, env_enetaddr, 6); +	} + +	if (dev->write_hwaddr && +		!eth_mac_skip(eth_number) && +		is_valid_ether_addr(dev->enetaddr)) { +		ret = dev->write_hwaddr(dev); +	} + +	return ret; +} +  int eth_register(struct eth_device *dev)  {  	struct eth_device *d; @@ -208,7 +241,6 @@ int eth_register(struct eth_device *dev)  int eth_initialize(bd_t *bis)  { -	unsigned char env_enetaddr[6];  	int eth_number = 0;  	eth_devices = NULL; @@ -264,27 +296,8 @@ int eth_initialize(bd_t *bis)  			if (strchr(dev->name, ' '))  				puts("\nWarning: eth device name has a space!\n"); -			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) && -				    memcmp(dev->enetaddr, env_enetaddr, 6)) -				{ -					printf ("\nWarning: %s MAC addresses don't match:\n", -						dev->name); -					printf ("Address in SROM is         %pM\n", -						dev->enetaddr); -					printf ("Address in environment is  %pM\n", -						env_enetaddr); -				} - -				memcpy(dev->enetaddr, env_enetaddr, 6); -			} -			if (dev->write_hwaddr && -				!eth_mac_skip(eth_number) && -				is_valid_ether_addr(dev->enetaddr)) { -				dev->write_hwaddr(dev); -			} +			if (eth_write_hwaddr(dev, NULL, eth_number)) +				puts("Warning: failed to set MAC address\n");  			eth_number++;  			dev = dev->next; @@ -359,7 +372,8 @@ int eth_init(bd_t *bis)  	do {  		uchar env_enetaddr[6]; -		if (eth_getenv_enetaddr_by_index(eth_number, env_enetaddr)) +		if (eth_getenv_enetaddr_by_index("eth", eth_number, +						 env_enetaddr))  			memcpy(dev->enetaddr, env_enetaddr, 6);  		++eth_number; |