14.01.2026 00:16:37 Andre Przywara <[email protected]>:

> On Tue, 10 Jun 2025 07:38:54 +0200
> Lukas Schmid <[email protected]> wrote:

Hi Andre,
> 
> Hi Lukas,
> 
>> Boards using MAC addresses stored in EEPROM via the device tree's
>> `nvmem-cells` mechanism may already have a valid MAC loaded by the
>> device model. However, setup_environment() currently ignores this
>> and generates a fallback address from the SoC SID if no environment
>> variable is set.
>> 
>> This leads to a mismatch warning during boot when the kernel or U-Boot
>> detects the MAC from nvmem and compares it to the environment.
>> 
>> This patch checks whether the corresponding ethernet device node
>> has a `nvmem-cells` property and skips generating a fallback MAC
>> if it does, thus avoiding redundant or incorrect ethaddr setup.
> 
> So while this seems like a pragmatic solution, I feel it's not the
> right one: This "peeking into the DT to skip something" sounds
> backwards. You have probably investigated this more thoroughly, but how
> does this work here? Did the generic code already parse the MAC address
> and put it somewhere, and our code here was about to overwrite it? Or
> will the generic code later fill the gap, if the sunxi code didn't set a
> MAC address based on the SID?

At the time of running setup_environment is not yet set as a environment 
variable and U-Boot will also not try to set it later since sunxi already set 
one. I did not find a way in setup_env to check otherwise if there already is a 
valid Mac somewhere.

U-Boot does know however that there is a different mac intended for the 
interface as it throws a Mac address mismatch warning.

> 
> I feel like the sunxi code is to blame here for doing it at the wrong
> time or using its own method instead of coordinating with the generic
> code, so I'd rather fix this properly than papering over it here.
> 
> I will help you find a better solution, but if you can dump here what
> you learned, I'd be grateful, as I am too lazy atm to chase down the
> code ;-)
> 
> Cheers,
> Andre
> 
>> This improves compatibility with nvmem-based MAC provisioning and
>> aligns U-Boot behavior with Linux.
>> 
>> Signed-off-by: Lukas Schmid <[email protected]>
>> ---
>> board/sunxi/board.c | 15 ++++++++++++++-
>> 1 file changed, 14 insertions(+), 1 deletion(-)
>> 
>> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
>> index ac9cefc6..41b85c66 100644
>> --- a/board/sunxi/board.c
>> +++ b/board/sunxi/board.c
>> @@ -774,10 +774,23 @@ static void setup_environment(const void *fdt)
>>         return;
>> 
>>     for (i = 0; i < 4; i++) {
>> +       const char *alias;
>> +       int nodeoffset;
>> +       int len;
>> +       const fdt32_t *prop;
>> +
>>         sprintf(ethaddr, "ethernet%d", i);
>> -       if (!fdt_get_alias(fdt, ethaddr))
>> +       alias = fdt_get_alias(fdt, ethaddr);
>> +       if (!alias)
>>             continue;
>> 
>> +       nodeoffset = fdt_path_offset(fdt, alias);
>> +       if (nodeoffset >= 0) {
>> +           prop = fdt_getprop(fdt, nodeoffset, "nvmem-cells", &len);
>> +           if (prop && len > 0)
>> +               continue;
>> +       }
>> +
>>         if (i == 0)
>>             strcpy(ethaddr, "ethaddr");
>>         else

Reply via email to