* [PATCH net] net: enetc: fix fallback PHY address handling and do not skip setting for addr 0
@ 2026-03-03 10:30 Wei Fang
2026-03-04 7:32 ` Clark Wang
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Wei Fang @ 2026-03-03 10:30 UTC (permalink / raw)
To: claudiu.manoil, vladimir.oltean, xiaoning.wang, andrew+netdev,
davem, edumazet, kuba, pabeni, alexander.stein
Cc: aziz.sellami, netdev, linux-kernel, imx
The current netc_get_phy_addr() implementation falls back to PHY address
0 when the "mdio" node or any 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, the bit 0 of phy_mask becomes 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.
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 a single
ENETC MAC, for example:
- a SGMII PHY with a non-zero address (selected via DTS_A)
- a RGMII PHY with address 0 (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, which leaves the hardware in an inconsistent state.
Therefore, remove the special-case skip of PHY address 0 so that valid
configurations using address 0 are properly supported.
Reported-by: Alexander Stein <alexander.stein@ew.tq-group.com>
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")
Fixes: 50bfd9c06f0f ("net: enetc: set external PHY address in IERB for i.MX94 ENETC")
Signed-off-by: Wei Fang <wei.fang@nxp.com>
---
.../ethernet/freescale/enetc/netc_blk_ctrl.c | 24 ++++++++-----------
1 file changed, 10 insertions(+), 14 deletions(-)
diff --git a/drivers/net/ethernet/freescale/enetc/netc_blk_ctrl.c b/drivers/net/ethernet/freescale/enetc/netc_blk_ctrl.c
index 7fd39f895290..92a0f824dae7 100644
--- a/drivers/net/ethernet/freescale/enetc/netc_blk_ctrl.c
+++ b/drivers/net/ethernet/freescale/enetc/netc_blk_ctrl.c
@@ -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)
- return 0;
+ return -ENODEV;
phy_node = of_get_next_child(mdio_node, NULL);
- if (!phy_node)
+ if (!phy_node) {
+ err = -ENODEV;
goto of_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");
return addr;
}
@@ -433,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, so no need to set the register.
- */
- if (!addr)
- continue;
-
switch (bus_devfn) {
case IMX95_ENETC0_BUS_DEVFN:
netc_reg_write(priv->ierb, IERB_LBCR(0),
@@ -578,16 +577,13 @@ static int imx94_enetc_mdio_phyaddr_config(struct netc_blk_ctrl *priv,
addr = netc_get_phy_addr(np);
if (addr < 0) {
+ if (addr == -ENODEV)
+ return 0;
+
dev_err(dev, "Failed to get PHY address\n");
return addr;
}
- /* The default value of LaBCR[MDIO_PHYAD_PRTAD] is 0,
- * so no need to set the register.
- */
- if (!addr)
- return 0;
-
if (phy_mask & BIT(addr)) {
dev_err(dev,
"Find same PHY address in EMDIO and ENETC node\n");
--
2.34.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* RE: [PATCH net] net: enetc: fix fallback PHY address handling and do not skip setting for addr 0
2026-03-03 10:30 [PATCH net] net: enetc: fix fallback PHY address handling and do not skip setting for addr 0 Wei Fang
@ 2026-03-04 7:32 ` Clark Wang
2026-03-04 13:58 ` Alexander Stein
2026-03-04 21:06 ` Andrew Lunn
2 siblings, 0 replies; 5+ messages in thread
From: Clark Wang @ 2026-03-04 7:32 UTC (permalink / raw)
To: Wei Fang, Claudiu Manoil, Vladimir Oltean, andrew+netdev@lunn.ch,
davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
pabeni@redhat.com, alexander.stein@ew.tq-group.com
Cc: Aziz Sellami, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, imx@lists.linux.dev
> The current netc_get_phy_addr() implementation falls back to PHY address
> 0 when the "mdio" node or any 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, the bit 0 of phy_mask becomes 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.
>
> 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 a single
> ENETC MAC, for example:
>
> - a SGMII PHY with a non-zero address (selected via DTS_A)
> - a RGMII PHY with address 0 (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, which leaves the hardware in an inconsistent state.
>
> Therefore, remove the special-case skip of PHY address 0 so that valid
> configurations using address 0 are properly supported.
>
> Reported-by: Alexander Stein <alexander.stein@ew.tq-group.com>
> 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")
> Fixes: 50bfd9c06f0f ("net: enetc: set external PHY address in IERB for i.MX94
> ENETC")
> Signed-off-by: Wei Fang <wei.fang@nxp.com>
Reviewed-by: Clark Wang <xiaoning.wang@nxp.com>
Thanks!
Clark Wang
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net] net: enetc: fix fallback PHY address handling and do not skip setting for addr 0
2026-03-03 10:30 [PATCH net] net: enetc: fix fallback PHY address handling and do not skip setting for addr 0 Wei Fang
2026-03-04 7:32 ` Clark Wang
@ 2026-03-04 13:58 ` Alexander Stein
2026-03-04 21:06 ` Andrew Lunn
2 siblings, 0 replies; 5+ messages in thread
From: Alexander Stein @ 2026-03-04 13:58 UTC (permalink / raw)
To: claudiu.manoil, vladimir.oltean, xiaoning.wang, andrew+netdev,
davem, edumazet, kuba, pabeni, Wei Fang
Cc: aziz.sellami, netdev, linux-kernel, imx
Am Dienstag, 3. März 2026, 11:30:47 CET schrieb Wei Fang:
> The current netc_get_phy_addr() implementation falls back to PHY address
> 0 when the "mdio" node or any 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, the bit 0 of phy_mask becomes 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.
>
> 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 a single
> ENETC MAC, for example:
>
> - a SGMII PHY with a non-zero address (selected via DTS_A)
> - a RGMII PHY with address 0 (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, which leaves the hardware in an inconsistent state.
>
> Therefore, remove the special-case skip of PHY address 0 so that valid
> configurations using address 0 are properly supported.
>
> Reported-by: Alexander Stein <alexander.stein@ew.tq-group.com>
> 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")
> Fixes: 50bfd9c06f0f ("net: enetc: set external PHY address in IERB for i.MX94 ENETC")
> Signed-off-by: Wei Fang <wei.fang@nxp.com>
Thanks,
Tested-by: Alexander Stein <alexander.stein@ew.tq-group.com>
> ---
> .../ethernet/freescale/enetc/netc_blk_ctrl.c | 24 ++++++++-----------
> 1 file changed, 10 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/net/ethernet/freescale/enetc/netc_blk_ctrl.c b/drivers/net/ethernet/freescale/enetc/netc_blk_ctrl.c
> index 7fd39f895290..92a0f824dae7 100644
> --- a/drivers/net/ethernet/freescale/enetc/netc_blk_ctrl.c
> +++ b/drivers/net/ethernet/freescale/enetc/netc_blk_ctrl.c
> @@ -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)
> - return 0;
> + return -ENODEV;
>
> phy_node = of_get_next_child(mdio_node, NULL);
> - if (!phy_node)
> + if (!phy_node) {
> + err = -ENODEV;
> goto of_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");
> return addr;
> }
> @@ -433,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, so no need to set the register.
> - */
> - if (!addr)
> - continue;
> -
> switch (bus_devfn) {
> case IMX95_ENETC0_BUS_DEVFN:
> netc_reg_write(priv->ierb, IERB_LBCR(0),
> @@ -578,16 +577,13 @@ static int imx94_enetc_mdio_phyaddr_config(struct netc_blk_ctrl *priv,
>
> addr = netc_get_phy_addr(np);
> if (addr < 0) {
> + if (addr == -ENODEV)
> + return 0;
> +
> dev_err(dev, "Failed to get PHY address\n");
> return addr;
> }
>
> - /* The default value of LaBCR[MDIO_PHYAD_PRTAD] is 0,
> - * so no need to set the register.
> - */
> - if (!addr)
> - return 0;
> -
> if (phy_mask & BIT(addr)) {
> dev_err(dev,
> "Find same PHY address in EMDIO and ENETC node\n");
>
--
TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
Amtsgericht München, HRB 105018
Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
http://www.tq-group.com/
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net] net: enetc: fix fallback PHY address handling and do not skip setting for addr 0
2026-03-03 10:30 [PATCH net] net: enetc: fix fallback PHY address handling and do not skip setting for addr 0 Wei Fang
2026-03-04 7:32 ` Clark Wang
2026-03-04 13:58 ` Alexander Stein
@ 2026-03-04 21:06 ` Andrew Lunn
2026-03-05 2:10 ` Wei Fang
2 siblings, 1 reply; 5+ messages in thread
From: Andrew Lunn @ 2026-03-04 21:06 UTC (permalink / raw)
To: Wei Fang
Cc: claudiu.manoil, vladimir.oltean, xiaoning.wang, andrew+netdev,
davem, edumazet, kuba, pabeni, alexander.stein, aziz.sellami,
netdev, linux-kernel, imx
On Tue, Mar 03, 2026 at 06:30:47PM +0800, Wei Fang wrote:
> The current netc_get_phy_addr() implementation falls back to PHY address
> 0 when the "mdio" node or any 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, the bit 0 of phy_mask becomes 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.
>
> 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 a single
> ENETC MAC, for example:
>
> - a SGMII PHY with a non-zero address (selected via DTS_A)
> - a RGMII PHY with address 0 (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, which leaves the hardware in an inconsistent state.
>
> Therefore, remove the special-case skip of PHY address 0 so that valid
> configurations using address 0 are properly supported.
Please can you break this patch up. I've not looked at all the details, but:
> diff --git a/drivers/net/ethernet/freescale/enetc/netc_blk_ctrl.c b/drivers/net/ethernet/freescale/enetc/netc_blk_ctrl.c
> index 7fd39f895290..92a0f824dae7 100644
> --- a/drivers/net/ethernet/freescale/enetc/netc_blk_ctrl.c
> +++ b/drivers/net/ethernet/freescale/enetc/netc_blk_ctrl.c
> @@ -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)
> - return 0;
> + return -ENODEV;
>
> phy_node = of_get_next_child(mdio_node, NULL);
> - if (!phy_node)
> + if (!phy_node) {
> + err = -ENODEV;
> goto of_put_mdio_node;
> + }
This looks like it could be one patch.
> @@ -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;
> +
This seems like a patch when combined with the if (addr < 0) hunk
below.
> @@ -433,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, so no need to set the register.
> - */
> - if (!addr)
> - continue;
> -
This can be a patch, along with the same delete in the last section of
this patch.
The point of having lots of small patches is that it makes to find
regressions. If something does break, git bisect will quickly tell you
which patch is was. The less a patch does, the more git bisect is
useful.
Andrew
---
pw-bot: cr
^ permalink raw reply [flat|nested] 5+ messages in thread
* RE: [PATCH net] net: enetc: fix fallback PHY address handling and do not skip setting for addr 0
2026-03-04 21:06 ` Andrew Lunn
@ 2026-03-05 2:10 ` Wei Fang
0 siblings, 0 replies; 5+ messages in thread
From: Wei Fang @ 2026-03-05 2:10 UTC (permalink / raw)
To: Andrew Lunn
Cc: Claudiu Manoil, Vladimir Oltean, Clark Wang,
andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com,
kuba@kernel.org, pabeni@redhat.com,
alexander.stein@ew.tq-group.com, Aziz Sellami,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
imx@lists.linux.dev
> On Tue, Mar 03, 2026 at 06:30:47PM +0800, Wei Fang wrote:
> > The current netc_get_phy_addr() implementation falls back to PHY address
> > 0 when the "mdio" node or any 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, the bit 0 of phy_mask becomes 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.
> >
> > 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 a single
> > ENETC MAC, for example:
> >
> > - a SGMII PHY with a non-zero address (selected via DTS_A)
> > - a RGMII PHY with address 0 (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, which leaves the hardware in an inconsistent state.
> >
> > Therefore, remove the special-case skip of PHY address 0 so that valid
> > configurations using address 0 are properly supported.
>
> Please can you break this patch up. I've not looked at all the details, but:
>
> > diff --git a/drivers/net/ethernet/freescale/enetc/netc_blk_ctrl.c
> b/drivers/net/ethernet/freescale/enetc/netc_blk_ctrl.c
> > index 7fd39f895290..92a0f824dae7 100644
> > --- a/drivers/net/ethernet/freescale/enetc/netc_blk_ctrl.c
> > +++ b/drivers/net/ethernet/freescale/enetc/netc_blk_ctrl.c
> > @@ -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)
> > - return 0;
> > + return -ENODEV;
> >
> > phy_node = of_get_next_child(mdio_node, NULL);
> > - if (!phy_node)
> > + if (!phy_node) {
> > + err = -ENODEV;
> > goto of_put_mdio_node;
> > + }
>
> This looks like it could be one patch.
>
> > @@ -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;
> > +
>
> This seems like a patch when combined with the if (addr < 0) hunk
> below.
This change should be included in the same patch as the one mentioned above.
The change above changed the return value, so the call point also needs to be
modified.
>
> > @@ -433,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, so no need to set the register.
> > - */
> > - if (!addr)
> > - continue;
> > -
>
> This can be a patch, along with the same delete in the last section of
> this patch.
>
> The point of having lots of small patches is that it makes to find
> regressions. If something does break, git bisect will quickly tell you
> which patch is was. The less a patch does, the more git bisect is
> useful.
>
Sounds good, I will split this patch into two parts.
>
> ---
> pw-bot: cr
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-03-05 2:10 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-03 10:30 [PATCH net] net: enetc: fix fallback PHY address handling and do not skip setting for addr 0 Wei Fang
2026-03-04 7:32 ` Clark Wang
2026-03-04 13:58 ` Alexander Stein
2026-03-04 21:06 ` Andrew Lunn
2026-03-05 2:10 ` Wei Fang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox