net: hns3: Add egress/ingress vlan filter for revision 0x21
authorZhongzhu Liu <liuzhongzhu@huawei.com>
Fri, 5 Oct 2018 17:03:28 +0000 (18:03 +0100)
committerDavid S. Miller <davem@davemloft.net>
Fri, 5 Oct 2018 19:01:55 +0000 (12:01 -0700)
In revision 0x21, hw supports both ingress and egress vlan filter.
This patch adds support for it.

Signed-off-by: Zhongzhu Liu <liuzhongzhu@huawei.com>
Signed-off-by: Jian Shen <shenjian15@huawei.com>
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

index d95ea9b2cf6d3a56a4598d774fb4049913e3963f..ca1a93664d0e34382600079212ea1c101fd540cd 100644 (file)
@@ -5523,7 +5523,7 @@ static int hclge_do_ioctl(struct hnae3_handle *handle, struct ifreq *ifr,
 }
 
 static int hclge_set_vlan_filter_ctrl(struct hclge_dev *hdev, u8 vlan_type,
-                                     bool filter_en)
+                                     u8 fe_type, bool filter_en)
 {
        struct hclge_vlan_filter_ctrl_cmd *req;
        struct hclge_desc desc;
@@ -5533,7 +5533,7 @@ static int hclge_set_vlan_filter_ctrl(struct hclge_dev *hdev, u8 vlan_type,
 
        req = (struct hclge_vlan_filter_ctrl_cmd *)desc.data;
        req->vlan_type = vlan_type;
-       req->vlan_fe = filter_en;
+       req->vlan_fe = filter_en ? fe_type : 0;
 
        ret = hclge_cmd_send(&hdev->hw, &desc, 1);
        if (ret)
@@ -5545,13 +5545,30 @@ static int hclge_set_vlan_filter_ctrl(struct hclge_dev *hdev, u8 vlan_type,
 
 #define HCLGE_FILTER_TYPE_VF           0
 #define HCLGE_FILTER_TYPE_PORT         1
+#define HCLGE_FILTER_FE_EGRESS_V1_B    BIT(0)
+#define HCLGE_FILTER_FE_NIC_INGRESS_B  BIT(0)
+#define HCLGE_FILTER_FE_NIC_EGRESS_B   BIT(1)
+#define HCLGE_FILTER_FE_ROCE_INGRESS_B BIT(2)
+#define HCLGE_FILTER_FE_ROCE_EGRESS_B  BIT(3)
+#define HCLGE_FILTER_FE_EGRESS         (HCLGE_FILTER_FE_NIC_EGRESS_B \
+                                       | HCLGE_FILTER_FE_ROCE_EGRESS_B)
+#define HCLGE_FILTER_FE_INGRESS                (HCLGE_FILTER_FE_NIC_INGRESS_B \
+                                       | HCLGE_FILTER_FE_ROCE_INGRESS_B)
 
 static void hclge_enable_vlan_filter(struct hnae3_handle *handle, bool enable)
 {
        struct hclge_vport *vport = hclge_get_vport(handle);
        struct hclge_dev *hdev = vport->back;
 
-       hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_VF, enable);
+       if (hdev->pdev->revision >= 0x21) {
+               hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_VF,
+                                          HCLGE_FILTER_FE_EGRESS, enable);
+               hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_PORT,
+                                          HCLGE_FILTER_FE_INGRESS, enable);
+       } else {
+               hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_VF,
+                                          HCLGE_FILTER_FE_EGRESS_V1_B, enable);
+       }
 }
 
 static int hclge_set_vf_vlan_common(struct hclge_dev *hdev, int vfid,
@@ -5853,13 +5870,23 @@ static int hclge_init_vlan_config(struct hclge_dev *hdev)
        int ret;
        int i;
 
-       ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_VF, true);
-       if (ret)
-               return ret;
+       if (hdev->pdev->revision >= 0x21) {
+               ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_VF,
+                                                HCLGE_FILTER_FE_EGRESS, true);
+               if (ret)
+                       return ret;
 
-       ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_PORT, true);
-       if (ret)
-               return ret;
+               ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_PORT,
+                                                HCLGE_FILTER_FE_INGRESS, true);
+               if (ret)
+                       return ret;
+       } else {
+               ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_VF,
+                                                HCLGE_FILTER_FE_EGRESS_V1_B,
+                                                true);
+               if (ret)
+                       return ret;
+       }
 
        hdev->vlan_type_cfg.rx_in_fst_vlan_type = HCLGE_DEF_VLAN_TYPE;
        hdev->vlan_type_cfg.rx_in_sec_vlan_type = HCLGE_DEF_VLAN_TYPE;