net: phy: c45: genphy_c45_ethtool_set_eee: validate EEE link modes
authorOleksij Rempel <o.rempel@pengutronix.de>
Wed, 22 Feb 2023 05:50:43 +0000 (06:50 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 23 Feb 2023 12:43:23 +0000 (13:43 +0100)
Currently, it is possible to let some PHYs to advertise not supported
EEE link modes. So, validate them before overwriting existing
configuration.

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/phy/phy-c45.c

index 8717c122e2f346f05446e6ba9cd3831d50517788..3813b86689d0716cbfd652094d3d5fc0c58a590b 100644 (file)
@@ -1438,12 +1438,23 @@ int genphy_c45_ethtool_set_eee(struct phy_device *phydev,
        int ret;
 
        if (data->eee_enabled) {
-               if (data->advertised)
+               if (data->advertised) {
+                       __ETHTOOL_DECLARE_LINK_MODE_MASK(adv);
+
+                       ethtool_convert_legacy_u32_to_link_mode(adv,
+                                                               data->advertised);
+                       linkmode_andnot(adv, adv, phydev->supported_eee);
+                       if (!linkmode_empty(adv)) {
+                               phydev_warn(phydev, "At least some EEE link modes are not supported.\n");
+                               return -EINVAL;
+                       }
+
                        ethtool_convert_legacy_u32_to_link_mode(phydev->advertising_eee,
                                                                data->advertised);
-               else
+               } else {
                        linkmode_copy(phydev->advertising_eee,
                                      phydev->supported_eee);
+               }
 
                phydev->eee_enabled = true;
        } else {