[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