Simplify the ksettings_set() implementation to look more like phylib's
implementation; use a switch() for validating the autoneg setting, and
use the linkmode_modify() helper to set the autoneg bit in the
advertisement mask.

Reviewed-by: Ioana Ciornei <ioana.cior...@nxp.com>
Signed-off-by: Russell King <rmk+ker...@armlinux.org.uk>
---
 drivers/net/phy/phylink.c | 25 ++++++++++++-------------
 1 file changed, 12 insertions(+), 13 deletions(-)

diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c
index 424a927d7889..103d2a550415 100644
--- a/drivers/net/phy/phylink.c
+++ b/drivers/net/phy/phylink.c
@@ -1314,25 +1314,24 @@ int phylink_ethtool_ksettings_set(struct phylink *pl,
        __ETHTOOL_DECLARE_LINK_MODE_MASK(support);
        struct ethtool_link_ksettings our_kset;
        struct phylink_link_state config;
+       const struct phy_setting *s;
        int ret;
 
        ASSERT_RTNL();
 
-       if (kset->base.autoneg != AUTONEG_DISABLE &&
-           kset->base.autoneg != AUTONEG_ENABLE)
-               return -EINVAL;
-
        linkmode_copy(support, pl->supported);
        config = pl->link_config;
+       config.an_enabled = kset->base.autoneg == AUTONEG_ENABLE;
 
-       /* Mask out unsupported advertisements */
+       /* Mask out unsupported advertisements, and force the autoneg bit */
        linkmode_and(config.advertising, kset->link_modes.advertising,
                     support);
+       linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, config.advertising,
+                        config.an_enabled);
 
        /* FIXME: should we reject autoneg if phy/mac does not support it? */
-       if (kset->base.autoneg == AUTONEG_DISABLE) {
-               const struct phy_setting *s;
-
+       switch (kset->base.autoneg) {
+       case AUTONEG_DISABLE:
                /* Autonegotiation disabled, select a suitable speed and
                 * duplex.
                 */
@@ -1351,19 +1350,19 @@ int phylink_ethtool_ksettings_set(struct phylink *pl,
 
                config.speed = s->speed;
                config.duplex = s->duplex;
-               config.an_enabled = false;
+               break;
 
-               __clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, config.advertising);
-       } else {
+       case AUTONEG_ENABLE:
                /* If we have a fixed link, refuse to enable autonegotiation */
                if (pl->cur_link_an_mode == MLO_AN_FIXED)
                        return -EINVAL;
 
                config.speed = SPEED_UNKNOWN;
                config.duplex = DUPLEX_UNKNOWN;
-               config.an_enabled = true;
+               break;
 
-               __set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, config.advertising);
+       default:
+               return -EINVAL;
        }
 
        if (pl->phydev) {
-- 
2.20.1

Reply via email to