We may have some SoCs that can't achieve XGMAC max speed. Limit it if
asked to.

Signed-off-by: Jose Abreu <joab...@synopsys.com>

---
Cc: Giuseppe Cavallaro <peppe.cavall...@st.com>
Cc: Alexandre Torgue <alexandre.tor...@st.com>
Cc: Jose Abreu <joab...@synopsys.com>
Cc: "David S. Miller" <da...@davemloft.net>
Cc: Maxime Coquelin <mcoquelin.st...@gmail.com>
Cc: net...@vger.kernel.org
Cc: linux-arm-ker...@lists.infradead.org
Cc: linux-kernel@vger.kernel.org
---
 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 25 +++++++++++++++--------
 1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c 
b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index c3baca9f587b..686b82068142 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -831,15 +831,22 @@ static void stmmac_validate(struct phylink_config *config,
                phylink_set(mask, 1000baseT_Full);
                phylink_set(mask, 1000baseX_Full);
        } else if (priv->plat->has_xgmac) {
-               phylink_set(mac_supported, 2500baseT_Full);
-               phylink_set(mac_supported, 5000baseT_Full);
-               phylink_set(mac_supported, 10000baseSR_Full);
-               phylink_set(mac_supported, 10000baseLR_Full);
-               phylink_set(mac_supported, 10000baseER_Full);
-               phylink_set(mac_supported, 10000baseLRM_Full);
-               phylink_set(mac_supported, 10000baseT_Full);
-               phylink_set(mac_supported, 10000baseKX4_Full);
-               phylink_set(mac_supported, 10000baseKR_Full);
+               if (!max_speed || (max_speed >= 2500)) {
+                       phylink_set(mac_supported, 2500baseT_Full);
+                       phylink_set(mac_supported, 2500baseX_Full);
+               }
+               if (!max_speed || (max_speed >= 5000)) {
+                       phylink_set(mac_supported, 5000baseT_Full);
+               }
+               if (!max_speed || (max_speed >= 10000)) {
+                       phylink_set(mac_supported, 10000baseSR_Full);
+                       phylink_set(mac_supported, 10000baseLR_Full);
+                       phylink_set(mac_supported, 10000baseER_Full);
+                       phylink_set(mac_supported, 10000baseLRM_Full);
+                       phylink_set(mac_supported, 10000baseT_Full);
+                       phylink_set(mac_supported, 10000baseKX4_Full);
+                       phylink_set(mac_supported, 10000baseKR_Full);
+               }
        }
 
        /* Half-Duplex can only work with single queue */
-- 
2.7.4

Reply via email to