[PATCH 2/4] realtek: initialize port masks to match the default state

Jan Hoffmann jan at 3e8.eu
Sun Mar 12 15:57:28 PDT 2023


All ports are disabled by default, so configure the port isolation masks
and the pm field accordingly in the setup function. When port_enable is
called for a port, the isolation masks will be set up so that traffic
can flow between the port and the CPU.

While at it, change the code to also use the traffic_set method in
rtl83xx_setup.

Signed-off-by: Jan Hoffmann <jan at 3e8.eu>
---
 .../files-5.10/drivers/net/dsa/rtl83xx/dsa.c  | 22 ++++++++++---------
 .../files-5.15/drivers/net/dsa/rtl83xx/dsa.c  | 22 ++++++++++---------
 2 files changed, 24 insertions(+), 20 deletions(-)

diff --git a/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/dsa.c b/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/dsa.c
index 220f1d5d281d..5936f5e7d2c3 100644
--- a/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/dsa.c
+++ b/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/dsa.c
@@ -176,7 +176,6 @@ static int rtl83xx_setup(struct dsa_switch *ds)
 {
 	int i;
 	struct rtl838x_switch_priv *priv = ds->priv;
-	u64 port_bitmap = BIT_ULL(priv->cpu_port);
 
 	pr_debug("%s called\n", __func__);
 
@@ -187,18 +186,19 @@ static int rtl83xx_setup(struct dsa_switch *ds)
 		priv->ports[i].enable = false;
 	priv->ports[priv->cpu_port].enable = true;
 
-	/* Isolate ports from each other: traffic only CPU <-> port */
+	/* Configure ports so they are disabled by default, but once enabled
+	 * they will work in isolated mode (only traffic between port and CPU).
+	 */
 	/* Setting bit j in register RTL838X_PORT_ISO_CTRL(i) allows
 	 * traffic from source port i to destination port j
 	 */
 	for (i = 0; i < priv->cpu_port; i++) {
 		if (priv->ports[i].phy) {
-			priv->r->set_port_reg_be(BIT_ULL(priv->cpu_port) | BIT_ULL(i),
-					      priv->r->port_iso_ctrl(i));
-			port_bitmap |= BIT_ULL(i);
+			priv->ports[i].pm = BIT_ULL(priv->cpu_port);
+			priv->r->traffic_set(i, BIT_ULL(i));
 		}
 	}
-	priv->r->set_port_reg_be(port_bitmap, priv->r->port_iso_ctrl(priv->cpu_port));
+	priv->r->traffic_set(priv->cpu_port, BIT_ULL(priv->cpu_port));
 
 	if (priv->family_id == RTL8380_FAMILY_ID)
 		rtl838x_print_matrix();
@@ -240,7 +240,6 @@ static int rtl93xx_setup(struct dsa_switch *ds)
 {
 	int i;
 	struct rtl838x_switch_priv *priv = ds->priv;
-	u32 port_bitmap = BIT(priv->cpu_port);
 
 	pr_info("%s called\n", __func__);
 
@@ -258,13 +257,16 @@ static int rtl93xx_setup(struct dsa_switch *ds)
 		priv->ports[i].enable = false;
 	priv->ports[priv->cpu_port].enable = true;
 
+	/* Configure ports so they are disabled by default, but once enabled
+	 * they will work in isolated mode (only traffic between port and CPU).
+	 */
 	for (i = 0; i < priv->cpu_port; i++) {
 		if (priv->ports[i].phy) {
-			priv->r->traffic_set(i, BIT_ULL(priv->cpu_port) | BIT_ULL(i));
-			port_bitmap |= BIT_ULL(i);
+			priv->ports[i].pm = BIT_ULL(priv->cpu_port);
+			priv->r->traffic_set(i, BIT_ULL(i));
 		}
 	}
-	priv->r->traffic_set(priv->cpu_port, port_bitmap);
+	priv->r->traffic_set(priv->cpu_port, BIT_ULL(priv->cpu_port));
 
 	rtl930x_print_matrix();
 
diff --git a/target/linux/realtek/files-5.15/drivers/net/dsa/rtl83xx/dsa.c b/target/linux/realtek/files-5.15/drivers/net/dsa/rtl83xx/dsa.c
index 7eebb2107f84..05f00ef20765 100644
--- a/target/linux/realtek/files-5.15/drivers/net/dsa/rtl83xx/dsa.c
+++ b/target/linux/realtek/files-5.15/drivers/net/dsa/rtl83xx/dsa.c
@@ -167,7 +167,6 @@ static void rtl83xx_port_set_salrn(struct rtl838x_switch_priv *priv,
 static int rtl83xx_setup(struct dsa_switch *ds)
 {
 	struct rtl838x_switch_priv *priv = ds->priv;
-	u64 port_bitmap = BIT_ULL(priv->cpu_port);
 
 	pr_debug("%s called\n", __func__);
 
@@ -178,18 +177,19 @@ static int rtl83xx_setup(struct dsa_switch *ds)
 		priv->ports[i].enable = false;
 	priv->ports[priv->cpu_port].enable = true;
 
-	/* Isolate ports from each other: traffic only CPU <-> port */
+	/* Configure ports so they are disabled by default, but once enabled
+	 * they will work in isolated mode (only traffic between port and CPU).
+	 */
 	/* Setting bit j in register RTL838X_PORT_ISO_CTRL(i) allows
 	 * traffic from source port i to destination port j
 	 */
 	for (int i = 0; i < priv->cpu_port; i++) {
 		if (priv->ports[i].phy) {
-			priv->r->set_port_reg_be(BIT_ULL(priv->cpu_port) | BIT_ULL(i),
-					      priv->r->port_iso_ctrl(i));
-			port_bitmap |= BIT_ULL(i);
+			priv->ports[i].pm = BIT_ULL(priv->cpu_port);
+			priv->r->traffic_set(i, BIT_ULL(i));
 		}
 	}
-	priv->r->set_port_reg_be(port_bitmap, priv->r->port_iso_ctrl(priv->cpu_port));
+	priv->r->traffic_set(priv->cpu_port, BIT_ULL(priv->cpu_port));
 
 	if (priv->family_id == RTL8380_FAMILY_ID)
 		rtl838x_print_matrix();
@@ -229,7 +229,6 @@ static int rtl83xx_setup(struct dsa_switch *ds)
 static int rtl93xx_setup(struct dsa_switch *ds)
 {
 	struct rtl838x_switch_priv *priv = ds->priv;
-	u32 port_bitmap = BIT(priv->cpu_port);
 
 	pr_info("%s called\n", __func__);
 
@@ -247,13 +246,16 @@ static int rtl93xx_setup(struct dsa_switch *ds)
 		priv->ports[i].enable = false;
 	priv->ports[priv->cpu_port].enable = true;
 
+	/* Configure ports so they are disabled by default, but once enabled
+	 * they will work in isolated mode (only traffic between port and CPU).
+	 */
 	for (int i = 0; i < priv->cpu_port; i++) {
 		if (priv->ports[i].phy) {
-			priv->r->traffic_set(i, BIT_ULL(priv->cpu_port) | BIT_ULL(i));
-			port_bitmap |= BIT_ULL(i);
+			priv->ports[i].pm = BIT_ULL(priv->cpu_port);
+			priv->r->traffic_set(i, BIT_ULL(i));
 		}
 	}
-	priv->r->traffic_set(priv->cpu_port, port_bitmap);
+	priv->r->traffic_set(priv->cpu_port, BIT_ULL(priv->cpu_port));
 
 	rtl930x_print_matrix();
 
-- 
2.39.1




More information about the openwrt-devel mailing list