netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [net-next: PATCH v7 0/7] dsa: lan9303: Move to PHYLINK
@ 2023-01-17 20:56 Jerry Ray
  2023-01-17 20:56 ` [net-next: PATCH v7 1/7] dsa: lan9303: align dsa_switch_ops members Jerry Ray
                   ` (7 more replies)
  0 siblings, 8 replies; 9+ messages in thread
From: Jerry Ray @ 2023-01-17 20:56 UTC (permalink / raw)
  To: Andrew Lunn, Florian Fainelli, Vladimir Oltean, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Russell King, jbe,
	netdev, linux-kernel, Jerry Ray

This patch series moves the lan9303 driver to use the phylink
api away from phylib.

Migrating to phylink means removing the .adjust_link api. The
functionality from the adjust_link is moved to the phylink_mac_link_up
api.  The code being removed only affected the cpu port.  The other
ports on the LAN9303 do not need anything from the phylink_mac_link_up
api.

Patches:
 0001 - Whitespace only change aligning the dsa_switch_ops members.
	No code changes.
 0002 - Moves the Turbo bit initialization out of the adjust_link api and
	places it in a driver initialization execution path. It only needs
	to be initialized once, it is never changed, and it is not a
	per-port flag.
 0003 - Adds exception handling logic in the extremely unlikely event that
	the read of the device fails.
 0004 - Performance optimization that skips a slow register write if there
	is no need to perform it.
 0005 - Change the way we identify the xMII port as phydev will be NULL
	when this logic is moved into phylink_mac_link_up.
 0006 - Removes adjust_link and begins using the phylink dsa_switch_ops
	apis.
 0007 - Adds XMII port flow control settings in the phylink_mac_link_up()
	api while cleaning up the ANEG / speed / duplex implementation.
---
v6->v7:
  - Moved the initialization of the Turbo bit into lan9303_setup().
  - Added a macro for determining is a port is an XMII port.
  - Added setting the XMII flow control in the phylink_mac_link_up() API.
  - removed unnecessary error handling and cleaned up the code flow in
    phylink_mac_link_up().
v5->v6:
  - Moved to using port number to identify xMII port for the LAN9303.
v4->v5:
  - Created prep patches to better show how things migrate.
  - cleaned up comments.
v3->v4:
  - Addressed whitespace issues as a separate patch.
  - Removed port_max_mtu api patch as it is unrelated to phylink migration.
  - Reworked the implementation to preserve the adjust_link functionality
    by including it in the phylink_mac_link_up api.
v2->v3:
  Added back in disabling Turbo Mode on the CPU MII interface.
  Removed the unnecessary clearing of the phy supported interfaces.
v1->v2:
  corrected the reported mtu size, removing ETH_HLEN and ETH_FCS_LEN

 drivers/net/dsa/lan9303-core.c | xx ++++++++++++--------
 1 file changed


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [net-next: PATCH v7 1/7] dsa: lan9303: align dsa_switch_ops members
  2023-01-17 20:56 [net-next: PATCH v7 0/7] dsa: lan9303: Move to PHYLINK Jerry Ray
@ 2023-01-17 20:56 ` Jerry Ray
  2023-01-17 20:56 ` [net-next: PATCH v7 2/7] dsa: lan9303: move Turbo Mode bit init Jerry Ray
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Jerry Ray @ 2023-01-17 20:56 UTC (permalink / raw)
  To: Andrew Lunn, Florian Fainelli, Vladimir Oltean, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Russell King, jbe,
	netdev, linux-kernel, Jerry Ray

Whitespace preparatory patch, making the dsa_switch_ops table consistent.
No code is added or removed.

Signed-off-by: Jerry Ray <jerry.ray@microchip.com>
---
 drivers/net/dsa/lan9303-core.c | 38 +++++++++++++++++-----------------
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/drivers/net/dsa/lan9303-core.c b/drivers/net/dsa/lan9303-core.c
index 2e270b479143..f8f6f79052e3 100644
--- a/drivers/net/dsa/lan9303-core.c
+++ b/drivers/net/dsa/lan9303-core.c
@@ -1282,25 +1282,25 @@ static int lan9303_port_mdb_del(struct dsa_switch *ds, int port,
 }
 
 static const struct dsa_switch_ops lan9303_switch_ops = {
-	.get_tag_protocol = lan9303_get_tag_protocol,
-	.setup = lan9303_setup,
-	.get_strings = lan9303_get_strings,
-	.phy_read = lan9303_phy_read,
-	.phy_write = lan9303_phy_write,
-	.adjust_link = lan9303_adjust_link,
-	.get_ethtool_stats = lan9303_get_ethtool_stats,
-	.get_sset_count = lan9303_get_sset_count,
-	.port_enable = lan9303_port_enable,
-	.port_disable = lan9303_port_disable,
-	.port_bridge_join       = lan9303_port_bridge_join,
-	.port_bridge_leave      = lan9303_port_bridge_leave,
-	.port_stp_state_set     = lan9303_port_stp_state_set,
-	.port_fast_age          = lan9303_port_fast_age,
-	.port_fdb_add           = lan9303_port_fdb_add,
-	.port_fdb_del           = lan9303_port_fdb_del,
-	.port_fdb_dump          = lan9303_port_fdb_dump,
-	.port_mdb_add           = lan9303_port_mdb_add,
-	.port_mdb_del           = lan9303_port_mdb_del,
+	.get_tag_protocol	= lan9303_get_tag_protocol,
+	.setup			= lan9303_setup,
+	.get_strings		= lan9303_get_strings,
+	.phy_read		= lan9303_phy_read,
+	.phy_write		= lan9303_phy_write,
+	.adjust_link		= lan9303_adjust_link,
+	.get_ethtool_stats	= lan9303_get_ethtool_stats,
+	.get_sset_count		= lan9303_get_sset_count,
+	.port_enable		= lan9303_port_enable,
+	.port_disable		= lan9303_port_disable,
+	.port_bridge_join	= lan9303_port_bridge_join,
+	.port_bridge_leave	= lan9303_port_bridge_leave,
+	.port_stp_state_set	= lan9303_port_stp_state_set,
+	.port_fast_age		= lan9303_port_fast_age,
+	.port_fdb_add		= lan9303_port_fdb_add,
+	.port_fdb_del		= lan9303_port_fdb_del,
+	.port_fdb_dump		= lan9303_port_fdb_dump,
+	.port_mdb_add		= lan9303_port_mdb_add,
+	.port_mdb_del		= lan9303_port_mdb_del,
 };
 
 static int lan9303_register_switch(struct lan9303 *chip)
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [net-next: PATCH v7 2/7] dsa: lan9303: move Turbo Mode bit init
  2023-01-17 20:56 [net-next: PATCH v7 0/7] dsa: lan9303: Move to PHYLINK Jerry Ray
  2023-01-17 20:56 ` [net-next: PATCH v7 1/7] dsa: lan9303: align dsa_switch_ops members Jerry Ray
@ 2023-01-17 20:56 ` Jerry Ray
  2023-01-17 20:56 ` [net-next: PATCH v7 3/7] dsa: lan9303: Add exception logic for read failure Jerry Ray
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Jerry Ray @ 2023-01-17 20:56 UTC (permalink / raw)
  To: Andrew Lunn, Florian Fainelli, Vladimir Oltean, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Russell King, jbe,
	netdev, linux-kernel, Jerry Ray

In preparing to remove the .adjust_link api, I am moving the one-time
initialization of the device's Turbo Mode bit into a different execution
path. This code clears (disables) the Turbo Mode bit which is never used
by this driver. Turbo Mode is a non-standard mode that would allow the
100Mbps RMII interface to run at 200Mbps.

Signed-off-by: Jerry Ray <jerry.ray@microchip.com>
---
 drivers/net/dsa/lan9303-core.c | 16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/drivers/net/dsa/lan9303-core.c b/drivers/net/dsa/lan9303-core.c
index f8f6f79052e3..63f5c1ef65e2 100644
--- a/drivers/net/dsa/lan9303-core.c
+++ b/drivers/net/dsa/lan9303-core.c
@@ -902,6 +902,7 @@ static int lan9303_setup(struct dsa_switch *ds)
 {
 	struct lan9303 *chip = ds->priv;
 	int ret;
+	u32 reg;
 
 	/* Make sure that port 0 is the cpu port */
 	if (!dsa_is_cpu_port(ds, 0)) {
@@ -909,6 +910,12 @@ static int lan9303_setup(struct dsa_switch *ds)
 		return -EINVAL;
 	}
 
+	/* Virtual Phy: Remove Turbo 200Mbit mode */
+	lan9303_read(chip->regmap, LAN9303_VIRT_SPECIAL_CTRL, &reg);
+
+	reg &= ~LAN9303_VIRT_SPECIAL_TURBO;
+	regmap_write(chip->regmap, LAN9303_VIRT_SPECIAL_CTRL, reg);
+
 	ret = lan9303_setup_tagging(chip);
 	if (ret)
 		dev_err(chip->dev, "failed to setup port tagging %d\n", ret);
@@ -1052,7 +1059,6 @@ static int lan9303_phy_write(struct dsa_switch *ds, int phy, int regnum,
 static void lan9303_adjust_link(struct dsa_switch *ds, int port,
 				struct phy_device *phydev)
 {
-	struct lan9303 *chip = ds->priv;
 	int ctl;
 
 	if (!phy_is_pseudo_fixed_link(phydev))
@@ -1075,14 +1081,6 @@ static void lan9303_adjust_link(struct dsa_switch *ds, int port,
 		ctl &= ~BMCR_FULLDPLX;
 
 	lan9303_phy_write(ds, port, MII_BMCR, ctl);
-
-	if (port == chip->phy_addr_base) {
-		/* Virtual Phy: Remove Turbo 200Mbit mode */
-		lan9303_read(chip->regmap, LAN9303_VIRT_SPECIAL_CTRL, &ctl);
-
-		ctl &= ~LAN9303_VIRT_SPECIAL_TURBO;
-		regmap_write(chip->regmap, LAN9303_VIRT_SPECIAL_CTRL, ctl);
-	}
 }
 
 static int lan9303_port_enable(struct dsa_switch *ds, int port,
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [net-next: PATCH v7 3/7] dsa: lan9303: Add exception logic for read failure
  2023-01-17 20:56 [net-next: PATCH v7 0/7] dsa: lan9303: Move to PHYLINK Jerry Ray
  2023-01-17 20:56 ` [net-next: PATCH v7 1/7] dsa: lan9303: align dsa_switch_ops members Jerry Ray
  2023-01-17 20:56 ` [net-next: PATCH v7 2/7] dsa: lan9303: move Turbo Mode bit init Jerry Ray
@ 2023-01-17 20:56 ` Jerry Ray
  2023-01-17 20:57 ` [net-next: PATCH v7 4/7] dsa: lan9303: write reg only if necessary Jerry Ray
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Jerry Ray @ 2023-01-17 20:56 UTC (permalink / raw)
  To: Andrew Lunn, Florian Fainelli, Vladimir Oltean, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Russell King, jbe,
	netdev, linux-kernel, Jerry Ray

While it is highly unlikely a read will ever fail, This code fragment is
now in a function that allows us to return an error code. A read failure
here will cause the lan9303_probe to fail.

Signed-off-by: Jerry Ray <jerry.ray@microchip.com>
---
 drivers/net/dsa/lan9303-core.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/dsa/lan9303-core.c b/drivers/net/dsa/lan9303-core.c
index 63f5c1ef65e2..66466d50d015 100644
--- a/drivers/net/dsa/lan9303-core.c
+++ b/drivers/net/dsa/lan9303-core.c
@@ -911,7 +911,9 @@ static int lan9303_setup(struct dsa_switch *ds)
 	}
 
 	/* Virtual Phy: Remove Turbo 200Mbit mode */
-	lan9303_read(chip->regmap, LAN9303_VIRT_SPECIAL_CTRL, &reg);
+	ret = lan9303_read(chip->regmap, LAN9303_VIRT_SPECIAL_CTRL, &reg);
+	if (ret)
+		return (ret);
 
 	reg &= ~LAN9303_VIRT_SPECIAL_TURBO;
 	regmap_write(chip->regmap, LAN9303_VIRT_SPECIAL_CTRL, reg);
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [net-next: PATCH v7 4/7] dsa: lan9303: write reg only if necessary
  2023-01-17 20:56 [net-next: PATCH v7 0/7] dsa: lan9303: Move to PHYLINK Jerry Ray
                   ` (2 preceding siblings ...)
  2023-01-17 20:56 ` [net-next: PATCH v7 3/7] dsa: lan9303: Add exception logic for read failure Jerry Ray
@ 2023-01-17 20:57 ` Jerry Ray
  2023-01-17 20:57 ` [net-next: PATCH v7 5/7] dsa: lan9303: Port 0 is xMII port Jerry Ray
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Jerry Ray @ 2023-01-17 20:57 UTC (permalink / raw)
  To: Andrew Lunn, Florian Fainelli, Vladimir Oltean, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Russell King, jbe,
	netdev, linux-kernel, Jerry Ray

As the regmap_write() is over a slow bus that will sleep, we can speed up
the boot-up time a bit by not bothering to clear a bit that is already
clear.

Signed-off-by: Jerry Ray <jerry.ray@microchip.com>
---
 drivers/net/dsa/lan9303-core.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/net/dsa/lan9303-core.c b/drivers/net/dsa/lan9303-core.c
index 66466d50d015..a4decf42a002 100644
--- a/drivers/net/dsa/lan9303-core.c
+++ b/drivers/net/dsa/lan9303-core.c
@@ -915,8 +915,11 @@ static int lan9303_setup(struct dsa_switch *ds)
 	if (ret)
 		return (ret);
 
-	reg &= ~LAN9303_VIRT_SPECIAL_TURBO;
-	regmap_write(chip->regmap, LAN9303_VIRT_SPECIAL_CTRL, reg);
+	/* Clear the TURBO Mode bit if it was set. */
+	if (reg & LAN9303_VIRT_SPECIAL_TURBO) {
+		reg &= ~LAN9303_VIRT_SPECIAL_TURBO;
+		regmap_write(chip->regmap, LAN9303_VIRT_SPECIAL_CTRL, reg);
+	}
 
 	ret = lan9303_setup_tagging(chip);
 	if (ret)
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [net-next: PATCH v7 5/7] dsa: lan9303: Port 0 is xMII port
  2023-01-17 20:56 [net-next: PATCH v7 0/7] dsa: lan9303: Move to PHYLINK Jerry Ray
                   ` (3 preceding siblings ...)
  2023-01-17 20:57 ` [net-next: PATCH v7 4/7] dsa: lan9303: write reg only if necessary Jerry Ray
@ 2023-01-17 20:57 ` Jerry Ray
  2023-01-17 20:57 ` [net-next: PATCH v7 6/7] dsa: lan9303: Migrate to PHYLINK Jerry Ray
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Jerry Ray @ 2023-01-17 20:57 UTC (permalink / raw)
  To: Andrew Lunn, Florian Fainelli, Vladimir Oltean, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Russell King, jbe,
	netdev, linux-kernel, Jerry Ray

In preparing to move the adjust_link logic into the phylink_mac_link_up
api, change the macro used to check for the cpu port. In
phylink_mac_link_up, the phydev pointer passed in for the CPU port is
NULL, so we can't keep using phy_is_pseudo_fixed_link(phydev).

Signed-off-by: Jerry Ray <jerry.ray@microchip.com>
---
 drivers/net/dsa/lan9303-core.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/net/dsa/lan9303-core.c b/drivers/net/dsa/lan9303-core.c
index a4decf42a002..a4cc76423d4b 100644
--- a/drivers/net/dsa/lan9303-core.c
+++ b/drivers/net/dsa/lan9303-core.c
@@ -15,6 +15,9 @@
 
 #include "lan9303.h"
 
+/* For the LAN9303 and LAN9354, only port 0 is an XMII port. */
+#define IS_PORT_XMII(port)	((port) == 0)
+
 #define LAN9303_NUM_PORTS 3
 
 /* 13.2 System Control and Status Registers
@@ -1066,7 +1069,11 @@ static void lan9303_adjust_link(struct dsa_switch *ds, int port,
 {
 	int ctl;
 
-	if (!phy_is_pseudo_fixed_link(phydev))
+	/* On this device, we are only interested in doing something here if
+	 * this is an xMII port. All other ports are 10/100 phys using MDIO
+	 * to control there link settings.
+	 */
+	if (!IS_PORT_XMII(port))
 		return;
 
 	ctl = lan9303_phy_read(ds, port, MII_BMCR);
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [net-next: PATCH v7 6/7] dsa: lan9303: Migrate to PHYLINK
  2023-01-17 20:56 [net-next: PATCH v7 0/7] dsa: lan9303: Move to PHYLINK Jerry Ray
                   ` (4 preceding siblings ...)
  2023-01-17 20:57 ` [net-next: PATCH v7 5/7] dsa: lan9303: Port 0 is xMII port Jerry Ray
@ 2023-01-17 20:57 ` Jerry Ray
  2023-01-17 20:57 ` [net-next: PATCH v7 7/7] dsa: lan9303: Add flow ctrl in link_up Jerry Ray
  2023-01-20  9:00 ` [net-next: PATCH v7 0/7] dsa: lan9303: Move to PHYLINK patchwork-bot+netdevbpf
  7 siblings, 0 replies; 9+ messages in thread
From: Jerry Ray @ 2023-01-17 20:57 UTC (permalink / raw)
  To: Andrew Lunn, Florian Fainelli, Vladimir Oltean, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Russell King, jbe,
	netdev, linux-kernel, Jerry Ray

This patch replaces the adjust_link api with the phylink apis that provide
equivalent functionality.

The remaining functionality from the adjust_link is now covered in the
phylink_mac_link_up api.

Removes:
.adjust_link
Adds:
.phylink_get_caps
.phylink_mac_link_up

Signed-off-by: Jerry Ray <jerry.ray@microchip.com>
---
 drivers/net/dsa/lan9303-core.c | 101 ++++++++++++++++++++++-----------
 1 file changed, 69 insertions(+), 32 deletions(-)

diff --git a/drivers/net/dsa/lan9303-core.c b/drivers/net/dsa/lan9303-core.c
index a4cc76423d4b..93ece212cac8 100644
--- a/drivers/net/dsa/lan9303-core.c
+++ b/drivers/net/dsa/lan9303-core.c
@@ -1064,37 +1064,6 @@ static int lan9303_phy_write(struct dsa_switch *ds, int phy, int regnum,
 	return chip->ops->phy_write(chip, phy, regnum, val);
 }
 
-static void lan9303_adjust_link(struct dsa_switch *ds, int port,
-				struct phy_device *phydev)
-{
-	int ctl;
-
-	/* On this device, we are only interested in doing something here if
-	 * this is an xMII port. All other ports are 10/100 phys using MDIO
-	 * to control there link settings.
-	 */
-	if (!IS_PORT_XMII(port))
-		return;
-
-	ctl = lan9303_phy_read(ds, port, MII_BMCR);
-
-	ctl &= ~BMCR_ANENABLE;
-
-	if (phydev->speed == SPEED_100)
-		ctl |= BMCR_SPEED100;
-	else if (phydev->speed == SPEED_10)
-		ctl &= ~BMCR_SPEED100;
-	else
-		dev_err(ds->dev, "unsupported speed: %d\n", phydev->speed);
-
-	if (phydev->duplex == DUPLEX_FULL)
-		ctl |= BMCR_FULLDPLX;
-	else
-		ctl &= ~BMCR_FULLDPLX;
-
-	lan9303_phy_write(ds, port, MII_BMCR, ctl);
-}
-
 static int lan9303_port_enable(struct dsa_switch *ds, int port,
 			       struct phy_device *phy)
 {
@@ -1291,13 +1260,81 @@ static int lan9303_port_mdb_del(struct dsa_switch *ds, int port,
 	return 0;
 }
 
+static void lan9303_phylink_get_caps(struct dsa_switch *ds, int port,
+				     struct phylink_config *config)
+{
+	struct lan9303 *chip = ds->priv;
+
+	dev_dbg(chip->dev, "%s(%d) entered.", __func__, port);
+
+	config->mac_capabilities = MAC_10 | MAC_100 | MAC_ASYM_PAUSE |
+				   MAC_SYM_PAUSE;
+
+	if (port == 0) {
+		__set_bit(PHY_INTERFACE_MODE_RMII,
+			  config->supported_interfaces);
+		__set_bit(PHY_INTERFACE_MODE_MII,
+			  config->supported_interfaces);
+	} else {
+		__set_bit(PHY_INTERFACE_MODE_INTERNAL,
+			  config->supported_interfaces);
+		/* Compatibility for phylib's default interface type when the
+		 * phy-mode property is absent
+		 */
+		__set_bit(PHY_INTERFACE_MODE_GMII,
+			  config->supported_interfaces);
+	}
+
+	/* This driver does not make use of the speed, duplex, pause or the
+	 * advertisement in its mac_config, so it is safe to mark this driver
+	 * as non-legacy.
+	 */
+	config->legacy_pre_march2020 = false;
+}
+
+static void lan9303_phylink_mac_link_up(struct dsa_switch *ds, int port,
+					unsigned int mode,
+					phy_interface_t interface,
+					struct phy_device *phydev, int speed,
+					int duplex, bool tx_pause,
+					bool rx_pause)
+{
+	u32 ctl;
+
+	/* On this device, we are only interested in doing something here if
+	 * this is the xMII port. All other ports are 10/100 phys using MDIO
+	 * to control there link settings.
+	 */
+	if (!IS_PORT_XMII(port))
+		return;
+
+	ctl = lan9303_phy_read(ds, port, MII_BMCR);
+
+	ctl &= ~BMCR_ANENABLE;
+
+	if (speed == SPEED_100)
+		ctl |= BMCR_SPEED100;
+	else if (speed == SPEED_10)
+		ctl &= ~BMCR_SPEED100;
+	else
+		dev_err(ds->dev, "unsupported speed: %d\n", speed);
+
+	if (duplex == DUPLEX_FULL)
+		ctl |= BMCR_FULLDPLX;
+	else
+		ctl &= ~BMCR_FULLDPLX;
+
+	lan9303_phy_write(ds, port, MII_BMCR, ctl);
+}
+
 static const struct dsa_switch_ops lan9303_switch_ops = {
 	.get_tag_protocol	= lan9303_get_tag_protocol,
 	.setup			= lan9303_setup,
 	.get_strings		= lan9303_get_strings,
 	.phy_read		= lan9303_phy_read,
 	.phy_write		= lan9303_phy_write,
-	.adjust_link		= lan9303_adjust_link,
+	.phylink_get_caps	= lan9303_phylink_get_caps,
+	.phylink_mac_link_up	= lan9303_phylink_mac_link_up,
 	.get_ethtool_stats	= lan9303_get_ethtool_stats,
 	.get_sset_count		= lan9303_get_sset_count,
 	.port_enable		= lan9303_port_enable,
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [net-next: PATCH v7 7/7] dsa: lan9303: Add flow ctrl in link_up
  2023-01-17 20:56 [net-next: PATCH v7 0/7] dsa: lan9303: Move to PHYLINK Jerry Ray
                   ` (5 preceding siblings ...)
  2023-01-17 20:57 ` [net-next: PATCH v7 6/7] dsa: lan9303: Migrate to PHYLINK Jerry Ray
@ 2023-01-17 20:57 ` Jerry Ray
  2023-01-20  9:00 ` [net-next: PATCH v7 0/7] dsa: lan9303: Move to PHYLINK patchwork-bot+netdevbpf
  7 siblings, 0 replies; 9+ messages in thread
From: Jerry Ray @ 2023-01-17 20:57 UTC (permalink / raw)
  To: Andrew Lunn, Florian Fainelli, Vladimir Oltean, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Russell King, jbe,
	netdev, linux-kernel, Jerry Ray

While the prior patch moved the adjust_link code into the
phylink_mac_link_up api, this patch cleans it up and adds the setting the
port's flow control based on the phylink_mac_link_up input parameters.

Signed-off-by: Jerry Ray <jerry.ray@microchip.com>
---
 drivers/net/dsa/lan9303-core.c | 34 +++++++++++++++++++++++-----------
 1 file changed, 23 insertions(+), 11 deletions(-)

diff --git a/drivers/net/dsa/lan9303-core.c b/drivers/net/dsa/lan9303-core.c
index 93ece212cac8..fe8bf0faf6b7 100644
--- a/drivers/net/dsa/lan9303-core.c
+++ b/drivers/net/dsa/lan9303-core.c
@@ -53,6 +53,9 @@
 #define LAN9303_MANUAL_FC_1 0x68
 #define LAN9303_MANUAL_FC_2 0x69
 #define LAN9303_MANUAL_FC_0 0x6a
+# define LAN9303_BP_EN BIT(6)
+# define LAN9303_RX_FC_EN BIT(2)
+# define LAN9303_TX_FC_EN BIT(1)
 #define LAN9303_SWITCH_CSR_DATA 0x6b
 #define LAN9303_SWITCH_CSR_CMD 0x6c
 #define LAN9303_SWITCH_CSR_CMD_BUSY BIT(31)
@@ -228,6 +231,13 @@ const struct regmap_access_table lan9303_register_set = {
 };
 EXPORT_SYMBOL(lan9303_register_set);
 
+/* Flow Control registers indexed by port number */
+static unsigned int flow_ctl_reg[] = {
+	LAN9303_MANUAL_FC_0,
+	LAN9303_MANUAL_FC_1,
+	LAN9303_MANUAL_FC_2
+};
+
 static int lan9303_read(struct regmap *regmap, unsigned int offset, u32 *reg)
 {
 	int ret, i;
@@ -1299,7 +1309,9 @@ static void lan9303_phylink_mac_link_up(struct dsa_switch *ds, int port,
 					int duplex, bool tx_pause,
 					bool rx_pause)
 {
+	struct lan9303 *chip = ds->priv;
 	u32 ctl;
+	u32 reg;
 
 	/* On this device, we are only interested in doing something here if
 	 * this is the xMII port. All other ports are 10/100 phys using MDIO
@@ -1308,23 +1320,23 @@ static void lan9303_phylink_mac_link_up(struct dsa_switch *ds, int port,
 	if (!IS_PORT_XMII(port))
 		return;
 
+	/* Disable auto-negotiation and force the speed/duplex settings. */
 	ctl = lan9303_phy_read(ds, port, MII_BMCR);
-
-	ctl &= ~BMCR_ANENABLE;
-
+	ctl &= ~(BMCR_ANENABLE | BMCR_SPEED100 | BMCR_FULLDPLX);
 	if (speed == SPEED_100)
 		ctl |= BMCR_SPEED100;
-	else if (speed == SPEED_10)
-		ctl &= ~BMCR_SPEED100;
-	else
-		dev_err(ds->dev, "unsupported speed: %d\n", speed);
-
 	if (duplex == DUPLEX_FULL)
 		ctl |= BMCR_FULLDPLX;
-	else
-		ctl &= ~BMCR_FULLDPLX;
-
 	lan9303_phy_write(ds, port, MII_BMCR, ctl);
+
+	/* Force the flow control settings. */
+	lan9303_read(chip->regmap, flow_ctl_reg[port], &reg);
+	reg &= ~(LAN9303_BP_EN | LAN9303_RX_FC_EN | LAN9303_TX_FC_EN);
+	if (rx_pause)
+		reg |= (LAN9303_RX_FC_EN | LAN9303_BP_EN);
+	if (tx_pause)
+		reg |= LAN9303_TX_FC_EN;
+	regmap_write(chip->regmap, flow_ctl_reg[port], reg);
 }
 
 static const struct dsa_switch_ops lan9303_switch_ops = {
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [net-next: PATCH v7 0/7] dsa: lan9303: Move to PHYLINK
  2023-01-17 20:56 [net-next: PATCH v7 0/7] dsa: lan9303: Move to PHYLINK Jerry Ray
                   ` (6 preceding siblings ...)
  2023-01-17 20:57 ` [net-next: PATCH v7 7/7] dsa: lan9303: Add flow ctrl in link_up Jerry Ray
@ 2023-01-20  9:00 ` patchwork-bot+netdevbpf
  7 siblings, 0 replies; 9+ messages in thread
From: patchwork-bot+netdevbpf @ 2023-01-20  9:00 UTC (permalink / raw)
  To: Jerry Ray
  Cc: andrew, f.fainelli, olteanv, davem, edumazet, kuba, pabeni, linux,
	jbe, netdev, linux-kernel

Hello:

This series was applied to netdev/net-next.git (master)
by David S. Miller <davem@davemloft.net>:

On Tue, 17 Jan 2023 14:56:56 -0600 you wrote:
> This patch series moves the lan9303 driver to use the phylink
> api away from phylib.
> 
> Migrating to phylink means removing the .adjust_link api. The
> functionality from the adjust_link is moved to the phylink_mac_link_up
> api.  The code being removed only affected the cpu port.  The other
> ports on the LAN9303 do not need anything from the phylink_mac_link_up
> api.
> 
> [...]

Here is the summary with links:
  - [net-next:,v7,1/7] dsa: lan9303: align dsa_switch_ops members
    https://git.kernel.org/netdev/net-next/c/9755126dc038
  - [net-next:,v7,2/7] dsa: lan9303: move Turbo Mode bit init
    https://git.kernel.org/netdev/net-next/c/1bcb5df81e4b
  - [net-next:,v7,3/7] dsa: lan9303: Add exception logic for read failure
    https://git.kernel.org/netdev/net-next/c/601f574a1b44
  - [net-next:,v7,4/7] dsa: lan9303: write reg only if necessary
    https://git.kernel.org/netdev/net-next/c/de375aa860fb
  - [net-next:,v7,5/7] dsa: lan9303: Port 0 is xMII port
    https://git.kernel.org/netdev/net-next/c/56e23d91bcfd
  - [net-next:,v7,6/7] dsa: lan9303: Migrate to PHYLINK
    https://git.kernel.org/netdev/net-next/c/332bc552a402
  - [net-next:,v7,7/7] dsa: lan9303: Add flow ctrl in link_up
    https://git.kernel.org/netdev/net-next/c/87523986570e

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2023-01-20  9:00 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-01-17 20:56 [net-next: PATCH v7 0/7] dsa: lan9303: Move to PHYLINK Jerry Ray
2023-01-17 20:56 ` [net-next: PATCH v7 1/7] dsa: lan9303: align dsa_switch_ops members Jerry Ray
2023-01-17 20:56 ` [net-next: PATCH v7 2/7] dsa: lan9303: move Turbo Mode bit init Jerry Ray
2023-01-17 20:56 ` [net-next: PATCH v7 3/7] dsa: lan9303: Add exception logic for read failure Jerry Ray
2023-01-17 20:57 ` [net-next: PATCH v7 4/7] dsa: lan9303: write reg only if necessary Jerry Ray
2023-01-17 20:57 ` [net-next: PATCH v7 5/7] dsa: lan9303: Port 0 is xMII port Jerry Ray
2023-01-17 20:57 ` [net-next: PATCH v7 6/7] dsa: lan9303: Migrate to PHYLINK Jerry Ray
2023-01-17 20:57 ` [net-next: PATCH v7 7/7] dsa: lan9303: Add flow ctrl in link_up Jerry Ray
2023-01-20  9:00 ` [net-next: PATCH v7 0/7] dsa: lan9303: Move to PHYLINK patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).