diff options
author | Simon Glass <sjg@chromium.org> | 2011-06-13 16:13:10 -0700 |
---|---|---|
committer | Remy Bohmer <linux@bohmer.net> | 2011-08-08 21:05:23 +0200 |
commit | 7616e7850804c7c69e0a22c179dfcba9e8f3f587 (patch) | |
tree | 9626807ab58412177023ab6ad472448b932d412c /net/eth.c | |
parent | 291391bed566a569a80b50c924a7c43747abc1b5 (diff) |
Add Ethernet hardware MAC address framework to usbnet
Built-in Ethernet adapters support setting the mac address by means of a
ethaddr environment variable for each interface (ethaddr, eth1addr, eth2addr).
This adds similar support to the USB network side, using the names
usbethaddr, usbeth1addr, etc. They are kept separate since we don't want
a USB device taking the MAC address of a built-in device or vice versa.
Signed-off-by: Simon Glass <sjg@chromium.org>
Tested-by: Eric BĂ©nard <eric@eukrea.com>
Diffstat (limited to 'net/eth.c')
-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; |