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>2024-02-27 15:38:02 +0000
commit24dfa726bc40f918724d31b611949d6fc1ef4594 (patch)
tree4c7d047317a98c10bffba61392d6a9ac8a51ea75
parent876e9bf96d714101ec0058827382aff20c28aaf3 (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.c49
1 files changed, 31 insertions, 18 deletions
diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c
index 7261f1d4b10f..7ef0ecd36613 100644
--- a/drivers/net/phy/phylink.c
+++ b/drivers/net/phy/phylink.c
@@ -650,7 +650,7 @@ static void phylink_validate_mask_caps(unsigned long *supported,
linkmode_and(state->advertising, state->advertising, mask);
}
-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)
{
@@ -706,6 +706,7 @@ static int phylink_validate_mac_and_pcs(struct phylink *pl,
}
static void phylink_validate_one(struct phylink *pl, struct phy_device *phy,
+ unsigned int mode,
const unsigned long *supported,
const struct phylink_link_state *state,
phy_interface_t interface,
@@ -723,7 +724,8 @@ static void phylink_validate_one(struct phylink *pl, struct phy_device *phy,
if (phy)
tmp_state.rate_matching = phy_get_rate_matching(phy, interface);
- if (!phylink_validate_mac_and_pcs(pl, tmp_supported, &tmp_state)) {
+ if (!phylink_validate_mac_and_pcs(pl, mode, tmp_supported,
+ &tmp_state)) {
phylink_dbg(pl, " interface %u (%s) rate match %s supports %*pbl\n",
interface, phy_modes(interface),
phy_rate_matching_to_str(tmp_state.rate_matching),
@@ -736,6 +738,7 @@ static void phylink_validate_one(struct phylink *pl, struct phy_device *phy,
}
static int phylink_validate_mask(struct phylink *pl, struct phy_device *phy,
+ unsigned int mode,
unsigned long *supported,
struct phylink_link_state *state,
const unsigned long *interfaces)
@@ -745,7 +748,7 @@ static int phylink_validate_mask(struct phylink *pl, struct phy_device *phy,
int interface;
for_each_set_bit(interface, interfaces, PHY_INTERFACE_MODE_MAX)
- phylink_validate_one(pl, phy, supported, state, interface,
+ phylink_validate_one(pl, phy, mode, supported, state, interface,
all_s, all_adv);
linkmode_copy(supported, all_s);
@@ -754,19 +757,20 @@ static int phylink_validate_mask(struct phylink *pl, struct phy_device *phy,
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, NULL, supported, state,
+ return phylink_validate_mask(pl, NULL, 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,
@@ -844,7 +848,7 @@ static int phylink_parse_fixedlink(struct phylink *pl,
linkmode_fill(pl->supported);
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);
pause = phylink_test(pl->supported, Pause);
asym_pause = phylink_test(pl->supported, Asym_Pause);
@@ -1003,7 +1007,8 @@ static int phylink_parse_mode(struct phylink *pl,
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;
@@ -1823,7 +1828,7 @@ struct phylink *phylink_create(struct phylink_config *config,
linkmode_fill(pl->supported);
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);
/* Set the default EEE configuration */
pl->eee_cfg = pl->config->eee;
@@ -1928,6 +1933,9 @@ 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 the PHY provides a bitmap of the interfaces it will be using
* depending on the negotiated media speeds, use this to validate
@@ -1964,10 +1972,13 @@ static int phylink_validate_phy(struct phylink *pl, struct phy_device *phy,
phy->possible_interfaces,
(int)PHY_INTERFACE_MODE_MAX, interfaces);
- return phylink_validate_mask(pl, phy, supported, state,
+ return phylink_validate_mask(pl, phy, mode, supported, state,
interfaces);
}
+ phylink_dbg(pl, "PHY %s doesn't supply possible interfaces\n",
+ phydev_name(phy));
+
/* Check whether we would use rate matching for the proposed interface
* mode.
*/
@@ -1990,7 +2001,7 @@ static int phylink_validate_phy(struct phylink *pl, struct phy_device *phy,
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);
}
static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy,
@@ -2698,7 +2709,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),
@@ -2708,7 +2720,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;
}
@@ -3369,7 +3382,7 @@ static int phylink_sfp_config_phy(struct phylink *pl, u8 mode,
config.pause = MLO_PAUSE_AN;
/* 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,
@@ -3387,7 +3400,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",
@@ -3439,8 +3452,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, NULL, pl->sfp_support, &config,
- interfaces);
+ ret = phylink_validate_mask(pl, NULL, 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);
@@ -3459,7 +3472,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,