mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-03 22:44:27 -05: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>
		
			
				
	
	
		
			121 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 36569971241ae6b81376da4937d2c8760122d10b Mon Sep 17 00:00:00 2001
 | 
						|
From: Russell King <rmk+kernel@armlinux.org.uk>
 | 
						|
Date: Thu, 21 Nov 2019 17:58:58 +0000
 | 
						|
Subject: [PATCH 652/660] net: phylink: split phylink_sfp_module_insert()
 | 
						|
 | 
						|
Split out the configuration step from phylink_sfp_module_insert() so
 | 
						|
we can re-use this later.
 | 
						|
 | 
						|
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
 | 
						|
---
 | 
						|
 drivers/net/phy/phylink.c | 47 +++++++++++++++++++++++----------------
 | 
						|
 1 file changed, 28 insertions(+), 19 deletions(-)
 | 
						|
 | 
						|
--- a/drivers/net/phy/phylink.c
 | 
						|
+++ b/drivers/net/phy/phylink.c
 | 
						|
@@ -1633,25 +1633,21 @@ static void phylink_sfp_detach(void *ups
 | 
						|
 	pl->netdev->sfp_bus = NULL;
 | 
						|
 }
 | 
						|
 
 | 
						|
-static int phylink_sfp_module_insert(void *upstream,
 | 
						|
-				     const struct sfp_eeprom_id *id)
 | 
						|
+static int phylink_sfp_config(struct phylink *pl, u8 mode, u8 port,
 | 
						|
+			      const unsigned long *supported,
 | 
						|
+			      const unsigned long *advertising)
 | 
						|
 {
 | 
						|
-	struct phylink *pl = upstream;
 | 
						|
-	__ETHTOOL_DECLARE_LINK_MODE_MASK(support) = { 0, };
 | 
						|
 	__ETHTOOL_DECLARE_LINK_MODE_MASK(support1);
 | 
						|
+	__ETHTOOL_DECLARE_LINK_MODE_MASK(support);
 | 
						|
 	struct phylink_link_state config;
 | 
						|
 	phy_interface_t iface;
 | 
						|
-	int ret = 0;
 | 
						|
 	bool changed;
 | 
						|
-	u8 port;
 | 
						|
+	int ret;
 | 
						|
 
 | 
						|
-	ASSERT_RTNL();
 | 
						|
-
 | 
						|
-	sfp_parse_support(pl->sfp_bus, id, support);
 | 
						|
-	port = sfp_parse_port(pl->sfp_bus, id, support);
 | 
						|
+	linkmode_copy(support, supported);
 | 
						|
 
 | 
						|
 	memset(&config, 0, sizeof(config));
 | 
						|
-	linkmode_copy(config.advertising, support);
 | 
						|
+	linkmode_copy(config.advertising, advertising);
 | 
						|
 	config.interface = PHY_INTERFACE_MODE_NA;
 | 
						|
 	config.speed = SPEED_UNKNOWN;
 | 
						|
 	config.duplex = DUPLEX_UNKNOWN;
 | 
						|
@@ -1666,8 +1662,6 @@ static int phylink_sfp_module_insert(voi
 | 
						|
 		return ret;
 | 
						|
 	}
 | 
						|
 
 | 
						|
-	linkmode_copy(support1, support);
 | 
						|
-
 | 
						|
 	iface = sfp_select_interface(pl->sfp_bus, config.advertising);
 | 
						|
 	if (iface == PHY_INTERFACE_MODE_NA) {
 | 
						|
 		netdev_err(pl->netdev,
 | 
						|
@@ -1677,18 +1671,18 @@ static int phylink_sfp_module_insert(voi
 | 
						|
 	}
 | 
						|
 
 | 
						|
 	config.interface = iface;
 | 
						|
+	linkmode_copy(support1, support);
 | 
						|
 	ret = phylink_validate(pl, support1, &config);
 | 
						|
 	if (ret) {
 | 
						|
 		netdev_err(pl->netdev, "validation of %s/%s with support %*pb failed: %d\n",
 | 
						|
-			   phylink_an_mode_str(MLO_AN_INBAND),
 | 
						|
+			   phylink_an_mode_str(mode),
 | 
						|
 			   phy_modes(config.interface),
 | 
						|
 			   __ETHTOOL_LINK_MODE_MASK_NBITS, support, ret);
 | 
						|
 		return ret;
 | 
						|
 	}
 | 
						|
 
 | 
						|
 	netdev_dbg(pl->netdev, "requesting link mode %s/%s with support %*pb\n",
 | 
						|
-		   phylink_an_mode_str(MLO_AN_INBAND),
 | 
						|
-		   phy_modes(config.interface),
 | 
						|
+		   phylink_an_mode_str(mode), phy_modes(config.interface),
 | 
						|
 		   __ETHTOOL_LINK_MODE_MASK_NBITS, support);
 | 
						|
 
 | 
						|
 	if (phy_interface_mode_is_8023z(iface) && pl->phydev)
 | 
						|
@@ -1701,15 +1695,15 @@ static int phylink_sfp_module_insert(voi
 | 
						|
 		linkmode_copy(pl->link_config.advertising, config.advertising);
 | 
						|
 	}
 | 
						|
 
 | 
						|
-	if (pl->cur_link_an_mode != MLO_AN_INBAND ||
 | 
						|
+	if (pl->cur_link_an_mode != mode ||
 | 
						|
 	    pl->link_config.interface != config.interface) {
 | 
						|
 		pl->link_config.interface = config.interface;
 | 
						|
-		pl->cur_link_an_mode = MLO_AN_INBAND;
 | 
						|
+		pl->cur_link_an_mode = mode;
 | 
						|
 
 | 
						|
 		changed = true;
 | 
						|
 
 | 
						|
 		netdev_info(pl->netdev, "switched to %s/%s link mode\n",
 | 
						|
-			    phylink_an_mode_str(MLO_AN_INBAND),
 | 
						|
+			    phylink_an_mode_str(mode),
 | 
						|
 			    phy_modes(config.interface));
 | 
						|
 	}
 | 
						|
 
 | 
						|
@@ -1722,6 +1716,21 @@ static int phylink_sfp_module_insert(voi
 | 
						|
 	return ret;
 | 
						|
 }
 | 
						|
 
 | 
						|
+static int phylink_sfp_module_insert(void *upstream,
 | 
						|
+				     const struct sfp_eeprom_id *id)
 | 
						|
+{
 | 
						|
+	struct phylink *pl = upstream;
 | 
						|
+	__ETHTOOL_DECLARE_LINK_MODE_MASK(support) = { 0, };
 | 
						|
+	u8 port;
 | 
						|
+
 | 
						|
+	ASSERT_RTNL();
 | 
						|
+
 | 
						|
+	sfp_parse_support(pl->sfp_bus, id, support);
 | 
						|
+	port = sfp_parse_port(pl->sfp_bus, id, support);
 | 
						|
+
 | 
						|
+	return phylink_sfp_config(pl, MLO_AN_INBAND, port, support, support);
 | 
						|
+}
 | 
						|
+
 | 
						|
 static int phylink_sfp_module_start(void *upstream)
 | 
						|
 {
 | 
						|
 	struct phylink *pl = upstream;
 |