kernel: set and get mc index for rtl8367d family chips
authorMieczyslaw Nalewaj <namiltd@yahoo.com>
Sun, 21 Jul 2024 20:55:17 +0000 (22:55 +0200)
committerHauke Mehrtens <hauke@hauke-m.de>
Thu, 29 Aug 2024 18:50:01 +0000 (20:50 +0200)
Set and get mc index for rtl8367d family chips

Co-authored-by: Serge Vasilugin <vasilugin@yandex.ru>
Signed-off-by: Mieczyslaw Nalewaj <namiltd@yahoo.com>
Link: https://github.com/openwrt/openwrt/pull/14804
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
target/linux/generic/files/drivers/net/phy/rtl8367b.c

index a1efd8fe5bd91bd23c68441b55ad3c1c29a50e80..75912c44547065ae5a9482c6cfe5304a16d2e22c 100644 (file)
@@ -276,6 +276,10 @@ struct rtl8367b_initval {
 #define RTL8367D_REG_MAC0_FORCE_SELECT         0x12c0
 #define RTL8367D_REG_MAC0_FORCE_SELECT_EN      0x12c8
 
+#define RTL8367D_VLAN_PVID_CTRL_REG(_p)                (0x0700 + (_p))
+#define RTL8367D_VLAN_PVID_CTRL_MASK           0xfff
+#define RTL8367D_VLAN_PVID_CTRL_SHIFT(_p)      0
+
 static struct rtl8366_mib_counter
 rtl8367b_mib_counters[RTL8367B_NUM_MIB_COUNTERS] = {
        {0,   0, 4, "ifInOctets"                        },
@@ -1040,10 +1044,17 @@ static int rtl8367b_get_mc_index(struct rtl8366_smi *smi, int port, int *val)
        if (port >= RTL8367B_NUM_PORTS)
                return -EINVAL;
 
-       REG_RD(smi, RTL8367B_VLAN_PVID_CTRL_REG(port), &data);
+       if (smi->rtl8367b_chip >= RTL8367B_CHIP_RTL8367S_VB) { /* Family D */
+               REG_RD(smi, RTL8367D_VLAN_PVID_CTRL_REG(port), &data);
 
-       *val = (data >> RTL8367B_VLAN_PVID_CTRL_SHIFT(port)) &
-              RTL8367B_VLAN_PVID_CTRL_MASK;
+               *val = (data >> RTL8367D_VLAN_PVID_CTRL_SHIFT(port)) &
+                       RTL8367D_VLAN_PVID_CTRL_MASK;
+       } else {
+               REG_RD(smi, RTL8367B_VLAN_PVID_CTRL_REG(port), &data);
+
+               *val = (data >> RTL8367B_VLAN_PVID_CTRL_SHIFT(port)) &
+                       RTL8367B_VLAN_PVID_CTRL_MASK;
+       }
 
        return 0;
 }
@@ -1053,7 +1064,14 @@ static int rtl8367b_set_mc_index(struct rtl8366_smi *smi, int port, int index)
        if (port >= RTL8367B_NUM_PORTS || index >= RTL8367B_NUM_VLANS)
                return -EINVAL;
 
-       return rtl8366_smi_rmwr(smi, RTL8367B_VLAN_PVID_CTRL_REG(port),
+       if (smi->rtl8367b_chip >= RTL8367B_CHIP_RTL8367S_VB) /* Family D */
+               return rtl8366_smi_rmwr(smi, RTL8367D_VLAN_PVID_CTRL_REG(port),
+                               RTL8367D_VLAN_PVID_CTRL_MASK <<
+                                       RTL8367D_VLAN_PVID_CTRL_SHIFT(port),
+                               (index & RTL8367D_VLAN_PVID_CTRL_MASK) <<
+                                       RTL8367D_VLAN_PVID_CTRL_SHIFT(port));
+       else
+               return rtl8366_smi_rmwr(smi, RTL8367B_VLAN_PVID_CTRL_REG(port),
                                RTL8367B_VLAN_PVID_CTRL_MASK <<
                                        RTL8367B_VLAN_PVID_CTRL_SHIFT(port),
                                (index & RTL8367B_VLAN_PVID_CTRL_MASK) <<