Commit b50fea1f authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'remove-phylink_state-s-an_enabled-member'

Russell King says:

====================
Remove phylink_state's an_enabled member

Now that all the fixes and correctness patches have been merged, it is
time to switch the two users that make use of .an_enabled to check the
Autoneg bit in the advertising mask, and finally remove the
.an_enabled member.

The first two patches remove the last uses of .an_enabled, which are
in DPAA2 and XPCS. The final patch removes the member.
====================

Link: https://lore.kernel.org/r/ZBnT6yW9UY1sAsiy@shell.armlinux.org.ukSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 1cc6571f 4ee9b0dc
...@@ -159,7 +159,8 @@ static void dpaa2_mac_config(struct phylink_config *config, unsigned int mode, ...@@ -159,7 +159,8 @@ static void dpaa2_mac_config(struct phylink_config *config, unsigned int mode,
struct dpmac_link_state *dpmac_state = &mac->state; struct dpmac_link_state *dpmac_state = &mac->state;
int err; int err;
if (state->an_enabled) if (linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
state->advertising))
dpmac_state->options |= DPMAC_LINK_OPT_AUTONEG; dpmac_state->options |= DPMAC_LINK_OPT_AUTONEG;
else else
dpmac_state->options &= ~DPMAC_LINK_OPT_AUTONEG; dpmac_state->options &= ~DPMAC_LINK_OPT_AUTONEG;
......
...@@ -923,6 +923,7 @@ static int xpcs_get_state_c73(struct dw_xpcs *xpcs, ...@@ -923,6 +923,7 @@ static int xpcs_get_state_c73(struct dw_xpcs *xpcs,
struct phylink_link_state *state, struct phylink_link_state *state,
const struct xpcs_compat *compat) const struct xpcs_compat *compat)
{ {
bool an_enabled;
int ret; int ret;
/* Link needs to be read first ... */ /* Link needs to be read first ... */
...@@ -940,11 +941,13 @@ static int xpcs_get_state_c73(struct dw_xpcs *xpcs, ...@@ -940,11 +941,13 @@ static int xpcs_get_state_c73(struct dw_xpcs *xpcs,
return xpcs_do_config(xpcs, state->interface, MLO_AN_INBAND, NULL); return xpcs_do_config(xpcs, state->interface, MLO_AN_INBAND, NULL);
} }
if (state->an_enabled && xpcs_aneg_done_c73(xpcs, state, compat)) { an_enabled = linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
state->advertising);
if (an_enabled && xpcs_aneg_done_c73(xpcs, state, compat)) {
state->an_complete = true; state->an_complete = true;
xpcs_read_lpa_c73(xpcs, state); xpcs_read_lpa_c73(xpcs, state);
xpcs_resolve_lpa_c73(xpcs, state); xpcs_resolve_lpa_c73(xpcs, state);
} else if (state->an_enabled) { } else if (an_enabled) {
state->link = 0; state->link = 0;
} else if (state->link) { } else if (state->link) {
xpcs_resolve_pma(xpcs, state); xpcs_resolve_pma(xpcs, state);
...@@ -999,7 +1002,8 @@ static int xpcs_get_state_c37_1000basex(struct dw_xpcs *xpcs, ...@@ -999,7 +1002,8 @@ static int xpcs_get_state_c37_1000basex(struct dw_xpcs *xpcs,
{ {
int lpa, bmsr; int lpa, bmsr;
if (state->an_enabled) { if (linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
state->advertising)) {
/* Reset link state */ /* Reset link state */
state->link = false; state->link = false;
......
...@@ -843,7 +843,6 @@ static int phylink_parse_mode(struct phylink *pl, struct fwnode_handle *fwnode) ...@@ -843,7 +843,6 @@ static int phylink_parse_mode(struct phylink *pl, struct fwnode_handle *fwnode)
phylink_set(pl->supported, Autoneg); phylink_set(pl->supported, Autoneg);
phylink_set(pl->supported, Asym_Pause); phylink_set(pl->supported, Asym_Pause);
phylink_set(pl->supported, Pause); phylink_set(pl->supported, Pause);
pl->link_config.an_enabled = true;
pl->cfg_link_an_mode = MLO_AN_INBAND; pl->cfg_link_an_mode = MLO_AN_INBAND;
switch (pl->link_config.interface) { switch (pl->link_config.interface) {
...@@ -945,9 +944,6 @@ static int phylink_parse_mode(struct phylink *pl, struct fwnode_handle *fwnode) ...@@ -945,9 +944,6 @@ static int phylink_parse_mode(struct phylink *pl, struct fwnode_handle *fwnode)
"failed to validate link configuration for in-band status\n"); "failed to validate link configuration for in-band status\n");
return -EINVAL; return -EINVAL;
} }
/* Check if MAC/PCS also supports Autoneg. */
pl->link_config.an_enabled = phylink_test(pl->supported, Autoneg);
} }
return 0; return 0;
...@@ -957,7 +953,8 @@ static void phylink_apply_manual_flow(struct phylink *pl, ...@@ -957,7 +953,8 @@ static void phylink_apply_manual_flow(struct phylink *pl,
struct phylink_link_state *state) struct phylink_link_state *state)
{ {
/* If autoneg is disabled, pause AN is also disabled */ /* If autoneg is disabled, pause AN is also disabled */
if (!state->an_enabled) if (!linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
state->advertising))
state->pause &= ~MLO_PAUSE_AN; state->pause &= ~MLO_PAUSE_AN;
/* Manual configuration of pause modes */ /* Manual configuration of pause modes */
...@@ -997,21 +994,22 @@ static void phylink_mac_config(struct phylink *pl, ...@@ -997,21 +994,22 @@ static void phylink_mac_config(struct phylink *pl,
const struct phylink_link_state *state) const struct phylink_link_state *state)
{ {
phylink_dbg(pl, phylink_dbg(pl,
"%s: mode=%s/%s/%s/%s/%s adv=%*pb pause=%02x link=%u an=%u\n", "%s: mode=%s/%s/%s/%s/%s adv=%*pb pause=%02x link=%u\n",
__func__, phylink_an_mode_str(pl->cur_link_an_mode), __func__, phylink_an_mode_str(pl->cur_link_an_mode),
phy_modes(state->interface), phy_modes(state->interface),
phy_speed_to_str(state->speed), phy_speed_to_str(state->speed),
phy_duplex_to_str(state->duplex), phy_duplex_to_str(state->duplex),
phy_rate_matching_to_str(state->rate_matching), phy_rate_matching_to_str(state->rate_matching),
__ETHTOOL_LINK_MODE_MASK_NBITS, state->advertising, __ETHTOOL_LINK_MODE_MASK_NBITS, state->advertising,
state->pause, state->link, state->an_enabled); state->pause, state->link);
pl->mac_ops->mac_config(pl->config, pl->cur_link_an_mode, state); pl->mac_ops->mac_config(pl->config, pl->cur_link_an_mode, state);
} }
static void phylink_mac_pcs_an_restart(struct phylink *pl) static void phylink_mac_pcs_an_restart(struct phylink *pl)
{ {
if (pl->link_config.an_enabled && if (linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
pl->link_config.advertising) &&
phy_interface_mode_is_8023z(pl->link_config.interface) && phy_interface_mode_is_8023z(pl->link_config.interface) &&
phylink_autoneg_inband(pl->cur_link_an_mode)) { phylink_autoneg_inband(pl->cur_link_an_mode)) {
if (pl->pcs) if (pl->pcs)
...@@ -1138,9 +1136,9 @@ static void phylink_mac_pcs_get_state(struct phylink *pl, ...@@ -1138,9 +1136,9 @@ static void phylink_mac_pcs_get_state(struct phylink *pl,
linkmode_copy(state->advertising, pl->link_config.advertising); linkmode_copy(state->advertising, pl->link_config.advertising);
linkmode_zero(state->lp_advertising); linkmode_zero(state->lp_advertising);
state->interface = pl->link_config.interface; state->interface = pl->link_config.interface;
state->an_enabled = pl->link_config.an_enabled;
state->rate_matching = pl->link_config.rate_matching; state->rate_matching = pl->link_config.rate_matching;
if (state->an_enabled) { if (linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
state->advertising)) {
state->speed = SPEED_UNKNOWN; state->speed = SPEED_UNKNOWN;
state->duplex = DUPLEX_UNKNOWN; state->duplex = DUPLEX_UNKNOWN;
state->pause = MLO_PAUSE_NONE; state->pause = MLO_PAUSE_NONE;
...@@ -1531,7 +1529,6 @@ struct phylink *phylink_create(struct phylink_config *config, ...@@ -1531,7 +1529,6 @@ struct phylink *phylink_create(struct phylink_config *config,
pl->link_config.pause = MLO_PAUSE_AN; pl->link_config.pause = MLO_PAUSE_AN;
pl->link_config.speed = SPEED_UNKNOWN; pl->link_config.speed = SPEED_UNKNOWN;
pl->link_config.duplex = DUPLEX_UNKNOWN; pl->link_config.duplex = DUPLEX_UNKNOWN;
pl->link_config.an_enabled = true;
pl->mac_ops = mac_ops; pl->mac_ops = mac_ops;
__set_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); __set_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state);
timer_setup(&pl->link_poll, phylink_fixed_poll, 0); timer_setup(&pl->link_poll, phylink_fixed_poll, 0);
...@@ -2136,8 +2133,9 @@ static void phylink_get_ksettings(const struct phylink_link_state *state, ...@@ -2136,8 +2133,9 @@ static void phylink_get_ksettings(const struct phylink_link_state *state,
kset->base.speed = state->speed; kset->base.speed = state->speed;
kset->base.duplex = state->duplex; kset->base.duplex = state->duplex;
} }
kset->base.autoneg = state->an_enabled ? AUTONEG_ENABLE : kset->base.autoneg = linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
AUTONEG_DISABLE; state->advertising) ?
AUTONEG_ENABLE : AUTONEG_DISABLE;
} }
/** /**
...@@ -2284,9 +2282,8 @@ int phylink_ethtool_ksettings_set(struct phylink *pl, ...@@ -2284,9 +2282,8 @@ int phylink_ethtool_ksettings_set(struct phylink *pl,
/* We have ruled out the case with a PHY attached, and the /* We have ruled out the case with a PHY attached, and the
* fixed-link cases. All that is left are in-band links. * fixed-link cases. All that is left are in-band links.
*/ */
config.an_enabled = kset->base.autoneg == AUTONEG_ENABLE;
linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, config.advertising, linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, config.advertising,
config.an_enabled); kset->base.autoneg == AUTONEG_ENABLE);
/* 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
...@@ -2320,13 +2317,14 @@ int phylink_ethtool_ksettings_set(struct phylink *pl, ...@@ -2320,13 +2317,14 @@ int phylink_ethtool_ksettings_set(struct phylink *pl,
} }
/* If autonegotiation is enabled, we must have an advertisement */ /* If autonegotiation is enabled, we must have an advertisement */
if (config.an_enabled && phylink_is_empty_linkmode(config.advertising)) if (linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
config.advertising) &&
phylink_is_empty_linkmode(config.advertising))
return -EINVAL; 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;
pl->link_config.an_enabled = config.an_enabled;
if (pl->link_config.interface != config.interface) { if (pl->link_config.interface != config.interface) {
/* The interface changed, e.g. 1000base-X <-> 2500base-X */ /* The interface changed, e.g. 1000base-X <-> 2500base-X */
...@@ -2932,7 +2930,6 @@ static int phylink_sfp_config_phy(struct phylink *pl, u8 mode, ...@@ -2932,7 +2930,6 @@ static int phylink_sfp_config_phy(struct phylink *pl, u8 mode,
config.speed = SPEED_UNKNOWN; config.speed = SPEED_UNKNOWN;
config.duplex = DUPLEX_UNKNOWN; config.duplex = DUPLEX_UNKNOWN;
config.pause = MLO_PAUSE_AN; config.pause = MLO_PAUSE_AN;
config.an_enabled = pl->link_config.an_enabled;
/* Ignore errors if we're expecting a PHY to attach later */ /* Ignore errors if we're expecting a PHY to attach later */
ret = phylink_validate(pl, support, &config); ret = phylink_validate(pl, support, &config);
...@@ -3001,7 +2998,6 @@ static int phylink_sfp_config_optical(struct phylink *pl) ...@@ -3001,7 +2998,6 @@ static int phylink_sfp_config_optical(struct phylink *pl)
config.speed = SPEED_UNKNOWN; config.speed = SPEED_UNKNOWN;
config.duplex = DUPLEX_UNKNOWN; config.duplex = DUPLEX_UNKNOWN;
config.pause = MLO_PAUSE_AN; config.pause = MLO_PAUSE_AN;
config.an_enabled = true;
/* For all the interfaces that are supported, reduce the sfp_support /* For all the interfaces that are supported, reduce the sfp_support
* mask to only those link modes that can be supported. * mask to only those link modes that can be supported.
...@@ -3300,7 +3296,8 @@ void phylink_mii_c22_pcs_decode_state(struct phylink_link_state *state, ...@@ -3300,7 +3296,8 @@ void phylink_mii_c22_pcs_decode_state(struct phylink_link_state *state,
/* If there is no link or autonegotiation is disabled, the LP advertisement /* If there is no link or autonegotiation is disabled, the LP advertisement
* data is not meaningful, so don't go any further. * data is not meaningful, so don't go any further.
*/ */
if (!state->link || !state->an_enabled) if (!state->link || !linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
state->advertising))
return; return;
switch (state->interface) { switch (state->interface) {
......
...@@ -93,7 +93,6 @@ static inline bool phylink_autoneg_inband(unsigned int mode) ...@@ -93,7 +93,6 @@ static inline bool phylink_autoneg_inband(unsigned int mode)
* the medium link mode (@speed and @duplex) and the speed/duplex of the phy * the medium link mode (@speed and @duplex) and the speed/duplex of the phy
* interface mode (@interface) are different. * interface mode (@interface) are different.
* @link: true if the link is up. * @link: true if the link is up.
* @an_enabled: true if autonegotiation is enabled/desired.
* @an_complete: true if autonegotiation has completed. * @an_complete: true if autonegotiation has completed.
*/ */
struct phylink_link_state { struct phylink_link_state {
...@@ -105,7 +104,6 @@ struct phylink_link_state { ...@@ -105,7 +104,6 @@ struct phylink_link_state {
int pause; int pause;
int rate_matching; int rate_matching;
unsigned int link:1; unsigned int link:1;
unsigned int an_enabled:1;
unsigned int an_complete:1; unsigned int an_complete:1;
}; };
......
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