diff mbox

[U-Boot,v2] net: allow setting env enetaddr from net device setting

Message ID 1323199478-21001-1-git-send-email-robherring2@gmail.com
State Superseded
Headers show

Commit Message

Rob Herring Dec. 6, 2011, 7:24 p.m. UTC
From: Rob Herring <rob.herring@calxeda.com>

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>
---
v2:
- Re-wrote to always setup ethaddr env variables

 doc/README.enetaddr |    4 +++-
 net/eth.c           |   19 ++++++++++++++++---
 2 files changed, 19 insertions(+), 4 deletions(-)

Comments

Wolfgang Denk Jan. 13, 2012, 8:36 p.m. UTC | #1
Dear Rob Herring,

In message <1323199478-21001-1-git-send-email-robherring2@gmail.com> you wrote:
> From: Rob Herring <rob.herring@calxeda.com>
> 
> 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>
> ---
> v2:
> - Re-wrote to always setup ethaddr env variables
> 
>  doc/README.enetaddr |    4 +++-
>  net/eth.c           |   19 ++++++++++++++++---
>  2 files changed, 19 insertions(+), 4 deletions(-)

I asked before:

... If the "ethaddr" environment variable is not
set, then this alternative value can be used as default. In this case
a warning should be printed.  If both settings exist and differ, the
"ethaddr" environment variable shall be used, and a warning be
printed, too.

I do not see any wanings in your patch?

Best regards,

Wolfgang Denk
diff mbox

Patch

diff --git a/doc/README.enetaddr b/doc/README.enetaddr
index 2d8e24f..6c61817 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 4280d6d..e3d8777 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];
@@ -190,9 +199,13 @@  int eth_write_hwaddr(struct eth_device *dev, const char *base_name,
 	unsigned char env_enetaddr[6];
 	int ret = 0;
 
-	if (!eth_getenv_enetaddr_by_index(base_name, eth_number, env_enetaddr))
-		return -1;
-
+	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)) {