mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 14:04:26 -04:00 
			
		
		
		
	Removed upstreamed: bcm53xx/patches-5.10/083-v6.0-clk-iproc-Do-not-rely-on-node-name-for-correct-PLL-s.patch[1] All other patches automatically rebased. 1. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.10.147&id=a8e6cde5062fb2aff81f86cc0770591714bee545 Signed-off-by: John Audia <therealgraysky@proton.me>
		
			
				
	
	
		
			113 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 9470174e7581e75a8ebd78964997314dfc2e706c Mon Sep 17 00:00:00 2001
 | |
| From: DENG Qingfang <dqfext@gmail.com>
 | |
| Date: Tue, 3 Nov 2020 13:06:18 +0800
 | |
| Subject: [PATCH] net: dsa: mt7530: support setting MTU
 | |
| 
 | |
| MT7530/7531 has a global RX packet length register, which can be used
 | |
| to set MTU.
 | |
| 
 | |
| Supported packet length values are 1522 (1518 if untagged), 1536,
 | |
| 1552, and multiple of 1024 (from 2048 to 15360).
 | |
| 
 | |
| Signed-off-by: DENG Qingfang <dqfext@gmail.com>
 | |
| Link: https://lore.kernel.org/r/20201103050618.11419-1-dqfext@gmail.com
 | |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org>
 | |
| ---
 | |
|  drivers/net/dsa/mt7530.c | 49 ++++++++++++++++++++++++++++++++++++++++
 | |
|  drivers/net/dsa/mt7530.h | 12 ++++++++++
 | |
|  2 files changed, 61 insertions(+)
 | |
| 
 | |
| --- a/drivers/net/dsa/mt7530.c
 | |
| +++ b/drivers/net/dsa/mt7530.c
 | |
| @@ -1018,6 +1018,53 @@ mt7530_port_disable(struct dsa_switch *d
 | |
|  	mutex_unlock(&priv->reg_mutex);
 | |
|  }
 | |
|  
 | |
| +static int
 | |
| +mt7530_port_change_mtu(struct dsa_switch *ds, int port, int new_mtu)
 | |
| +{
 | |
| +	struct mt7530_priv *priv = ds->priv;
 | |
| +	struct mii_bus *bus = priv->bus;
 | |
| +	int length;
 | |
| +	u32 val;
 | |
| +
 | |
| +	/* When a new MTU is set, DSA always set the CPU port's MTU to the
 | |
| +	 * largest MTU of the slave ports. Because the switch only has a global
 | |
| +	 * RX length register, only allowing CPU port here is enough.
 | |
| +	 */
 | |
| +	if (!dsa_is_cpu_port(ds, port))
 | |
| +		return 0;
 | |
| +
 | |
| +	mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
 | |
| +
 | |
| +	val = mt7530_mii_read(priv, MT7530_GMACCR);
 | |
| +	val &= ~MAX_RX_PKT_LEN_MASK;
 | |
| +
 | |
| +	/* RX length also includes Ethernet header, MTK tag, and FCS length */
 | |
| +	length = new_mtu + ETH_HLEN + MTK_HDR_LEN + ETH_FCS_LEN;
 | |
| +	if (length <= 1522) {
 | |
| +		val |= MAX_RX_PKT_LEN_1522;
 | |
| +	} else if (length <= 1536) {
 | |
| +		val |= MAX_RX_PKT_LEN_1536;
 | |
| +	} else if (length <= 1552) {
 | |
| +		val |= MAX_RX_PKT_LEN_1552;
 | |
| +	} else {
 | |
| +		val &= ~MAX_RX_JUMBO_MASK;
 | |
| +		val |= MAX_RX_JUMBO(DIV_ROUND_UP(length, 1024));
 | |
| +		val |= MAX_RX_PKT_LEN_JUMBO;
 | |
| +	}
 | |
| +
 | |
| +	mt7530_mii_write(priv, MT7530_GMACCR, val);
 | |
| +
 | |
| +	mutex_unlock(&bus->mdio_lock);
 | |
| +
 | |
| +	return 0;
 | |
| +}
 | |
| +
 | |
| +static int
 | |
| +mt7530_port_max_mtu(struct dsa_switch *ds, int port)
 | |
| +{
 | |
| +	return MT7530_MAX_MTU;
 | |
| +}
 | |
| +
 | |
|  static void
 | |
|  mt7530_stp_state_set(struct dsa_switch *ds, int port, u8 state)
 | |
|  {
 | |
| @@ -2650,6 +2697,8 @@ static const struct dsa_switch_ops mt753
 | |
|  	.get_sset_count		= mt7530_get_sset_count,
 | |
|  	.port_enable		= mt7530_port_enable,
 | |
|  	.port_disable		= mt7530_port_disable,
 | |
| +	.port_change_mtu	= mt7530_port_change_mtu,
 | |
| +	.port_max_mtu		= mt7530_port_max_mtu,
 | |
|  	.port_stp_state_set	= mt7530_stp_state_set,
 | |
|  	.port_bridge_join	= mt7530_port_bridge_join,
 | |
|  	.port_bridge_leave	= mt7530_port_bridge_leave,
 | |
| --- a/drivers/net/dsa/mt7530.h
 | |
| +++ b/drivers/net/dsa/mt7530.h
 | |
| @@ -11,6 +11,9 @@
 | |
|  #define MT7530_NUM_FDB_RECORDS		2048
 | |
|  #define MT7530_ALL_MEMBERS		0xff
 | |
|  
 | |
| +#define MTK_HDR_LEN	4
 | |
| +#define MT7530_MAX_MTU	(15 * 1024 - ETH_HLEN - ETH_FCS_LEN - MTK_HDR_LEN)
 | |
| +
 | |
|  enum mt753x_id {
 | |
|  	ID_MT7530 = 0,
 | |
|  	ID_MT7621 = 1,
 | |
| @@ -301,6 +304,15 @@ enum mt7530_vlan_port_attr {
 | |
|  #define MT7531_DBG_CNT(x)		(0x3018 + (x) * 0x100)
 | |
|  #define  MT7531_DIS_CLR			BIT(31)
 | |
|  
 | |
| +#define MT7530_GMACCR			0x30e0
 | |
| +#define  MAX_RX_JUMBO(x)		((x) << 2)
 | |
| +#define  MAX_RX_JUMBO_MASK		GENMASK(5, 2)
 | |
| +#define  MAX_RX_PKT_LEN_MASK		GENMASK(1, 0)
 | |
| +#define  MAX_RX_PKT_LEN_1522		0x0
 | |
| +#define  MAX_RX_PKT_LEN_1536		0x1
 | |
| +#define  MAX_RX_PKT_LEN_1552		0x2
 | |
| +#define  MAX_RX_PKT_LEN_JUMBO		0x3
 | |
| +
 | |
|  /* Register for MIB */
 | |
|  #define MT7530_PORT_MIB_COUNTER(x)	(0x4000 + (x) * 0x100)
 | |
|  #define MT7530_MIB_CCR			0x4fe0
 |