[PATCH 10/10] board: sl28: disable random MAC address generation
Michael Walle
michael at walle.cc
Wed Nov 17 17:45:58 CET 2021
Am 2021-11-16 22:14, schrieb Tom Rini:
> On Mon, Nov 15, 2021 at 11:45:51PM +0100, Michael Walle wrote:
>
>> Nowadays, u-boot (when CONFIG_NET_RANDOM_ETHADDR is set) will set
>> enetaddr to a random value if not set and then pass the randomly
>> generated MAC address to linux.
>
> First, for clarity I'm not nak'ing this. I kind of would like to see a
> slight reword as I think some things aren't 100% correct, even if the
> "save random MAC to ethaddr environment variable" change goes in. For
> example, it's quite long standing that (dev|pdata)->enetaddr populates
> "mac-address" and "local-mac-address" and it seems in some older cases
> we only set the "local-mac-address" property.
fdt_fixup_memory() in common/fdt_support.c does a env_get(mac).
I'm not even sure, if there is a connection between what is fixed up
in the kernel DT and the corresponding device in u-boot if
CONFIG_DM_SEQ_ALIAS is not set.
>> This is bad for the following reasons:
>> (1) it makes it impossible for linux to detect this error
>> (2) linux won't trigger any fallback mechanism for the case where
>> it didn't find any valid MAC address
>
> This feels in some ways to be a limitation of the binding:
> https://www.kernel.org/doc/Documentation/devicetree/bindings/net/ethernet-controller.yaml
Agreed. But it doesn't render my argument invalid ;)
> And it reads like we really must be populating "mac-address" with that
> random one and while providing a blank "local-mac-address" would be a
> way to say we don't know the true device one, it seems that wouldn't be
> used / noticed?
I guess it will just use the one populated in mac-address, i.e. the
random one. Btw, the binding says "last used" what if u-boot never
actually used that ethernet controller, should it then be empty or
populated with the random mac address.
>> (3) a saveenv will store this randomly generated MAC address in the
>> environment
>>
>> Probably, the user will also be unaware that something is wrong. He
>> will
>> just get different MAC addresses on each reboot, asking himself why
>> this
>> is the case.
>>
>> As this board usually have a serial port, the user can just fix this
>> by
>> setting the MAC address manually in the environment. Also disable the
>> netconsole just in case, because it cannot be guaranteed that it will
>> work in any case. After all, this was just a convenience option,
>> because
>> the bootloader - right now - doesn't have the ability to read the MAC
>> address, which is stored in the OTP. But it is far more important to
>> have a clear view of whats wrong with a board and that means we can no
>> longer use this Kconfig option.
>>
>> Signed-off-by: Michael Walle <michael at walle.cc>
>> ---
>> configs/kontron_sl28_defconfig | 2 --
>> 1 file changed, 2 deletions(-)
>>
>> diff --git a/configs/kontron_sl28_defconfig
>> b/configs/kontron_sl28_defconfig
>> index af907175f1..7fb6bdbe82 100644
>> --- a/configs/kontron_sl28_defconfig
>> +++ b/configs/kontron_sl28_defconfig
>> @@ -59,8 +59,6 @@ CONFIG_OF_LIST=""
>> CONFIG_ENV_OVERWRITE=y
>> CONFIG_ENV_IS_IN_SPI_FLASH=y
>> CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
>> -CONFIG_NET_RANDOM_ETHADDR=y
>> -CONFIG_NETCONSOLE=y
>> CONFIG_SPL_DM_SEQ_ALIAS=y
>> CONFIG_SCSI_AHCI=y
>> CONFIG_SATA_CEVA=y
>
> Now, an alternate solution here would be to enable these two options
> still and write an ft_board_setup() with:
> ... if ethaddr is in the locally administered pool then
> fdt_delprop(... "mac-address");
> fdt_delprop(... "local-mac-address");
Which would also trigger if a user sets a "locally administered"
mac himself. Even if unlikely, I'm opposed to such magic and
unexpected behavior. Sooner or later it will bite you.
> And that should cause the kernel to fall through the cases to find out
> where to get the real MAC from. I'm not super happy with this at
> first,
> but I also don't see anything clever in the binding we can do.
If I'll need this one again, then I'll just add the random mac
generation in board_eth_init(), I think.
-michael
More information about the U-Boot
mailing list