]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: phy: don't try to setup PHY-driven SFP cages when using genphy
authorMaxime Chevallier <maxime.chevallier@bootlin.com>
Thu, 4 Jun 2026 09:28:18 +0000 (11:28 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 9 Jun 2026 00:43:27 +0000 (17:43 -0700)
We don't have support for PHY-driver SFP cages with the genphy code.

On top of that, it was found by sashiko that running
sfp_bus_add_upstream() for genphy deadlocks, as for genphy the PHY
probing runs under RTNL, which isn't the case for non-genphy drivers.

This problem was reproduced, and does lead to a deadlock on RTNL.

Before the blamed commit, the phy_sfp_probe() call was made by
individual PHY drivers, so there was no way to get to the SFP probing
path when using genphy.

Let's therefore only run phy_sfp_probe when not using genphy.

Reviewed-by: Nicolai Buchwitz <nb@tipi-net.de>
Fixes: bad869b5e41a ("net: phy: Only rely on phy_port for PHY-driven SFP")
Signed-off-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Link: https://patch.msgid.link/20260604092819.723505-5-maxime.chevallier@bootlin.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/phy/phy_device.c

index b48722589f405f650ea9dd1538608f00ac3cba33..1511385b9b360b351228a3a7eebb9e3600739aab 100644 (file)
@@ -3512,9 +3512,15 @@ static int phy_setup_ports(struct phy_device *phydev)
        if (ret)
                return ret;
 
-       ret = phy_sfp_probe(phydev);
-       if (ret)
-               goto out;
+       /* We don't support SFP with genphy drivers. Also, genphy driver
+        * binding occurs with RTNL help, which will deadlock the call to
+        * sfp_bus_add_upstream().
+        */
+       if (!phydev->is_genphy_driven) {
+               ret = phy_sfp_probe(phydev);
+               if (ret)
+                       goto out;
+       }
 
        if (phydev->n_ports < phydev->max_n_ports) {
                ret = phy_default_setup_single_port(phydev);