]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
realtek: rtl931x: Fix traffic on upper ports
authorHarshal Gohel <hg@simonwunderlich.de>
Wed, 18 Jun 2025 11:35:15 +0000 (11:35 +0000)
committerRobert Marko <robimarko@gmail.com>
Thu, 31 Jul 2025 19:59:23 +0000 (21:59 +0200)
* traffic isolation tables are different between rtl930x and rtl931x
* traffic_enable/disable/get/set functions span multiple columns in the
  rtl931x as a result, previous implementation would only enable traffic
  in some ports.

traffic_enable/disable and traffic_set/get should now work on all ports and
not just the initial 32

Signed-off-by: Harshal Gohel <hg@simonwunderlich.de>
Signed-off-by: Sharadanand Karanjkar <sk@simonwunderlich.de>
Link: https://github.com/openwrt/openwrt/pull/19572
Signed-off-by: Robert Marko <robimarko@gmail.com>
target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl931x.c

index a3277992aef5d62e2b576aefac2990ad541292ac..25b7fc6257826c86edc962efad873bb84aea99a0 100644 (file)
@@ -530,13 +530,15 @@ void rtl931x_set_receive_management_action(int port, rma_ctrl_t type, action_typ
 
 static u64 rtl931x_traffic_get(int source)
 {
-       u32 v;
-       struct table_reg *r = rtl_table_get(RTL9310_TBL_0, 6);
+       u64 v;
+       struct table_reg *r = rtl_table_get(RTL9310_TBL_2, 1);
 
        rtl_table_read(r, source);
        v = sw_r32(rtl_table_data(r, 0));
+       v <<= 32;
+       v |= sw_r32(rtl_table_data(r, 1));
+       v >>= 7;
        rtl_table_release(r);
-       v = v >> 3;
 
        return v;
 }
@@ -544,27 +546,28 @@ static u64 rtl931x_traffic_get(int source)
 /* Enable traffic between a source port and a destination port matrix */
 static void rtl931x_traffic_set(int source, u64 dest_matrix)
 {
-       struct table_reg *r = rtl_table_get(RTL9310_TBL_0, 6);
+       struct table_reg *r = rtl_table_get(RTL9310_TBL_2, 1);
 
-       sw_w32((dest_matrix << 3), rtl_table_data(r, 0));
+       sw_w32(dest_matrix >> (32 - 7), rtl_table_data(r, 0));
+       sw_w32(dest_matrix << 7, rtl_table_data(r, 1));
        rtl_table_write(r, source);
        rtl_table_release(r);
 }
 
 static void rtl931x_traffic_enable(int source, int dest)
 {
-       struct table_reg *r = rtl_table_get(RTL9310_TBL_0, 6);
+       struct table_reg *r = rtl_table_get(RTL9310_TBL_2, 1);
        rtl_table_read(r, source);
-       sw_w32_mask(0, BIT(dest + 3), rtl_table_data(r, 0));
+       sw_w32_mask(0, BIT((dest + 7) % 32), rtl_table_data(r, (dest + 7) / 32 ? 0 : 1));
        rtl_table_write(r, source);
        rtl_table_release(r);
 }
 
 static void rtl931x_traffic_disable(int source, int dest)
 {
-       struct table_reg *r = rtl_table_get(RTL9310_TBL_0, 6);
+       struct table_reg *r = rtl_table_get(RTL9310_TBL_2, 1);
        rtl_table_read(r, source);
-       sw_w32_mask(BIT(dest + 3), 0, rtl_table_data(r, 0));
+       sw_w32_mask(BIT((dest + 7) % 32), 0, rtl_table_data(r, (dest + 7) / 32 ? 0 : 1));
        rtl_table_write(r, source);
        rtl_table_release(r);
 }