diff mbox series

[v2,1/3] net: eth-uclass: Introduce NET_PREFER_ROM_MAC_ADDR

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

Commit Message

Detlev Casanova April 22, 2024, 1:56 p.m. UTC
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(-)

Comments

Marek Vasut April 22, 2024, 7:47 p.m. UTC | #1
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 ?
Detlev Casanova April 23, 2024, 1:35 p.m. UTC | #2
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.
Marek Vasut April 23, 2024, 1:44 p.m. UTC | #3
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 mbox series

Patch

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);