common: Fix-up MAC addr in dts by fetching env variable serially
authorPrabhakar Kushwaha <prabhakar.kushwaha@nxp.com>
Thu, 23 Nov 2017 11:21:32 +0000 (16:51 +0530)
committerSimon Glass <sjg@chromium.org>
Sun, 24 Dec 2017 19:42:50 +0000 (12:42 -0700)
The MAC addresses get fixed in the device tree for "ethernet" nodes
is by using trailing number behind "ethernet" found in "/aliases".
It may not be necessary for the "ethernet" nodes to be sequential.
There can be gaps in between or any node disabled

So provide a support to fetch MAC addr sequentially from env
and apply them to "ethernet" nodes in the order they appear in
device tree only if "ethernet" is not "disabled"

Signed-off-by: Prabhakar Kushwaha <prabhakar.kushwaha@nxp.com>
Reviewed-by: York Sun <york.sun@nxp.com>
README
common/fdt_support.c

diff --git a/README b/README
index 93c7ea966589984c334213fd6d84f8baa8521109..53502c06283c12259f2ee58b330e20cce2952f93 100644 (file)
--- a/README
+++ b/README
@@ -1603,6 +1603,15 @@ The following options need to be configured:
 
                See doc/README.link-local for more information.
 
+ - MAC address from environment variables
+
+               FDT_SEQ_MACADDR_FROM_ENV
+
+               Fix-up device tree with MAC addresses fetched sequentially from
+               environment variables. This config work on assumption that
+               non-usable ethernet node of device-tree are either not present
+               or their status has been marked as "disabled".
+
  - CDP Options:
                CONFIG_CDP_DEVICE_ID
 
index 6896dcb285aee9d0078930b20e5019cc202c746b..724452d754523a39f4a57fce208a80ae49cea2bd 100644 (file)
@@ -508,12 +508,16 @@ int fdt_fixup_memory(void *blob, u64 start, u64 size)
 
 void fdt_fixup_ethernet(void *fdt)
 {
-       int i, j, prop;
+       int i = 0, j, prop;
        char *tmp, *end;
        char mac[16];
        const char *path;
        unsigned char mac_addr[ARP_HLEN];
        int offset;
+#ifdef FDT_SEQ_MACADDR_FROM_ENV
+       int nodeoff;
+       const struct fdt_property *fdt_prop;
+#endif
 
        if (fdt_path_offset(fdt, "/aliases") < 0)
                return;
@@ -526,7 +530,7 @@ void fdt_fixup_ethernet(void *fdt)
                offset = fdt_first_property_offset(fdt,
                        fdt_path_offset(fdt, "/aliases"));
                /* Select property number 'prop' */
-               for (i = 0; i < prop; i++)
+               for (j = 0; j < prop; j++)
                        offset = fdt_next_property_offset(fdt, offset);
 
                if (offset < 0)
@@ -535,11 +539,16 @@ void fdt_fixup_ethernet(void *fdt)
                path = fdt_getprop_by_offset(fdt, offset, &name, NULL);
                if (!strncmp(name, "ethernet", 8)) {
                        /* Treat plain "ethernet" same as "ethernet0". */
-                       if (!strcmp(name, "ethernet"))
+                       if (!strcmp(name, "ethernet")
+#ifdef FDT_SEQ_MACADDR_FROM_ENV
+                        || !strcmp(name, "ethernet0")
+#endif
+                       )
                                i = 0;
+#ifndef FDT_SEQ_MACADDR_FROM_ENV
                        else
                                i = trailing_strtol(name);
-
+#endif
                        if (i != -1) {
                                if (i == 0)
                                        strcpy(mac, "ethaddr");
@@ -548,6 +557,14 @@ void fdt_fixup_ethernet(void *fdt)
                        } else {
                                continue;
                        }
+#ifdef FDT_SEQ_MACADDR_FROM_ENV
+                       nodeoff = fdt_path_offset(fdt, path);
+                       fdt_prop = fdt_get_property(fdt, nodeoff, "status",
+                                                   NULL);
+                       if (fdt_prop && !strcmp(fdt_prop->data, "disabled"))
+                               continue;
+                       i++;
+#endif
                        tmp = env_get(mac);
                        if (!tmp)
                                continue;