 7ace30aeb6
			
		
	
	7ace30aeb6
	
	
	
		
			
			Backport upstream code split patch for qca8k needed for ipq40xx target to correctly implement a DSA driver. Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
		
			
				
	
	
		
			138 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From fce1ec0c4e2d03d9c62ffc615a42bdba78eb4c14 Mon Sep 17 00:00:00 2001
 | |
| From: Christian Marangi <ansuelsmth@gmail.com>
 | |
| Date: Wed, 27 Jul 2022 13:35:15 +0200
 | |
| Subject: [PATCH 06/14] net: dsa: qca8k: move mib init function to common code
 | |
| 
 | |
| The same mib function is used by drivers based on qca8k family switch.
 | |
| Move it to common code to make it accessible also by other drivers.
 | |
| 
 | |
| Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
 | |
| Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
 | |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org>
 | |
| ---
 | |
|  drivers/net/dsa/qca/qca8k-8xxx.c   | 37 ------------------------------
 | |
|  drivers/net/dsa/qca/qca8k-common.c | 35 ++++++++++++++++++++++++++++
 | |
|  drivers/net/dsa/qca/qca8k.h        |  4 ++++
 | |
|  3 files changed, 39 insertions(+), 37 deletions(-)
 | |
| 
 | |
| --- a/drivers/net/dsa/qca/qca8k-8xxx.c
 | |
| +++ b/drivers/net/dsa/qca/qca8k-8xxx.c
 | |
| @@ -442,15 +442,6 @@ static struct regmap_config qca8k_regmap
 | |
|  };
 | |
|  
 | |
|  static int
 | |
| -qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask)
 | |
| -{
 | |
| -	u32 val;
 | |
| -
 | |
| -	return regmap_read_poll_timeout(priv->regmap, reg, val, !(val & mask), 0,
 | |
| -				       QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC);
 | |
| -}
 | |
| -
 | |
| -static int
 | |
|  qca8k_fdb_read(struct qca8k_priv *priv, struct qca8k_fdb *fdb)
 | |
|  {
 | |
|  	u32 reg[3];
 | |
| @@ -777,34 +768,6 @@ out:
 | |
|  	return ret;
 | |
|  }
 | |
|  
 | |
| -static int
 | |
| -qca8k_mib_init(struct qca8k_priv *priv)
 | |
| -{
 | |
| -	int ret;
 | |
| -
 | |
| -	mutex_lock(&priv->reg_mutex);
 | |
| -	ret = regmap_update_bits(priv->regmap, QCA8K_REG_MIB,
 | |
| -				 QCA8K_MIB_FUNC | QCA8K_MIB_BUSY,
 | |
| -				 FIELD_PREP(QCA8K_MIB_FUNC, QCA8K_MIB_FLUSH) |
 | |
| -				 QCA8K_MIB_BUSY);
 | |
| -	if (ret)
 | |
| -		goto exit;
 | |
| -
 | |
| -	ret = qca8k_busy_wait(priv, QCA8K_REG_MIB, QCA8K_MIB_BUSY);
 | |
| -	if (ret)
 | |
| -		goto exit;
 | |
| -
 | |
| -	ret = regmap_set_bits(priv->regmap, QCA8K_REG_MIB, QCA8K_MIB_CPU_KEEP);
 | |
| -	if (ret)
 | |
| -		goto exit;
 | |
| -
 | |
| -	ret = qca8k_write(priv, QCA8K_REG_MODULE_EN, QCA8K_MODULE_EN_MIB);
 | |
| -
 | |
| -exit:
 | |
| -	mutex_unlock(&priv->reg_mutex);
 | |
| -	return ret;
 | |
| -}
 | |
| -
 | |
|  static void
 | |
|  qca8k_port_set_status(struct qca8k_priv *priv, int port, int enable)
 | |
|  {
 | |
| --- a/drivers/net/dsa/qca/qca8k-common.c
 | |
| +++ b/drivers/net/dsa/qca/qca8k-common.c
 | |
| @@ -7,6 +7,7 @@
 | |
|   */
 | |
|  
 | |
|  #include <linux/netdevice.h>
 | |
| +#include <linux/bitfield.h>
 | |
|  #include <net/dsa.h>
 | |
|  
 | |
|  #include "qca8k.h"
 | |
| @@ -138,3 +139,38 @@ int qca8k_bulk_write(struct qca8k_priv *
 | |
|  
 | |
|  	return 0;
 | |
|  }
 | |
| +
 | |
| +int qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask)
 | |
| +{
 | |
| +	u32 val;
 | |
| +
 | |
| +	return regmap_read_poll_timeout(priv->regmap, reg, val, !(val & mask), 0,
 | |
| +				       QCA8K_BUSY_WAIT_TIMEOUT * USEC_PER_MSEC);
 | |
| +}
 | |
| +
 | |
| +int qca8k_mib_init(struct qca8k_priv *priv)
 | |
| +{
 | |
| +	int ret;
 | |
| +
 | |
| +	mutex_lock(&priv->reg_mutex);
 | |
| +	ret = regmap_update_bits(priv->regmap, QCA8K_REG_MIB,
 | |
| +				 QCA8K_MIB_FUNC | QCA8K_MIB_BUSY,
 | |
| +				 FIELD_PREP(QCA8K_MIB_FUNC, QCA8K_MIB_FLUSH) |
 | |
| +				 QCA8K_MIB_BUSY);
 | |
| +	if (ret)
 | |
| +		goto exit;
 | |
| +
 | |
| +	ret = qca8k_busy_wait(priv, QCA8K_REG_MIB, QCA8K_MIB_BUSY);
 | |
| +	if (ret)
 | |
| +		goto exit;
 | |
| +
 | |
| +	ret = regmap_set_bits(priv->regmap, QCA8K_REG_MIB, QCA8K_MIB_CPU_KEEP);
 | |
| +	if (ret)
 | |
| +		goto exit;
 | |
| +
 | |
| +	ret = qca8k_write(priv, QCA8K_REG_MODULE_EN, QCA8K_MODULE_EN_MIB);
 | |
| +
 | |
| +exit:
 | |
| +	mutex_unlock(&priv->reg_mutex);
 | |
| +	return ret;
 | |
| +}
 | |
| --- a/drivers/net/dsa/qca/qca8k.h
 | |
| +++ b/drivers/net/dsa/qca/qca8k.h
 | |
| @@ -422,6 +422,7 @@ struct qca8k_fdb {
 | |
|  /* Common setup function */
 | |
|  extern const struct qca8k_mib_desc ar8327_mib[];
 | |
|  extern const struct regmap_access_table qca8k_readable_table;
 | |
| +int qca8k_mib_init(struct qca8k_priv *priv);
 | |
|  
 | |
|  /* Common read/write/rmw function */
 | |
|  int qca8k_read(struct qca8k_priv *priv, u32 reg, u32 *val);
 | |
| @@ -431,4 +432,7 @@ int qca8k_rmw(struct qca8k_priv *priv, u
 | |
|  int qca8k_bulk_read(struct qca8k_priv *priv, u32 reg, u32 *val, int len);
 | |
|  int qca8k_bulk_write(struct qca8k_priv *priv, u32 reg, u32 *val, int len);
 | |
|  
 | |
| +/* Common ops function */
 | |
| +int qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask);
 | |
| +
 | |
|  #endif /* __QCA8K_H */
 |