diff mbox series

[U-Boot,1/3,v3] common: Fix-up MAC addr in dts by fetching env variable serially

Message ID 1511436092-14765-1-git-send-email-prabhakar.kushwaha@nxp.com
State Accepted
Delegated to: Simon Glass
Headers show
Series Update MAC address in "ethernet" node of Linux device tree | expand

Commit Message

Prabhakar Kushwaha Nov. 23, 2017, 11:21 a.m. UTC
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>
---
Changes for v2: Updated description and README
Changes for v3: sending as it is

 README               |  9 +++++++++
 common/fdt_support.c | 25 +++++++++++++++++++++----
 2 files changed, 30 insertions(+), 4 deletions(-)

Comments

York Sun Dec. 12, 2017, 5:56 p.m. UTC | #1
On 11/23/2017 03:22 AM, Prabhakar Kushwaha wrote:
> 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>
> ---
> Changes for v2: Updated description and README
> Changes for v3: sending as it is
> 

Reviewed-by: York Sun <york.sun@nxp.com>
Simon Glass Dec. 19, 2017, 1:18 p.m. UTC | #2
On 12 December 2017 at 10:56, York Sun <york.sun@nxp.com> wrote:
> On 11/23/2017 03:22 AM, Prabhakar Kushwaha wrote:
>> 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>
>> ---
>> Changes for v2: Updated description and README
>> Changes for v3: sending as it is
>>
>
> Reviewed-by: York Sun <york.sun@nxp.com>

Applied to u-boot-dm, thanks!
diff mbox series

Patch

diff --git a/README b/README
index 7a4f342..15310a2 100644
--- 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
 
diff --git a/common/fdt_support.c b/common/fdt_support.c
index f4f9543..43ca8db 100644
--- a/common/fdt_support.c
+++ b/common/fdt_support.c
@@ -469,12 +469,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;
@@ -487,7 +491,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)
@@ -496,11 +500,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");
@@ -509,6 +518,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;