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 <j...@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


_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to