[U-Boot] [PATCH v2] fdt: fix setting MAC addresses for multiple interfaces
Bin Meng
bmeng.cn at gmail.com
Wed Apr 27 02:06:49 CEST 2016
Hi Lev,
On Fri, Jan 8, 2016 at 7:04 AM, Lev Iserovich
<Lev.Iserovich at deshawresearch.com> wrote:
> For multiple ethernet interfaces the FDT offset of '/aliases' will change as
> we
> are adding MAC addresses to the FDT.
> Therefore only the first interface ('ethernet0') will get properly updated
> in
> the FDT, with the rest getting FDT errors when we try to set their MAC
> address.
>
> Signed-off-by: Lev Iserovich<iserovil at deshawresearch.com>
> ---
>
> Changes in v2:
> - Rebase on u-boot-net patches:
> http://patchwork.ozlabs.org/patch/539373/
> http://patchwork.ozlabs.org/patch/539374/
> - Recompute offset based on property index
>
> ---
>
> common/fdt_support.c | 21 ++++++++++++++-------
> 1 file changed, 14 insertions(+), 7 deletions(-)
>
> diff --git a/common/fdt_support.c b/common/fdt_support.c
> index 48faba9..713d2a4 100644
> --- a/common/fdt_support.c
> +++ b/common/fdt_support.c
> @@ -481,23 +481,30 @@ int fdt_fixup_memory(void *blob, u64 start, u64 size)
>
> void fdt_fixup_ethernet(void *fdt)
> {
> - int node, i, j;
> + int i, j, prop;
> char *tmp, *end;
> char mac[16];
> const char *path;
> unsigned char mac_addr[6];
> int offset;
>
> - node = fdt_path_offset(fdt, "/aliases");
> - if (node < 0)
> + if (fdt_path_offset(fdt, "/aliases") < 0)
> return;
> -
> - for (offset = fdt_first_property_offset(fdt, node);
> - offset > 0;
> - offset = fdt_next_property_offset(fdt, offset)) {
> +
> + // Cycle through all aliases
Please do not use C++ comment style.
> + for (prop = 0; ; prop++) {
> const char *name;
> int len = strlen("ethernet");
>
> + // FDT might have been edited, recompute the offset
ditto.
> + offset = fdt_first_property_offset(fdt, fdt_path_offset(fdt,
> "/aliases"));
> + // Select property number 'prop'
ditto.
> + for (i = 0; i < prop; i++) {
> + offset = fdt_next_property_offset(fdt, offset);
> + }
> + if (offset < 0)
> + break;
> +
> path = fdt_getprop_by_offset(fdt, offset, &name, NULL);
> if (!strncmp(name, "ethernet", len)) {
> i = trailing_strtol(name);
>
Regards,
Bin
More information about the U-Boot
mailing list