
On Fri, Mar 17, 2017 at 09:44:59PM +0200, Tuomas Tynkkynen wrote:
The Raspberry Pi device tree files since Linux v4.9 have a "ethernet" alias pointing to the on-board Ethernet device node. However, U-Boot's fdt_fixup_ethernet() (and the kernel's of_alias_scan()) only looks at ethernet aliases ending in digits. Make it also check the "ethernet" alias.
Without this Linux isn't told of the MAC address provided by the RPI firmware and the ethernet device is always assigned a random MAC address.
The device trees themselves can't be fixed as someone is already depending on the "ethernet" alias: https://github.com/raspberrypi/firmware/issues/613
Signed-off-by: Tuomas Tynkkynen tuomas@tuxera.com
I looked into this a bit and there's a few other (much older) examples of 'ethernet' rather than 'ethernet0' and the spec doesn't mandate aliases end in a number.
That said, looking at the code, I think we can do this in a more clear manner. Can you test this please?
diff --git a/common/fdt_support.c b/common/fdt_support.c index 55d4d6f6d444..80186a95baf0 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -482,7 +482,6 @@ void fdt_fixup_ethernet(void *fdt) /* Cycle through all aliases */ for (prop = 0; ; prop++) { const char *name; - int len = strlen("ethernet");
/* FDT might have been edited, recompute the offset */ offset = fdt_first_property_offset(fdt, @@ -495,16 +494,13 @@ void fdt_fixup_ethernet(void *fdt) break;
path = fdt_getprop_by_offset(fdt, offset, &name, NULL); - if (!strncmp(name, "ethernet", len)) { + if (!strncmp(name, "ethernet", 8)) { i = trailing_strtol(name); - if (i != -1) { - if (i == 0) - strcpy(mac, "ethaddr"); - else - sprintf(mac, "eth%daddr", i); - } else { - continue; - } + /* Handle 'ethernet0' (0) and 'ethernet' (-1) */ + if (i <= 0) + strcpy(mac, "ethaddr"); + else + sprintf(mac, "eth%daddr", i); tmp = getenv(mac); if (!tmp) continue;