mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 14:04:26 -04:00 
			
		
		
		
	The qca8k patch series brings the numbering to 799. This patch renames 7xx patches to create space for more backports to be added. Signed-off-by: Matthew Hagan <mnhagan88@gmail.com> [rename 729->719] Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
		
			
				
	
	
		
			51 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 63c33bbfeb6842a956a0eb12901e28eb335bdb18 Mon Sep 17 00:00:00 2001
 | |
| From: Ansuel Smith <ansuelsmth@gmail.com>
 | |
| Date: Fri, 14 May 2021 23:00:07 +0200
 | |
| Subject: [PATCH] net: dsa: qca8k: clear MASTER_EN after phy read/write
 | |
| 
 | |
| Clear MDIO_MASTER_EN bit from MDIO_MASTER_CTRL after read/write
 | |
| operation. The MDIO_MASTER_EN bit is not reset after read/write
 | |
| operation and the next operation can be wrongly interpreted by the
 | |
| switch as a mdio operation. This cause a production of wrong/garbage
 | |
| data from the switch and underfined bheavior. (random port drop,
 | |
| unplugged port flagged with link up, wrong port speed)
 | |
| Also on driver remove the MASTER_CTRL can be left set and cause the
 | |
| malfunction of any next driver using the mdio device.
 | |
| 
 | |
| Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
 | |
| Signed-off-by: David S. Miller <davem@davemloft.net>
 | |
| ---
 | |
|  drivers/net/dsa/qca8k.c | 14 ++++++++++++--
 | |
|  1 file changed, 12 insertions(+), 2 deletions(-)
 | |
| 
 | |
| --- a/drivers/net/dsa/qca8k.c
 | |
| +++ b/drivers/net/dsa/qca8k.c
 | |
| @@ -649,8 +649,14 @@ qca8k_mdio_write(struct qca8k_priv *priv
 | |
|  	if (ret)
 | |
|  		return ret;
 | |
|  
 | |
| -	return qca8k_busy_wait(priv, QCA8K_MDIO_MASTER_CTRL,
 | |
| -		QCA8K_MDIO_MASTER_BUSY);
 | |
| +	ret = qca8k_busy_wait(priv, QCA8K_MDIO_MASTER_CTRL,
 | |
| +			      QCA8K_MDIO_MASTER_BUSY);
 | |
| +
 | |
| +	/* even if the busy_wait timeouts try to clear the MASTER_EN */
 | |
| +	qca8k_reg_clear(priv, QCA8K_MDIO_MASTER_CTRL,
 | |
| +			QCA8K_MDIO_MASTER_EN);
 | |
| +
 | |
| +	return ret;
 | |
|  }
 | |
|  
 | |
|  static int
 | |
| @@ -685,6 +691,10 @@ qca8k_mdio_read(struct qca8k_priv *priv,
 | |
|  
 | |
|  	val &= QCA8K_MDIO_MASTER_DATA_MASK;
 | |
|  
 | |
| +	/* even if the busy_wait timeouts try to clear the MASTER_EN */
 | |
| +	qca8k_reg_clear(priv, QCA8K_MDIO_MASTER_CTRL,
 | |
| +			QCA8K_MDIO_MASTER_EN);
 | |
| +
 | |
|  	return val;
 | |
|  }
 | |
|  
 |