]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: stmmac: dwmac-motorcomm: fix eFUSE MAC address read failure
authorJohan Alvarado <contact@c127.dev>
Mon, 6 Apr 2026 07:44:25 +0000 (07:44 +0000)
committerJakub Kicinski <kuba@kernel.org>
Wed, 8 Apr 2026 01:21:00 +0000 (18:21 -0700)
This patch fixes an issue where reading the MAC address from the eFUSE
fails due to a race condition.

The root cause was identified by comparing the driver's behavior with a
custom U-Boot port. In U-Boot, the MAC address was read successfully
every time because the driver was loaded later in the boot process, giving
the hardware ample time to initialize. In Linux, reading the eFUSE
immediately returns all zeros, resulting in a fallback to a random MAC address.

Hardware cold-boot testing revealed that the eFUSE controller requires a
short settling time to load its internal data. Adding a 2000-5000us
delay after the reset ensures the hardware is fully ready, allowing the
native MAC address to be read consistently.

Fixes: 02ff155ea281 ("net: stmmac: Add glue driver for Motorcomm YT6801 ethernet controller")
Reported-by: Georg Gottleuber <ggo@tuxedocomputers.com>
Closes: https://lore.kernel.org/24cfefff-1233-4745-8c47-812b502d5d19@tuxedocomputers.com
Signed-off-by: Johan Alvarado <contact@c127.dev>
Reviewed-by: Yao Zi <me@ziyao.cc>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Link: https://patch.msgid.link/fc5992a4-9532-49c3-8ec1-c2f8c5b84ca1@smtp-relay.sendinblue.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/stmicro/stmmac/dwmac-motorcomm.c

index 8b45b9cf7202ff84e06c70804a4d12f574e10170..663d87ccfa0f8f34717e52a7b4fd876de97e5c83 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include <linux/bits.h>
+#include <linux/delay.h>
 #include <linux/dev_printk.h>
 #include <linux/io.h>
 #include <linux/iopoll.h>
@@ -334,6 +335,13 @@ static int motorcomm_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 
        motorcomm_reset(priv);
 
+       /*
+        * After system reset, the eFuse controller needs time to load
+        * its internal data. Without this delay, eFuse reads return
+        * all zeros, causing MAC address detection to fail.
+        */
+       usleep_range(2000, 5000);
+
        ret = motorcomm_efuse_read_mac(&pdev->dev, priv, res.mac);
        if (ret == -ENOENT) {
                dev_warn(&pdev->dev, "eFuse contains no valid MAC address\n");