]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
net: phylink: validate sfp_select_interface() returned interface
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Wed, 23 Oct 2024 13:41:51 +0000 (14:41 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 29 Oct 2024 18:57:31 +0000 (11:57 -0700)
Validate that the returned interface from sfp_select_interface() is
supportable by the MAC/PCS. If it isn't, print an error and return
the NA interface type. This is a preparatory step to reorganising
how a PHY on a SFP module is handled.

Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Tested-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Link: https://patch.msgid.link/E1t3bcV-000c8B-Vz@rmk-PC.armlinux.org.uk
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/phy/phylink.c

index 2eb12bc564526f392cec365ae89de19ae3029697..71dde95daf04e27609d1e9953a60df3f3acf1158 100644 (file)
@@ -2414,11 +2414,22 @@ static phy_interface_t phylink_sfp_select_interface(struct phylink *pl,
        phy_interface_t interface;
 
        interface = sfp_select_interface(pl->sfp_bus, link_modes);
-       if (interface == PHY_INTERFACE_MODE_NA)
+       if (interface == PHY_INTERFACE_MODE_NA) {
                phylink_err(pl,
                            "selection of interface failed, advertisement %*pb\n",
                            __ETHTOOL_LINK_MODE_MASK_NBITS,
                            link_modes);
+               return interface;
+       }
+
+       if (!test_bit(interface, pl->config->supported_interfaces)) {
+               phylink_err(pl,
+                           "selection of interface failed, SFP selected %s (%u) but MAC supports %*pbl\n",
+                           phy_modes(interface), interface,
+                           (int)PHY_INTERFACE_MODE_MAX,
+                           pl->config->supported_interfaces);
+               return PHY_INTERFACE_MODE_NA;
+       }
 
        return interface;
 }