]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
realtek: rtl931x: Fix VLAN tagging and untagging 19576/head
authorHarshal Gohel <hg@simonwunderlich.de>
Tue, 17 Jun 2025 12:46:42 +0000 (12:46 +0000)
committerHauke Mehrtens <hauke@hauke-m.de>
Thu, 7 Aug 2025 16:33:09 +0000 (18:33 +0200)
* 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>
target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl931x.c

index ed6674e044beb58947221bcd2b260f81f6dda9df..000e41400019b701687bbde8a703cd00c66e17ac 100644 (file)
@@ -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));