There are two potential issues when PHY address 0 is used on the board,
see the commit messages of the patches for more details.
---
v2:
1. No functional changes, only split the v1 patch into two patches.
2. Collect tags.
v1 link: https://lore.kernel.org/imx/20260303103047.228005-1-wei.fang@nxp.com/
---
Wei Fang (2):
net: enetc: fix incorrect fallback PHY address handling
net: enetc: do not skip setting LaBCR[MDIO_PHYAD_PRTAD] for addr 0
.../ethernet/freescale/enetc/netc_blk_ctrl.c | 24 ++++++++-----------
1 file changed, 10 insertions(+), 14 deletions(-)
--
2.34.1
The current netc_get_phy_addr() implementation falls back to PHY address
0 when the "mdio" node or the PHY child node is missing. On i.MX95, this
causes failures when a real PHY is actually assigned address 0 and is
managed through the EMDIO interface. Because the bit 0 of phy_mask will
be set, leading imx95_enetc_mdio_phyaddr_config() to return an error, and
the netc_blk_ctrl driver probe subsequently fails. Fix this by returning
-ENODEV when neither an "mdio" node nor any PHY node is present, it means
that ENETC port MDIO is not used to manage the PHY, so there is no need
to configure LaBCR[MDIO_PHYAD_PRTAD].
Reported-by: Alexander Stein <redacted>
Closes: https://lore.kernel.org/all/7825188.GXAFRqVoOG@steina-w
Fixes: 6633df05f3ad ("net: enetc: set the external PHY address in IERB for port MDIO usage")
Reviewed-by: Clark Wang <xiaoning.wang@nxp.com>
Tested-by: Alexander Stein <redacted>
Signed-off-by: Wei Fang <wei.fang@nxp.com>
---
drivers/net/ethernet/freescale/enetc/netc_blk_ctrl.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
@@ -333,11 +333,13 @@ static int netc_get_phy_addr(struct device_node *np)mdio_node=of_get_child_by_name(np,"mdio");if(!mdio_node)-return0;+return-ENODEV;phy_node=of_get_next_child(mdio_node,NULL);-if(!phy_node)+if(!phy_node){+err=-ENODEV;gotoof_put_mdio_node;+}err=of_property_read_u32(phy_node,"reg",&addr);if(err)
@@ -423,6 +425,9 @@ static int imx95_enetc_mdio_phyaddr_config(struct platform_device *pdev)addr=netc_get_phy_addr(gchild);if(addr<0){+if(addr==-ENODEV)+continue;+dev_err(dev,"Failed to get PHY address\n");returnaddr;}
@@ -578,6 +583,9 @@ static int imx94_enetc_mdio_phyaddr_config(struct netc_blk_ctrl *priv,addr=netc_get_phy_addr(np);if(addr<0){+if(addr==-ENODEV)+return0;+dev_err(dev,"Failed to get PHY address\n");returnaddr;}
Given that some platforms may use PHY address 0 (I suppose the PHY may
not treat address 0 as a broadcast address or default response address).
It is possible for some boards to connect multiple PHYs to the same
ENETC MAC, for example:
- a PHY with a non-zero address connects to ENETC MAC through SGMII
interface (selected via DTS_A)
- a PHY with address 0 connects to ENETC MAC through RGMII interface
(selected via DTS_B)
For the case where the ENETC port MDIO is used to manage the PHY, when
switching from DTS_A to DTS_B via soft reboot, LaBCR[MDIO_PHYAD_PRTAD]
must be updated to 0 because the NETCMIX block is not reset during soft
reboot. However, the current driver explicitly skips configuring address
0, causing LaBCR[MDIO_PHYAD_PRTAD] to retain its old value.
Therefore, remove the special-case skip of PHY address 0 so that valid
configurations using address 0 are properly supported.
Fixes: 6633df05f3ad ("net: enetc: set the external PHY address in IERB for port MDIO usage")
Fixes: 50bfd9c06f0f ("net: enetc: set external PHY address in IERB for i.MX94 ENETC")
Reviewed-by: Clark Wang <xiaoning.wang@nxp.com>
Signed-off-by: Wei Fang <wei.fang@nxp.com>
---
drivers/net/ethernet/freescale/enetc/netc_blk_ctrl.c | 12 ------------
1 file changed, 12 deletions(-)
@@ -438,12 +438,6 @@ static int imx95_enetc_mdio_phyaddr_config(struct platform_device *pdev)return-EINVAL;}-/* The default value of LaBCR[MDIO_PHYAD_PRTAD ] is-*0,sononeedtosettheregister.-*/-if(!addr)-continue;-switch(bus_devfn){caseIMX95_ENETC0_BUS_DEVFN:netc_reg_write(priv->ierb,IERB_LBCR(0),
@@ -590,12 +584,6 @@ static int imx94_enetc_mdio_phyaddr_config(struct netc_blk_ctrl *priv,returnaddr;}-/* The default value of LaBCR[MDIO_PHYAD_PRTAD] is 0,-*sononeedtosettheregister.-*/-if(!addr)-return0;-if(phy_mask&BIT(addr)){dev_err(dev,"Find same PHY address in EMDIO and ENETC node\n");
Hello:
This series was applied to netdev/net.git (main)
by Paolo Abeni [off-list ref]:
On Thu, 5 Mar 2026 11:12:09 +0800 you wrote:
There are two potential issues when PHY address 0 is used on the board,
see the commit messages of the patches for more details.
---
v2:
1. No functional changes, only split the v1 patch into two patches.
2. Collect tags.
v1 link: https://lore.kernel.org/imx/20260303103047.228005-1-wei.fang@nxp.com/
[...]