Message ID | 20240422135927.23582-2-detlev.casanova@collabora.com |
---|---|
State | Changes Requested |
Delegated to: | Marek Vasut |
Headers | show |
Series | Introduce NET_PREFER_ROM_MAC_ADDR config | expand |
On 4/22/24 3:56 PM, Detlev Casanova wrote: > On some boards, a MAC address is set based on the CPU ID or other > information. This is usually done in the misc_init_r() function. > > This becomes a problem for net devices that are probed after the call to > misc_init_r(), for example, when the ethernet is on a PCI port, which > needs to be enumerated. > > In this case, misc_init_r() will set the ethaddr variable, then, when > the ethernet device is probed, if it has a ROM address, u-boot will warn > about a MAC address mismatch and use the misc_init_r() address instead > of the one in ROM. > > The operating system later will most likely use the ROM MAC address, > which can be confusing. > > To avoid that, this commit introduces NET_PREFER_ROM_MAC_ADDR that can > be set for boards that have such an interface. > > Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com> Won't the system pick ROM MAC if $ethaddr is not set ?
On Monday, April 22, 2024 3:47:21 P.M. EDT Marek Vasut wrote: > On 4/22/24 3:56 PM, Detlev Casanova wrote: > > On some boards, a MAC address is set based on the CPU ID or other > > information. This is usually done in the misc_init_r() function. > > > > This becomes a problem for net devices that are probed after the call to > > misc_init_r(), for example, when the ethernet is on a PCI port, which > > needs to be enumerated. > > > > In this case, misc_init_r() will set the ethaddr variable, then, when > > the ethernet device is probed, if it has a ROM address, u-boot will warn > > about a MAC address mismatch and use the misc_init_r() address instead > > of the one in ROM. > > > > The operating system later will most likely use the ROM MAC address, > > which can be confusing. > > > > To avoid that, this commit introduces NET_PREFER_ROM_MAC_ADDR that can > > be set for boards that have such an interface. > > > > Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com> > > Won't the system pick ROM MAC if $ethaddr is not set ? Yes, and in the case of rockchip, misc_init_r() will set an $ethaddr based on the cpuid, which makes the eth driver use that instead of the ROM one.
On 4/23/24 3:35 PM, Detlev Casanova wrote: > On Monday, April 22, 2024 3:47:21 P.M. EDT Marek Vasut wrote: >> On 4/22/24 3:56 PM, Detlev Casanova wrote: >>> On some boards, a MAC address is set based on the CPU ID or other >>> information. This is usually done in the misc_init_r() function. >>> >>> This becomes a problem for net devices that are probed after the call to >>> misc_init_r(), for example, when the ethernet is on a PCI port, which >>> needs to be enumerated. >>> >>> In this case, misc_init_r() will set the ethaddr variable, then, when >>> the ethernet device is probed, if it has a ROM address, u-boot will warn >>> about a MAC address mismatch and use the misc_init_r() address instead >>> of the one in ROM. >>> >>> The operating system later will most likely use the ROM MAC address, >>> which can be confusing. >>> >>> To avoid that, this commit introduces NET_PREFER_ROM_MAC_ADDR that can >>> be set for boards that have such an interface. >>> >>> Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com> >> >> Won't the system pick ROM MAC if $ethaddr is not set ? > > Yes, and in the case of rockchip, misc_init_r() will set an $ethaddr based on > the cpuid, which makes the eth driver use that instead of the ROM one. Shouldn't the rockchip misc_init_r be fixed then ?
diff --git a/net/Kconfig b/net/Kconfig index 5dff6336293..1797c2cea35 100644 --- a/net/Kconfig +++ b/net/Kconfig @@ -227,6 +227,13 @@ config SERVERIP string "Value of the default 'serverip' value in the environment" depends on USE_SERVERIP +config NET_PREFER_ROM_MAC_ADDR + bool "Prefer using HW MAC address if environment address differs" + default n + help + In case of a MAC address mismatch between the environment and the HW, + prefer using the HW address. + config PROT_TCP bool "TCP stack" help diff --git a/net/eth-uclass.c b/net/eth-uclass.c index 3d0ec91dfa4..682de3ec7bd 100644 --- a/net/eth-uclass.c +++ b/net/eth-uclass.c @@ -584,8 +584,13 @@ static int eth_post_probe(struct udevice *dev) env_enetaddr); } - /* Override the ROM MAC address */ - memcpy(pdata->enetaddr, env_enetaddr, ARP_HLEN); + if (!IS_ENABLED(CONFIG_NET_PREFER_ROM_MAC_ADDR)) { + /* Override the ROM MAC address */ + printf("Using address in environment\n"); + memcpy(pdata->enetaddr, env_enetaddr, ARP_HLEN); + } else { + printf("Using address in %s\n", source); + } } else if (is_valid_ethaddr(pdata->enetaddr)) { eth_env_set_enetaddr_by_index("eth", dev_seq(dev), pdata->enetaddr);
On some boards, a MAC address is set based on the CPU ID or other information. This is usually done in the misc_init_r() function. This becomes a problem for net devices that are probed after the call to misc_init_r(), for example, when the ethernet is on a PCI port, which needs to be enumerated. In this case, misc_init_r() will set the ethaddr variable, then, when the ethernet device is probed, if it has a ROM address, u-boot will warn about a MAC address mismatch and use the misc_init_r() address instead of the one in ROM. The operating system later will most likely use the ROM MAC address, which can be confusing. To avoid that, this commit introduces NET_PREFER_ROM_MAC_ADDR that can be set for boards that have such an interface. Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com> --- net/Kconfig | 7 +++++++ net/eth-uclass.c | 9 +++++++-- 2 files changed, 14 insertions(+), 2 deletions(-)