* [PATCH net-next 1/1] net: mdio: reset PHY before attempting to access ID register
@ 2025-11-25 11:15 Buday Csaba
2025-11-26 2:43 ` Jakub Kicinski
2025-11-26 15:17 ` kernel test robot
0 siblings, 2 replies; 6+ messages in thread
From: Buday Csaba @ 2025-11-25 11:15 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, netdev, linux-kernel
Cc: Buday Csaba
When the ID of an Ethernet PHY is not provided by the 'compatible'
string in the device tree, its actual ID is read via the MDIO bus.
For some PHYs this could be unsafe, since a hard reset may be
necessary to safely access the MDIO registers.
Add a fallback mechanism for such devices: when reading the ID
fails, the reset will be asserted, and the ID read is retried.
This allows such devices to be used with an autodetected ID.
The fallback mechanism is activated in the error handling path, and
the return code of fwnode_mdiobus_register_phy() is unaltered, except
when the reset fails with -EPROBE_DEFER, which is propagated to the
caller.
Signed-off-by: Buday Csaba <buday.csaba@prolan.hu>
---
Patch split from a larger series:
https://lore.kernel.org/all/cover.1761732347.git.buday.csaba@prolan.hu/
The refactoring parts of the previous patchset were already merged,
leaving this one. Functionally identical to:
https://lore.kernel.org/all/5f8d93021a7aa6eeb4fb67ab27ddc7de9101c59f.1761732347.git.buday.csaba@prolan.hu/
Comments were added for clarity.
---
drivers/net/mdio/fwnode_mdio.c | 40 +++++++++++++++++++++++++++++++++-
1 file changed, 39 insertions(+), 1 deletion(-)
diff --git a/drivers/net/mdio/fwnode_mdio.c b/drivers/net/mdio/fwnode_mdio.c
index ba7091518..c1988cc37 100644
--- a/drivers/net/mdio/fwnode_mdio.c
+++ b/drivers/net/mdio/fwnode_mdio.c
@@ -12,6 +12,7 @@
#include <linux/of.h>
#include <linux/phy.h>
#include <linux/pse-pd/pse.h>
+#include "../phy/mdio-private.h"
MODULE_AUTHOR("Calvin Johnson <calvin.johnson@oss.nxp.com>");
MODULE_LICENSE("GPL");
@@ -114,6 +115,34 @@ int fwnode_mdiobus_phy_device_register(struct mii_bus *mdio,
}
EXPORT_SYMBOL(fwnode_mdiobus_phy_device_register);
+/* Hard-reset a PHY before registration */
+static int fwnode_reset_phy(struct mii_bus *bus, u32 addr,
+ struct fwnode_handle *phy_node)
+{
+ struct mdio_device *tmpdev;
+ int rc;
+
+ /* Create a temporary MDIO device to allocate reset resources */
+ tmpdev = mdio_device_create(bus, addr);
+ if (IS_ERR(tmpdev))
+ return PTR_ERR(tmpdev);
+
+ device_set_node(&tmpdev->dev, fwnode_handle_get(phy_node));
+ rc = mdio_device_register_reset(tmpdev);
+ if (rc) {
+ mdio_device_free(tmpdev);
+ return rc;
+ }
+
+ mdio_device_reset(tmpdev, 1);
+ mdio_device_reset(tmpdev, 0);
+
+ mdio_device_unregister_reset(tmpdev);
+ mdio_device_free(tmpdev);
+
+ return 0;
+}
+
int fwnode_mdiobus_register_phy(struct mii_bus *bus,
struct fwnode_handle *child, u32 addr)
{
@@ -129,8 +158,17 @@ int fwnode_mdiobus_register_phy(struct mii_bus *bus,
return PTR_ERR(mii_ts);
is_c45 = fwnode_device_is_compatible(child, "ethernet-phy-ieee802.3-c45");
- if (is_c45 || fwnode_get_phy_id(child, &phy_id))
+ if (is_c45 || fwnode_get_phy_id(child, &phy_id)) {
phy = get_phy_device(bus, addr, is_c45);
+ if (IS_ERR(phy)) {
+ /* get_phy_device() failed, retry after a reset */
+ rc = fwnode_reset_phy(bus, addr, child);
+ if (rc == -EPROBE_DEFER)
+ goto clean_mii_ts;
+ else if (!rc)
+ phy = get_phy_device(bus, addr, is_c45);
+ }
+ }
else
phy = phy_device_create(bus, addr, phy_id, 0, NULL);
if (IS_ERR(phy)) {
base-commit: e2c20036a8879476c88002730d8a27f4e3c32d4b
--
2.39.5
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH net-next 1/1] net: mdio: reset PHY before attempting to access ID register
2025-11-25 11:15 [PATCH net-next 1/1] net: mdio: reset PHY before attempting to access ID register Buday Csaba
@ 2025-11-26 2:43 ` Jakub Kicinski
2025-11-26 7:03 ` Buday Csaba
2025-11-27 11:17 ` Buday Csaba
2025-11-26 15:17 ` kernel test robot
1 sibling, 2 replies; 6+ messages in thread
From: Jakub Kicinski @ 2025-11-26 2:43 UTC (permalink / raw)
To: Buday Csaba
Cc: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
Eric Dumazet, Paolo Abeni, netdev, linux-kernel
On Tue, 25 Nov 2025 12:15:51 +0100 Buday Csaba wrote:
> When the ID of an Ethernet PHY is not provided by the 'compatible'
> string in the device tree, its actual ID is read via the MDIO bus.
> For some PHYs this could be unsafe, since a hard reset may be
> necessary to safely access the MDIO registers.
You may be missing exports because it doesn't build with allmodconfig:
ERROR: modpost: "mdio_device_register_reset" [drivers/net/mdio/fwnode_mdio.ko] undefined!
ERROR: modpost: "mdio_device_unregister_reset" [drivers/net/mdio/fwnode_mdio.ko] undefined!
--
pw-bot: cr
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH net-next 1/1] net: mdio: reset PHY before attempting to access ID register
2025-11-26 2:43 ` Jakub Kicinski
@ 2025-11-26 7:03 ` Buday Csaba
2025-11-27 11:17 ` Buday Csaba
1 sibling, 0 replies; 6+ messages in thread
From: Buday Csaba @ 2025-11-26 7:03 UTC (permalink / raw)
To: Jakub Kicinski
Cc: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
Eric Dumazet, Paolo Abeni, netdev, linux-kernel
On Tue, Nov 25, 2025 at 06:43:35PM -0800, Jakub Kicinski wrote:
> On Tue, 25 Nov 2025 12:15:51 +0100 Buday Csaba wrote:
> > When the ID of an Ethernet PHY is not provided by the 'compatible'
> > string in the device tree, its actual ID is read via the MDIO bus.
> > For some PHYs this could be unsafe, since a hard reset may be
> > necessary to safely access the MDIO registers.
>
> You may be missing exports because it doesn't build with allmodconfig:
>
> ERROR: modpost: "mdio_device_register_reset" [drivers/net/mdio/fwnode_mdio.ko] undefined!
> ERROR: modpost: "mdio_device_unregister_reset" [drivers/net/mdio/fwnode_mdio.ko] undefined!
> --
> pw-bot: cr
>
I do not know how, but I missed that.
The previous version has built fine, but the declarations were moved to
an internal header file, so I guess that EXPORT_SYMBOL on either of these
functions would not be appropriate anymore.
I must find an other solution.
Regards,
Csaba
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH net-next 1/1] net: mdio: reset PHY before attempting to access ID register
2025-11-26 2:43 ` Jakub Kicinski
2025-11-26 7:03 ` Buday Csaba
@ 2025-11-27 11:17 ` Buday Csaba
2025-11-27 15:56 ` Andrew Lunn
1 sibling, 1 reply; 6+ messages in thread
From: Buday Csaba @ 2025-11-27 11:17 UTC (permalink / raw)
To: Jakub Kicinski
Cc: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
Eric Dumazet, Paolo Abeni, netdev, linux-kernel
On Tue, Nov 25, 2025 at 06:43:35PM -0800, Jakub Kicinski wrote:
> On Tue, 25 Nov 2025 12:15:51 +0100 Buday Csaba wrote:
> > When the ID of an Ethernet PHY is not provided by the 'compatible'
> > string in the device tree, its actual ID is read via the MDIO bus.
> > For some PHYs this could be unsafe, since a hard reset may be
> > necessary to safely access the MDIO registers.
>
> You may be missing exports because it doesn't build with allmodconfig:
>
> ERROR: modpost: "mdio_device_register_reset" [drivers/net/mdio/fwnode_mdio.ko] undefined!
> ERROR: modpost: "mdio_device_unregister_reset" [drivers/net/mdio/fwnode_mdio.ko] undefined!
> --
> pw-bot: cr
>
I require some advice on how to do it properly.
The high level functionality belongs to either fwnode_mdio.c or maybe
phy_device.c
The latter may be better, since get_phy_device() already performs some
kind of recovery for PHYs with a certain unexpected behaviour.
But the low level functionality: registering the reset properties are
now in their proper place in mdio_device.c
These three source files build into three different modules, so I only
see the following options:
a) make mdio_device_register_reset() and its counterpart public
But we have already agreed that they should not be, and keep them
internal
b) create a new helper function in mdio_device.c, and make that public
This could work, but then what is the point of hiding
mdio_device_register_reset()? My idea was something like
mdio_device_reset_strobe(), which calls register/unregister reset
while also performing the assertion/deassertion of the reset.
But such a function is unsafe on an already established mdio_device,
so making that exported may be questionable as well.
It is possible to work around that, but then it is getting out of hand
fast, and does not follow the keep it simple and stupid principle.
c) what about using EXPORT_SYMBOL_FOR_MODULES() on the problematic
functions? Are there any objections against it?
This type of export is rarely used in the kernel, so I am uncertain
about that. Is using it on functions declared in private headers
also discouraged?
Thank you in advance,
Csaba
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH net-next 1/1] net: mdio: reset PHY before attempting to access ID register
2025-11-27 11:17 ` Buday Csaba
@ 2025-11-27 15:56 ` Andrew Lunn
0 siblings, 0 replies; 6+ messages in thread
From: Andrew Lunn @ 2025-11-27 15:56 UTC (permalink / raw)
To: Buday Csaba
Cc: Jakub Kicinski, Heiner Kallweit, Russell King, David S. Miller,
Eric Dumazet, Paolo Abeni, netdev, linux-kernel
> c) what about using EXPORT_SYMBOL_FOR_MODULES() on the problematic
> functions? Are there any objections against it?
> This type of export is rarely used in the kernel, so I am uncertain
> about that. Is using it on functions declared in private headers
> also discouraged?
Rather than _FOR_MODULES, how about using a namespace.
https://docs.kernel.org/core-api/symbol-namespaces.html#how-to-use-symbols-exported-in-namespaces
Add a name space "NET_PHY_CORE_ONLY", and put these symbols into that
name space. We should notice any driver importing that namespace and
reject it.
Andrew
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH net-next 1/1] net: mdio: reset PHY before attempting to access ID register
2025-11-25 11:15 [PATCH net-next 1/1] net: mdio: reset PHY before attempting to access ID register Buday Csaba
2025-11-26 2:43 ` Jakub Kicinski
@ 2025-11-26 15:17 ` kernel test robot
1 sibling, 0 replies; 6+ messages in thread
From: kernel test robot @ 2025-11-26 15:17 UTC (permalink / raw)
To: Buday Csaba, Andrew Lunn, Heiner Kallweit, Russell King,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
linux-kernel
Cc: llvm, oe-kbuild-all, netdev, Buday Csaba
Hi Buday,
kernel test robot noticed the following build errors:
[auto build test ERROR on e2c20036a8879476c88002730d8a27f4e3c32d4b]
url: https://github.com/intel-lab-lkp/linux/commits/Buday-Csaba/net-mdio-reset-PHY-before-attempting-to-access-ID-register/20251125-191906
base: e2c20036a8879476c88002730d8a27f4e3c32d4b
patch link: https://lore.kernel.org/r/6cb97b7bfd92d8dc1c1c00662114ece03b6d2913.1764069248.git.buday.csaba%40prolan.hu
patch subject: [PATCH net-next 1/1] net: mdio: reset PHY before attempting to access ID register
config: arm-randconfig-003-20251126 (https://download.01.org/0day-ci/archive/20251126/202511262214.pygdUoQY-lkp@intel.com/config)
compiler: clang version 19.1.7 (https://github.com/llvm/llvm-project cd708029e0b2869e80abe31ddb175f7c35361f90)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251126/202511262214.pygdUoQY-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202511262214.pygdUoQY-lkp@intel.com/
All errors (new ones prefixed by >>, old ones prefixed by <<):
>> ERROR: modpost: "mdio_device_register_reset" [drivers/net/mdio/fwnode_mdio.ko] undefined!
>> ERROR: modpost: "mdio_device_unregister_reset" [drivers/net/mdio/fwnode_mdio.ko] undefined!
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-11-27 15:56 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-25 11:15 [PATCH net-next 1/1] net: mdio: reset PHY before attempting to access ID register Buday Csaba
2025-11-26 2:43 ` Jakub Kicinski
2025-11-26 7:03 ` Buday Csaba
2025-11-27 11:17 ` Buday Csaba
2025-11-27 15:56 ` Andrew Lunn
2025-11-26 15:17 ` kernel test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).