When using an offboard ethernet chip such as e1000, it is highly likely
that the driver has already read a valid MAC address from the onboard
EEPROM.  In that case, U-Boot should not issue a warning about the
absence of an "eth*addr" value in the environment.

Since the calling code in drivers/usb/eth/usb_ether.c and net/eth.c
cannot tell what the error really was, move the log messages down into
the eth_write_hwaddr() code.

The code is further improved by the use of is_valid_ether_addr(), etc.

A properly configured HWW-1U-1A board is fixed from this output:

  Net:   e1000: 00:50:93:81:ff:8a
         e1000: 00:50:93:81:ff:8b
         owt0, owt1, peer, e1000#0
  Warning: failed to set MAC address
  , e1000#1
  Warning: failed to set MAC address

To this:

  Net:   e1000: 00:50:93:81:ff:8a
         e1000: 00:50:93:81:ff:8b
         owt0, owt1, peer, e1000#0, e1000#1

Furthermore, the log messages should avoid screwing up the "Net:" output
formatting provided by the calling code, EG:

  Net:   eth0, eth1 [could not set MAC: 00:50:93:81:ff:8a], eth2

Finally, the code in the NE-2000 driver which was working around the
spurious error messages from the core code can be removed.

Signed-off-by: Kyle Moffett <kyle.d.moff...@boeing.com>
Cc: Ben Warren <biggerbadder...@gmail.com>
---
 drivers/net/ne2000_base.c   |   17 +-----------
 drivers/usb/eth/usb_ether.c |    4 +--
 net/eth.c                   |   56 ++++++++++++++++++++++++------------------
 3 files changed, 35 insertions(+), 42 deletions(-)

diff --git a/drivers/net/ne2000_base.c b/drivers/net/ne2000_base.c
index 8275091..20fa70e 100644
--- a/drivers/net/ne2000_base.c
+++ b/drivers/net/ne2000_base.c
@@ -710,21 +710,8 @@ static int ne2k_setup_driver(struct eth_device *dev)
        nic.rx_buf_start = RX_START;
        nic.rx_buf_end = RX_END;
 
-       /*
-        * According to doc/README.enetaddr, drivers shall give priority
-        * to the MAC address value in the environment, so we do not read
-        * it from the prom or eeprom if it is specified in the environment.
-        */
-       if (!eth_getenv_enetaddr("ethaddr", dev->enetaddr)) {
-               /* If the MAC address is not in the environment, get it: */
-               if (!get_prom(dev->enetaddr, nic.base)) /* get MAC from prom */
-                       dp83902a_init(dev->enetaddr);   /* fallback: seeprom */
-               /* And write it into the environment otherwise eth_write_hwaddr
-                * returns -1 due to eth_getenv_enetaddr_by_index() failing,
-                * and this causes "Warning: failed to set MAC address", and
-                * cmd_bdinfo has no ethaddr value which it can show: */
-               eth_setenv_enetaddr("ethaddr", dev->enetaddr);
-       }
+       if (!get_prom(dev->enetaddr, nic.base)) /* get MAC from prom */
+               dp83902a_init(dev->enetaddr);   /* fallback: seeprom */
        return 0;
 }
 
diff --git a/drivers/usb/eth/usb_ether.c b/drivers/usb/eth/usb_ether.c
index 6565ea5..bb8be5a 100644
--- a/drivers/usb/eth/usb_ether.c
+++ b/drivers/usb/eth/usb_ether.c
@@ -103,9 +103,7 @@ static void probe_valid_drivers(struct usb_device *dev)
                         * relies on it
                         */
                        eth_register(eth);
-                       if (eth_write_hwaddr(eth, "usbeth",
-                                       usb_max_eth_dev - 1))
-                               puts("Warning: failed to set MAC address\n");
+                       eth_write_hwaddr(eth, "usbeth", usb_max_eth_dev - 1);
                        break;
                        }
                }
diff --git a/net/eth.c b/net/eth.c
index 4280d6d..1b6ca86 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -187,33 +187,42 @@ static void eth_current_changed(void)
 int eth_write_hwaddr(struct eth_device *dev, const char *base_name,
                   int eth_number)
 {
-       unsigned char env_enetaddr[6];
-       int ret = 0;
+       unsigned char envaddr[6];
 
-       if (!eth_getenv_enetaddr_by_index(base_name, eth_number, env_enetaddr))
-               return -1;
+       /*
+        * If the environment does not have a valid MAC address, then just
+        * try to use whatever we were able to load from the chipset.
+        */
+       if (!eth_getenv_enetaddr_by_index(base_name, eth_number, envaddr))
+               goto write_addr;
+       if (!is_valid_ether_addr(envaddr)) {
+               printf(" [bad env MAC: %pM]", envaddr);
+               goto write_addr;
+       }
 
-       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);
-               }
+       /* If the ROM and environment match, we should just program it */
+       if (!memcmp(dev->enetaddr, envaddr, 6))
+               goto write_addr;
 
-               memcpy(dev->enetaddr, env_enetaddr, 6);
-       }
+       /* Log the discrepancy and let the environment override the ROM */
+       if (is_valid_ether_addr(dev->enetaddr))
+               printf(" [MAC mismatch: ROM=%pM, env=%pM]",
+                               dev->enetaddr, envaddr);
+       memcpy(dev->enetaddr, envaddr, 6);
 
-       if (dev->write_hwaddr &&
-               !eth_mac_skip(eth_number) &&
-               is_valid_ether_addr(dev->enetaddr)) {
-               ret = dev->write_hwaddr(dev);
+write_addr:
+       if (!is_valid_ether_addr(dev->enetaddr)) {
+               printf(" [invalid MAC: %pM]", dev->enetaddr);
+               return -1;
        }
-
-       return ret;
+       if (dev->write_hwaddr && !eth_mac_skip(eth_number)) {
+               int ret = dev->write_hwaddr(dev);
+               if (ret) {
+                       printf(" [could not set MAC: %pM]", dev->enetaddr);
+                       return ret;
+               }
+       }
+       return 0;
 }
 
 int eth_register(struct eth_device *dev)
@@ -294,8 +303,7 @@ int eth_initialize(bd_t *bis)
                        if (strchr(dev->name, ' '))
                                puts("\nWarning: eth device name has a 
space!\n");
 
-                       if (eth_write_hwaddr(dev, "eth", eth_number))
-                               puts("\nWarning: failed to set MAC address\n");
+                       eth_write_hwaddr(dev, "eth", eth_number);
 
                        eth_number++;
                        dev = dev->next;
-- 
1.7.7.3

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to