summaryrefslogtreecommitdiff
path: root/target/linux/mvebu/patches-4.9/410-net-phy-allow-settings-table-to-support-more-than-32.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/mvebu/patches-4.9/410-net-phy-allow-settings-table-to-support-more-than-32.patch')
-rw-r--r--target/linux/mvebu/patches-4.9/410-net-phy-allow-settings-table-to-support-more-than-32.patch142
1 files changed, 142 insertions, 0 deletions
diff --git a/target/linux/mvebu/patches-4.9/410-net-phy-allow-settings-table-to-support-more-than-32.patch b/target/linux/mvebu/patches-4.9/410-net-phy-allow-settings-table-to-support-more-than-32.patch
new file mode 100644
index 0000000..b6d8505
--- /dev/null
+++ b/target/linux/mvebu/patches-4.9/410-net-phy-allow-settings-table-to-support-more-than-32.patch
@@ -0,0 +1,142 @@
+From: Russell King <rmk+kernel@armlinux.org.uk>
+Date: Thu, 5 Jan 2017 16:32:14 +0000
+Subject: [PATCH] net: phy: allow settings table to support more than 32
+ link modes
+
+Allow the phy settings table to support more than 32 link modes by
+switching to the ethtool link mode bit number representation, rather
+than storing the mask. This will allow phylink and other ethtool
+code to share the settings table to look up settings.
+
+Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
+---
+
+--- a/drivers/net/phy/phy.c
++++ b/drivers/net/phy/phy.c
+@@ -175,7 +175,7 @@ static inline int phy_aneg_done(struct p
+ struct phy_setting {
+ int speed;
+ int duplex;
+- u32 setting;
++ int bit;
+ };
+
+ /* A mapping of all SUPPORTED settings to speed/duplex. This table
+@@ -185,57 +185,57 @@ static const struct phy_setting settings
+ {
+ .speed = SPEED_10000,
+ .duplex = DUPLEX_FULL,
+- .setting = SUPPORTED_10000baseKR_Full,
++ .bit = ETHTOOL_LINK_MODE_10000baseKR_Full_BIT,
+ },
+ {
+ .speed = SPEED_10000,
+ .duplex = DUPLEX_FULL,
+- .setting = SUPPORTED_10000baseKX4_Full,
++ .bit = ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT,
+ },
+ {
+ .speed = SPEED_10000,
+ .duplex = DUPLEX_FULL,
+- .setting = SUPPORTED_10000baseT_Full,
++ .bit = ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
+ },
+ {
+ .speed = SPEED_2500,
+ .duplex = DUPLEX_FULL,
+- .setting = SUPPORTED_2500baseX_Full,
++ .bit = ETHTOOL_LINK_MODE_2500baseX_Full_BIT,
+ },
+ {
+ .speed = SPEED_1000,
+ .duplex = DUPLEX_FULL,
+- .setting = SUPPORTED_1000baseKX_Full,
++ .bit = ETHTOOL_LINK_MODE_1000baseKX_Full_BIT,
+ },
+ {
+ .speed = SPEED_1000,
+ .duplex = DUPLEX_FULL,
+- .setting = SUPPORTED_1000baseT_Full,
++ .bit = ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
+ },
+ {
+ .speed = SPEED_1000,
+ .duplex = DUPLEX_HALF,
+- .setting = SUPPORTED_1000baseT_Half,
++ .bit = ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
+ },
+ {
+ .speed = SPEED_100,
+ .duplex = DUPLEX_FULL,
+- .setting = SUPPORTED_100baseT_Full,
++ .bit = ETHTOOL_LINK_MODE_100baseT_Full_BIT,
+ },
+ {
+ .speed = SPEED_100,
+ .duplex = DUPLEX_HALF,
+- .setting = SUPPORTED_100baseT_Half,
++ .bit = ETHTOOL_LINK_MODE_100baseT_Half_BIT,
+ },
+ {
+ .speed = SPEED_10,
+ .duplex = DUPLEX_FULL,
+- .setting = SUPPORTED_10baseT_Full,
++ .bit = ETHTOOL_LINK_MODE_10baseT_Full_BIT,
+ },
+ {
+ .speed = SPEED_10,
+ .duplex = DUPLEX_HALF,
+- .setting = SUPPORTED_10baseT_Half,
++ .bit = ETHTOOL_LINK_MODE_10baseT_Half_BIT,
+ },
+ };
+
+@@ -243,7 +243,8 @@ static const struct phy_setting settings
+ * phy_lookup_setting - lookup a PHY setting
+ * @speed: speed to match
+ * @duplex: duplex to match
+- * @feature: allowed link modes
++ * @mask: allowed link modes
++ * @maxbit: bit size of link modes
+ * @exact: an exact match is required
+ *
+ * Search the settings array for a setting that matches the speed and
+@@ -257,13 +258,14 @@ static const struct phy_setting settings
+ * they all fail, %NULL will be returned.
+ */
+ static const struct phy_setting *
+-phy_lookup_setting(int speed, int duplex, u32 features, bool exact)
++phy_lookup_setting(int speed, int duplex, const unsigned long *mask,
++ size_t maxbit, bool exact)
+ {
+ const struct phy_setting *p, *match = NULL, *last = NULL;
+ int i;
+
+ for (i = 0, p = settings; i < ARRAY_SIZE(settings); i++, p++) {
+- if (p->setting & features) {
++ if (p->bit < maxbit && test_bit(p->bit, mask)) {
+ last = p;
+ if (p->speed == speed && p->duplex == duplex) {
+ /* Exact match for speed and duplex */
+@@ -302,7 +304,9 @@ phy_lookup_setting(int speed, int duplex
+ static const struct phy_setting *
+ phy_find_valid(int speed, int duplex, u32 supported)
+ {
+- return phy_lookup_setting(speed, duplex, supported, false);
++ unsigned long mask = supported;
++
++ return phy_lookup_setting(speed, duplex, &mask, BITS_PER_LONG, false);
+ }
+
+ /**
+@@ -316,7 +320,9 @@ phy_find_valid(int speed, int duplex, u3
+ */
+ static inline bool phy_check_valid(int speed, int duplex, u32 features)
+ {
+- return !!phy_lookup_setting(speed, duplex, features, true);
++ unsigned long mask = features;
++
++ return !!phy_lookup_setting(speed, duplex, &mask, BITS_PER_LONG, true);
+ }
+
+ /**