From nobody Mon Jan 26 22:57:39 2026 Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D8E1033F37F for ; Mon, 26 Jan 2026 17:25:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769448319; cv=none; b=QEcK6BTqmh2Ft77d7Q/0I2ZVw6J19ETejr8RYjsqBekoyf3OKyCw1T7he2dp8tT1GeMpjPFagL3otS+od4818XjlEMJhbLFfYF94dWvp4qWd9S3C4yKrifLKV1wfJrKQT0aZ0XOVX9AAf6QYJ40uAyHgxnO98hj6WY6yJqRWBd4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769448319; c=relaxed/simple; bh=Z9egbW4PzribQ2BUsv8FP0Zs6A2lyVBkqKP8TaaVKRw=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=GArB87U9Du7KbwB9OY6nOYSWnpTzpNSMeV7JyKsIa+sAjM9BkrpvaE8vga0Uqy+67ZFTTM6VNOt9ctvrV7QtCCkLPaDmYeGBxMRXsyoOQDGrBoQd4uAjfyP3egou1FsIhkJJgA8be0DDI/Vfr/SyfDg6ekgrklZhxP0c7vMWslg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=DvJLTQhg; arc=none smtp.client-ip=209.85.221.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="DvJLTQhg" Received: by mail-wr1-f45.google.com with SMTP id ffacd0b85a97d-4359a302794so2960771f8f.1 for ; Mon, 26 Jan 2026 09:25:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1769448316; x=1770053116; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=I8NCqtdKCDQg/h+vlP7+WRT2HIbB0HaXTUJf1+ishbw=; b=DvJLTQhgXOROjdcWLdlvc6eZZjQWHpHRFNHNbXVOTc2KfyRdXMGxD2xnR5N1L8lwNe bLSWYDX96uxWq1hfajZIxiWLJAm5Eqw0YO96L8g3iYUGqIujmHWeRy9aM4Yvuws0fXNl q7IZSWfVbwXpTfbcsrWXGnABOz0mcXCvmxlZEsH9cCooFV5En8Odx4rNCPNnjkyJLIAN 6/WJGthpTwE/xtKVVbyi9+cOH6+yDMHSUxXWDWN93TGlbACKgJI1vLCF9dWf5pCcO5rZ 5ftncT9I5u4wdmRl/vzfwv46amYfqo4NDJaCqbMcLApAU/LCEzT7QGV23Mtg72JeAeI/ OGFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769448316; x=1770053116; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=I8NCqtdKCDQg/h+vlP7+WRT2HIbB0HaXTUJf1+ishbw=; b=uHLR8vEBOSS5CKgppfu8zitRrJVW0/99xsAIwjm6V0XcU8oGysFq0J/iPLNHDAEy+v 0Rq90G9r1na/L+DpU4I9cmgIS+Xi9GMPdwFyKmQ/IrfA+iJv8JsCJLTKhd3JCpkRsUHK hjkMpga1d/4qyfUBnjtUPI1OD8X/x2tH1R1C0x2zvvhOjWG7eHJkm79Xti8qv8Vc3QqS FFAArxLVIb1XezmReu5a53+PhD15udsRGWDwhiUdzlhSSzKEVV/9ea3z+mX08mQd2WQL XT8rBlhF0lFBUXpfwdpCV29iEMuEX3KxxLmb+dIDwTDzmWCOrfumX2CZ3352oepfl2u4 OklQ== X-Forwarded-Encrypted: i=1; AJvYcCVaU5A0yOBwrYXysJrr1WwzYu5e893KAGer5A58/2bfzHvbZPFtDCTqSz7917/Ko8mAHLlYI5JsfAIKEoM=@vger.kernel.org X-Gm-Message-State: AOJu0YyO1zKT/6OrqWPHIOC4H722w6Z6qdKeBwat592/0IuXtj+u4sIO wZzas3T1ckoEtPdWRBcOUwyq24b6ELYpujtS6abWkJ53rSZ1DlCAkGSa X-Gm-Gg: AZuq6aKdwwDt/RMu/7+yaOkHnF4Z3cS3Ry1L4N/kps9Cr6aK2WDVmd+IVE6OfXiSCwh 4cYCOY7dG3Lp5xcRhCSHyssiz6ajkFhfWb0TkJkMNhWru5pZ9v8sYCf6bUyirg/xJ1RkqizP/i0 P7Bda1VmA5S5n3GzGvKhrJuQP5Mw8w7CYzgQ6nNO3+jeiGdrSjaXIhhFoWRtWJnbtWVpA/2z9Z0 1F7gcdNiavZPO7T1yR4URo5RJmvAo8thW/PtwV7Idxuca2Ai6EwebBjv24CzTLYE+YbnDH4NawW KAlI6JiMn3xY4G5kq+A1USj/5kcz8lDDD/SNUewfm+6fTwZZGSqsnvYq6KRRJ7j1qzDzZrJIu2Q qRV2+aCIJxMCznIFjL0jW+UXjQ0910c/LaUtjKA7zP+2IRe9WK1AcRrvO9MaEz8854FUFnM05uT 8ZfV4JYS1+wjvvsvksxesz114SHGJ8TclGIC6J4poe15/J2QCZ0eo9dkg1xh2mr2FRXZ++1U6i7 GNUrAfCQ5uTy0qN9S2vy3r5Xbsb0N9Jx4y77MZoDA6A X-Received: by 2002:a05:6000:2889:b0:435:9e32:2b78 with SMTP id ffacd0b85a97d-435ca0f7b5cmr7897753f8f.1.1769448315992; Mon, 26 Jan 2026 09:25:15 -0800 (PST) Received: from iku.example.org ([2a06:5906:61b:2d00:6788:ac2b:89cc:7ade]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-435b1c24bf8sm31288531f8f.11.2026.01.26.09.25.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 26 Jan 2026 09:25:15 -0800 (PST) From: Prabhakar X-Google-Original-From: Prabhakar To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Maxime Coquelin , Alexandre Torgue , Philipp Zabel , "Russell King (Oracle)" , Geert Uytterhoeven , netdev@vger.kernel.org Cc: linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Prabhakar , Biju Das , Fabrizio Castro , Lad Prabhakar Subject: [RFC PATCH net-next] net: stmmac: Preserve bootloader MAC address across unconditional reset Date: Mon, 26 Jan 2026 17:25:03 +0000 Message-ID: <20260126172503.238724-1-prabhakar.mahadev-lad.rj@bp.renesas.com> X-Mailer: git-send-email 2.52.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Lad Prabhakar Commit 90f522a20e3d1 ("NET: dwmac: Make dwmac reset unconditional") asserts a reset in probe when a reset controller is present. This reset clears the MAC address registers, so a valid address programmed by the bootloader gets lost and the driver falls back to a random address. Read the MAC address from the hardware registers before resetting the hardware. Keep the existing address selection logic when no valid address is found, and program the selected address back into the MAC after probe so it remains consistent in hardware. Export stmmac_bus_clks_config() so the early read path can enable the bus clocks before accessing the MAC registers. Signed-off-by: Lad Prabhakar --- Hi all, Sending this patch as an RFC if there is an alternative/better way to achieve this. Cheers, Prabhakar --- .../net/ethernet/stmicro/stmmac/stmmac_main.c | 66 ++++++++++++++++++- .../ethernet/stmicro/stmmac/stmmac_platform.c | 3 +- .../ethernet/stmicro/stmmac/stmmac_platform.h | 2 + 3 files changed, 69 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/ne= t/ethernet/stmicro/stmmac/stmmac_main.c index 347a0078f622..171bf08d6242 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -44,6 +44,7 @@ #include #include #include +#include "stmmac_platform.h" #include "stmmac_ptp.h" #include "stmmac_fpe.h" #include "stmmac.h" @@ -7659,11 +7660,65 @@ struct plat_stmmacenet_data *stmmac_plat_dat_alloc(= struct device *dev) } EXPORT_SYMBOL_GPL(stmmac_plat_dat_alloc); =20 +static int stmmac_read_mac_before_reset(struct stmmac_priv *priv, + u8 *mac_addr) +{ + unsigned int hi_addr, lo_addr; + int ret; + + eth_zero_addr(mac_addr); + + /* Deassert reset to allow hardware access */ + if (priv->plat->stmmac_rst) { + ret =3D reset_control_deassert(priv->plat->stmmac_rst); + if (ret) + return ret; + } + + /* Enable bus clocks to read MAC address */ + ret =3D stmmac_bus_clks_config(priv, true); + if (ret) { + dev_warn(priv->device, "failed to enable clocks: %d\n", ret); + goto assert_reset; + } + + switch (priv->plat->core_type) { + case DWMAC_CORE_GMAC4: + case DWMAC_CORE_XGMAC: + /* GMAC4/XGMAC: MAC Address0 High/Low Register */ + hi_addr =3D 0x300; /* GMAC_ADDR_HIGH(0) */ + lo_addr =3D 0x304; /* GMAC_ADDR_LOW(0) */ + break; + case DWMAC_CORE_GMAC: + case DWMAC_CORE_MAC100: + /* GMAC/GMAC3/MAC100: MAC Address0 High/Low Register */ + hi_addr =3D 0x40; /* GMAC_ADDR_HIGH(0) */ + lo_addr =3D 0x44; /* GMAC_ADDR_LOW(0) */ + break; + default: + hi_addr =3D 0; + } + + if (hi_addr) + stmmac_get_mac_addr(priv->ioaddr, mac_addr, hi_addr, lo_addr); + + ret =3D 0; + + stmmac_bus_clks_config(priv, false); + +assert_reset: + if (priv->plat->stmmac_rst) + reset_control_assert(priv->plat->stmmac_rst); + + return ret; +} + static int __stmmac_dvr_probe(struct device *device, struct plat_stmmacenet_data *plat_dat, struct stmmac_resources *res) { struct net_device *ndev =3D NULL; + u8 saved_mac_addr[ETH_ALEN]; struct stmmac_priv *priv; u32 rxq; int i, ret =3D 0; @@ -7740,6 +7795,9 @@ static int __stmmac_dvr_probe(struct device *device, if ((phyaddr >=3D 0) && (phyaddr <=3D 31)) priv->plat->phy_addr =3D phyaddr; =20 + /* Save MAC address before reset (if bootloader programmed it) */ + stmmac_read_mac_before_reset(priv, saved_mac_addr); + if (priv->plat->stmmac_rst) { ret =3D reset_control_assert(priv->plat->stmmac_rst); reset_control_deassert(priv->plat->stmmac_rst); @@ -7768,7 +7826,13 @@ static int __stmmac_dvr_probe(struct device *device, if (priv->synopsys_id < DWMAC_CORE_5_20) priv->plat->dma_cfg->dche =3D false; =20 - stmmac_check_ether_addr(priv); + if (is_valid_ether_addr(saved_mac_addr)) + eth_hw_addr_set(priv->dev, saved_mac_addr); + else + stmmac_check_ether_addr(priv); + + /* Store the MAC address in hardware */ + stmmac_set_umac_addr(priv, priv->hw, priv->dev->dev_addr, 0); =20 ndev->netdev_ops =3D &stmmac_netdev_ops; =20 diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/driver= s/net/ethernet/stmicro/stmmac/stmmac_platform.c index 8979a50b5507..6f0393f2992d 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c @@ -857,7 +857,7 @@ void stmmac_pltfr_remove(struct platform_device *pdev) } EXPORT_SYMBOL_GPL(stmmac_pltfr_remove); =20 -static int stmmac_bus_clks_config(struct stmmac_priv *priv, bool enabled) +int stmmac_bus_clks_config(struct stmmac_priv *priv, bool enabled) { struct plat_stmmacenet_data *plat_dat =3D priv->plat; int ret; @@ -888,6 +888,7 @@ static int stmmac_bus_clks_config(struct stmmac_priv *p= riv, bool enabled) =20 return 0; } +EXPORT_SYMBOL_GPL(stmmac_bus_clks_config); =20 static int __maybe_unused stmmac_runtime_suspend(struct device *dev) { diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h b/driver= s/net/ethernet/stmicro/stmmac/stmmac_platform.h index 6e6561e29d6e..2d52197020a7 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h @@ -20,6 +20,8 @@ struct clk *stmmac_pltfr_find_clk(struct plat_stmmacenet_= data *plat_dat, int stmmac_get_platform_resources(struct platform_device *pdev, struct stmmac_resources *stmmac_res); =20 +int stmmac_bus_clks_config(struct stmmac_priv *priv, bool enabled); + int stmmac_pltfr_probe(struct platform_device *pdev, struct plat_stmmacenet_data *plat, struct stmmac_resources *res); --=20 2.52.0