net: phy: phy_caps: Move phy_speeds to phy_caps
authorMaxime Chevallier <maxime.chevallier@bootlin.com>
Fri, 7 Mar 2025 17:36:00 +0000 (18:36 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 18 Mar 2025 08:03:11 +0000 (09:03 +0100)
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>
Link: https://patch.msgid.link/20250307173611.129125-4-maxime.chevallier@bootlin.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/phy/phy-caps.h
drivers/net/phy/phy-core.c
drivers/net/phy/phy.c
drivers/net/phy/phy_caps.c
include/linux/phy.h

index 6024f1d11a93c3583cd96c51b12a5f6c9987cf0d..5a5f4ee3006b87ebf21cdf4bd6dbab7de9007251 100644 (file)
@@ -40,4 +40,7 @@ struct link_capabilities {
 
 int phy_caps_init(void);
 
+size_t phy_caps_speeds(unsigned int *speeds, size_t size,
+                      unsigned long *linkmodes);
+
 #endif /* __PHY_CAPS_H */
index 31ed1ce3b62f15b95872fe9a3c81f5b5d004323c..102834b11de0e5e517cfbf47f5589070d2719ee1 100644 (file)
@@ -340,21 +340,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;
index 16ffc00b419ca5365eecc3ae27408d9483588c42..3128df03feda3e92f3b21d4a411194a8a827ea87 100644 (file)
@@ -37,6 +37,7 @@
 #include <net/sock.h>
 
 #include "phylib-internal.h"
+#include "phy-caps.h"
 
 #define PHY_STATE_TIME HZ
 
@@ -245,7 +246,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);
 }
 
 /**
index 6cb18e216d97a36e299208b6488d7e1b2815a133..8ce91257160fc0107b9cade6ae83e667bcdd4d0e 100644 (file)
@@ -57,6 +57,9 @@ static int speed_duplex_to_capa(int speed, unsigned int duplex)
        return -EINVAL;
 }
 
+#define for_each_link_caps_asc_speed(cap) \
+       for (cap = link_caps; cap < &link_caps[__LINK_CAPA_MAX]; cap++)
+
 /**
  * phy_caps_init() - Initializes the link_caps array from the link_mode_params.
  *
@@ -88,3 +91,33 @@ int phy_caps_init(void)
 
        return 0;
 }
+
+/**
+ * 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)
+{
+       struct link_capabilities *lcap;
+       size_t count = 0;
+
+       for_each_link_caps_asc_speed(lcap) {
+               if (linkmode_intersects(lcap->linkmodes, linkmodes) &&
+                   (count == 0 || speeds[count - 1] != lcap->speed)) {
+                       speeds[count++] = lcap->speed;
+                       if (count >= size)
+                               break;
+               }
+       }
+
+       return count;
+}
index 61a8cb9d1247778c377a44db7ee4575f21956430..83c50bb21939197c7e5cd9f4dda6d49428dd9c3a 100644 (file)
@@ -1287,8 +1287,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);
 
 /**
  * phy_is_started - Convenience function to check whether PHY is started