mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-30 21:44:27 -04:00 
			
		
		
		
	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;
 | |
|  
 |