realtek: refactor keep vlan tag setup, fix tagged forwarding
[openwrt/openwrt.git] / target / linux / realtek / files-5.10 / drivers / net / dsa / rtl83xx / rtl839x.c
index 29912257e829648402d14d36ba7770af427823ee..986a4b5f45c7c1bd394691420a084cb9498c4a9d 100644 (file)
@@ -3,6 +3,21 @@
 #include <asm/mach-rtl838x/mach-rtl83xx.h>
 #include "rtl83xx.h"
 
+#define RTL839X_VLAN_PORT_TAG_STS_UNTAG                                0x0
+#define RTL839X_VLAN_PORT_TAG_STS_TAGGED                       0x1
+#define RTL839X_VLAN_PORT_TAG_STS_PRIORITY_TAGGED              0x2
+
+#define RTL839X_VLAN_PORT_TAG_STS_CTRL_BASE                    0x6828
+/* port 0-52 */
+#define RTL839X_VLAN_PORT_TAG_STS_CTRL(port) \
+               RTL839X_VLAN_PORT_TAG_STS_CTRL_BASE + (port << 2)
+#define RTL839X_VLAN_PORT_TAG_STS_CTRL_OTAG_STS_MASK           GENMASK(7,6)
+#define RTL839X_VLAN_PORT_TAG_STS_CTRL_ITAG_STS_MASK           GENMASK(5,4)
+#define RTL839X_VLAN_PORT_TAG_STS_CTRL_EGR_P_OTAG_KEEP_MASK    GENMASK(3,3)
+#define RTL839X_VLAN_PORT_TAG_STS_CTRL_EGR_P_ITAG_KEEP_MASK    GENMASK(2,2)
+#define RTL839X_VLAN_PORT_TAG_STS_CTRL_IGR_P_OTAG_KEEP_MASK    GENMASK(1,1)
+#define RTL839X_VLAN_PORT_TAG_STS_CTRL_IGR_P_ITAG_KEEP_MASK    GENMASK(0,0)
+
 extern struct mutex smi_lock;
 extern struct rtl83xx_soc_info soc_info;
 
@@ -1755,6 +1770,15 @@ int rtl839x_l3_setup(struct rtl838x_switch_priv *priv)
        return 0;
 }
 
+void rtl839x_vlan_port_keep_tag_set(int port, bool keep_outer, bool keep_inner)
+{
+       sw_w32(FIELD_PREP(RTL839X_VLAN_PORT_TAG_STS_CTRL_OTAG_STS_MASK,
+                         keep_outer ? RTL839X_VLAN_PORT_TAG_STS_TAGGED : RTL839X_VLAN_PORT_TAG_STS_UNTAG) |
+              FIELD_PREP(RTL839X_VLAN_PORT_TAG_STS_CTRL_ITAG_STS_MASK,
+                         keep_inner ? RTL839X_VLAN_PORT_TAG_STS_TAGGED : RTL839X_VLAN_PORT_TAG_STS_UNTAG),
+              RTL839X_VLAN_PORT_TAG_STS_CTRL(port));
+}
+
 void rtl839x_vlan_port_pvidmode_set(int port, enum pbvlan_type type, enum pbvlan_mode mode)
 {
        if (type == PBVLAN_TYPE_INNER)
@@ -1860,6 +1884,7 @@ const struct rtl838x_reg rtl839x_reg = {
        .vlan_profile_dump = rtl839x_vlan_profile_dump,
        .vlan_profile_setup = rtl839x_vlan_profile_setup,
        .vlan_fwd_on_inner = rtl839x_vlan_fwd_on_inner,
+       .vlan_port_keep_tag_set = rtl839x_vlan_port_keep_tag_set,
        .vlan_port_pvidmode_set = rtl839x_vlan_port_pvidmode_set,
        .vlan_port_pvid_set = rtl839x_vlan_port_pvid_set,
        .set_vlan_igr_filter = rtl839x_set_igr_filter,
@@ -1886,7 +1911,6 @@ const struct rtl838x_reg rtl839x_reg = {
        .write_l2_entry_using_hash = rtl839x_write_l2_entry_using_hash,
        .read_cam = rtl839x_read_cam,
        .write_cam = rtl839x_write_cam,
-       .vlan_port_tag_sts_ctrl = RTL839X_VLAN_PORT_TAG_STS_CTRL,
        .trk_mbr_ctr = rtl839x_trk_mbr_ctr,
        .rma_bpdu_fld_pmask = RTL839X_RMA_BPDU_FLD_PMSK,
        .spcl_trap_eapol_ctrl = RTL839X_SPCL_TRAP_EAPOL_CTRL,