Add support for Methode DM7052 NBASE-T module to OpenWRT. These patches are taken from my "phy" branch, and will be sent for the next kernel merge window. Signed-off-by: Russell King <linux@armlinux.org.uk> [jonas.gorski: move patches to pending, refresh patches] Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
		
			
				
	
	
		
			59 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 3d8592a23dd67fb78ad85ddf711a059d3880fcb4 Mon Sep 17 00:00:00 2001
 | 
						|
From: Russell King <rmk+kernel@armlinux.org.uk>
 | 
						|
Date: Fri, 8 Nov 2019 17:19:16 +0000
 | 
						|
Subject: [PATCH 654/660] net: phylink: make Broadcom BCM84881 based SFPs work
 | 
						|
 | 
						|
The Broadcom BCM84881 does not appear to send the SGMII control word
 | 
						|
when operating in SGMII mode, which causes network adapters to fail
 | 
						|
to link with the PHY, or decide to operate at fixed 1G speed, even if
 | 
						|
the PHY negotiated 100M.
 | 
						|
 | 
						|
Work around this by detecting the Broadcom BCM84881 and switch to phy
 | 
						|
mode rather than inband mode.
 | 
						|
 | 
						|
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
 | 
						|
---
 | 
						|
 drivers/net/phy/phylink.c | 17 ++++++++++++++++-
 | 
						|
 1 file changed, 16 insertions(+), 1 deletion(-)
 | 
						|
 | 
						|
--- a/drivers/net/phy/phylink.c
 | 
						|
+++ b/drivers/net/phy/phylink.c
 | 
						|
@@ -1787,12 +1787,22 @@ static void phylink_sfp_link_up(void *up
 | 
						|
 	phylink_run_resolve(pl);
 | 
						|
 }
 | 
						|
 
 | 
						|
+/* The Broadcom BCM84881 in the Methode DM7052 is unable to provide a SGMII
 | 
						|
+ * or 802.3z control word, so inband will not work.
 | 
						|
+ */
 | 
						|
+static bool phylink_phy_no_inband(struct phy_device *phy)
 | 
						|
+{
 | 
						|
+	return phy->is_c45 &&
 | 
						|
+		(phy->c45_ids.device_ids[1] & 0xfffffff0) == 0xae025150;
 | 
						|
+}
 | 
						|
+
 | 
						|
 static int phylink_sfp_connect_phy(void *upstream, struct phy_device *phy)
 | 
						|
 {
 | 
						|
 	struct phylink *pl = upstream;
 | 
						|
 	__ETHTOOL_DECLARE_LINK_MODE_MASK(supported);
 | 
						|
 	__ETHTOOL_DECLARE_LINK_MODE_MASK(advertising);
 | 
						|
 	phy_interface_t interface;
 | 
						|
+	u8 mode;
 | 
						|
 	int ret;
 | 
						|
 
 | 
						|
 	/*
 | 
						|
@@ -1807,8 +1817,13 @@ static int phylink_sfp_connect_phy(void
 | 
						|
 	ethtool_convert_legacy_u32_to_link_mode(supported, phy->supported);
 | 
						|
 	ethtool_convert_legacy_u32_to_link_mode(advertising, phy->advertising);
 | 
						|
 
 | 
						|
+	if (phylink_phy_no_inband(phy))
 | 
						|
+		mode = MLO_AN_PHY;
 | 
						|
+	else
 | 
						|
+		mode = MLO_AN_INBAND;
 | 
						|
+
 | 
						|
 	/* Do the initial configuration */
 | 
						|
-	ret = phylink_sfp_config(pl, ML_AN_INBAND, supported, advertising);
 | 
						|
+	ret = phylink_sfp_config(pl, mode, supported, advertising);
 | 
						|
 	if (ret < 0)
 | 
						|
 		return ret;
 | 
						|
 
 |