Backport upstream patch that fixes TRGMII mode now that mt7530 is
actually resetting the switch on ramips devices.
Patches apply to both Linux 5.4 and 5.10, since TRGMII is broken on both.
Fixes: 69551a2442 ("ramips: manage low reset lines")
Signed-off-by: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
		
	
		
			
				
	
	
		
			122 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 9cfb2d426c38272f245e9e6f62b3552d1ed5852b Mon Sep 17 00:00:00 2001
 | 
						|
From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= <opensource@vdorst.com>
 | 
						|
Date: Tue, 21 Apr 2020 00:18:08 +0200
 | 
						|
Subject: [PATCH] net: dsa: mt7530: Support EEE features
 | 
						|
MIME-Version: 1.0
 | 
						|
Content-Type: text/plain; charset=UTF-8
 | 
						|
Content-Transfer-Encoding: 8bit
 | 
						|
 | 
						|
Signed-off-by: René van Dorst <opensource@vdorst.com>
 | 
						|
--- a/drivers/net/dsa/mt7530.c
 | 
						|
+++ b/drivers/net/dsa/mt7530.c
 | 
						|
@@ -1417,9 +1417,13 @@ static void mt7530_phylink_mac_config(st
 | 
						|
 	switch (state->speed) {
 | 
						|
 	case SPEED_1000:
 | 
						|
 		mcr_new |= PMCR_FORCE_SPEED_1000;
 | 
						|
+		if (priv->eee_enable & BIT(port))
 | 
						|
+			mcr_new |= PMCR_FORCE_EEE1G;
 | 
						|
 		break;
 | 
						|
 	case SPEED_100:
 | 
						|
 		mcr_new |= PMCR_FORCE_SPEED_100;
 | 
						|
+		if (priv->eee_enable & BIT(port))
 | 
						|
+			mcr_new |= PMCR_FORCE_EEE100;
 | 
						|
 		break;
 | 
						|
 	}
 | 
						|
 	if (state->duplex == DUPLEX_FULL) {
 | 
						|
@@ -1555,6 +1559,54 @@ mt7530_phylink_mac_link_state(struct dsa
 | 
						|
 	return 1;
 | 
						|
 }
 | 
						|
 
 | 
						|
+static int mt7530_get_mac_eee(struct dsa_switch *ds, int port,
 | 
						|
+			      struct ethtool_eee *e)
 | 
						|
+{
 | 
						|
+	struct mt7530_priv *priv = ds->priv;
 | 
						|
+	u32 eeecr, pmsr;
 | 
						|
+
 | 
						|
+	e->eee_enabled = !!(priv->eee_enable & BIT(port));
 | 
						|
+
 | 
						|
+	if (e->eee_enabled) {
 | 
						|
+		eeecr = mt7530_read(priv, MT7530_PMEEECR_P(port));
 | 
						|
+		e->tx_lpi_enabled = !(eeecr & LPI_MODE_EN);
 | 
						|
+		e->tx_lpi_timer   = (eeecr >> 4) & 0xFFF;
 | 
						|
+		pmsr = mt7530_read(priv, MT7530_PMSR_P(port));
 | 
						|
+		e->eee_active  = e->eee_enabled && !!(pmsr & PMSR_EEE1G);
 | 
						|
+	} else {
 | 
						|
+		e->tx_lpi_enabled = 0;
 | 
						|
+		e->tx_lpi_timer = 0;
 | 
						|
+		e->eee_active = 0;
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	return 0;
 | 
						|
+}
 | 
						|
+
 | 
						|
+static int mt7530_set_mac_eee(struct dsa_switch *ds, int port,
 | 
						|
+			      struct ethtool_eee *e)
 | 
						|
+{
 | 
						|
+	struct mt7530_priv *priv = ds->priv;
 | 
						|
+	u32 eeecr;
 | 
						|
+
 | 
						|
+	if (e->tx_lpi_enabled && e->tx_lpi_timer > 0xFFF)
 | 
						|
+		return -EINVAL;
 | 
						|
+
 | 
						|
+	if (e->eee_enabled) {
 | 
						|
+		priv->eee_enable |= BIT(port);
 | 
						|
+		//MT7530_PMEEECR_P
 | 
						|
+		eeecr = mt7530_read(priv, MT7530_PMEEECR_P(port));
 | 
						|
+		eeecr &= 0xFFFF0000;
 | 
						|
+		if (!e->tx_lpi_enabled)
 | 
						|
+			eeecr |= LPI_MODE_EN;
 | 
						|
+		eeecr = LPI_THRESH(e->tx_lpi_timer);
 | 
						|
+		mt7530_write(priv, MT7530_PMEEECR_P(port), eeecr);
 | 
						|
+	} else {
 | 
						|
+		priv->eee_enable &= ~(BIT(port));
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	return 0;
 | 
						|
+}
 | 
						|
+
 | 
						|
 static const struct dsa_switch_ops mt7530_switch_ops = {
 | 
						|
 	.get_tag_protocol	= mtk_get_tag_protocol,
 | 
						|
 	.setup			= mt7530_setup,
 | 
						|
@@ -1582,6 +1634,8 @@ static const struct dsa_switch_ops mt753
 | 
						|
 	.phylink_mac_config	= mt7530_phylink_mac_config,
 | 
						|
 	.phylink_mac_link_down	= mt7530_phylink_mac_link_down,
 | 
						|
 	.phylink_mac_link_up	= mt7530_phylink_mac_link_up,
 | 
						|
+	.get_mac_eee		= mt7530_get_mac_eee,
 | 
						|
+	.set_mac_eee		= mt7530_set_mac_eee,
 | 
						|
 };
 | 
						|
 
 | 
						|
 static const struct of_device_id mt7530_of_match[] = {
 | 
						|
--- a/drivers/net/dsa/mt7530.h
 | 
						|
+++ b/drivers/net/dsa/mt7530.h
 | 
						|
@@ -212,6 +212,8 @@ enum mt7530_vlan_port_attr {
 | 
						|
 #define  PMCR_RX_EN			BIT(13)
 | 
						|
 #define  PMCR_BACKOFF_EN		BIT(9)
 | 
						|
 #define  PMCR_BACKPR_EN			BIT(8)
 | 
						|
+#define  PMCR_FORCE_EEE1G		BIT(7)
 | 
						|
+#define  PMCR_FORCE_EEE100		BIT(6)
 | 
						|
 #define  PMCR_TX_FC_EN			BIT(5)
 | 
						|
 #define  PMCR_RX_FC_EN			BIT(4)
 | 
						|
 #define  PMCR_FORCE_SPEED_1000		BIT(3)
 | 
						|
@@ -233,6 +235,12 @@ enum mt7530_vlan_port_attr {
 | 
						|
 #define  PMSR_DPX			BIT(1)
 | 
						|
 #define  PMSR_LINK			BIT(0)
 | 
						|
 
 | 
						|
+#define MT7530_PMEEECR_P(x)		(0x3004 + (x) * 0x100)
 | 
						|
+#define  WAKEUP_TIME_1000(x)		((x & 0xFF) << 24)
 | 
						|
+#define  WAKEUP_TIME_100(x)		((x & 0xFF) << 16)
 | 
						|
+#define  LPI_THRESH(x)			((x & 0xFFF) << 4)
 | 
						|
+#define  LPI_MODE_EN			BIT(0)
 | 
						|
+
 | 
						|
 /* Register for MIB */
 | 
						|
 #define MT7530_PORT_MIB_COUNTER(x)	(0x4000 + (x) * 0x100)
 | 
						|
 #define MT7530_MIB_CCR			0x4fe0
 | 
						|
@@ -471,6 +479,7 @@ struct mt7530_priv {
 | 
						|
 	unsigned int		p5_intf_sel;
 | 
						|
 	u8			mirror_rx;
 | 
						|
 	u8			mirror_tx;
 | 
						|
+	u8			eee_enable;
 | 
						|
 
 | 
						|
 	struct mt7530_port	ports[MT7530_NUM_PORTS];
 | 
						|
 	/* protect among processes for registers access*/
 |