Add kernel tag that introduced the patch on backport patch. Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
		
			
				
	
	
		
			79 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 6a3bdc5209f45d2af83aa92433ab6e5cf2297aa4 Mon Sep 17 00:00:00 2001
 | 
						|
From: Ansuel Smith <ansuelsmth@gmail.com>
 | 
						|
Date: Mon, 22 Nov 2021 16:23:47 +0100
 | 
						|
Subject: net: dsa: qca8k: add set_ageing_time support
 | 
						|
 | 
						|
qca8k support setting ageing time in step of 7s. Add support for it and
 | 
						|
set the max value accepted of 7645m.
 | 
						|
Documentation talks about support for 10000m but that values doesn't
 | 
						|
make sense as the value doesn't match the max value in the reg.
 | 
						|
 | 
						|
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
 | 
						|
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
 | 
						|
Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
						|
---
 | 
						|
 drivers/net/dsa/qca8k.c | 25 +++++++++++++++++++++++++
 | 
						|
 drivers/net/dsa/qca8k.h |  3 +++
 | 
						|
 2 files changed, 28 insertions(+)
 | 
						|
 | 
						|
--- a/drivers/net/dsa/qca8k.c
 | 
						|
+++ b/drivers/net/dsa/qca8k.c
 | 
						|
@@ -1261,6 +1261,10 @@ qca8k_setup(struct dsa_switch *ds)
 | 
						|
 	/* We don't have interrupts for link changes, so we need to poll */
 | 
						|
 	ds->pcs_poll = true;
 | 
						|
 
 | 
						|
+	/* Set min a max ageing value supported */
 | 
						|
+	ds->ageing_time_min = 7000;
 | 
						|
+	ds->ageing_time_max = 458745000;
 | 
						|
+
 | 
						|
 	return 0;
 | 
						|
 }
 | 
						|
 
 | 
						|
@@ -1801,6 +1805,26 @@ qca8k_port_fast_age(struct dsa_switch *d
 | 
						|
 }
 | 
						|
 
 | 
						|
 static int
 | 
						|
+qca8k_set_ageing_time(struct dsa_switch *ds, unsigned int msecs)
 | 
						|
+{
 | 
						|
+	struct qca8k_priv *priv = ds->priv;
 | 
						|
+	unsigned int secs = msecs / 1000;
 | 
						|
+	u32 val;
 | 
						|
+
 | 
						|
+	/* AGE_TIME reg is set in 7s step */
 | 
						|
+	val = secs / 7;
 | 
						|
+
 | 
						|
+	/* Handle case with 0 as val to NOT disable
 | 
						|
+	 * learning
 | 
						|
+	 */
 | 
						|
+	if (!val)
 | 
						|
+		val = 1;
 | 
						|
+
 | 
						|
+	return regmap_update_bits(priv->regmap, QCA8K_REG_ATU_CTRL, QCA8K_ATU_AGE_TIME_MASK,
 | 
						|
+				  QCA8K_ATU_AGE_TIME(val));
 | 
						|
+}
 | 
						|
+
 | 
						|
+static int
 | 
						|
 qca8k_port_enable(struct dsa_switch *ds, int port,
 | 
						|
 		  struct phy_device *phy)
 | 
						|
 {
 | 
						|
@@ -2018,6 +2042,7 @@ static const struct dsa_switch_ops qca8k
 | 
						|
 	.get_strings		= qca8k_get_strings,
 | 
						|
 	.get_ethtool_stats	= qca8k_get_ethtool_stats,
 | 
						|
 	.get_sset_count		= qca8k_get_sset_count,
 | 
						|
+	.set_ageing_time	= qca8k_set_ageing_time,
 | 
						|
 	.get_mac_eee		= qca8k_get_mac_eee,
 | 
						|
 	.set_mac_eee		= qca8k_set_mac_eee,
 | 
						|
 	.port_enable		= qca8k_port_enable,
 | 
						|
--- a/drivers/net/dsa/qca8k.h
 | 
						|
+++ b/drivers/net/dsa/qca8k.h
 | 
						|
@@ -175,6 +175,9 @@
 | 
						|
 #define   QCA8K_VTU_FUNC1_BUSY				BIT(31)
 | 
						|
 #define   QCA8K_VTU_FUNC1_VID_MASK			GENMASK(27, 16)
 | 
						|
 #define   QCA8K_VTU_FUNC1_FULL				BIT(4)
 | 
						|
+#define QCA8K_REG_ATU_CTRL				0x618
 | 
						|
+#define   QCA8K_ATU_AGE_TIME_MASK			GENMASK(15, 0)
 | 
						|
+#define   QCA8K_ATU_AGE_TIME(x)				FIELD_PREP(QCA8K_ATU_AGE_TIME_MASK, (x))
 | 
						|
 #define QCA8K_REG_GLOBAL_FW_CTRL0			0x620
 | 
						|
 #define   QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN		BIT(10)
 | 
						|
 #define QCA8K_REG_GLOBAL_FW_CTRL1			0x624
 |