netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [net-next PATCH v2 1/5] net: dsa: tag_qca: return early if dev is not found
@ 2023-07-29 11:55 Christian Marangi
  2023-07-29 11:55 ` [net-next PATCH v2 2/5] net: dsa: qca8k: make learning configurable and keep off if standalone Christian Marangi
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Christian Marangi @ 2023-07-29 11:55 UTC (permalink / raw)
  To: Andrew Lunn, Florian Fainelli, Vladimir Oltean, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Christian Marangi,
	Yang Yingliang, Russell King (Oracle), Atin Bainada, netdev,
	linux-kernel
  Cc: Simon Horman, Florian Fainelli

Currently checksum is recalculated and dsa tag stripped even if we later
don't find the dev.

To improve code, exit early if we don't find the dev and skip additional
operation on the skb since it will be freed anyway.

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
---
 net/dsa/tag_qca.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/net/dsa/tag_qca.c b/net/dsa/tag_qca.c
index e757c8de06f1..e5ff7c34e577 100644
--- a/net/dsa/tag_qca.c
+++ b/net/dsa/tag_qca.c
@@ -75,10 +75,6 @@ static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev)
 		return NULL;
 	}
 
-	/* Remove QCA tag and recalculate checksum */
-	skb_pull_rcsum(skb, QCA_HDR_LEN);
-	dsa_strip_etype_header(skb, QCA_HDR_LEN);
-
 	/* Get source port information */
 	port = FIELD_GET(QCA_HDR_RECV_SOURCE_PORT, hdr);
 
@@ -86,6 +82,10 @@ static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev)
 	if (!skb->dev)
 		return NULL;
 
+	/* Remove QCA tag and recalculate checksum */
+	skb_pull_rcsum(skb, QCA_HDR_LEN);
+	dsa_strip_etype_header(skb, QCA_HDR_LEN);
+
 	return skb;
 }
 
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [net-next PATCH v2 2/5] net: dsa: qca8k: make learning configurable and keep off if standalone
  2023-07-29 11:55 [net-next PATCH v2 1/5] net: dsa: tag_qca: return early if dev is not found Christian Marangi
@ 2023-07-29 11:55 ` Christian Marangi
  2023-07-29 11:55 ` [net-next PATCH v2 3/5] net: dsa: qca8k: limit user ports access to the first CPU port on setup Christian Marangi
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 8+ messages in thread
From: Christian Marangi @ 2023-07-29 11:55 UTC (permalink / raw)
  To: Andrew Lunn, Florian Fainelli, Vladimir Oltean, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Christian Marangi,
	Yang Yingliang, Russell King (Oracle), Atin Bainada, netdev,
	linux-kernel
  Cc: Florian Fainelli

Address learning should initially be turned off by the driver for port
operation in standalone mode, then the DSA core handles changes to it
via ds->ops->port_bridge_flags().

Currently this is not the case for qca8k where learning is enabled
unconditionally in qca8k_setup for every user port.

Handle ports configured in standalone mode by making the learning
configurable and not enabling it by default.

Implement .port_pre_bridge_flags and .port_bridge_flags dsa ops to
enable learning for bridge that request it and tweak
.port_stp_state_set to correctly disable learning when port is
configured in standalone mode.

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
---
 drivers/net/dsa/qca/qca8k-8xxx.c   |  7 +++--
 drivers/net/dsa/qca/qca8k-common.c | 48 ++++++++++++++++++++++++++++++
 drivers/net/dsa/qca/qca8k.h        |  6 ++++
 3 files changed, 58 insertions(+), 3 deletions(-)

diff --git a/drivers/net/dsa/qca/qca8k-8xxx.c b/drivers/net/dsa/qca/qca8k-8xxx.c
index ae088a4df794..31552853fdd4 100644
--- a/drivers/net/dsa/qca/qca8k-8xxx.c
+++ b/drivers/net/dsa/qca/qca8k-8xxx.c
@@ -1870,9 +1870,8 @@ qca8k_setup(struct dsa_switch *ds)
 			if (ret)
 				return ret;
 
-			/* Enable ARP Auto-learning by default */
-			ret = regmap_set_bits(priv->regmap, QCA8K_PORT_LOOKUP_CTRL(i),
-					      QCA8K_PORT_LOOKUP_LEARN);
+			ret = regmap_clear_bits(priv->regmap, QCA8K_PORT_LOOKUP_CTRL(i),
+						QCA8K_PORT_LOOKUP_LEARN);
 			if (ret)
 				return ret;
 
@@ -1978,6 +1977,8 @@ static const struct dsa_switch_ops qca8k_switch_ops = {
 	.port_change_mtu	= qca8k_port_change_mtu,
 	.port_max_mtu		= qca8k_port_max_mtu,
 	.port_stp_state_set	= qca8k_port_stp_state_set,
+	.port_pre_bridge_flags	= qca8k_port_pre_bridge_flags,
+	.port_bridge_flags	= qca8k_port_bridge_flags,
 	.port_bridge_join	= qca8k_port_bridge_join,
 	.port_bridge_leave	= qca8k_port_bridge_leave,
 	.port_fast_age		= qca8k_port_fast_age,
diff --git a/drivers/net/dsa/qca/qca8k-common.c b/drivers/net/dsa/qca/qca8k-common.c
index 13b8452ce5b2..fce04ce12cf9 100644
--- a/drivers/net/dsa/qca/qca8k-common.c
+++ b/drivers/net/dsa/qca/qca8k-common.c
@@ -565,9 +565,26 @@ int qca8k_get_mac_eee(struct dsa_switch *ds, int port,
 	return 0;
 }
 
+static int qca8k_port_configure_learning(struct dsa_switch *ds, int port,
+					 bool learning)
+{
+	struct qca8k_priv *priv = ds->priv;
+
+	if (learning)
+		return regmap_set_bits(priv->regmap,
+				       QCA8K_PORT_LOOKUP_CTRL(port),
+				       QCA8K_PORT_LOOKUP_LEARN);
+	else
+		return regmap_clear_bits(priv->regmap,
+					 QCA8K_PORT_LOOKUP_CTRL(port),
+					 QCA8K_PORT_LOOKUP_LEARN);
+}
+
 void qca8k_port_stp_state_set(struct dsa_switch *ds, int port, u8 state)
 {
+	struct dsa_port *dp = dsa_to_port(ds, port);
 	struct qca8k_priv *priv = ds->priv;
+	bool learning = false;
 	u32 stp_state;
 
 	switch (state) {
@@ -582,8 +599,11 @@ void qca8k_port_stp_state_set(struct dsa_switch *ds, int port, u8 state)
 		break;
 	case BR_STATE_LEARNING:
 		stp_state = QCA8K_PORT_LOOKUP_STATE_LEARNING;
+		learning = dp->learning;
 		break;
 	case BR_STATE_FORWARDING:
+		learning = dp->learning;
+		fallthrough;
 	default:
 		stp_state = QCA8K_PORT_LOOKUP_STATE_FORWARD;
 		break;
@@ -591,6 +611,34 @@ void qca8k_port_stp_state_set(struct dsa_switch *ds, int port, u8 state)
 
 	qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
 		  QCA8K_PORT_LOOKUP_STATE_MASK, stp_state);
+
+	qca8k_port_configure_learning(ds, port, learning);
+}
+
+int qca8k_port_pre_bridge_flags(struct dsa_switch *ds, int port,
+				struct switchdev_brport_flags flags,
+				struct netlink_ext_ack *extack)
+{
+	if (flags.mask & ~BR_LEARNING)
+		return -EINVAL;
+
+	return 0;
+}
+
+int qca8k_port_bridge_flags(struct dsa_switch *ds, int port,
+			    struct switchdev_brport_flags flags,
+			    struct netlink_ext_ack *extack)
+{
+	int ret;
+
+	if (flags.mask & BR_LEARNING) {
+		ret = qca8k_port_configure_learning(ds, port,
+						    flags.val & BR_LEARNING);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
 }
 
 int qca8k_port_bridge_join(struct dsa_switch *ds, int port,
diff --git a/drivers/net/dsa/qca/qca8k.h b/drivers/net/dsa/qca/qca8k.h
index c5cc8a172d65..8f88b7db384d 100644
--- a/drivers/net/dsa/qca/qca8k.h
+++ b/drivers/net/dsa/qca/qca8k.h
@@ -522,6 +522,12 @@ int qca8k_get_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *e);
 
 /* Common bridge function */
 void qca8k_port_stp_state_set(struct dsa_switch *ds, int port, u8 state);
+int qca8k_port_pre_bridge_flags(struct dsa_switch *ds, int port,
+				struct switchdev_brport_flags flags,
+				struct netlink_ext_ack *extack);
+int qca8k_port_bridge_flags(struct dsa_switch *ds, int port,
+			    struct switchdev_brport_flags flags,
+			    struct netlink_ext_ack *extack);
 int qca8k_port_bridge_join(struct dsa_switch *ds, int port,
 			   struct dsa_bridge bridge,
 			   bool *tx_fwd_offload,
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [net-next PATCH v2 3/5] net: dsa: qca8k: limit user ports access to the first CPU port on setup
  2023-07-29 11:55 [net-next PATCH v2 1/5] net: dsa: tag_qca: return early if dev is not found Christian Marangi
  2023-07-29 11:55 ` [net-next PATCH v2 2/5] net: dsa: qca8k: make learning configurable and keep off if standalone Christian Marangi
@ 2023-07-29 11:55 ` Christian Marangi
  2023-07-29 11:55 ` [net-next PATCH v2 4/5] net: dsa: qca8k: move qca8xxx hol fixup to separate function Christian Marangi
  2023-07-29 11:55 ` [net-next PATCH v2 5/5] net: dsa: qca8k: use dsa_for_each macro instead of for loop Christian Marangi
  3 siblings, 0 replies; 8+ messages in thread
From: Christian Marangi @ 2023-07-29 11:55 UTC (permalink / raw)
  To: Andrew Lunn, Florian Fainelli, Vladimir Oltean, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Christian Marangi,
	Yang Yingliang, Russell King (Oracle), Atin Bainada, netdev,
	linux-kernel
  Cc: Simon Horman, Florian Fainelli

In preparation for multi-CPU support, set CPU port LOOKUP MEMBER outside
the port loop and setup the LOOKUP MEMBER mask for user ports only to
the first CPU port.

This is to handle flooding condition where every CPU port is set as
target and prevent packet duplication for unknown frames from user ports.

Secondary CPU port LOOKUP MEMBER mask will be setup later when
port_change_master will be implemented.

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
---
 drivers/net/dsa/qca/qca8k-8xxx.c | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/drivers/net/dsa/qca/qca8k-8xxx.c b/drivers/net/dsa/qca/qca8k-8xxx.c
index 31552853fdd4..6286a64a2fe3 100644
--- a/drivers/net/dsa/qca/qca8k-8xxx.c
+++ b/drivers/net/dsa/qca/qca8k-8xxx.c
@@ -1850,18 +1850,16 @@ qca8k_setup(struct dsa_switch *ds)
 	if (ret)
 		return ret;
 
+	/* CPU port gets connected to all user ports of the switch */
+	ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(cpu_port),
+			QCA8K_PORT_LOOKUP_MEMBER, dsa_user_ports(ds));
+	if (ret)
+		return ret;
+
 	/* Setup connection between CPU port & user ports
 	 * Configure specific switch configuration for ports
 	 */
 	for (i = 0; i < QCA8K_NUM_PORTS; i++) {
-		/* CPU port gets connected to all user ports of the switch */
-		if (dsa_is_cpu_port(ds, i)) {
-			ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i),
-					QCA8K_PORT_LOOKUP_MEMBER, dsa_user_ports(ds));
-			if (ret)
-				return ret;
-		}
-
 		/* Individual user ports get connected to CPU port only */
 		if (dsa_is_user_port(ds, i)) {
 			ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i),
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [net-next PATCH v2 4/5] net: dsa: qca8k: move qca8xxx hol fixup to separate function
  2023-07-29 11:55 [net-next PATCH v2 1/5] net: dsa: tag_qca: return early if dev is not found Christian Marangi
  2023-07-29 11:55 ` [net-next PATCH v2 2/5] net: dsa: qca8k: make learning configurable and keep off if standalone Christian Marangi
  2023-07-29 11:55 ` [net-next PATCH v2 3/5] net: dsa: qca8k: limit user ports access to the first CPU port on setup Christian Marangi
@ 2023-07-29 11:55 ` Christian Marangi
  2023-07-30 19:52   ` Simon Horman
  2023-07-29 11:55 ` [net-next PATCH v2 5/5] net: dsa: qca8k: use dsa_for_each macro instead of for loop Christian Marangi
  3 siblings, 1 reply; 8+ messages in thread
From: Christian Marangi @ 2023-07-29 11:55 UTC (permalink / raw)
  To: Andrew Lunn, Florian Fainelli, Vladimir Oltean, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Christian Marangi,
	Yang Yingliang, Russell King (Oracle), Atin Bainada, netdev,
	linux-kernel

Move qca8xxx hol fixup to separate function to tidy things up and to
permit using a more efficent loop in future patch.

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
---
 drivers/net/dsa/qca/qca8k-8xxx.c | 78 +++++++++++++++++---------------
 1 file changed, 42 insertions(+), 36 deletions(-)

diff --git a/drivers/net/dsa/qca/qca8k-8xxx.c b/drivers/net/dsa/qca/qca8k-8xxx.c
index 6286a64a2fe3..81c6fab0a01b 100644
--- a/drivers/net/dsa/qca/qca8k-8xxx.c
+++ b/drivers/net/dsa/qca/qca8k-8xxx.c
@@ -1756,6 +1756,46 @@ static int qca8k_connect_tag_protocol(struct dsa_switch *ds,
 	return 0;
 }
 
+static void qca8k_setup_hol_fixup(struct qca8k_priv *priv, int port)
+{
+	u32 mask;
+
+	switch (port) {
+	/* The 2 CPU port and port 5 requires some different
+	 * priority than any other ports.
+	 */
+	case 0:
+	case 5:
+	case 6:
+		mask = QCA8K_PORT_HOL_CTRL0_EG_PRI0(0x3) |
+			QCA8K_PORT_HOL_CTRL0_EG_PRI1(0x4) |
+			QCA8K_PORT_HOL_CTRL0_EG_PRI2(0x4) |
+			QCA8K_PORT_HOL_CTRL0_EG_PRI3(0x4) |
+			QCA8K_PORT_HOL_CTRL0_EG_PRI4(0x6) |
+			QCA8K_PORT_HOL_CTRL0_EG_PRI5(0x8) |
+			QCA8K_PORT_HOL_CTRL0_EG_PORT(0x1e);
+		break;
+	default:
+		mask = QCA8K_PORT_HOL_CTRL0_EG_PRI0(0x3) |
+			QCA8K_PORT_HOL_CTRL0_EG_PRI1(0x4) |
+			QCA8K_PORT_HOL_CTRL0_EG_PRI2(0x6) |
+			QCA8K_PORT_HOL_CTRL0_EG_PRI3(0x8) |
+			QCA8K_PORT_HOL_CTRL0_EG_PORT(0x19);
+	}
+	regmap_write(priv->regmap, QCA8K_REG_PORT_HOL_CTRL0(port), mask);
+
+	mask = QCA8K_PORT_HOL_CTRL1_ING(0x6) |
+	       QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN |
+	       QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN |
+	       QCA8K_PORT_HOL_CTRL1_WRED_EN;
+	regmap_update_bits(priv->regmap, QCA8K_REG_PORT_HOL_CTRL1(port),
+			   QCA8K_PORT_HOL_CTRL1_ING_BUF_MASK |
+			   QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN |
+			   QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN |
+			   QCA8K_PORT_HOL_CTRL1_WRED_EN,
+			   mask);
+}
+
 static int
 qca8k_setup(struct dsa_switch *ds)
 {
@@ -1895,42 +1935,8 @@ qca8k_setup(struct dsa_switch *ds)
 		 * missing settings to improve switch stability under load condition.
 		 * This problem is limited to qca8337 and other qca8k switch are not affected.
 		 */
-		if (priv->switch_id == QCA8K_ID_QCA8337) {
-			switch (i) {
-			/* The 2 CPU port and port 5 requires some different
-			 * priority than any other ports.
-			 */
-			case 0:
-			case 5:
-			case 6:
-				mask = QCA8K_PORT_HOL_CTRL0_EG_PRI0(0x3) |
-					QCA8K_PORT_HOL_CTRL0_EG_PRI1(0x4) |
-					QCA8K_PORT_HOL_CTRL0_EG_PRI2(0x4) |
-					QCA8K_PORT_HOL_CTRL0_EG_PRI3(0x4) |
-					QCA8K_PORT_HOL_CTRL0_EG_PRI4(0x6) |
-					QCA8K_PORT_HOL_CTRL0_EG_PRI5(0x8) |
-					QCA8K_PORT_HOL_CTRL0_EG_PORT(0x1e);
-				break;
-			default:
-				mask = QCA8K_PORT_HOL_CTRL0_EG_PRI0(0x3) |
-					QCA8K_PORT_HOL_CTRL0_EG_PRI1(0x4) |
-					QCA8K_PORT_HOL_CTRL0_EG_PRI2(0x6) |
-					QCA8K_PORT_HOL_CTRL0_EG_PRI3(0x8) |
-					QCA8K_PORT_HOL_CTRL0_EG_PORT(0x19);
-			}
-			qca8k_write(priv, QCA8K_REG_PORT_HOL_CTRL0(i), mask);
-
-			mask = QCA8K_PORT_HOL_CTRL1_ING(0x6) |
-			QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN |
-			QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN |
-			QCA8K_PORT_HOL_CTRL1_WRED_EN;
-			qca8k_rmw(priv, QCA8K_REG_PORT_HOL_CTRL1(i),
-				  QCA8K_PORT_HOL_CTRL1_ING_BUF_MASK |
-				  QCA8K_PORT_HOL_CTRL1_EG_PRI_BUF_EN |
-				  QCA8K_PORT_HOL_CTRL1_EG_PORT_BUF_EN |
-				  QCA8K_PORT_HOL_CTRL1_WRED_EN,
-				  mask);
-		}
+		if (priv->switch_id == QCA8K_ID_QCA8337)
+			qca8k_setup_hol_fixup(priv, i);
 	}
 
 	/* Special GLOBAL_FC_THRESH value are needed for ar8327 switch */
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [net-next PATCH v2 5/5] net: dsa: qca8k: use dsa_for_each macro instead of for loop
  2023-07-29 11:55 [net-next PATCH v2 1/5] net: dsa: tag_qca: return early if dev is not found Christian Marangi
                   ` (2 preceding siblings ...)
  2023-07-29 11:55 ` [net-next PATCH v2 4/5] net: dsa: qca8k: move qca8xxx hol fixup to separate function Christian Marangi
@ 2023-07-29 11:55 ` Christian Marangi
  2023-07-29 16:24   ` kernel test robot
  2023-07-29 19:50   ` kernel test robot
  3 siblings, 2 replies; 8+ messages in thread
From: Christian Marangi @ 2023-07-29 11:55 UTC (permalink / raw)
  To: Andrew Lunn, Florian Fainelli, Vladimir Oltean, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Christian Marangi,
	Yang Yingliang, Russell King (Oracle), Atin Bainada, netdev,
	linux-kernel

Convert for loop to dsa_for_each macro to save some redundant write on
unconnected/unused port and tidy things up.

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
---
 drivers/net/dsa/qca/qca8k-8xxx.c | 109 ++++++++++++++++---------------
 1 file changed, 57 insertions(+), 52 deletions(-)

diff --git a/drivers/net/dsa/qca/qca8k-8xxx.c b/drivers/net/dsa/qca/qca8k-8xxx.c
index 81c6fab0a01b..1434f145aa9c 100644
--- a/drivers/net/dsa/qca/qca8k-8xxx.c
+++ b/drivers/net/dsa/qca/qca8k-8xxx.c
@@ -1800,7 +1800,8 @@ static int
 qca8k_setup(struct dsa_switch *ds)
 {
 	struct qca8k_priv *priv = ds->priv;
-	int cpu_port, ret, i;
+	int cpu_port, ret, port;
+	struct dsa_port *dp;
 	u32 mask;
 
 	cpu_port = qca8k_find_cpu_port(ds);
@@ -1855,27 +1856,31 @@ qca8k_setup(struct dsa_switch *ds)
 		dev_warn(priv->dev, "mib init failed");
 
 	/* Initial setup of all ports */
-	for (i = 0; i < QCA8K_NUM_PORTS; i++) {
+	dsa_switch_for_each_port(dp, ds) {
+		port = dp->index;
+
 		/* Disable forwarding by default on all ports */
-		ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i),
+		ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
 				QCA8K_PORT_LOOKUP_MEMBER, 0);
 		if (ret)
 			return ret;
 
-		/* Enable QCA header mode on all cpu ports */
-		if (dsa_is_cpu_port(ds, i)) {
-			ret = qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(i),
-					  FIELD_PREP(QCA8K_PORT_HDR_CTRL_TX_MASK, QCA8K_PORT_HDR_CTRL_ALL) |
-					  FIELD_PREP(QCA8K_PORT_HDR_CTRL_RX_MASK, QCA8K_PORT_HDR_CTRL_ALL));
-			if (ret) {
-				dev_err(priv->dev, "failed enabling QCA header mode");
-				return ret;
-			}
-		}
-
 		/* Disable MAC by default on all user ports */
 		if (dsa_is_user_port(ds, i))
-			qca8k_port_set_status(priv, i, 0);
+			qca8k_port_set_status(priv, port, 0);
+	}
+
+	/* Enable QCA header mode on all cpu ports */
+	dsa_switch_for_each_cpu_port(dp, ds) {
+		port = dp->index;
+
+		ret = qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(port),
+				  FIELD_PREP(QCA8K_PORT_HDR_CTRL_TX_MASK, QCA8K_PORT_HDR_CTRL_ALL) |
+				  FIELD_PREP(QCA8K_PORT_HDR_CTRL_RX_MASK, QCA8K_PORT_HDR_CTRL_ALL));
+		if (ret) {
+			dev_err(priv->dev, "failed enabling QCA header mode on port %d", port);
+			return ret;
+		}
 	}
 
 	/* Forward all unknown frames to CPU port for Linux processing
@@ -1897,48 +1902,48 @@ qca8k_setup(struct dsa_switch *ds)
 		return ret;
 
 	/* Setup connection between CPU port & user ports
-	 * Configure specific switch configuration for ports
+	 * Individual user ports get connected to CPU port only
 	 */
-	for (i = 0; i < QCA8K_NUM_PORTS; i++) {
-		/* Individual user ports get connected to CPU port only */
-		if (dsa_is_user_port(ds, i)) {
-			ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i),
-					QCA8K_PORT_LOOKUP_MEMBER,
-					BIT(cpu_port));
-			if (ret)
-				return ret;
-
-			ret = regmap_clear_bits(priv->regmap, QCA8K_PORT_LOOKUP_CTRL(i),
-						QCA8K_PORT_LOOKUP_LEARN);
-			if (ret)
-				return ret;
-
-			/* For port based vlans to work we need to set the
-			 * default egress vid
-			 */
-			ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(i),
-					QCA8K_EGREES_VLAN_PORT_MASK(i),
-					QCA8K_EGREES_VLAN_PORT(i, QCA8K_PORT_VID_DEF));
-			if (ret)
-				return ret;
-
-			ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(i),
-					  QCA8K_PORT_VLAN_CVID(QCA8K_PORT_VID_DEF) |
-					  QCA8K_PORT_VLAN_SVID(QCA8K_PORT_VID_DEF));
-			if (ret)
-				return ret;
-		}
+	dsa_switch_for_each_user_port(dp, ds) {
+		port = dp->index;
 
-		/* The port 5 of the qca8337 have some problem in flood condition. The
-		 * original legacy driver had some specific buffer and priority settings
-		 * for the different port suggested by the QCA switch team. Add this
-		 * missing settings to improve switch stability under load condition.
-		 * This problem is limited to qca8337 and other qca8k switch are not affected.
+		ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
+				QCA8K_PORT_LOOKUP_MEMBER,
+				BIT(cpu_port));
+		if (ret)
+			return ret;
+
+		ret = regmap_clear_bits(priv->regmap, QCA8K_PORT_LOOKUP_CTRL(port),
+					QCA8K_PORT_LOOKUP_LEARN);
+		if (ret)
+			return ret;
+
+		/* For port based vlans to work we need to set the
+		 * default egress vid
 		 */
-		if (priv->switch_id == QCA8K_ID_QCA8337)
-			qca8k_setup_hol_fixup(priv, i);
+		ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(port),
+				QCA8K_EGREES_VLAN_PORT_MASK(port),
+				QCA8K_EGREES_VLAN_PORT(port, QCA8K_PORT_VID_DEF));
+		if (ret)
+			return ret;
+
+		ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(port),
+				  QCA8K_PORT_VLAN_CVID(QCA8K_PORT_VID_DEF) |
+				  QCA8K_PORT_VLAN_SVID(QCA8K_PORT_VID_DEF));
+		if (ret)
+			return ret;
 	}
 
+	/* The port 5 of the qca8337 have some problem in flood condition. The
+	 * original legacy driver had some specific buffer and priority settings
+	 * for the different port suggested by the QCA switch team. Add this
+	 * missing settings to improve switch stability under load condition.
+	 * This problem is limited to qca8337 and other qca8k switch are not affected.
+	 */
+	if (priv->switch_id == QCA8K_ID_QCA8337)
+		dsa_switch_for_each_available_port(dp, ds)
+			qca8k_setup_hol_fixup(priv, dp->index);
+
 	/* Special GLOBAL_FC_THRESH value are needed for ar8327 switch */
 	if (priv->switch_id == QCA8K_ID_QCA8327) {
 		mask = QCA8K_GLOBAL_FC_GOL_XON_THRES(288) |
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [net-next PATCH v2 5/5] net: dsa: qca8k: use dsa_for_each macro instead of for loop
  2023-07-29 11:55 ` [net-next PATCH v2 5/5] net: dsa: qca8k: use dsa_for_each macro instead of for loop Christian Marangi
@ 2023-07-29 16:24   ` kernel test robot
  2023-07-29 19:50   ` kernel test robot
  1 sibling, 0 replies; 8+ messages in thread
From: kernel test robot @ 2023-07-29 16:24 UTC (permalink / raw)
  To: Christian Marangi, Andrew Lunn, Florian Fainelli, Vladimir Oltean,
	David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Yang Yingliang, Russell King (Oracle), Atin Bainada, linux-kernel
  Cc: llvm, oe-kbuild-all, netdev

Hi Christian,

kernel test robot noticed the following build errors:

[auto build test ERROR on net-next/main]

url:    https://github.com/intel-lab-lkp/linux/commits/Christian-Marangi/net-dsa-qca8k-make-learning-configurable-and-keep-off-if-standalone/20230729-195747
base:   net-next/main
patch link:    https://lore.kernel.org/r/20230729115509.32601-5-ansuelsmth%40gmail.com
patch subject: [net-next PATCH v2 5/5] net: dsa: qca8k: use dsa_for_each macro instead of for loop
config: i386-randconfig-i006-20230729 (https://download.01.org/0day-ci/archive/20230730/202307300000.UBj7WovP-lkp@intel.com/config)
compiler: clang version 16.0.4 (https://github.com/llvm/llvm-project.git ae42196bc493ffe877a7e3dff8be32035dea4d07)
reproduce: (https://download.01.org/0day-ci/archive/20230730/202307300000.UBj7WovP-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202307300000.UBj7WovP-lkp@intel.com/

All errors (new ones prefixed by >>):

>> drivers/net/dsa/qca/qca8k-8xxx.c:1869:28: error: use of undeclared identifier 'i'
                   if (dsa_is_user_port(ds, i))
                                            ^
   1 error generated.


vim +/i +1869 drivers/net/dsa/qca/qca8k-8xxx.c

  1798	
  1799	static int
  1800	qca8k_setup(struct dsa_switch *ds)
  1801	{
  1802		struct qca8k_priv *priv = ds->priv;
  1803		int cpu_port, ret, port;
  1804		struct dsa_port *dp;
  1805		u32 mask;
  1806	
  1807		cpu_port = qca8k_find_cpu_port(ds);
  1808		if (cpu_port < 0) {
  1809			dev_err(priv->dev, "No cpu port configured in both cpu port0 and port6");
  1810			return cpu_port;
  1811		}
  1812	
  1813		/* Parse CPU port config to be later used in phy_link mac_config */
  1814		ret = qca8k_parse_port_config(priv);
  1815		if (ret)
  1816			return ret;
  1817	
  1818		ret = qca8k_setup_mdio_bus(priv);
  1819		if (ret)
  1820			return ret;
  1821	
  1822		ret = qca8k_setup_of_pws_reg(priv);
  1823		if (ret)
  1824			return ret;
  1825	
  1826		ret = qca8k_setup_mac_pwr_sel(priv);
  1827		if (ret)
  1828			return ret;
  1829	
  1830		ret = qca8k_setup_led_ctrl(priv);
  1831		if (ret)
  1832			return ret;
  1833	
  1834		qca8k_setup_pcs(priv, &priv->pcs_port_0, 0);
  1835		qca8k_setup_pcs(priv, &priv->pcs_port_6, 6);
  1836	
  1837		/* Make sure MAC06 is disabled */
  1838		ret = regmap_clear_bits(priv->regmap, QCA8K_REG_PORT0_PAD_CTRL,
  1839					QCA8K_PORT0_PAD_MAC06_EXCHANGE_EN);
  1840		if (ret) {
  1841			dev_err(priv->dev, "failed disabling MAC06 exchange");
  1842			return ret;
  1843		}
  1844	
  1845		/* Enable CPU Port */
  1846		ret = regmap_set_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0,
  1847				      QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN);
  1848		if (ret) {
  1849			dev_err(priv->dev, "failed enabling CPU port");
  1850			return ret;
  1851		}
  1852	
  1853		/* Enable MIB counters */
  1854		ret = qca8k_mib_init(priv);
  1855		if (ret)
  1856			dev_warn(priv->dev, "mib init failed");
  1857	
  1858		/* Initial setup of all ports */
  1859		dsa_switch_for_each_port(dp, ds) {
  1860			port = dp->index;
  1861	
  1862			/* Disable forwarding by default on all ports */
  1863			ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
  1864					QCA8K_PORT_LOOKUP_MEMBER, 0);
  1865			if (ret)
  1866				return ret;
  1867	
  1868			/* Disable MAC by default on all user ports */
> 1869			if (dsa_is_user_port(ds, i))
  1870				qca8k_port_set_status(priv, port, 0);
  1871		}
  1872	
  1873		/* Enable QCA header mode on all cpu ports */
  1874		dsa_switch_for_each_cpu_port(dp, ds) {
  1875			port = dp->index;
  1876	
  1877			ret = qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(port),
  1878					  FIELD_PREP(QCA8K_PORT_HDR_CTRL_TX_MASK, QCA8K_PORT_HDR_CTRL_ALL) |
  1879					  FIELD_PREP(QCA8K_PORT_HDR_CTRL_RX_MASK, QCA8K_PORT_HDR_CTRL_ALL));
  1880			if (ret) {
  1881				dev_err(priv->dev, "failed enabling QCA header mode on port %d", port);
  1882				return ret;
  1883			}
  1884		}
  1885	
  1886		/* Forward all unknown frames to CPU port for Linux processing
  1887		 * Notice that in multi-cpu config only one port should be set
  1888		 * for igmp, unknown, multicast and broadcast packet
  1889		 */
  1890		ret = qca8k_write(priv, QCA8K_REG_GLOBAL_FW_CTRL1,
  1891				  FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_MASK, BIT(cpu_port)) |
  1892				  FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_BC_DP_MASK, BIT(cpu_port)) |
  1893				  FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_MC_DP_MASK, BIT(cpu_port)) |
  1894				  FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_UC_DP_MASK, BIT(cpu_port)));
  1895		if (ret)
  1896			return ret;
  1897	
  1898		/* CPU port gets connected to all user ports of the switch */
  1899		ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(cpu_port),
  1900				QCA8K_PORT_LOOKUP_MEMBER, dsa_user_ports(ds));
  1901		if (ret)
  1902			return ret;
  1903	
  1904		/* Setup connection between CPU port & user ports
  1905		 * Individual user ports get connected to CPU port only
  1906		 */
  1907		dsa_switch_for_each_user_port(dp, ds) {
  1908			port = dp->index;
  1909	
  1910			ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
  1911					QCA8K_PORT_LOOKUP_MEMBER,
  1912					BIT(cpu_port));
  1913			if (ret)
  1914				return ret;
  1915	
  1916			ret = regmap_clear_bits(priv->regmap, QCA8K_PORT_LOOKUP_CTRL(port),
  1917						QCA8K_PORT_LOOKUP_LEARN);
  1918			if (ret)
  1919				return ret;
  1920	
  1921			/* For port based vlans to work we need to set the
  1922			 * default egress vid
  1923			 */
  1924			ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(port),
  1925					QCA8K_EGREES_VLAN_PORT_MASK(port),
  1926					QCA8K_EGREES_VLAN_PORT(port, QCA8K_PORT_VID_DEF));
  1927			if (ret)
  1928				return ret;
  1929	
  1930			ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(port),
  1931					  QCA8K_PORT_VLAN_CVID(QCA8K_PORT_VID_DEF) |
  1932					  QCA8K_PORT_VLAN_SVID(QCA8K_PORT_VID_DEF));
  1933			if (ret)
  1934				return ret;
  1935		}
  1936	
  1937		/* The port 5 of the qca8337 have some problem in flood condition. The
  1938		 * original legacy driver had some specific buffer and priority settings
  1939		 * for the different port suggested by the QCA switch team. Add this
  1940		 * missing settings to improve switch stability under load condition.
  1941		 * This problem is limited to qca8337 and other qca8k switch are not affected.
  1942		 */
  1943		if (priv->switch_id == QCA8K_ID_QCA8337)
  1944			dsa_switch_for_each_available_port(dp, ds)
  1945				qca8k_setup_hol_fixup(priv, dp->index);
  1946	
  1947		/* Special GLOBAL_FC_THRESH value are needed for ar8327 switch */
  1948		if (priv->switch_id == QCA8K_ID_QCA8327) {
  1949			mask = QCA8K_GLOBAL_FC_GOL_XON_THRES(288) |
  1950			       QCA8K_GLOBAL_FC_GOL_XOFF_THRES(496);
  1951			qca8k_rmw(priv, QCA8K_REG_GLOBAL_FC_THRESH,
  1952				  QCA8K_GLOBAL_FC_GOL_XON_THRES_MASK |
  1953				  QCA8K_GLOBAL_FC_GOL_XOFF_THRES_MASK,
  1954				  mask);
  1955		}
  1956	
  1957		/* Setup our port MTUs to match power on defaults */
  1958		ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, ETH_FRAME_LEN + ETH_FCS_LEN);
  1959		if (ret)
  1960			dev_warn(priv->dev, "failed setting MTU settings");
  1961	
  1962		/* Flush the FDB table */
  1963		qca8k_fdb_flush(priv);
  1964	
  1965		/* Set min a max ageing value supported */
  1966		ds->ageing_time_min = 7000;
  1967		ds->ageing_time_max = 458745000;
  1968	
  1969		/* Set max number of LAGs supported */
  1970		ds->num_lag_ids = QCA8K_NUM_LAGS;
  1971	
  1972		return 0;
  1973	}
  1974	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [net-next PATCH v2 5/5] net: dsa: qca8k: use dsa_for_each macro instead of for loop
  2023-07-29 11:55 ` [net-next PATCH v2 5/5] net: dsa: qca8k: use dsa_for_each macro instead of for loop Christian Marangi
  2023-07-29 16:24   ` kernel test robot
@ 2023-07-29 19:50   ` kernel test robot
  1 sibling, 0 replies; 8+ messages in thread
From: kernel test robot @ 2023-07-29 19:50 UTC (permalink / raw)
  To: Christian Marangi, Andrew Lunn, Florian Fainelli, Vladimir Oltean,
	David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Yang Yingliang, Russell King (Oracle), Atin Bainada, linux-kernel
  Cc: oe-kbuild-all, netdev

Hi Christian,

kernel test robot noticed the following build errors:

[auto build test ERROR on net-next/main]

url:    https://github.com/intel-lab-lkp/linux/commits/Christian-Marangi/net-dsa-qca8k-make-learning-configurable-and-keep-off-if-standalone/20230729-195747
base:   net-next/main
patch link:    https://lore.kernel.org/r/20230729115509.32601-5-ansuelsmth%40gmail.com
patch subject: [net-next PATCH v2 5/5] net: dsa: qca8k: use dsa_for_each macro instead of for loop
config: x86_64-allyesconfig (https://download.01.org/0day-ci/archive/20230730/202307300305.RJlPYbyQ-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce: (https://download.01.org/0day-ci/archive/20230730/202307300305.RJlPYbyQ-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202307300305.RJlPYbyQ-lkp@intel.com/

All errors (new ones prefixed by >>):

   drivers/net/dsa/qca/qca8k-8xxx.c: In function 'qca8k_setup':
>> drivers/net/dsa/qca/qca8k-8xxx.c:1869:42: error: 'i' undeclared (first use in this function)
    1869 |                 if (dsa_is_user_port(ds, i))
         |                                          ^
   drivers/net/dsa/qca/qca8k-8xxx.c:1869:42: note: each undeclared identifier is reported only once for each function it appears in


vim +/i +1869 drivers/net/dsa/qca/qca8k-8xxx.c

  1798	
  1799	static int
  1800	qca8k_setup(struct dsa_switch *ds)
  1801	{
  1802		struct qca8k_priv *priv = ds->priv;
  1803		int cpu_port, ret, port;
  1804		struct dsa_port *dp;
  1805		u32 mask;
  1806	
  1807		cpu_port = qca8k_find_cpu_port(ds);
  1808		if (cpu_port < 0) {
  1809			dev_err(priv->dev, "No cpu port configured in both cpu port0 and port6");
  1810			return cpu_port;
  1811		}
  1812	
  1813		/* Parse CPU port config to be later used in phy_link mac_config */
  1814		ret = qca8k_parse_port_config(priv);
  1815		if (ret)
  1816			return ret;
  1817	
  1818		ret = qca8k_setup_mdio_bus(priv);
  1819		if (ret)
  1820			return ret;
  1821	
  1822		ret = qca8k_setup_of_pws_reg(priv);
  1823		if (ret)
  1824			return ret;
  1825	
  1826		ret = qca8k_setup_mac_pwr_sel(priv);
  1827		if (ret)
  1828			return ret;
  1829	
  1830		ret = qca8k_setup_led_ctrl(priv);
  1831		if (ret)
  1832			return ret;
  1833	
  1834		qca8k_setup_pcs(priv, &priv->pcs_port_0, 0);
  1835		qca8k_setup_pcs(priv, &priv->pcs_port_6, 6);
  1836	
  1837		/* Make sure MAC06 is disabled */
  1838		ret = regmap_clear_bits(priv->regmap, QCA8K_REG_PORT0_PAD_CTRL,
  1839					QCA8K_PORT0_PAD_MAC06_EXCHANGE_EN);
  1840		if (ret) {
  1841			dev_err(priv->dev, "failed disabling MAC06 exchange");
  1842			return ret;
  1843		}
  1844	
  1845		/* Enable CPU Port */
  1846		ret = regmap_set_bits(priv->regmap, QCA8K_REG_GLOBAL_FW_CTRL0,
  1847				      QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN);
  1848		if (ret) {
  1849			dev_err(priv->dev, "failed enabling CPU port");
  1850			return ret;
  1851		}
  1852	
  1853		/* Enable MIB counters */
  1854		ret = qca8k_mib_init(priv);
  1855		if (ret)
  1856			dev_warn(priv->dev, "mib init failed");
  1857	
  1858		/* Initial setup of all ports */
  1859		dsa_switch_for_each_port(dp, ds) {
  1860			port = dp->index;
  1861	
  1862			/* Disable forwarding by default on all ports */
  1863			ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
  1864					QCA8K_PORT_LOOKUP_MEMBER, 0);
  1865			if (ret)
  1866				return ret;
  1867	
  1868			/* Disable MAC by default on all user ports */
> 1869			if (dsa_is_user_port(ds, i))
  1870				qca8k_port_set_status(priv, port, 0);
  1871		}
  1872	
  1873		/* Enable QCA header mode on all cpu ports */
  1874		dsa_switch_for_each_cpu_port(dp, ds) {
  1875			port = dp->index;
  1876	
  1877			ret = qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(port),
  1878					  FIELD_PREP(QCA8K_PORT_HDR_CTRL_TX_MASK, QCA8K_PORT_HDR_CTRL_ALL) |
  1879					  FIELD_PREP(QCA8K_PORT_HDR_CTRL_RX_MASK, QCA8K_PORT_HDR_CTRL_ALL));
  1880			if (ret) {
  1881				dev_err(priv->dev, "failed enabling QCA header mode on port %d", port);
  1882				return ret;
  1883			}
  1884		}
  1885	
  1886		/* Forward all unknown frames to CPU port for Linux processing
  1887		 * Notice that in multi-cpu config only one port should be set
  1888		 * for igmp, unknown, multicast and broadcast packet
  1889		 */
  1890		ret = qca8k_write(priv, QCA8K_REG_GLOBAL_FW_CTRL1,
  1891				  FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_MASK, BIT(cpu_port)) |
  1892				  FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_BC_DP_MASK, BIT(cpu_port)) |
  1893				  FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_MC_DP_MASK, BIT(cpu_port)) |
  1894				  FIELD_PREP(QCA8K_GLOBAL_FW_CTRL1_UC_DP_MASK, BIT(cpu_port)));
  1895		if (ret)
  1896			return ret;
  1897	
  1898		/* CPU port gets connected to all user ports of the switch */
  1899		ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(cpu_port),
  1900				QCA8K_PORT_LOOKUP_MEMBER, dsa_user_ports(ds));
  1901		if (ret)
  1902			return ret;
  1903	
  1904		/* Setup connection between CPU port & user ports
  1905		 * Individual user ports get connected to CPU port only
  1906		 */
  1907		dsa_switch_for_each_user_port(dp, ds) {
  1908			port = dp->index;
  1909	
  1910			ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
  1911					QCA8K_PORT_LOOKUP_MEMBER,
  1912					BIT(cpu_port));
  1913			if (ret)
  1914				return ret;
  1915	
  1916			ret = regmap_clear_bits(priv->regmap, QCA8K_PORT_LOOKUP_CTRL(port),
  1917						QCA8K_PORT_LOOKUP_LEARN);
  1918			if (ret)
  1919				return ret;
  1920	
  1921			/* For port based vlans to work we need to set the
  1922			 * default egress vid
  1923			 */
  1924			ret = qca8k_rmw(priv, QCA8K_EGRESS_VLAN(port),
  1925					QCA8K_EGREES_VLAN_PORT_MASK(port),
  1926					QCA8K_EGREES_VLAN_PORT(port, QCA8K_PORT_VID_DEF));
  1927			if (ret)
  1928				return ret;
  1929	
  1930			ret = qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(port),
  1931					  QCA8K_PORT_VLAN_CVID(QCA8K_PORT_VID_DEF) |
  1932					  QCA8K_PORT_VLAN_SVID(QCA8K_PORT_VID_DEF));
  1933			if (ret)
  1934				return ret;
  1935		}
  1936	
  1937		/* The port 5 of the qca8337 have some problem in flood condition. The
  1938		 * original legacy driver had some specific buffer and priority settings
  1939		 * for the different port suggested by the QCA switch team. Add this
  1940		 * missing settings to improve switch stability under load condition.
  1941		 * This problem is limited to qca8337 and other qca8k switch are not affected.
  1942		 */
  1943		if (priv->switch_id == QCA8K_ID_QCA8337)
  1944			dsa_switch_for_each_available_port(dp, ds)
  1945				qca8k_setup_hol_fixup(priv, dp->index);
  1946	
  1947		/* Special GLOBAL_FC_THRESH value are needed for ar8327 switch */
  1948		if (priv->switch_id == QCA8K_ID_QCA8327) {
  1949			mask = QCA8K_GLOBAL_FC_GOL_XON_THRES(288) |
  1950			       QCA8K_GLOBAL_FC_GOL_XOFF_THRES(496);
  1951			qca8k_rmw(priv, QCA8K_REG_GLOBAL_FC_THRESH,
  1952				  QCA8K_GLOBAL_FC_GOL_XON_THRES_MASK |
  1953				  QCA8K_GLOBAL_FC_GOL_XOFF_THRES_MASK,
  1954				  mask);
  1955		}
  1956	
  1957		/* Setup our port MTUs to match power on defaults */
  1958		ret = qca8k_write(priv, QCA8K_MAX_FRAME_SIZE, ETH_FRAME_LEN + ETH_FCS_LEN);
  1959		if (ret)
  1960			dev_warn(priv->dev, "failed setting MTU settings");
  1961	
  1962		/* Flush the FDB table */
  1963		qca8k_fdb_flush(priv);
  1964	
  1965		/* Set min a max ageing value supported */
  1966		ds->ageing_time_min = 7000;
  1967		ds->ageing_time_max = 458745000;
  1968	
  1969		/* Set max number of LAGs supported */
  1970		ds->num_lag_ids = QCA8K_NUM_LAGS;
  1971	
  1972		return 0;
  1973	}
  1974	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [net-next PATCH v2 4/5] net: dsa: qca8k: move qca8xxx hol fixup to separate function
  2023-07-29 11:55 ` [net-next PATCH v2 4/5] net: dsa: qca8k: move qca8xxx hol fixup to separate function Christian Marangi
@ 2023-07-30 19:52   ` Simon Horman
  0 siblings, 0 replies; 8+ messages in thread
From: Simon Horman @ 2023-07-30 19:52 UTC (permalink / raw)
  To: Christian Marangi
  Cc: Andrew Lunn, Florian Fainelli, Vladimir Oltean, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Yang Yingliang,
	Russell King (Oracle), Atin Bainada, netdev, linux-kernel

On Sat, Jul 29, 2023 at 01:55:08PM +0200, Christian Marangi wrote:
> Move qca8xxx hol fixup to separate function to tidy things up and to
> permit using a more efficent loop in future patch.

nit: efficent -> efficient

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2023-07-30 19:52 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-07-29 11:55 [net-next PATCH v2 1/5] net: dsa: tag_qca: return early if dev is not found Christian Marangi
2023-07-29 11:55 ` [net-next PATCH v2 2/5] net: dsa: qca8k: make learning configurable and keep off if standalone Christian Marangi
2023-07-29 11:55 ` [net-next PATCH v2 3/5] net: dsa: qca8k: limit user ports access to the first CPU port on setup Christian Marangi
2023-07-29 11:55 ` [net-next PATCH v2 4/5] net: dsa: qca8k: move qca8xxx hol fixup to separate function Christian Marangi
2023-07-30 19:52   ` Simon Horman
2023-07-29 11:55 ` [net-next PATCH v2 5/5] net: dsa: qca8k: use dsa_for_each macro instead of for loop Christian Marangi
2023-07-29 16:24   ` kernel test robot
2023-07-29 19:50   ` kernel test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).