[PATCH v2 1/3] net: eth-uclass: Introduce NET_PREFER_ROM_MAC_ADDR
Detlev Casanova
detlev.casanova at collabora.com
Mon Apr 22 15:56:18 CEST 2024
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 at collabora.com>
---
net/Kconfig | 7 +++++++
net/eth-uclass.c | 9 +++++++--
2 files changed, 14 insertions(+), 2 deletions(-)
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);
--
2.43.2
More information about the U-Boot
mailing list