Currently __set_phy_supported allows to add modes w/o checking whether
the PHY supports them. This is wrong, it should never add modes but
only remove modes we don't want to support.

The commit marked as fixed didn't do anything wrong, it just copied
existing functionality to the helper which is being fixed now.

Fixes: f3a6bd393c2c ("phylib: Add phy_set_max_speed helper")
Signed-off-by: Heiner Kallweit <hkallwe...@gmail.com>
---
This will cause a merge conflict once net is merged into net-next.
And the fix will need minor tweaking when being backported to
older kernel versions.
---
 drivers/net/phy/phy_device.c | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)

diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index 23ee3967c..18e92c19c 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -1880,20 +1880,17 @@ EXPORT_SYMBOL(genphy_loopback);
 
 static int __set_phy_supported(struct phy_device *phydev, u32 max_speed)
 {
-       phydev->supported &= ~(PHY_1000BT_FEATURES | PHY_100BT_FEATURES |
-                              PHY_10BT_FEATURES);
-
        switch (max_speed) {
-       default:
-               return -ENOTSUPP;
-       case SPEED_1000:
-               phydev->supported |= PHY_1000BT_FEATURES;
+       case SPEED_10:
+               phydev->supported &= ~PHY_100BT_FEATURES;
                /* fall through */
        case SPEED_100:
-               phydev->supported |= PHY_100BT_FEATURES;
-               /* fall through */
-       case SPEED_10:
-               phydev->supported |= PHY_10BT_FEATURES;
+               phydev->supported &= ~PHY_1000BT_FEATURES;
+               break;
+       case SPEED_1000:
+               break;
+       default:
+               return -ENOTSUPP;
        }
 
        return 0;
-- 
2.19.2

Reply via email to