On 5/15/26 1:13 PM, Vinay Tilak, Pranav wrote:

[...]

diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index
d7e0c4fe02d..7d698f00c09 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -24,6 +24,7 @@
   #include <linux/delay.h>
   #include <linux/err.h>
   #include <linux/compiler.h>
+#include <dm/uclass-internal.h>

   /* Generic PHY support and helper functions */

@@ -927,6 +928,14 @@ struct phy_device *phy_connect(struct mii_dev
*bus, int addr,
   {
     struct phy_device *phydev = NULL;
     uint mask = (addr >= 0) ? (1 << addr) : 0xffffffff;
+   struct udevice *phy_dev;

Please pick a variable name which is not phy_dev , there is already a phydev variable in this function and the naming is VERY confusing.

+   int ret;
+
+   /* Skip binding if PHY already bound by eth_phy_binds_nodes(). */
+   ret = uclass_find_device_by_phandle(UCLASS_ETH_PHY, dev,
+                                       "phy-handle", &phy_dev);
+   if (!ret)
+           goto out;

You already check if (!ret) here ...

   #ifdef CONFIG_PHY_FIXED
     phydev = phy_connect_fixed(bus, dev); @@ -947,9 +956,13 @@
struct
phy_device *phy_connect(struct mii_dev *bus, int addr,
             phydev = phy_connect_gmii2rgmii(bus, dev);
   #endif

+out:
     if (!phydev)
             phydev = phy_find_by_mask(bus, mask);

+   if (phydev && !ret && !ofnode_valid(phydev->node))
+           phydev->node = dev_ofnode(phy_dev);
Is the !ret test necessary in this conditional ?

Yes i checked, !ret is necessary as uclass_find_device_by_phandle() always sets 
phy_dev= NULL on entry, when it fails to find an already bound PHY phy_dev is 
NULL. Removing !ret would call dev_ofnode(NULL) which dereferences a NULL 
pointer and crashes.

... so I think the goto jump target needs to be adjusted ?

In fact, I do not understand why does this code call phy_find_by_mask() if the PHY udevice was already found by uclass_find_device_by_phandle() ? Can you not convert that already found PHY udevice into phydev ?

!ret also serves as a guard for the assignment of phydev->node it should only happen 
when the PHY is already DM bound. When binding methods run (ret != 0), they already set 
phydev->node correctly so no need to again set phydev->node in that case.

If uclass_find_device_by_phandle() does locate PHY udevice , it will return 0, and the !ret conditional will evaluate to true , so phydev->node = dev_ofnode(phy_dev); will run in that case ?

The !ofnode_valid(phydev->node) check is redundant and can be dropped. In the ret == 
0 path, only phy_find_by_mask() runs and it never sets phydev->node, so 
!ofnode_valid(phydev->node) is always true.
Hence condition can be simplified to:

if (phydev && !ret)
     phydev->node = dev_ofnode(phy_dev);
[...]

Reply via email to