aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Herring <rob.herring@calxeda.com>2011-12-06 11:15:04 -0600
committerJohn Rigby <john.rigby@linaro.org>2012-08-16 09:56:02 -0600
commita89d0d39e2504876b7c30e80c94a2e63360988aa (patch)
tree6310f8659ca427bbe89aac7638d61e6b2b9fe3d4
parent0fd9b7b97f6ca663d425795cbba0f68eb501de8e (diff)
net: allow setting env enetaddr from net device setting
If the net driver has setup a valid ethernet address and an ethernet address is not set in the environment already, then set the environment variables from the net driver setting This enables pxe booting on boards which don't set ethaddr env variable. Signed-off-by: Rob Herring <rob.herring@calxeda.com>
-rw-r--r--doc/README.enetaddr4
-rw-r--r--net/eth.c18
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
diff --git a/net/eth.c b/net/eth.c
index d526264fa..6f10ecc6c 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -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];
@@ -191,8 +200,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)) {