summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>2021-11-21 12:52:30 +0000
committerRussell King (Oracle) <rmk+kernel@armlinux.org.uk>2022-06-21 10:57:44 +0100
commita769530705ee315fee0e0d090b43d5c8fb66d6fb (patch)
tree35eb94b9e381a9e3217ddf141b8a8afbcb4e5cdc
parentec3ecabf5fdc16220e13b56564547280c8fada97 (diff)
net: phylink: pass mode into phylink_validate()
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
-rw-r--r--drivers/net/phy/phylink.c46
1 files changed, 28 insertions, 18 deletions
diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c
index eaae3beec44d..bcb5e6e645fb 100644
--- a/drivers/net/phy/phylink.c
+++ b/drivers/net/phy/phylink.c
@@ -434,7 +434,7 @@ void phylink_generic_validate(struct phylink_config *config,
}
EXPORT_SYMBOL_GPL(phylink_generic_validate);
-static int phylink_validate_mac_and_pcs(struct phylink *pl,
+static int phylink_validate_mac_and_pcs(struct phylink *pl, unsigned int mode,
unsigned long *supported,
struct phylink_link_state *state)
{
@@ -488,7 +488,8 @@ static int phylink_validate_mac_and_pcs(struct phylink *pl,
return phylink_is_empty_linkmode(supported) ? -EINVAL : 0;
}
-static int phylink_validate_mask(struct phylink *pl, unsigned long *supported,
+static int phylink_validate_mask(struct phylink *pl, unsigned int mode,
+ unsigned long *supported,
struct phylink_link_state *state,
const unsigned long *interfaces)
{
@@ -504,7 +505,7 @@ static int phylink_validate_mask(struct phylink *pl, unsigned long *supported,
t = *state;
t.interface = intf;
- if (!phylink_validate_mac_and_pcs(pl, s, &t)) {
+ if (!phylink_validate_mac_and_pcs(pl, mode, s, &t)) {
linkmode_or(all_s, all_s, s);
linkmode_or(all_adv, all_adv, t.advertising);
}
@@ -517,18 +518,20 @@ static int phylink_validate_mask(struct phylink *pl, unsigned long *supported,
return phylink_is_empty_linkmode(supported) ? -EINVAL : 0;
}
-static int phylink_validate(struct phylink *pl, unsigned long *supported,
+static int phylink_validate(struct phylink *pl, unsigned int mode,
+ unsigned long *supported,
struct phylink_link_state *state)
{
const unsigned long *interfaces = pl->config->supported_interfaces;
if (state->interface == PHY_INTERFACE_MODE_NA)
- return phylink_validate_mask(pl, supported, state, interfaces);
+ return phylink_validate_mask(pl, mode, supported, state,
+ interfaces);
if (!test_bit(state->interface, interfaces))
return -EINVAL;
- return phylink_validate_mac_and_pcs(pl, supported, state);
+ return phylink_validate_mac_and_pcs(pl, mode, supported, state);
}
static int phylink_parse_fixedlink(struct phylink *pl,
@@ -605,7 +608,7 @@ static int phylink_parse_fixedlink(struct phylink *pl,
bitmap_fill(pl->supported, __ETHTOOL_LINK_MODE_MASK_NBITS);
linkmode_copy(pl->link_config.advertising, pl->supported);
- phylink_validate(pl, pl->supported, &pl->link_config);
+ phylink_validate(pl, MLO_AN_FIXED, pl->supported, &pl->link_config);
s = phy_lookup_setting(pl->link_config.speed, pl->link_config.duplex,
pl->supported, true);
@@ -747,7 +750,8 @@ static int phylink_parse_mode(struct phylink *pl, struct fwnode_handle *fwnode)
linkmode_copy(pl->link_config.advertising, pl->supported);
- if (phylink_validate(pl, pl->supported, &pl->link_config)) {
+ if (phylink_validate(pl, pl->cfg_link_an_mode, pl->supported,
+ &pl->link_config)) {
phylink_err(pl,
"failed to validate link configuration for in-band status\n");
return -EINVAL;
@@ -1351,7 +1355,7 @@ struct phylink *phylink_create(struct phylink_config *config,
bitmap_fill(pl->supported, __ETHTOOL_LINK_MODE_MASK_NBITS);
linkmode_copy(pl->link_config.advertising, pl->supported);
- phylink_validate(pl, pl->supported, &pl->link_config);
+ phylink_validate(pl, MLO_AN_FIXED, pl->supported, &pl->link_config);
ret = phylink_parse_mode(pl, fwnode);
if (ret < 0) {
@@ -1456,10 +1460,13 @@ static int phylink_validate_phy(struct phylink *pl, struct phy_device *phy,
struct phylink_link_state *state)
{
DECLARE_PHY_INTERFACE_MASK(interfaces);
+ unsigned int mode;
+
+ mode = pl->cfg_link_an_mode;
/* If this is a clause 22 PHY, it only operates in a single mode. */
if (!phy->is_c45)
- return phylink_validate(pl, supported, state);
+ return phylink_validate(pl, mode, supported, state);
/* Clause 45 PHYs switch their Serdes lane between several different
* modes according to the negotiated media speed. For example, the
@@ -1476,7 +1483,7 @@ static int phylink_validate_phy(struct phylink *pl, struct phy_device *phy,
state->interface != PHY_INTERFACE_MODE_XAUI &&
state->interface != PHY_INTERFACE_MODE_USXGMII) {
state->interface = PHY_INTERFACE_MODE_NA;
- return phylink_validate(pl, supported, state);
+ return phylink_validate(pl, mode, supported, state);
}
/* Calculate the union of the interfaces the PHY supports in
@@ -1486,7 +1493,7 @@ static int phylink_validate_phy(struct phylink *pl, struct phy_device *phy,
phy_interface_and(interfaces, phy->possible_interfaces,
pl->config->supported_interfaces);
- return phylink_validate_mask(pl, supported, state, interfaces);
+ return phylink_validate_mask(pl, mode, supported, state, interfaces);
}
static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy,
@@ -2152,7 +2159,8 @@ int phylink_ethtool_ksettings_set(struct phylink *pl,
/* Revalidate with the selected interface */
linkmode_copy(support, pl->supported);
- if (phylink_validate(pl, support, &config)) {
+ if (phylink_validate(pl, pl->cur_link_an_mode, support,
+ &config)) {
phylink_err(pl, "validation of %s/%s with support %*pb failed\n",
phylink_an_mode_str(pl->cur_link_an_mode),
phy_modes(config.interface),
@@ -2162,7 +2170,8 @@ int phylink_ethtool_ksettings_set(struct phylink *pl,
} else {
/* Validate without changing the current supported mask. */
linkmode_copy(support, pl->supported);
- if (phylink_validate(pl, support, &config))
+ if (phylink_validate(pl, pl->cur_link_an_mode, support,
+ &config))
return -EINVAL;
}
@@ -2778,7 +2787,7 @@ static int phylink_sfp_config_phy(struct phylink *pl, u8 mode,
config.an_enabled = pl->link_config.an_enabled;
/* Ignore errors if we're expecting a PHY to attach later */
- ret = phylink_validate(pl, support, &config);
+ ret = phylink_validate(pl, mode, support, &config);
if (ret) {
phylink_err(pl, "validation with support %*pb failed: %pe\n",
__ETHTOOL_LINK_MODE_MASK_NBITS, support,
@@ -2796,7 +2805,7 @@ static int phylink_sfp_config_phy(struct phylink *pl, u8 mode,
config.interface = iface;
linkmode_copy(support1, support);
- ret = phylink_validate(pl, support1, &config);
+ ret = phylink_validate(pl, mode, support1, &config);
if (ret) {
phylink_err(pl,
"validation of %s/%s with support %*pb failed: %pe\n",
@@ -2852,7 +2861,8 @@ static int phylink_sfp_config_optical(struct phylink *pl)
/* For all the interfaces that are supported, reduce the sfp_support
* mask to only those link modes that can be supported.
*/
- ret = phylink_validate_mask(pl, pl->sfp_support, &config, interfaces);
+ ret = phylink_validate_mask(pl, MLO_AN_INBAND, pl->sfp_support, &config,
+ interfaces);
if (ret) {
phylink_err(pl, "unsupported SFP module: validation with support %*pb failed\n",
__ETHTOOL_LINK_MODE_MASK_NBITS, support);
@@ -2871,7 +2881,7 @@ static int phylink_sfp_config_optical(struct phylink *pl)
config.interface = interface;
/* Ignore errors if we're expecting a PHY to attach later */
- ret = phylink_validate(pl, support, &config);
+ ret = phylink_validate(pl, MLO_AN_INBAND, support, &config);
if (ret) {
phylink_err(pl, "validation with support %*pb failed: %pe\n",
__ETHTOOL_LINK_MODE_MASK_NBITS, support,