diff options
-rw-r--r-- | doc/README.enetaddr | 4 | ||||
-rw-r--r-- | net/eth.c | 18 |
2 files changed, 19 insertions, 3 deletions
diff --git a/doc/README.enetaddr b/doc/README.enetaddr index 2d8e24f5c..6c61817da 100644 --- a/doc/README.enetaddr +++ b/doc/README.enetaddr @@ -32,7 +32,9 @@ Correct flow of setting up the MAC address (summarized): 1. Read from hardware in initialize() function 2. Read from environment in net/eth.c after initialize() -3. Give priority to the value in the environment if a conflict +3. Write value to environment if setup in struct eth_device->enetaddr by driver + initialize() function. Give priority to the value in the environment if a + conflict. 4. Program the address into hardware if the following conditions are met: a) The relevant driver has a 'write_addr' function b) The user hasn't set an 'ethmacskip' environment variable @@ -62,6 +62,15 @@ int eth_getenv_enetaddr_by_index(const char *base_name, int index, return eth_getenv_enetaddr(enetvar, enetaddr); } +int eth_setenv_enetaddr_by_index(const char *base_name, int index, + uchar *enetaddr) +{ + char enetvar[32]; + sprintf(enetvar, index ? "%s%daddr" : "%saddr", base_name, index); + return eth_setenv_enetaddr(enetvar, enetaddr); +} + + static int eth_mac_skip(int index) { char enetvar[15]; @@ -172,8 +181,13 @@ int eth_write_hwaddr(struct eth_device *dev, const char *base_name, unsigned char env_enetaddr[6]; int ret = 0; - eth_getenv_enetaddr_by_index(base_name, eth_number, env_enetaddr); - + if (!eth_getenv_enetaddr_by_index(base_name, eth_number, env_enetaddr)) { + if (!is_valid_ether_addr(dev->enetaddr)) + return -1; + eth_setenv_enetaddr_by_index(base_name, eth_number, + dev->enetaddr); + memcpy(env_enetaddr, dev->enetaddr, 6); + } 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)) { |