From: Harshal Gohel Date: Wed, 18 Jun 2025 11:35:15 +0000 (+0000) Subject: realtek: rtl931x: Fix traffic on upper ports X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f51b54bc953e19daf3140577cf80c779a6fac96f;p=thirdparty%2Fopenwrt.git realtek: rtl931x: Fix traffic on upper ports * 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 Signed-off-by: Sharadanand Karanjkar Link: https://github.com/openwrt/openwrt/pull/19572 Signed-off-by: Robert Marko --- diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl931x.c b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl931x.c index a3277992aef..25b7fc62578 100644 --- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl931x.c +++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl931x.c @@ -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); }