summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>2022-06-10 15:13:48 +0100
committerRussell King (Oracle) <rmk+kernel@armlinux.org.uk>2022-10-03 17:20:15 +0100
commite65a47c4053255bd51715d5550e21c869971258c (patch)
tree86ef53de9729261d7e88e9d4b422a6d9a701e814
parent1b0389a94e6724e60890986645c2ee18a346a06a (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.c25
-rw-r--r--include/linux/phylink.h3
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);