Commit dc90604b authored by Russell King (Oracle)'s avatar Russell King (Oracle) Committed by David S. Miller

net: phylink: rejig SFP interface selection in ksettings_set()

Commit ea269a6f ("net: phylink: Update SFP selected interface on
advertising changes") added a better solution to selecting the
interface mode for SFPs using the advertisement mask. This method will
work for mvneta and mvpp2 when selecting between 2500base-X and
1000base-X without needing to use the basex helper, or indicate that
we support both 1000base-X and 2500base-X when in either of these two
interface modes.

Hence, we need to eliminate the validation prior to selecting the
interface, otherwise when we clean up mvneta's validation function, we
will end up locking to 2500base-X as we validate with an interface mode
of PHY_INERFACE_MODE_2500BASEX.

The supported mask will already have been reduced down to the union of
support for the SFP and MAC already, so we can be confident that the
advertisement mask is already appropriately restricted. We only need to
select the appropriate interface, and then revalidate with the new
interface mode.

We get rid of the check for pl->sfp_port too, this is meaningless here
as it doesn't get cleared when a module is removed, so it doesn't
indicate if a module is present. Just rely on pl->sfp_bus.
Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1bd29798
...@@ -1612,20 +1612,11 @@ int phylink_ethtool_ksettings_set(struct phylink *pl, ...@@ -1612,20 +1612,11 @@ int phylink_ethtool_ksettings_set(struct phylink *pl,
linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, config.advertising, linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, config.advertising,
config.an_enabled); config.an_enabled);
/* Validate without changing the current supported mask. */
linkmode_copy(support, pl->supported);
if (phylink_validate(pl, support, &config))
return -EINVAL;
/* If autonegotiation is enabled, we must have an advertisement */
if (config.an_enabled && phylink_is_empty_linkmode(config.advertising))
return -EINVAL;
/* If this link is with an SFP, ensure that changes to advertised modes /* If this link is with an SFP, ensure that changes to advertised modes
* also cause the associated interface to be selected such that the * also cause the associated interface to be selected such that the
* link can be configured correctly. * link can be configured correctly.
*/ */
if (pl->sfp_port && pl->sfp_bus) { if (pl->sfp_bus) {
config.interface = sfp_select_interface(pl->sfp_bus, config.interface = sfp_select_interface(pl->sfp_bus,
config.advertising); config.advertising);
if (config.interface == PHY_INTERFACE_MODE_NA) { if (config.interface == PHY_INTERFACE_MODE_NA) {
...@@ -1645,8 +1636,17 @@ int phylink_ethtool_ksettings_set(struct phylink *pl, ...@@ -1645,8 +1636,17 @@ int phylink_ethtool_ksettings_set(struct phylink *pl,
__ETHTOOL_LINK_MODE_MASK_NBITS, support); __ETHTOOL_LINK_MODE_MASK_NBITS, support);
return -EINVAL; return -EINVAL;
} }
} else {
/* Validate without changing the current supported mask. */
linkmode_copy(support, pl->supported);
if (phylink_validate(pl, support, &config))
return -EINVAL;
} }
/* If autonegotiation is enabled, we must have an advertisement */
if (config.an_enabled && phylink_is_empty_linkmode(config.advertising))
return -EINVAL;
mutex_lock(&pl->state_mutex); mutex_lock(&pl->state_mutex);
pl->link_config.speed = config.speed; pl->link_config.speed = config.speed;
pl->link_config.duplex = config.duplex; pl->link_config.duplex = config.duplex;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment