lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-Id: <20221017202241.1741671-5-sean.anderson@seco.com> Date: Mon, 17 Oct 2022 16:22:35 -0400 From: Sean Anderson <sean.anderson@...o.com> To: "David S . Miller" <davem@...emloft.net>, Jakub Kicinski <kuba@...nel.org>, Madalin Bucur <madalin.bucur@....com>, Camelia Alexandra Groza <camelia.groza@....com>, netdev@...r.kernel.org Cc: Eric Dumazet <edumazet@...gle.com>, "linuxppc-dev @ lists . ozlabs . org" <linuxppc-dev@...ts.ozlabs.org>, linux-arm-kernel@...ts.infradead.org, linux-kernel@...r.kernel.org, Russell King <linux@...linux.org.uk>, Paolo Abeni <pabeni@...hat.com>, "Russell King (Oracle)" <rmk+kernel@...linux.org.uk>, Sean Anderson <sean.anderson@...o.com> Subject: [PATCH net-next v7 04/10] net: phylink: provide phylink_validate_mask_caps() helper From: "Russell King (Oracle)" <rmk+kernel@...linux.org.uk> Provide a helper that restricts the link modes according to the phylink capabilities. Signed-off-by: Russell King (Oracle) <rmk+kernel@...linux.org.uk> [rebased on net-next/master and added documentation] Signed-off-by: Sean Anderson <sean.anderson@...o.com> --- Changes in v7: - New drivers/net/phy/phylink.c | 43 +++++++++++++++++++++++++++------------ include/linux/phylink.h | 3 +++ 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c index 75464df191ef..ef10f5a70e5a 100644 --- a/drivers/net/phy/phylink.c +++ b/drivers/net/phy/phylink.c @@ -561,6 +561,35 @@ unsigned long phylink_get_capabilities(phy_interface_t interface, } EXPORT_SYMBOL_GPL(phylink_get_capabilities); +/** + * phylink_validate_mask_caps() - Restrict link modes based on caps + * @supported: ethtool bitmask for supported link modes. + * @state: an (optional) pointer to a &struct phylink_link_state. + * @mac_capabilities: bitmask of MAC capabilities + * + * Calculate the supported link modes based on @mac_capabilities, and restrict + * @supported and @state based on that. Use this function if your capabiliies + * aren't constant, such as if they vary depending on the interface. + */ +void phylink_validate_mask_caps(unsigned long *supported, + struct phylink_link_state *state, + unsigned long mac_capabilities) +{ + __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; + unsigned long caps; + + phylink_set_port_modes(mask); + phylink_set(mask, Autoneg); + caps = phylink_get_capabilities(state->interface, mac_capabilities, + state->rate_matching); + 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. @@ -569,24 +598,12 @@ EXPORT_SYMBOL_GPL(phylink_get_capabilities); * * Generic implementation of the validate() callback that MAC drivers can * use when they pass the range of supported interfaces and MAC capabilities. - * This makes use of phylink_get_linkmodes(). */ 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; - - phylink_set_port_modes(mask); - phylink_set(mask, Autoneg); - caps = phylink_get_capabilities(state->interface, - config->mac_capabilities, - state->rate_matching); - phylink_caps_to_linkmodes(mask, caps); - - linkmode_and(supported, supported, mask); - linkmode_and(state->advertising, state->advertising, mask); + phylink_validate_mask_caps(supported, state, config->mac_capabilities); } EXPORT_SYMBOL_GPL(phylink_generic_validate); diff --git a/include/linux/phylink.h b/include/linux/phylink.h index 664dd409feb9..c29c3f174972 100644 --- a/include/linux/phylink.h +++ b/include/linux/phylink.h @@ -556,6 +556,9 @@ void phylink_caps_to_linkmodes(unsigned long *linkmodes, unsigned long caps); unsigned long phylink_get_capabilities(phy_interface_t interface, unsigned long mac_capabilities, int rate_matching); +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); -- 2.35.1.1320.gc452695387.dirty
Powered by blists - more mailing lists