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 <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>
This commit is contained in:
Harshal Gohel
2025-06-18 11:35:15 +00:00
committed by Robert Marko
parent 656312f9b7
commit f51b54bc95

View 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);
}