On 6/30/20 5:29 PM, Russell King wrote:
> For fixed links, we only allow the current settings, so this should be
> a matter of merely rejecting an attempt to change the settings.  If the
> settings agree, then there is nothing more we need to do.
> 
> Signed-off-by: Russell King <rmk+ker...@armlinux.org.uk>

Reviewed-by: Ioana Ciornei <ioana.cior...@nxp.com>

> ---
>   drivers/net/phy/phylink.c | 31 ++++++++++++++++++++-----------
>   1 file changed, 20 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c
> index 967c068d16c8..b91151062cdc 100644
> --- a/drivers/net/phy/phylink.c
> +++ b/drivers/net/phy/phylink.c
> @@ -1360,22 +1360,31 @@ int phylink_ethtool_ksettings_set(struct phylink *pl,
>               if (!s)
>                       return -EINVAL;
>   
> -             /* If we have a fixed link (as specified by firmware), refuse
> -              * to change link parameters.
> +             /* If we have a fixed link, refuse to change link parameters.
> +              * If the link parameters match, accept them but do nothing.
>                */
> -             if (pl->cur_link_an_mode == MLO_AN_FIXED &&
> -                 (s->speed != pl->link_config.speed ||
> -                  s->duplex != pl->link_config.duplex))
> -                     return -EINVAL;
> +             if (pl->cur_link_an_mode == MLO_AN_FIXED) {
> +                     if (s->speed != pl->link_config.speed ||
> +                         s->duplex != pl->link_config.duplex)
> +                             return -EINVAL;
> +                     return 0;
> +             }
>   
>               config.speed = s->speed;
>               config.duplex = s->duplex;
>               break;
>   
>       case AUTONEG_ENABLE:
> -             /* If we have a fixed link, refuse to enable autonegotiation */
> -             if (pl->cur_link_an_mode == MLO_AN_FIXED)
> -                     return -EINVAL;
> +             /* If we have a fixed link, allow autonegotiation (since that
> +              * is our default case) but do not allow the advertisement to
> +              * be changed. If the advertisement matches, simply return.
> +              */
> +             if (pl->cur_link_an_mode == MLO_AN_FIXED) {
> +                     if (!linkmode_equal(config.advertising,
> +                                         pl->link_config.advertising))
> +                             return -EINVAL;
> +                     return 0;
> +             }
>   
>               config.speed = SPEED_UNKNOWN;
>               config.duplex = DUPLEX_UNKNOWN;
> @@ -1385,8 +1394,8 @@ int phylink_ethtool_ksettings_set(struct phylink *pl,
>               return -EINVAL;
>       }
>   
> -     /* For a fixed link, this isn't able to change any parameters,
> -      * which just leaves inband mode.
> +     /* We have ruled out the case with a PHY attached, and the
> +      * fixed-link cases.  All that is left are in-band links.
>        */
>       if (phylink_validate(pl, support, &config))
>               return -EINVAL;
> 

Reply via email to