mirror of
https://git.openwrt.org/openwrt/openwrt.git
synced 2026-03-14 20:49:51 +01:00
realtek: rtl931x: Fix VLAN tagging and untagging
* In RTL931x, bit 31 of the (4th column) of 802_1Q_VLAN_QINQ table indicates the validity of l2 tunnel. Before bit 63 (3rd column) was being checked for validity of l2 tunnel. * The untagged_ports requires 64 bits to represent 56 ports. Do not store u64 in u32 variable * First 24 ports are represented in the 2nd register not just first 20 Signed-off-by: Harshal Gohel <hg@simonwunderlich.de> Signed-off-by: Sharadanand Karanjkar <sk@simonwunderlich.de> Link: https://github.com/openwrt/openwrt/pull/19576 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
This commit is contained in:
parent
536a25ebf8
commit
e45d783bce
1 changed files with 7 additions and 9 deletions
|
|
@ -204,9 +204,8 @@ static void rtl931x_vlan_tables_read(u32 vlan, struct rtl838x_vlan_info *info)
|
|||
info->hash_uc_fid = !!(x & BIT(31));
|
||||
info->hash_mc_fid = !!(x & BIT(30));
|
||||
info->if_id = (x >> 20) & 0x3ff;
|
||||
info->profile_id = (x >> 16) & 0xf;
|
||||
info->multicast_grp_mask = x & 0xffff;
|
||||
if (x & BIT(31))
|
||||
if (y & BIT(31))
|
||||
info->l2_tunnel_list_id = y >> 18;
|
||||
else
|
||||
info->l2_tunnel_list_id = -1;
|
||||
|
|
@ -217,21 +216,19 @@ static void rtl931x_vlan_tables_read(u32 vlan, struct rtl838x_vlan_info *info)
|
|||
/* Read UNTAG table via table register 3 */
|
||||
r = rtl_table_get(RTL9310_TBL_3, 0);
|
||||
rtl_table_read(r, vlan);
|
||||
v = ((u64)sw_r32(rtl_table_data(r, 0))) << 25;
|
||||
v |= sw_r32(rtl_table_data(r, 1)) >> 7;
|
||||
rtl_table_release(r);
|
||||
info->untagged_ports = ((u64)sw_r32(rtl_table_data(r, 0))) << 25;
|
||||
info->untagged_ports |= sw_r32(rtl_table_data(r, 1)) >> 7;
|
||||
|
||||
info->untagged_ports = v;
|
||||
rtl_table_release(r);
|
||||
}
|
||||
|
||||
static void rtl931x_vlan_set_tagged(u32 vlan, struct rtl838x_vlan_info *info)
|
||||
{
|
||||
struct table_reg *r;
|
||||
u32 v, w, x, y;
|
||||
/* Access VLAN table (1) via register 0 */
|
||||
struct table_reg *r = rtl_table_get(RTL9310_TBL_0, 3);
|
||||
|
||||
v = info->tagged_ports >> 25;
|
||||
w = (info->tagged_ports & 0x1fffff) << 7;
|
||||
w = (info->tagged_ports & GENMASK(24, 0)) << 7;
|
||||
w |= info->fid & 0x7f;
|
||||
x = info->hash_uc_fid ? BIT(31) : 0;
|
||||
x |= info->hash_mc_fid ? BIT(30) : 0;
|
||||
|
|
@ -245,6 +242,7 @@ static void rtl931x_vlan_set_tagged(u32 vlan, struct rtl838x_vlan_info *info)
|
|||
y = 0;
|
||||
}
|
||||
|
||||
r = rtl_table_get(RTL9310_TBL_0, 3);
|
||||
sw_w32(v, rtl_table_data(r, 0));
|
||||
sw_w32(w, rtl_table_data(r, 1));
|
||||
sw_w32(x, rtl_table_data(r, 2));
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue