[PATCH v4] net: phy: fix duplicate eth_phy binding

Marek Vasut marek.vasut at mailbox.org
Tue May 12 21:13:31 CEST 2026


On 5/12/26 2:23 PM, Pranav Tilak wrote:

[...]

> @@ -927,29 +928,40 @@ 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;
> +	bool phy_bound;
> +
> +	/* Skip binding if PHY already bound by eth_phy_binds_nodes(). */
> +	phy_bound = !uclass_find_device_by_phandle(UCLASS_ETH_PHY, dev,
> +						       "phy-handle",
> +						       &phy_dev);
> +	if (!phy_bound) {

The double negation is not needed, simply use int data type .

Also, try "goto exit" ...

>   #ifdef CONFIG_PHY_FIXED
> -	phydev = phy_connect_fixed(bus, dev);
> +		phydev = phy_connect_fixed(bus, dev);
>   #endif
>   
>   #ifdef CONFIG_PHY_NCSI
> -	if (!phydev && interface == PHY_INTERFACE_MODE_NCSI)
> -		phydev = phy_device_create(bus, 0, PHY_NCSI_ID, false);
> +		if (!phydev && interface == PHY_INTERFACE_MODE_NCSI)
> +			phydev = phy_device_create(bus, 0, PHY_NCSI_ID, false);
>   #endif
>   
>   #ifdef CONFIG_PHY_ETHERNET_ID
> -	if (!phydev)
> -		phydev = phy_connect_phy_id(bus, dev, addr);
> +		if (!phydev)
> +			phydev = phy_connect_phy_id(bus, dev, addr);
>   #endif
>   
>   #ifdef CONFIG_PHY_XILINX_GMII2RGMII
> -	if (!phydev)
> -		phydev = phy_connect_gmii2rgmii(bus, dev);
> +		if (!phydev)
> +			phydev = phy_connect_gmii2rgmii(bus, dev);
>   #endif
> +	}

exit:

This may simplify the patch .

>   	if (!phydev)
>   		phydev = phy_find_by_mask(bus, mask);
>   
> +	if (phydev && phy_bound && !ofnode_valid(phydev->node))
> +		phydev->node = dev_ofnode(phy_dev);
> +
>   	if (phydev)
>   		phy_connect_dev(phydev, dev, interface);
>   	else

[...]


More information about the U-Boot mailing list