Ethernet PHY package nodes describe shared resources for their member PHYs, but are not populated as struct devices. fw_devlink consequently represents the package dependencies with proxy links to the closest ancestor device. The MDIO bus is a class device without a driver, so such a proxy can remain available indefinitely and prevent a supplier from receiving its sync_state() callback even after every PHY has probed. Treat every enabled member PHY as a consumer of the common package suppliers. The links can then be converted to links for the real PHY devices and retired through their normal driver lifecycle. Fixes: 385ef48f4686 ("net: phy: add support for scanning PHY in PHY packages nodes") Signed-off-by: James Hilliard --- drivers/of/property.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/of/property.c b/drivers/of/property.c index 72cf12907de0..f29ba818ecbc 100644 --- a/drivers/of/property.c +++ b/drivers/of/property.c @@ -1272,6 +1272,20 @@ static void of_link_to_phandle(struct device_node *con_np, tmp_np = of_get_next_parent(tmp_np); } + /* + * An Ethernet PHY package node describes resources shared by its member + * PHYs, but is not populated as a struct device. Link every enabled + * member PHY to those suppliers so fw_devlink can use the real consumer + * devices instead of leaving a proxy link on the MDIO bus indefinitely. + */ + if (of_node_name_eq(con_np, "ethernet-phy-package")) { + for_each_available_child_of_node_scoped(con_np, child) + fwnode_link_add(of_fwnode_handle(child), + of_fwnode_handle(sup_np), flags); + + return; + } + fwnode_link_add(of_fwnode_handle(con_np), of_fwnode_handle(sup_np), flags); } -- 2.53.0