[PATCH net-next 06/13] net: phy: phy_caps: Move phy_speeds to phy_caps
From: Maxime Chevallier <maxime.chevallier@bootlin.com>
Date: 2025-02-22 14:27:42
Also in:
linux-arm-kernel, lkml
Subsystem:
ethernet phy library, networking drivers, the rest · Maintainers:
Andrew Lunn, Heiner Kallweit, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
Use the newly introduced link_capabilities array to derive the list of possible speeds when given a combination of linkmodes. As link_capabilities is indexed by speed, we don't have to iterate the whole phy_settings array. Signed-off-by: Maxime Chevallier <maxime.chevallier@bootlin.com> --- drivers/net/phy/phy-caps.h | 3 +++ drivers/net/phy/phy-core.c | 15 --------------- drivers/net/phy/phy.c | 4 +++- drivers/net/phy/phy_caps.c | 27 +++++++++++++++++++++++++++ include/linux/phy.h | 2 -- 5 files changed, 33 insertions(+), 18 deletions(-)
diff --git a/drivers/net/phy/phy-caps.h b/drivers/net/phy/phy-caps.h
index 0c7543280fa3..d4cd91fd0911 100644
--- a/drivers/net/phy/phy-caps.h
+++ b/drivers/net/phy/phy-caps.h@@ -21,4 +21,7 @@ void linkmode_from_caps(unsigned long *linkmode, unsigned long caps); unsigned long phy_interface_caps(phy_interface_t interface); int phy_interface_max_speed(phy_interface_t interface); +size_t phy_caps_speeds(unsigned int *speeds, size_t size, + unsigned long *linkmodes); + #endif /* __PHY_CAPS_H */
diff --git a/drivers/net/phy/phy-core.c b/drivers/net/phy/phy-core.c
index 2fd1d153abc9..e2850d6fe158 100644
--- a/drivers/net/phy/phy-core.c
+++ b/drivers/net/phy/phy-core.c@@ -337,21 +337,6 @@ phy_lookup_setting(int speed, int duplex, const unsigned long *mask, bool exact) } EXPORT_SYMBOL_GPL(phy_lookup_setting); -size_t phy_speeds(unsigned int *speeds, size_t size, - unsigned long *mask) -{ - size_t count; - int i; - - for (i = 0, count = 0; i < ARRAY_SIZE(settings) && count < size; i++) - if (settings[i].bit < __ETHTOOL_LINK_MODE_MASK_NBITS && - test_bit(settings[i].bit, mask) && - (count == 0 || speeds[count - 1] != settings[i].speed)) - speeds[count++] = settings[i].speed; - - return count; -} - static void __set_linkmode_max_speed(u32 max_speed, unsigned long *addr) { const struct phy_setting *p;
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index 831b36839627..2b9e326bad61 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c@@ -36,6 +36,8 @@ #include <net/genetlink.h> #include <net/sock.h> +#include "phy-caps.h" + #define PHY_STATE_TIME HZ #define PHY_STATE_STR(_state) \
@@ -243,7 +245,7 @@ unsigned int phy_supported_speeds(struct phy_device *phy, unsigned int *speeds, unsigned int size) { - return phy_speeds(speeds, size, phy->supported); + return phy_caps_speeds(speeds, size, phy->supported); } /**
diff --git a/drivers/net/phy/phy_caps.c b/drivers/net/phy/phy_caps.c
index 55ac08edf151..ee8aa1217a6e 100644
--- a/drivers/net/phy/phy_caps.c
+++ b/drivers/net/phy/phy_caps.c@@ -102,6 +102,33 @@ void phy_caps_init(void) } } +/** + * phy_caps_speeds() - Fill an array of supported SPEED_* values for given modes + * @speeds: Output array to store the speeds list into + * @size: Size of the output array + * @linkmodes: Linkmodes to get the speeds from + * + * Fills the speeds array with all possible speeds that can be achieved with + * the specified linkmodes. + * + * Returns: The number of speeds filled into the array. If the input array isn't + * big enough to store all speeds, fill it as much as possible. + */ +size_t phy_caps_speeds(unsigned int *speeds, size_t size, + unsigned long *linkmodes) +{ + size_t count; + int capa; + + for (capa = 0, count = 0; capa < __LINK_CAPA_MAX && count < size; capa++) { + if (linkmode_intersects(link_caps[capa].linkmodes, linkmodes) && + (count == 0 || speeds[count - 1] != link_caps[capa].speed)) + speeds[count++] = link_caps[capa].speed; + } + + return count; +} + /** * linkmode_from_caps() - Convert capabilities to ethtool link modes * @linkmodes: ethtool linkmode mask (must be already initialised)
diff --git a/include/linux/phy.h b/include/linux/phy.h
index 13be48d3b8b3..b582590427bc 100644
--- a/include/linux/phy.h
+++ b/include/linux/phy.h@@ -1329,8 +1329,6 @@ struct phy_setting { const struct phy_setting * phy_lookup_setting(int speed, int duplex, const unsigned long *mask, bool exact); -size_t phy_speeds(unsigned int *speeds, size_t size, - unsigned long *mask); void of_set_phy_supported(struct phy_device *phydev); void of_set_phy_eee_broken(struct phy_device *phydev); void of_set_phy_timing_role(struct phy_device *phydev);
--
2.48.1