diff options
author | Russell King (Oracle) <rmk+kernel@armlinux.org.uk> | 2022-06-10 15:13:48 +0100 |
---|---|---|
committer | Russell King (Oracle) <rmk+kernel@armlinux.org.uk> | 2022-10-03 17:20:15 +0100 |
commit | e65a47c4053255bd51715d5550e21c869971258c (patch) | |
tree | 86ef53de9729261d7e88e9d4b422a6d9a701e814 | |
parent | 1b0389a94e6724e60890986645c2ee18a346a06a (diff) |
net: phylink: provide phylink_validate_mask_caps() helper
Provide a helper that restricts the link modes according to the
phylink capabilities.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
-rw-r--r-- | drivers/net/phy/phylink.c | 25 | ||||
-rw-r--r-- | include/linux/phylink.h | 3 |
2 files changed, 22 insertions, 6 deletions
diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c index d92569406fdd..15a665a49324 100644 --- a/drivers/net/phy/phylink.c +++ b/drivers/net/phy/phylink.c @@ -405,6 +405,22 @@ void phylink_get_linkmodes(unsigned long *linkmodes, phy_interface_t interface, } EXPORT_SYMBOL_GPL(phylink_get_linkmodes); +void phylink_validate_mask_caps(unsigned long *supported, + struct phylink_link_state *state, + unsigned long caps) +{ + __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; + + phylink_set_port_modes(mask); + phylink_set(mask, Autoneg); + phylink_caps_to_linkmodes(mask, caps); + + linkmode_and(supported, supported, mask); + if (state) + linkmode_and(state->advertising, state->advertising, mask); +} +EXPORT_SYMBOL_GPL(phylink_validate_mask_caps); + /** * phylink_generic_validate() - generic validate() callback implementation * @config: a pointer to a &struct phylink_config. @@ -419,14 +435,11 @@ void phylink_generic_validate(struct phylink_config *config, unsigned long *supported, struct phylink_link_state *state) { - __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; + unsigned long caps = config->mac_capabilities; - phylink_set_port_modes(mask); - phylink_set(mask, Autoneg); - phylink_get_linkmodes(mask, state->interface, config->mac_capabilities); + caps &= phylink_interface_to_caps(state->interface); - linkmode_and(supported, supported, mask); - linkmode_and(state->advertising, state->advertising, mask); + phylink_validate_mask_caps(supported, state, caps); } EXPORT_SYMBOL_GPL(phylink_generic_validate); diff --git a/include/linux/phylink.h b/include/linux/phylink.h index 52700b05ea84..59ab34e85a34 100644 --- a/include/linux/phylink.h +++ b/include/linux/phylink.h @@ -553,6 +553,9 @@ void pcs_link_up(struct phylink_pcs *pcs, unsigned int mode, unsigned long phylink_interface_to_caps(phy_interface_t interface); void phylink_get_linkmodes(unsigned long *linkmodes, phy_interface_t interface, unsigned long mac_capabilities); +void phylink_validate_mask_caps(unsigned long *supported, + struct phylink_link_state *state, + unsigned long caps); void phylink_generic_validate(struct phylink_config *config, unsigned long *supported, struct phylink_link_state *state); |