netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next 1/3] net: phylink: provide phylink_mac_implements_lpi()
  2025-02-05 15:10 [PATCH net-next 0/3] net: dsa: add support for phylink managed EEE Russell King (Oracle)
@ 2025-02-05 15:10 ` Russell King (Oracle)
  2025-02-05 15:10 ` [PATCH net-next 2/3] net: dsa: allow use of phylink managed EEE support Russell King (Oracle)
  2025-02-05 15:11 ` [PATCH net-next 3/3] net: dsa: mt7530: convert to phylink managed EEE Russell King (Oracle)
  2 siblings, 0 replies; 6+ messages in thread
From: Russell King (Oracle) @ 2025-02-05 15:10 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit
  Cc: AngeloGioacchino Del Regno, Chester A. Unal, Daniel Golle,
	David S. Miller, DENG Qingfang, Eric Dumazet, Jakub Kicinski,
	linux-arm-kernel, linux-mediatek, Matthias Brugger, netdev,
	Paolo Abeni, Sean Wang, Simon Horman, Vladimir Oltean

Provide a helper to determine whether the MAC operations structure
implements the LPI operations, which will be used by both phylink and
DSA.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
 drivers/net/phy/phylink.c |  3 +--
 include/linux/phylink.h   | 12 ++++++++++++
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c
index 214b62fba991..6fbb5fd5b400 100644
--- a/drivers/net/phy/phylink.c
+++ b/drivers/net/phy/phylink.c
@@ -1957,8 +1957,7 @@ struct phylink *phylink_create(struct phylink_config *config,
 		return ERR_PTR(-EINVAL);
 	}
 
-	pl->mac_supports_eee_ops = mac_ops->mac_disable_tx_lpi &&
-				   mac_ops->mac_enable_tx_lpi;
+	pl->mac_supports_eee_ops = phylink_mac_implements_lpi(mac_ops);
 	pl->mac_supports_eee = pl->mac_supports_eee_ops &&
 			       pl->config->lpi_capabilities &&
 			       !phy_interface_empty(pl->config->lpi_interfaces);
diff --git a/include/linux/phylink.h b/include/linux/phylink.h
index 898b00451bbf..0de78673172d 100644
--- a/include/linux/phylink.h
+++ b/include/linux/phylink.h
@@ -737,6 +737,18 @@ static inline int phylink_get_link_timer_ns(phy_interface_t interface)
 	}
 }
 
+/**
+ * phylink_mac_implements_lpi() - determine if MAC implements LPI ops
+ * @ops: phylink_mac_ops structure
+ *
+ * Returns true if the phylink MAC operations structure indicates that the
+ * LPI operations have been implemented, false otherwise.
+ */
+static inline bool phylink_mac_implements_lpi(const struct phylink_mac_ops *ops)
+{
+	return ops && ops->mac_disable_tx_lpi && ops->mac_enable_tx_lpi;
+}
+
 void phylink_mii_c22_pcs_decode_state(struct phylink_link_state *state,
 				      unsigned int neg_mode, u16 bmsr, u16 lpa);
 void phylink_mii_c22_pcs_get_state(struct mdio_device *pcs,
-- 
2.30.2


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

* [PATCH net-next 0/3] net: dsa: add support for phylink managed EEE
@ 2025-02-05 15:10 Russell King (Oracle)
  2025-02-05 15:10 ` [PATCH net-next 1/3] net: phylink: provide phylink_mac_implements_lpi() Russell King (Oracle)
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Russell King (Oracle) @ 2025-02-05 15:10 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit
  Cc: AngeloGioacchino Del Regno, Chester A. Unal, Daniel Golle,
	David S. Miller, DENG Qingfang, Eric Dumazet, Jakub Kicinski,
	linux-arm-kernel, linux-mediatek, Matthias Brugger, netdev,
	Paolo Abeni, Sean Wang, Simon Horman, Vladimir Oltean

Hi,

This series adds support for phylink managed EEE to DSA, and converts
mt753x to make use of this feature.

Patch 1 implements a helper to indicate whether the MAC LPI operations
are populated (suggested by Vladimir)

Patch 2 makes the necessary changes to the core code - we retain calling
set_mac_eee(), but this method now becomes a way to merely validate the
arguments when using phylink managed EEE rather than performing any
configuration.

Patch 3 converts the mt7530 driver to use phylink managed EEE.

 drivers/net/dsa/mt7530.c  | 69 ++++++++++++++++++++++++++++++++---------------
 drivers/net/phy/phylink.c |  3 +--
 include/linux/phylink.h   | 12 +++++++++
 net/dsa/user.c            | 21 +++++++++------
 4 files changed, 74 insertions(+), 31 deletions(-)

-- 
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!

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

* [PATCH net-next 2/3] net: dsa: allow use of phylink managed EEE support
  2025-02-05 15:10 [PATCH net-next 0/3] net: dsa: add support for phylink managed EEE Russell King (Oracle)
  2025-02-05 15:10 ` [PATCH net-next 1/3] net: phylink: provide phylink_mac_implements_lpi() Russell King (Oracle)
@ 2025-02-05 15:10 ` Russell King (Oracle)
  2025-02-05 15:11 ` [PATCH net-next 3/3] net: dsa: mt7530: convert to phylink managed EEE Russell King (Oracle)
  2 siblings, 0 replies; 6+ messages in thread
From: Russell King (Oracle) @ 2025-02-05 15:10 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit
  Cc: AngeloGioacchino Del Regno, Chester A. Unal, Daniel Golle,
	David S. Miller, DENG Qingfang, Eric Dumazet, Jakub Kicinski,
	linux-arm-kernel, linux-mediatek, Matthias Brugger, netdev,
	Paolo Abeni, Sean Wang, Simon Horman, Vladimir Oltean

In order to allow DSA drivers to use phylink managed EEE, changes are
necessary to the DSA .set_eee() and .get_eee() methods. Where drivers
make use of phylink managed EEE, these should just pass the method on
to their phylink implementation without calling the DSA specific
operations.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
 net/dsa/user.c | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/net/dsa/user.c b/net/dsa/user.c
index 291ab1b4acc4..2e0a51c1b750 100644
--- a/net/dsa/user.c
+++ b/net/dsa/user.c
@@ -1243,16 +1243,21 @@ static int dsa_user_set_eee(struct net_device *dev, struct ethtool_keee *e)
 	if (!ds->ops->support_eee || !ds->ops->support_eee(ds, dp->index))
 		return -EOPNOTSUPP;
 
-	/* Port's PHY and MAC both need to be EEE capable */
-	if (!dev->phydev)
-		return -ENODEV;
+	/* If the port is using phylink managed EEE, then get_mac_eee is
+	 * unnecessary.
+	 */
+	if (!phylink_mac_implements_lpi(ds->phylink_mac_ops)) {
+		/* Port's PHY and MAC both need to be EEE capable */
+		if (!dev->phydev)
+			return -ENODEV;
 
-	if (!ds->ops->set_mac_eee)
-		return -EOPNOTSUPP;
+		if (!ds->ops->set_mac_eee)
+			return -EOPNOTSUPP;
 
-	ret = ds->ops->set_mac_eee(ds, dp->index, e);
-	if (ret)
-		return ret;
+		ret = ds->ops->set_mac_eee(ds, dp->index, e);
+		if (ret)
+			return ret;
+	}
 
 	return phylink_ethtool_set_eee(dp->pl, e);
 }
-- 
2.30.2


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

* [PATCH net-next 3/3] net: dsa: mt7530: convert to phylink managed EEE
  2025-02-05 15:10 [PATCH net-next 0/3] net: dsa: add support for phylink managed EEE Russell King (Oracle)
  2025-02-05 15:10 ` [PATCH net-next 1/3] net: phylink: provide phylink_mac_implements_lpi() Russell King (Oracle)
  2025-02-05 15:10 ` [PATCH net-next 2/3] net: dsa: allow use of phylink managed EEE support Russell King (Oracle)
@ 2025-02-05 15:11 ` Russell King (Oracle)
  2025-02-05 15:42   ` Chester A. Unal
  2 siblings, 1 reply; 6+ messages in thread
From: Russell King (Oracle) @ 2025-02-05 15:11 UTC (permalink / raw)
  To: Andrew Lunn, Heiner Kallweit
  Cc: AngeloGioacchino Del Regno, Chester A. Unal, Daniel Golle,
	David S. Miller, DENG Qingfang, Eric Dumazet, Jakub Kicinski,
	linux-arm-kernel, linux-mediatek, Matthias Brugger, netdev,
	Paolo Abeni, Sean Wang, Simon Horman, Vladimir Oltean

Fixme: doesn't bit 25 and 26 also need to be set in the PMCR for
PMCR_FORCE_EEE100 and PMCR_FORCE_EEE1G to take effect?

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
 drivers/net/dsa/mt7530.c | 69 ++++++++++++++++++++++++++++------------
 1 file changed, 48 insertions(+), 21 deletions(-)

diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
index 1c83af805209..24191c4d5221 100644
--- a/drivers/net/dsa/mt7530.c
+++ b/drivers/net/dsa/mt7530.c
@@ -2957,28 +2957,62 @@ static void mt753x_phylink_mac_link_up(struct phylink_config *config,
 			mcr |= PMCR_FORCE_RX_FC_EN;
 	}
 
-	if (mode == MLO_AN_PHY && phydev && phy_init_eee(phydev, false) >= 0) {
-		switch (speed) {
-		case SPEED_1000:
-		case SPEED_2500:
-			mcr |= PMCR_FORCE_EEE1G;
-			break;
-		case SPEED_100:
-			mcr |= PMCR_FORCE_EEE100;
-			break;
-		}
-	}
-
 	mt7530_set(priv, MT753X_PMCR_P(dp->index), mcr);
 }
 
+static void mt753x_phylink_mac_disable_tx_lpi(struct phylink_config *config)
+{
+	struct dsa_port *dp = dsa_phylink_to_port(config);
+	struct mt7530_priv *priv = dp->ds->priv;
+
+	mt7530_clear(priv, MT753X_PMCR_P(dp->index),
+		     PMCR_FORCE_EEE1G | PMCR_FORCE_EEE100);
+}
+
+static int mt753x_phylink_mac_enable_tx_lpi(struct phylink_config *config,
+					    u32 timer, bool tx_clock_stop)
+{
+	struct dsa_port *dp = dsa_phylink_to_port(config);
+	struct mt7530_priv *priv = dp->ds->priv;
+	u32 val;
+
+	/* If the timer is zero, then set LPI_MODE_EN, which allows the
+	 * system to enter LPI mode immediately rather than waiting for
+	 * the LPI threshold.
+	 */
+	if (!timer)
+		val = LPI_MODE_EN;
+	else if (FIELD_FIT(LPI_THRESH_MASK, timer))
+		val = FIELD_PREP(LPI_THRESH_MASK, timer);
+	else
+		val = LPI_THRESH_MASK;
+
+	mt7530_rmw(priv, MT753X_PMEEECR_P(dp->index),
+		   LPI_THRESH_MASK | LPI_MODE_EN, val);
+
+	mt7530_set(priv, MT753X_PMCR_P(dp->index),
+		   PMCR_FORCE_EEE1G | PMCR_FORCE_EEE100);
+
+	return 0;
+}
+
 static void mt753x_phylink_get_caps(struct dsa_switch *ds, int port,
 				    struct phylink_config *config)
 {
 	struct mt7530_priv *priv = ds->priv;
+	u32 eeecr;
 
 	config->mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE;
 
+	config->lpi_capabilities = MAC_100FD | MAC_1000FD | MAC_2500FD;
+	config->lpi_timer_limit_us = FIELD_MAX(LPI_THRESH_MASK);
+
+	eeecr = mt7530_read(priv, MT753X_PMEEECR_P(port));
+	/* tx_lpi_timer should be in microseconds. The time units for
+	 * LPI threshold are unspecified.
+	 */
+	config->lpi_timer_default = FIELD_GET(LPI_THRESH_MASK, eeecr);
+
 	priv->info->mac_port_get_caps(ds, port, config);
 }
 
@@ -3088,18 +3122,9 @@ mt753x_setup(struct dsa_switch *ds)
 static int mt753x_set_mac_eee(struct dsa_switch *ds, int port,
 			      struct ethtool_keee *e)
 {
-	struct mt7530_priv *priv = ds->priv;
-	u32 set, mask = LPI_THRESH_MASK | LPI_MODE_EN;
-
 	if (e->tx_lpi_timer > 0xFFF)
 		return -EINVAL;
 
-	set = LPI_THRESH_SET(e->tx_lpi_timer);
-	if (!e->tx_lpi_enabled)
-		/* Force LPI Mode without a delay */
-		set |= LPI_MODE_EN;
-	mt7530_rmw(priv, MT753X_PMEEECR_P(port), mask, set);
-
 	return 0;
 }
 
@@ -3238,6 +3263,8 @@ static const struct phylink_mac_ops mt753x_phylink_mac_ops = {
 	.mac_config	= mt753x_phylink_mac_config,
 	.mac_link_down	= mt753x_phylink_mac_link_down,
 	.mac_link_up	= mt753x_phylink_mac_link_up,
+	.mac_disable_tx_lpi = mt753x_phylink_mac_disable_tx_lpi,
+	.mac_enable_tx_lpi = mt753x_phylink_mac_enable_tx_lpi,
 };
 
 const struct mt753x_info mt753x_table[] = {
-- 
2.30.2


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

* Re: [PATCH net-next 3/3] net: dsa: mt7530: convert to phylink managed EEE
  2025-02-05 15:11 ` [PATCH net-next 3/3] net: dsa: mt7530: convert to phylink managed EEE Russell King (Oracle)
@ 2025-02-05 15:42   ` Chester A. Unal
  2025-02-06 15:58     ` Russell King (Oracle)
  0 siblings, 1 reply; 6+ messages in thread
From: Chester A. Unal @ 2025-02-05 15:42 UTC (permalink / raw)
  To: Russell King (Oracle), Andrew Lunn, Heiner Kallweit
  Cc: AngeloGioacchino Del Regno, Daniel Golle, David S. Miller,
	DENG Qingfang, Eric Dumazet, Jakub Kicinski, linux-arm-kernel,
	linux-mediatek, Matthias Brugger, netdev, Paolo Abeni, Sean Wang,
	Simon Horman, Vladimir Oltean

Hello Russell.

On 05/02/2025 15:11, Russell King (Oracle) wrote:
> Fixme: doesn't bit 25 and 26 also need to be set in the PMCR for
> PMCR_FORCE_EEE100 and PMCR_FORCE_EEE1G to take effect?

Yes, but only for MT7531 and the switch component of the MT7988 SoC. For
MT7530 and the switch component of the AN7581 SoC, bit 15
(MT7530_FORCE_MODE) must be set. The MT753X DSA subdriver sets these bits
accordingly at the setup function that pertains to the specific switch
model.

Chester A.

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

* Re: [PATCH net-next 3/3] net: dsa: mt7530: convert to phylink managed EEE
  2025-02-05 15:42   ` Chester A. Unal
@ 2025-02-06 15:58     ` Russell King (Oracle)
  0 siblings, 0 replies; 6+ messages in thread
From: Russell King (Oracle) @ 2025-02-06 15:58 UTC (permalink / raw)
  To: Chester A. Unal
  Cc: Andrew Lunn, Heiner Kallweit, AngeloGioacchino Del Regno,
	Daniel Golle, David S. Miller, DENG Qingfang, Eric Dumazet,
	Jakub Kicinski, linux-arm-kernel, linux-mediatek,
	Matthias Brugger, netdev, Paolo Abeni, Sean Wang, Simon Horman,
	Vladimir Oltean

On Wed, Feb 05, 2025 at 03:42:30PM +0000, Chester A. Unal wrote:
> Hello Russell.
> 
> On 05/02/2025 15:11, Russell King (Oracle) wrote:
> > Fixme: doesn't bit 25 and 26 also need to be set in the PMCR for
> > PMCR_FORCE_EEE100 and PMCR_FORCE_EEE1G to take effect?
> 
> Yes, but only for MT7531 and the switch component of the MT7988 SoC. For
> MT7530 and the switch component of the AN7581 SoC, bit 15
> (MT7530_FORCE_MODE) must be set. The MT753X DSA subdriver sets these bits
> accordingly at the setup function that pertains to the specific switch
> model.

I'll remove the comment in the commit message. I also note from
patchwork that I need to remove lpi_timer_limit_us... so v2 will be
posted in the next day or so.

-- 
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!

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

end of thread, other threads:[~2025-02-06 15:58 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-05 15:10 [PATCH net-next 0/3] net: dsa: add support for phylink managed EEE Russell King (Oracle)
2025-02-05 15:10 ` [PATCH net-next 1/3] net: phylink: provide phylink_mac_implements_lpi() Russell King (Oracle)
2025-02-05 15:10 ` [PATCH net-next 2/3] net: dsa: allow use of phylink managed EEE support Russell King (Oracle)
2025-02-05 15:11 ` [PATCH net-next 3/3] net: dsa: mt7530: convert to phylink managed EEE Russell King (Oracle)
2025-02-05 15:42   ` Chester A. Unal
2025-02-06 15:58     ` Russell King (Oracle)

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).