* [PATCH v2 1/4] net: mdio: common handling of phy reset properties
@ 2025-10-15 13:45 Buday Csaba
  2025-10-15 13:45 ` [PATCH v2 2/4] net: mdio: change property read from fwnode_property_read_u32() to device_property_read_u32() Buday Csaba
                   ` (3 more replies)
  0 siblings, 4 replies; 12+ messages in thread
From: Buday Csaba @ 2025-10-15 13:45 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Florian Fainelli, netdev,
	devicetree, linux-kernel
  Cc: Buday Csaba
Reset properties of an `mdio_device` are initialized in multiple
source files and multiple functions:
  - `reset_assert_delay` and `reset_deassert_delay` are in
    fwnode_mdio.c
  - `reset_gpio` and `reset_ctrl` are in mdio_bus.c, but handled by
    different functions
This patch unifies the handling of all these properties into two
functions.
mdiobus_register_gpiod() and mdiobus_register_reset() are removed,
while mdio_device_register_reset() and mdio_device_unregister_reset()
are introduced instead.
These functions handle both reset-controllers and reset-gpios, and
also read the corresponding properties from the device tree.
These changes should make tracking the reset properties easier.
The reset logic is unaltered, and should work as it did before.
Signed-off-by: Buday Csaba <buday.csaba@prolan.hu>
---
V1 -> V2: the return value of mdio_device_unregister_reset() is made void
---
 drivers/net/mdio/fwnode_mdio.c |  5 ----
 drivers/net/phy/mdio_bus.c     | 39 ++------------------------
 drivers/net/phy/mdio_device.c  | 50 ++++++++++++++++++++++++++++++++++
 include/linux/mdio.h           |  2 ++
 4 files changed, 54 insertions(+), 42 deletions(-)
diff --git a/drivers/net/mdio/fwnode_mdio.c b/drivers/net/mdio/fwnode_mdio.c
index 9b41d4697..ba7091518 100644
--- a/drivers/net/mdio/fwnode_mdio.c
+++ b/drivers/net/mdio/fwnode_mdio.c
@@ -92,11 +92,6 @@ int fwnode_mdiobus_phy_device_register(struct mii_bus *mdio,
 	if (fwnode_property_read_bool(child, "broken-turn-around"))
 		mdio->phy_ignore_ta_mask |= 1 << addr;
 
-	fwnode_property_read_u32(child, "reset-assert-us",
-				 &phy->mdio.reset_assert_delay);
-	fwnode_property_read_u32(child, "reset-deassert-us",
-				 &phy->mdio.reset_deassert_delay);
-
 	/* Associate the fwnode with the device structure so it
 	 * can be looked up later
 	 */
diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c
index cad6ed3aa..cc3f9cfb1 100644
--- a/drivers/net/phy/mdio_bus.c
+++ b/drivers/net/phy/mdio_bus.c
@@ -33,33 +33,6 @@
 #define CREATE_TRACE_POINTS
 #include <trace/events/mdio.h>
 
-static int mdiobus_register_gpiod(struct mdio_device *mdiodev)
-{
-	/* Deassert the optional reset signal */
-	mdiodev->reset_gpio = gpiod_get_optional(&mdiodev->dev,
-						 "reset", GPIOD_OUT_LOW);
-	if (IS_ERR(mdiodev->reset_gpio))
-		return PTR_ERR(mdiodev->reset_gpio);
-
-	if (mdiodev->reset_gpio)
-		gpiod_set_consumer_name(mdiodev->reset_gpio, "PHY reset");
-
-	return 0;
-}
-
-static int mdiobus_register_reset(struct mdio_device *mdiodev)
-{
-	struct reset_control *reset;
-
-	reset = reset_control_get_optional_exclusive(&mdiodev->dev, "phy");
-	if (IS_ERR(reset))
-		return PTR_ERR(reset);
-
-	mdiodev->reset_ctrl = reset;
-
-	return 0;
-}
-
 int mdiobus_register_device(struct mdio_device *mdiodev)
 {
 	int err;
@@ -68,16 +41,9 @@ int mdiobus_register_device(struct mdio_device *mdiodev)
 		return -EBUSY;
 
 	if (mdiodev->flags & MDIO_DEVICE_FLAG_PHY) {
-		err = mdiobus_register_gpiod(mdiodev);
+		err = mdio_device_register_reset(mdiodev);
 		if (err)
 			return err;
-
-		err = mdiobus_register_reset(mdiodev);
-		if (err)
-			return err;
-
-		/* Assert the reset signal */
-		mdio_device_reset(mdiodev, 1);
 	}
 
 	mdiodev->bus->mdio_map[mdiodev->addr] = mdiodev;
@@ -91,8 +57,7 @@ int mdiobus_unregister_device(struct mdio_device *mdiodev)
 	if (mdiodev->bus->mdio_map[mdiodev->addr] != mdiodev)
 		return -EINVAL;
 
-	gpiod_put(mdiodev->reset_gpio);
-	reset_control_put(mdiodev->reset_ctrl);
+	mdio_device_unregister_reset(mdiodev);
 
 	mdiodev->bus->mdio_map[mdiodev->addr] = NULL;
 
diff --git a/drivers/net/phy/mdio_device.c b/drivers/net/phy/mdio_device.c
index f64176e0e..eb8237095 100644
--- a/drivers/net/phy/mdio_device.c
+++ b/drivers/net/phy/mdio_device.c
@@ -74,6 +74,56 @@ struct mdio_device *mdio_device_create(struct mii_bus *bus, int addr)
 }
 EXPORT_SYMBOL(mdio_device_create);
 
+/**
+ * mdio_device_register_reset - Read and initialize the reset properties of
+ *				an mdio device
+ * @mdiodev: mdio_device structure
+ */
+int mdio_device_register_reset(struct mdio_device *mdiodev)
+{
+	struct reset_control *reset;
+
+	/* Read optional firmware properties */
+	fwnode_property_read_u32(dev_fwnode(&mdiodev->dev), "reset-assert-us",
+				 &mdiodev->reset_assert_delay);
+	fwnode_property_read_u32(dev_fwnode(&mdiodev->dev), "reset-deassert-us",
+				 &mdiodev->reset_deassert_delay);
+
+	/* reset-gpio, bring up deasserted */
+	mdiodev->reset_gpio = gpiod_get_optional(&mdiodev->dev, "reset",
+						 GPIOD_OUT_LOW);
+
+	if (IS_ERR(mdiodev->reset_gpio))
+		return PTR_ERR(mdiodev->reset_gpio);
+
+	if (mdiodev->reset_gpio)
+		gpiod_set_consumer_name(mdiodev->reset_gpio, "PHY reset");
+
+	reset = reset_control_get_optional_exclusive(&mdiodev->dev, "phy");
+	if (IS_ERR(reset))
+		return PTR_ERR(reset);
+
+	mdiodev->reset_ctrl = reset;
+
+	/* Assert the reset signal */
+	mdio_device_reset(mdiodev, 1);
+
+	return 0;
+}
+EXPORT_SYMBOL(mdio_device_register_reset);
+
+/**
+ * mdio_device_unregister_reset - uninitialize the reset properties of
+ *				  an mdio device
+ * @mdiodev: mdio_device structure
+ */
+void mdio_device_unregister_reset(struct mdio_device *mdiodev)
+{
+	gpiod_put(mdiodev->reset_gpio);
+	reset_control_put(mdiodev->reset_ctrl);
+}
+EXPORT_SYMBOL(mdio_device_unregister_reset);
+
 /**
  * mdio_device_register - Register the mdio device on the MDIO bus
  * @mdiodev: mdio_device structure to be added to the MDIO bus
diff --git a/include/linux/mdio.h b/include/linux/mdio.h
index c640ba44d..4cedcae08 100644
--- a/include/linux/mdio.h
+++ b/include/linux/mdio.h
@@ -90,6 +90,8 @@ static inline void *mdiodev_get_drvdata(struct mdio_device *mdio)
 
 void mdio_device_free(struct mdio_device *mdiodev);
 struct mdio_device *mdio_device_create(struct mii_bus *bus, int addr);
+int mdio_device_register_reset(struct mdio_device *mdiodev);
+void mdio_device_unregister_reset(struct mdio_device *mdiodev);
 int mdio_device_register(struct mdio_device *mdiodev);
 void mdio_device_remove(struct mdio_device *mdiodev);
 void mdio_device_reset(struct mdio_device *mdiodev, int value);
-- 
2.39.5
^ permalink raw reply related	[flat|nested] 12+ messages in thread
* [PATCH v2 2/4] net: mdio: change property read from fwnode_property_read_u32() to device_property_read_u32()
  2025-10-15 13:45 [PATCH v2 1/4] net: mdio: common handling of phy reset properties Buday Csaba
@ 2025-10-15 13:45 ` Buday Csaba
  2025-10-15 13:45 ` [PATCH v2 3/4] dt-bindings: net: mdio: add phy-id-read-needs-reset property Buday Csaba
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 12+ messages in thread
From: Buday Csaba @ 2025-10-15 13:45 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Florian Fainelli, netdev,
	devicetree, linux-kernel
  Cc: Buday Csaba
Changed fwnode_property_read_u32() in mdio_device_register_reset()
to device_property_read_u32(), which is more appropriate here.
Signed-off-by: Buday Csaba <buday.csaba@prolan.hu>
---
 drivers/net/phy/mdio_device.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/phy/mdio_device.c b/drivers/net/phy/mdio_device.c
index eb8237095..d812ae2a0 100644
--- a/drivers/net/phy/mdio_device.c
+++ b/drivers/net/phy/mdio_device.c
@@ -84,9 +84,9 @@ int mdio_device_register_reset(struct mdio_device *mdiodev)
 	struct reset_control *reset;
 
 	/* Read optional firmware properties */
-	fwnode_property_read_u32(dev_fwnode(&mdiodev->dev), "reset-assert-us",
+	device_property_read_u32(&mdiodev->dev, "reset-assert-us",
 				 &mdiodev->reset_assert_delay);
-	fwnode_property_read_u32(dev_fwnode(&mdiodev->dev), "reset-deassert-us",
+	device_property_read_u32(&mdiodev->dev, "reset-deassert-us",
 				 &mdiodev->reset_deassert_delay);
 
 	/* reset-gpio, bring up deasserted */
-- 
2.39.5
^ permalink raw reply related	[flat|nested] 12+ messages in thread
* [PATCH v2 3/4] dt-bindings: net: mdio: add phy-id-read-needs-reset property
  2025-10-15 13:45 [PATCH v2 1/4] net: mdio: common handling of phy reset properties Buday Csaba
  2025-10-15 13:45 ` [PATCH v2 2/4] net: mdio: change property read from fwnode_property_read_u32() to device_property_read_u32() Buday Csaba
@ 2025-10-15 13:45 ` Buday Csaba
  2025-10-21 20:10   ` Rob Herring
  2025-10-15 13:45 ` [PATCH v2 4/4] net: mdio: reset PHY before attempting to access registers in fwnode_mdiobus_register_phy Buday Csaba
  2025-10-15 14:02 ` [PATCH v2 1/4] net: mdio: common handling of phy reset properties Buday Csaba
  3 siblings, 1 reply; 12+ messages in thread
From: Buday Csaba @ 2025-10-15 13:45 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Florian Fainelli, netdev,
	devicetree, linux-kernel
  Cc: Buday Csaba
Some Ethernet PHYs require a hard reset before accessing their MDIO
registers. When the ID is not provided by a compatible string,
reading the PHY ID may fail on such devices.
This patch introduces a new device tree property called
`phy-id-read-needs-reset`, which can be used to hard reset the
PHY before attempting to read its ID via MDIO.
Signed-off-by: Buday Csaba <buday.csaba@prolan.hu>
---
 Documentation/devicetree/bindings/net/ethernet-phy.yaml | 8 ++++++++
 1 file changed, 8 insertions(+)
diff --git a/Documentation/devicetree/bindings/net/ethernet-phy.yaml b/Documentation/devicetree/bindings/net/ethernet-phy.yaml
index 2ec2d9fda..b570f8038 100644
--- a/Documentation/devicetree/bindings/net/ethernet-phy.yaml
+++ b/Documentation/devicetree/bindings/net/ethernet-phy.yaml
@@ -215,6 +215,14 @@ properties:
       Delay after the reset was deasserted in microseconds. If
       this property is missing the delay will be skipped.
 
+  phy-id-read-needs-reset:
+    $ref: /schemas/types.yaml#/definitions/flag
+    description:
+      Some PHYs require a hard reset before accessing MDIO registers.
+      This workaround allows auto-detection of the PHY ID in such cases.
+      When the PHY ID is provided with the 'compatible' string, setting
+      this property has no effect.
+
   sfp:
     $ref: /schemas/types.yaml#/definitions/phandle
     description:
-- 
2.39.5
^ permalink raw reply related	[flat|nested] 12+ messages in thread
* [PATCH v2 4/4] net: mdio: reset PHY before attempting to access registers in fwnode_mdiobus_register_phy
  2025-10-15 13:45 [PATCH v2 1/4] net: mdio: common handling of phy reset properties Buday Csaba
  2025-10-15 13:45 ` [PATCH v2 2/4] net: mdio: change property read from fwnode_property_read_u32() to device_property_read_u32() Buday Csaba
  2025-10-15 13:45 ` [PATCH v2 3/4] dt-bindings: net: mdio: add phy-id-read-needs-reset property Buday Csaba
@ 2025-10-15 13:45 ` Buday Csaba
  2025-10-15 17:04   ` Simon Horman
                     ` (2 more replies)
  2025-10-15 14:02 ` [PATCH v2 1/4] net: mdio: common handling of phy reset properties Buday Csaba
  3 siblings, 3 replies; 12+ messages in thread
From: Buday Csaba @ 2025-10-15 13:45 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Florian Fainelli, netdev,
	devicetree, linux-kernel
  Cc: Buday Csaba
Implement support for the `phy-id-read-needs-reset` device tree
property.
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.
This patch performs the hard-reset before attempting to read the ID,
when the mentioned device tree property is present.
There were previous attempts to implement such functionality, I
tried to collect a few of these (see links).
Link: https://lore.kernel.org/lkml/1499346330-12166-2-git-send-email-richard.leitner@skidata.com/
Link: https://lore.kernel.org/all/20230405-net-next-topic-net-phy-reset-v1-0-7e5329f08002@pengutronix.de/
Link: https://lore.kernel.org/netdev/20250709133222.48802-4-buday.csaba@prolan.hu/
Signed-off-by: Buday Csaba <buday.csaba@prolan.hu>
---
V1 -> V2:
 - renamed DT property `reset-phy-before-probe` to
  `phy-id-read-needs-reset`
 - renamed fwnode_reset_phy_before_probe() to
   fwnode_reset_phy()
 - added kernel-doc for fwnode_reset_phy()
 - improved error handling in fwnode_reset_phy()
---
 drivers/net/mdio/fwnode_mdio.c | 37 +++++++++++++++++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)
diff --git a/drivers/net/mdio/fwnode_mdio.c b/drivers/net/mdio/fwnode_mdio.c
index ba7091518..6987b1a51 100644
--- a/drivers/net/mdio/fwnode_mdio.c
+++ b/drivers/net/mdio/fwnode_mdio.c
@@ -114,6 +114,38 @@ int fwnode_mdiobus_phy_device_register(struct mii_bus *mdio,
 }
 EXPORT_SYMBOL(fwnode_mdiobus_phy_device_register);
 
+/**
+ * fwnode_reset_phy() - 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 err;
+
+	tmpdev = mdio_device_create(bus, addr);
+	if (IS_ERR(tmpdev))
+		return PTR_ERR(tmpdev);
+
+	fwnode_handle_get(phy_node);
+	device_set_node(&tmpdev->dev, phy_node);
+	err = mdio_device_register_reset(tmpdev);
+	if (err) {
+		mdio_device_free(tmpdev);
+		return err;
+	}
+
+	mdio_device_reset(tmpdev, 1);
+	mdio_device_reset(tmpdev, 0);
+
+	mdio_device_unregister_reset(tmpdev);
+
+	mdio_device_free(tmpdev);
+	fwnode_handle_put(phy_node);
+
+	return 0;
+}
+
 int fwnode_mdiobus_register_phy(struct mii_bus *bus,
 				struct fwnode_handle *child, u32 addr)
 {
@@ -129,8 +161,11 @@ 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)) {
+		if (fwnode_property_present(child, "reset-phy-before-probe"))
+			fwnode_reset_phy(bus, addr, child);
 		phy = get_phy_device(bus, addr, is_c45);
+	}
 	else
 		phy = phy_device_create(bus, addr, phy_id, 0, NULL);
 	if (IS_ERR(phy)) {
-- 
2.39.5
^ permalink raw reply related	[flat|nested] 12+ messages in thread
* Re: [PATCH v2 1/4] net: mdio: common handling of phy reset properties
  2025-10-15 13:45 [PATCH v2 1/4] net: mdio: common handling of phy reset properties Buday Csaba
                   ` (2 preceding siblings ...)
  2025-10-15 13:45 ` [PATCH v2 4/4] net: mdio: reset PHY before attempting to access registers in fwnode_mdiobus_register_phy Buday Csaba
@ 2025-10-15 14:02 ` Buday Csaba
  3 siblings, 0 replies; 12+ messages in thread
From: Buday Csaba @ 2025-10-15 14:02 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Florian Fainelli, netdev,
	devicetree, linux-kernel
This is the refined v2 patchset of my previous patches, addressing the
issues found in them.
See the previous thread here:
https://lore.kernel.org/lkml/20251015134503.107925-1-buday.csaba@prolan.hu/
^ permalink raw reply	[flat|nested] 12+ messages in thread
* Re: [PATCH v2 4/4] net: mdio: reset PHY before attempting to access registers in fwnode_mdiobus_register_phy
  2025-10-15 13:45 ` [PATCH v2 4/4] net: mdio: reset PHY before attempting to access registers in fwnode_mdiobus_register_phy Buday Csaba
@ 2025-10-15 17:04   ` Simon Horman
  2025-10-16  5:20   ` kernel test robot
  2025-10-17  7:33   ` Buday Csaba
  2 siblings, 0 replies; 12+ messages in thread
From: Simon Horman @ 2025-10-15 17:04 UTC (permalink / raw)
  To: Buday Csaba
  Cc: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Florian Fainelli, netdev,
	devicetree, linux-kernel
On Wed, Oct 15, 2025 at 03:45:03PM +0200, Buday Csaba wrote:
...
>  drivers/net/mdio/fwnode_mdio.c | 37 +++++++++++++++++++++++++++++++++-
>  1 file changed, 36 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/mdio/fwnode_mdio.c b/drivers/net/mdio/fwnode_mdio.c
> index ba7091518..6987b1a51 100644
> --- a/drivers/net/mdio/fwnode_mdio.c
> +++ b/drivers/net/mdio/fwnode_mdio.c
> @@ -114,6 +114,38 @@ int fwnode_mdiobus_phy_device_register(struct mii_bus *mdio,
>  }
>  EXPORT_SYMBOL(fwnode_mdiobus_phy_device_register);
>  
> +/**
> + * fwnode_reset_phy() - Hard-reset a PHY before registration
Hi Buday,
This is not a full review. But as this is a Kernel doc (a comment in Kernel
doc format), it should also document:
1. The function arguments:
  * @bus: ...
  * @addr: ...
  * @phy_node: ...
2. The return value:
  * Returns: ...
Flagged by ./scripts/kernel-doc -none -Wall
Thanks!
> + */
> +static int fwnode_reset_phy(struct mii_bus *bus, u32 addr,
...
-- 
pw-bot: cr
^ permalink raw reply	[flat|nested] 12+ messages in thread
* Re: [PATCH v2 4/4] net: mdio: reset PHY before attempting to access registers in fwnode_mdiobus_register_phy
  2025-10-15 13:45 ` [PATCH v2 4/4] net: mdio: reset PHY before attempting to access registers in fwnode_mdiobus_register_phy Buday Csaba
  2025-10-15 17:04   ` Simon Horman
@ 2025-10-16  5:20   ` kernel test robot
  2025-10-17  7:33   ` Buday Csaba
  2 siblings, 0 replies; 12+ messages in thread
From: kernel test robot @ 2025-10-16  5:20 UTC (permalink / raw)
  To: Buday Csaba, Andrew Lunn, Heiner Kallweit, Russell King,
	David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley, Florian Fainelli,
	devicetree, linux-kernel
  Cc: oe-kbuild-all, netdev, Buday Csaba
Hi Buday,
kernel test robot noticed the following build warnings:
[auto build test WARNING on robh/for-next]
[also build test WARNING on net-next/main net/main linus/master v6.18-rc1 next-20251015]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url:    https://github.com/intel-lab-lkp/linux/commits/Buday-Csaba/net-mdio-change-property-read-from-fwnode_property_read_u32-to-device_property_read_u32/20251015-214614
base:   https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next
patch link:    https://lore.kernel.org/r/20251015134503.107925-4-buday.csaba%40prolan.hu
patch subject: [PATCH v2 4/4] net: mdio: reset PHY before attempting to access registers in fwnode_mdiobus_register_phy
config: arc-randconfig-002-20251016 (https://download.01.org/0day-ci/archive/20251016/202510161216.OMDTHD0v-lkp@intel.com/config)
compiler: arc-linux-gcc (GCC) 8.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251016/202510161216.OMDTHD0v-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/202510161216.OMDTHD0v-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> Warning: drivers/net/mdio/fwnode_mdio.c:121 function parameter 'bus' not described in 'fwnode_reset_phy'
>> Warning: drivers/net/mdio/fwnode_mdio.c:121 function parameter 'addr' not described in 'fwnode_reset_phy'
>> Warning: drivers/net/mdio/fwnode_mdio.c:121 function parameter 'phy_node' not described in 'fwnode_reset_phy'
-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply	[flat|nested] 12+ messages in thread
* Re: [PATCH v2 4/4] net: mdio: reset PHY before attempting to access registers in fwnode_mdiobus_register_phy
  2025-10-15 13:45 ` [PATCH v2 4/4] net: mdio: reset PHY before attempting to access registers in fwnode_mdiobus_register_phy Buday Csaba
  2025-10-15 17:04   ` Simon Horman
  2025-10-16  5:20   ` kernel test robot
@ 2025-10-17  7:33   ` Buday Csaba
  2025-10-17 14:40     ` Andrew Lunn
  2 siblings, 1 reply; 12+ messages in thread
From: Buday Csaba @ 2025-10-17  7:33 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Florian Fainelli, netdev,
	devicetree, linux-kernel
Dear Maintainers,
I am about the submit the v3 version of these patches, hopefully the last
iteration. I think I managed to elimante all failures and almost all of
the warnings, except one: patchwork complies, that not all the maintainers
are CC'ed.
I have used get_maintainers.pl to get the address list. I am on the
net-next tree. Is there a problem with get_maintainers.pl or with
patchwork? Can I ignore that warning?
Reference:
https://patchwork.kernel.org/project/netdevbpf/patch/20251015134503.107925-1-buday.csaba@prolan.hu/
Thank you,
Csaba
On Wed, Oct 15, 2025 at 03:45:03PM +0200, Buday Csaba wrote:
> Implement support for the `phy-id-read-needs-reset` device tree
> property.
> 
> 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.
> 
> This patch performs the hard-reset before attempting to read the ID,
> when the mentioned device tree property is present.
> 
> There were previous attempts to implement such functionality, I
> tried to collect a few of these (see links).
> 
> Link: https://lore.kernel.org/lkml/1499346330-12166-2-git-send-email-richard.leitner@skidata.com/
> Link: https://lore.kernel.org/all/20230405-net-next-topic-net-phy-reset-v1-0-7e5329f08002@pengutronix.de/
> Link: https://lore.kernel.org/netdev/20250709133222.48802-4-buday.csaba@prolan.hu/
> 
> Signed-off-by: Buday Csaba <buday.csaba@prolan.hu>
> ---
> V1 -> V2:
>  - renamed DT property `reset-phy-before-probe` to
>   `phy-id-read-needs-reset`
>  - renamed fwnode_reset_phy_before_probe() to
>    fwnode_reset_phy()
>  - added kernel-doc for fwnode_reset_phy()
>  - improved error handling in fwnode_reset_phy()
> ---
>  drivers/net/mdio/fwnode_mdio.c | 37 +++++++++++++++++++++++++++++++++-
>  1 file changed, 36 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/mdio/fwnode_mdio.c b/drivers/net/mdio/fwnode_mdio.c
> index ba7091518..6987b1a51 100644
> --- a/drivers/net/mdio/fwnode_mdio.c
> +++ b/drivers/net/mdio/fwnode_mdio.c
> @@ -114,6 +114,38 @@ int fwnode_mdiobus_phy_device_register(struct mii_bus *mdio,
>  }
>  EXPORT_SYMBOL(fwnode_mdiobus_phy_device_register);
>  
> +/**
> + * fwnode_reset_phy() - 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 err;
> +
> +	tmpdev = mdio_device_create(bus, addr);
> +	if (IS_ERR(tmpdev))
> +		return PTR_ERR(tmpdev);
> +
> +	fwnode_handle_get(phy_node);
> +	device_set_node(&tmpdev->dev, phy_node);
> +	err = mdio_device_register_reset(tmpdev);
> +	if (err) {
> +		mdio_device_free(tmpdev);
> +		return err;
> +	}
> +
> +	mdio_device_reset(tmpdev, 1);
> +	mdio_device_reset(tmpdev, 0);
> +
> +	mdio_device_unregister_reset(tmpdev);
> +
> +	mdio_device_free(tmpdev);
> +	fwnode_handle_put(phy_node);
> +
> +	return 0;
> +}
> +
>  int fwnode_mdiobus_register_phy(struct mii_bus *bus,
>  				struct fwnode_handle *child, u32 addr)
>  {
> @@ -129,8 +161,11 @@ 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)) {
> +		if (fwnode_property_present(child, "reset-phy-before-probe"))
> +			fwnode_reset_phy(bus, addr, child);
>  		phy = get_phy_device(bus, addr, is_c45);
> +	}
>  	else
>  		phy = phy_device_create(bus, addr, phy_id, 0, NULL);
>  	if (IS_ERR(phy)) {
> -- 
> 2.39.5
> 
^ permalink raw reply	[flat|nested] 12+ messages in thread
* Re: [PATCH v2 4/4] net: mdio: reset PHY before attempting to access registers in fwnode_mdiobus_register_phy
  2025-10-17  7:33   ` Buday Csaba
@ 2025-10-17 14:40     ` Andrew Lunn
  0 siblings, 0 replies; 12+ messages in thread
From: Andrew Lunn @ 2025-10-17 14:40 UTC (permalink / raw)
  To: Buday Csaba
  Cc: Heiner Kallweit, Russell King, David S. Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, Florian Fainelli, netdev, devicetree, linux-kernel
On Fri, Oct 17, 2025 at 09:33:58AM +0200, Buday Csaba wrote:
> Dear Maintainers,
> 
> I am about the submit the v3 version of these patches, hopefully the last
> iteration. I think I managed to elimante all failures and almost all of
> the warnings, except one: patchwork complies, that not all the maintainers
> are CC'ed.
> 
> I have used get_maintainers.pl to get the address list. I am on the
> net-next tree. Is there a problem with get_maintainers.pl or with
> patchwork? Can I ignore that warning?
patchwork might be passing additional parameters to
get_maintainers.pl. These tests are not go/no-go. We look at the
results and evaluate what they are saying. Missing
p.zabel@pengutronix.de is not a big issue.
	Andrew
^ permalink raw reply	[flat|nested] 12+ messages in thread
* Re: [PATCH v2 3/4] dt-bindings: net: mdio: add phy-id-read-needs-reset property
  2025-10-15 13:45 ` [PATCH v2 3/4] dt-bindings: net: mdio: add phy-id-read-needs-reset property Buday Csaba
@ 2025-10-21 20:10   ` Rob Herring
  2025-10-22  6:43     ` Buday Csaba
  2025-10-22  9:15     ` Buday Csaba
  0 siblings, 2 replies; 12+ messages in thread
From: Rob Herring @ 2025-10-21 20:10 UTC (permalink / raw)
  To: Buday Csaba
  Cc: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Krzysztof Kozlowski,
	Conor Dooley, Florian Fainelli, netdev, devicetree, linux-kernel
On Wed, Oct 15, 2025 at 03:45:02PM +0200, Buday Csaba wrote:
> Some Ethernet PHYs require a hard reset before accessing their MDIO
> registers. When the ID is not provided by a compatible string,
> reading the PHY ID may fail on such devices.
> 
> This patch introduces a new device tree property called
> `phy-id-read-needs-reset`, which can be used to hard reset the
> PHY before attempting to read its ID via MDIO.
> 
> Signed-off-by: Buday Csaba <buday.csaba@prolan.hu>
> ---
>  Documentation/devicetree/bindings/net/ethernet-phy.yaml | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/net/ethernet-phy.yaml b/Documentation/devicetree/bindings/net/ethernet-phy.yaml
> index 2ec2d9fda..b570f8038 100644
> --- a/Documentation/devicetree/bindings/net/ethernet-phy.yaml
> +++ b/Documentation/devicetree/bindings/net/ethernet-phy.yaml
> @@ -215,6 +215,14 @@ properties:
>        Delay after the reset was deasserted in microseconds. If
>        this property is missing the delay will be skipped.
>  
> +  phy-id-read-needs-reset:
> +    $ref: /schemas/types.yaml#/definitions/flag
> +    description:
> +      Some PHYs require a hard reset before accessing MDIO registers.
> +      This workaround allows auto-detection of the PHY ID in such cases.
> +      When the PHY ID is provided with the 'compatible' string, setting
> +      this property has no effect.
If the phy is listed in DT, then it should have a compatible. Therefore, 
you don't need this property.
Rob
^ permalink raw reply	[flat|nested] 12+ messages in thread
* Re: [PATCH v2 3/4] dt-bindings: net: mdio: add phy-id-read-needs-reset property
  2025-10-21 20:10   ` Rob Herring
@ 2025-10-22  6:43     ` Buday Csaba
  2025-10-22  9:15     ` Buday Csaba
  1 sibling, 0 replies; 12+ messages in thread
From: Buday Csaba @ 2025-10-22  6:43 UTC (permalink / raw)
  To: Rob Herring
  Cc: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Krzysztof Kozlowski,
	Conor Dooley, Florian Fainelli, netdev, devicetree, linux-kernel
On Tue, Oct 21, 2025 at 03:10:23PM -0500, Rob Herring wrote:
> On Wed, Oct 15, 2025 at 03:45:02PM +0200, Buday Csaba wrote:
> > Some Ethernet PHYs require a hard reset before accessing their MDIO
> > registers. When the ID is not provided by a compatible string,
> > reading the PHY ID may fail on such devices.
> > 
> > This patch introduces a new device tree property called
> > `phy-id-read-needs-reset`, which can be used to hard reset the
> > PHY before attempting to read its ID via MDIO.
> > 
> > Signed-off-by: Buday Csaba <buday.csaba@prolan.hu>
> > ---
> >  Documentation/devicetree/bindings/net/ethernet-phy.yaml | 8 ++++++++
> >  1 file changed, 8 insertions(+)
> > 
> > diff --git a/Documentation/devicetree/bindings/net/ethernet-phy.yaml b/Documentation/devicetree/bindings/net/ethernet-phy.yaml
> > index 2ec2d9fda..b570f8038 100644
> > --- a/Documentation/devicetree/bindings/net/ethernet-phy.yaml
> > +++ b/Documentation/devicetree/bindings/net/ethernet-phy.yaml
> > @@ -215,6 +215,14 @@ properties:
> >        Delay after the reset was deasserted in microseconds. If
> >        this property is missing the delay will be skipped.
> >  
> > +  phy-id-read-needs-reset:
> > +    $ref: /schemas/types.yaml#/definitions/flag
> > +    description:
> > +      Some PHYs require a hard reset before accessing MDIO registers.
> > +      This workaround allows auto-detection of the PHY ID in such cases.
> > +      When the PHY ID is provided with the 'compatible' string, setting
> > +      this property has no effect.
> 
> If the phy is listed in DT, then it should have a compatible. Therefore, 
> you don't need this property.
> 
> Rob
> 
Yes, it has a compatible, but most of the time it is just
"ethernet-phy-ieee802.e-c22" (or c45), and the specific ID is not provided.
Doing a quick search: of all the DTs only 126 specify a chip ID.
There are 198 matches for "ethernet-phy-ieee802.3-c22" only.
The current description reads: 
"
      - pattern: "^ethernet-phy-id[a-f0-9]{4}\\.[a-f0-9]{4}$"
        description:
          If the PHY reports an incorrect ID (or none at all) then [...]
"
This description tells me, that we are only encouraged to hardcode the 
chip ID in the DT, when it is read incorrectly.
The PHY we are having trouble with reports its ID perfectly, once properly
initialized: clock established and hard reset asserted after that.
I only wish to implement this condition. Andrew had a concern, that if we
unconditionally assert the reset, that may lead breaking compatibility with
some existing systems, so my best idea was to come up with a DT property
that can be used to flag this.
I also wish to emphasize: there are 43 DTs out there still using the
deprecated "phy-reset-gpios" property of the fec driver, probably for the
same reason: there is no replacement for it. Because that property does
reset the PHY before the ID read, but it has all kind of other problems.
The worst is that reset gpio handle is tossed after the initialization,
see fec_reset_phy().
If we ever want to truly deprecate that, there must be some alternative
logic to implement the same funcionality.
Csaba
^ permalink raw reply	[flat|nested] 12+ messages in thread
* Re: [PATCH v2 3/4] dt-bindings: net: mdio: add phy-id-read-needs-reset property
  2025-10-21 20:10   ` Rob Herring
  2025-10-22  6:43     ` Buday Csaba
@ 2025-10-22  9:15     ` Buday Csaba
  1 sibling, 0 replies; 12+ messages in thread
From: Buday Csaba @ 2025-10-22  9:15 UTC (permalink / raw)
  To: Rob Herring
  Cc: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Krzysztof Kozlowski,
	Conor Dooley, Florian Fainelli, netdev, devicetree, linux-kernel
On Tue, Oct 21, 2025 at 03:10:23PM -0500, Rob Herring wrote:
> On Wed, Oct 15, 2025 at 03:45:02PM +0200, Buday Csaba wrote:
> > Some Ethernet PHYs require a hard reset before accessing their MDIO
> > registers. When the ID is not provided by a compatible string,
> > reading the PHY ID may fail on such devices.
> > 
> > This patch introduces a new device tree property called
> > `phy-id-read-needs-reset`, which can be used to hard reset the
> > PHY before attempting to read its ID via MDIO.
> > 
> > Signed-off-by: Buday Csaba <buday.csaba@prolan.hu>
> > ---
> >  Documentation/devicetree/bindings/net/ethernet-phy.yaml | 8 ++++++++
> >  1 file changed, 8 insertions(+)
> > 
> > diff --git a/Documentation/devicetree/bindings/net/ethernet-phy.yaml b/Documentation/devicetree/bindings/net/ethernet-phy.yaml
> > index 2ec2d9fda..b570f8038 100644
> > --- a/Documentation/devicetree/bindings/net/ethernet-phy.yaml
> > +++ b/Documentation/devicetree/bindings/net/ethernet-phy.yaml
> > @@ -215,6 +215,14 @@ properties:
> >        Delay after the reset was deasserted in microseconds. If
> >        this property is missing the delay will be skipped.
> >  
> > +  phy-id-read-needs-reset:
> > +    $ref: /schemas/types.yaml#/definitions/flag
> > +    description:
> > +      Some PHYs require a hard reset before accessing MDIO registers.
> > +      This workaround allows auto-detection of the PHY ID in such cases.
> > +      When the PHY ID is provided with the 'compatible' string, setting
> > +      this property has no effect.
> 
> If the phy is listed in DT, then it should have a compatible. Therefore, 
> you don't need this property.
> 
> Rob
> 
Actually, please partly ignore my previous letter. I managed to do it
without a new DT property, and this seems to be a more elegant solution
after all.
If you wish to take a look at the next patch, you can find it here:
https://lore.kernel.org/netdev/cover.1761124022.git.buday.csaba@prolan.hu/
Thanks for the feedback!
Csaba
^ permalink raw reply	[flat|nested] 12+ messages in thread
end of thread, other threads:[~2025-10-22  9:15 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-15 13:45 [PATCH v2 1/4] net: mdio: common handling of phy reset properties Buday Csaba
2025-10-15 13:45 ` [PATCH v2 2/4] net: mdio: change property read from fwnode_property_read_u32() to device_property_read_u32() Buday Csaba
2025-10-15 13:45 ` [PATCH v2 3/4] dt-bindings: net: mdio: add phy-id-read-needs-reset property Buday Csaba
2025-10-21 20:10   ` Rob Herring
2025-10-22  6:43     ` Buday Csaba
2025-10-22  9:15     ` Buday Csaba
2025-10-15 13:45 ` [PATCH v2 4/4] net: mdio: reset PHY before attempting to access registers in fwnode_mdiobus_register_phy Buday Csaba
2025-10-15 17:04   ` Simon Horman
2025-10-16  5:20   ` kernel test robot
2025-10-17  7:33   ` Buday Csaba
2025-10-17 14:40     ` Andrew Lunn
2025-10-15 14:02 ` [PATCH v2 1/4] net: mdio: common handling of phy reset properties Buday Csaba
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).