 706a4ec40c
			
		
	
	706a4ec40c
	
	
	
		
			
			Manually rebased:
    oxnas/patches-5.10/100-oxnas-clk-plla-pllb.patch
All other patches automatically rebased.
Build system: x86_64
Build-tested: ipq806x/R7800
Signed-off-by: John Audia <therealgraysky@proton.me>
		
	
		
			
				
	
	
		
			100 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From ea6d5c924e391872d402acac38461a5f8261e57f Mon Sep 17 00:00:00 2001
 | |
| From: DENG Qingfang <dqfext@gmail.com>
 | |
| Date: Tue, 8 Dec 2020 15:00:28 +0800
 | |
| Subject: [PATCH] net: dsa: mt7530: support setting ageing time
 | |
| 
 | |
| MT7530 has a global address age control register, so use it to set
 | |
| ageing time.
 | |
| 
 | |
| The applied timer is (AGE_CNT + 1) * (AGE_UNIT + 1) seconds
 | |
| 
 | |
| Signed-off-by: DENG Qingfang <dqfext@gmail.com>
 | |
| Reviewed-by: Andrew Lunn <andrew@lunn.ch>
 | |
| Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
 | |
| Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
 | |
| Signed-off-by: David S. Miller <davem@davemloft.net>
 | |
| ---
 | |
|  drivers/net/dsa/mt7530.c | 41 ++++++++++++++++++++++++++++++++++++++++
 | |
|  drivers/net/dsa/mt7530.h | 13 +++++++++++++
 | |
|  2 files changed, 54 insertions(+)
 | |
| 
 | |
| --- a/drivers/net/dsa/mt7530.c
 | |
| +++ b/drivers/net/dsa/mt7530.c
 | |
| @@ -870,6 +870,46 @@ mt7530_get_sset_count(struct dsa_switch
 | |
|  	return ARRAY_SIZE(mt7530_mib);
 | |
|  }
 | |
|  
 | |
| +static int
 | |
| +mt7530_set_ageing_time(struct dsa_switch *ds, unsigned int msecs)
 | |
| +{
 | |
| +	struct mt7530_priv *priv = ds->priv;
 | |
| +	unsigned int secs = msecs / 1000;
 | |
| +	unsigned int tmp_age_count;
 | |
| +	unsigned int error = -1;
 | |
| +	unsigned int age_count;
 | |
| +	unsigned int age_unit;
 | |
| +
 | |
| +	/* Applied timer is (AGE_CNT + 1) * (AGE_UNIT + 1) seconds */
 | |
| +	if (secs < 1 || secs > (AGE_CNT_MAX + 1) * (AGE_UNIT_MAX + 1))
 | |
| +		return -ERANGE;
 | |
| +
 | |
| +	/* iterate through all possible age_count to find the closest pair */
 | |
| +	for (tmp_age_count = 0; tmp_age_count <= AGE_CNT_MAX; ++tmp_age_count) {
 | |
| +		unsigned int tmp_age_unit = secs / (tmp_age_count + 1) - 1;
 | |
| +
 | |
| +		if (tmp_age_unit <= AGE_UNIT_MAX) {
 | |
| +			unsigned int tmp_error = secs -
 | |
| +				(tmp_age_count + 1) * (tmp_age_unit + 1);
 | |
| +
 | |
| +			/* found a closer pair */
 | |
| +			if (error > tmp_error) {
 | |
| +				error = tmp_error;
 | |
| +				age_count = tmp_age_count;
 | |
| +				age_unit = tmp_age_unit;
 | |
| +			}
 | |
| +
 | |
| +			/* found the exact match, so break the loop */
 | |
| +			if (!error)
 | |
| +				break;
 | |
| +		}
 | |
| +	}
 | |
| +
 | |
| +	mt7530_write(priv, MT7530_AAC, AGE_CNT(age_count) | AGE_UNIT(age_unit));
 | |
| +
 | |
| +	return 0;
 | |
| +}
 | |
| +
 | |
|  static void mt7530_setup_port5(struct dsa_switch *ds, phy_interface_t interface)
 | |
|  {
 | |
|  	struct mt7530_priv *priv = ds->priv;
 | |
| @@ -2694,6 +2734,7 @@ static const struct dsa_switch_ops mt753
 | |
|  	.phy_write		= mt753x_phy_write,
 | |
|  	.get_ethtool_stats	= mt7530_get_ethtool_stats,
 | |
|  	.get_sset_count		= mt7530_get_sset_count,
 | |
| +	.set_ageing_time	= mt7530_set_ageing_time,
 | |
|  	.port_enable		= mt7530_port_enable,
 | |
|  	.port_disable		= mt7530_port_disable,
 | |
|  	.port_change_mtu	= mt7530_port_change_mtu,
 | |
| --- a/drivers/net/dsa/mt7530.h
 | |
| +++ b/drivers/net/dsa/mt7530.h
 | |
| @@ -161,6 +161,19 @@ enum mt7530_vlan_egress_attr {
 | |
|  	MT7530_VLAN_EGRESS_STACK = 3,
 | |
|  };
 | |
|  
 | |
| +/* Register for address age control */
 | |
| +#define MT7530_AAC			0xa0
 | |
| +/* Disable ageing */
 | |
| +#define  AGE_DIS			BIT(20)
 | |
| +/* Age count */
 | |
| +#define  AGE_CNT_MASK			GENMASK(19, 12)
 | |
| +#define  AGE_CNT_MAX			0xff
 | |
| +#define  AGE_CNT(x)			(AGE_CNT_MASK & ((x) << 12))
 | |
| +/* Age unit */
 | |
| +#define  AGE_UNIT_MASK			GENMASK(11, 0)
 | |
| +#define  AGE_UNIT_MAX			0xfff
 | |
| +#define  AGE_UNIT(x)			(AGE_UNIT_MASK & (x))
 | |
| +
 | |
|  /* Register for port STP state control */
 | |
|  #define MT7530_SSP_P(x)			(0x2000 + ((x) * 0x100))
 | |
|  #define  FID_PST(x)			((x) & 0x3)
 |