]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
net: hns3: enable VF VLAN filter for each VF when initializing
authorJian Shen <shenjian15@huawei.com>
Sat, 23 Feb 2019 09:22:16 +0000 (17:22 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 25 Feb 2019 04:27:50 +0000 (20:27 -0800)
For revision 0x21, the switch of VF VLAN filter is per function.
It's necessary to enable VF VLAN filter for each VF when initializing.
Otherwise, VF will be able to receive broadcast packets with unknown
VLAN when PF enters promisc mode.

Fixes: 64d114f0a750 ("net: hns3: Add egress/ingress vlan filter for revision 0x21")
Signed-off-by: Jian Shen <shenjian15@huawei.com>
Signed-off-by: Peng Li <lipeng321@huawei.com>
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

index bad21c89f6b77e14b5322f89b6eadf11e3b3221c..3714733c96d99260bb228fc548801fdfa8ce7240 100644 (file)
@@ -693,7 +693,9 @@ struct hclge_mac_vlan_remove_cmd {
 struct hclge_vlan_filter_ctrl_cmd {
        u8 vlan_type;
        u8 vlan_fe;
-       u8 rsv[22];
+       u8 rsv1[2];
+       u8 vf_id;
+       u8 rsv2[19];
 };
 
 struct hclge_vlan_filter_pf_cfg_cmd {
index f1134393b7b60c9e83e7c1a31f7bfb6891773a3e..deda606c51e7359851026b3b370791bc6ea161b6 100644 (file)
@@ -6337,7 +6337,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,
-                                     u8 fe_type, bool filter_en)
+                                     u8 fe_type, bool filter_en, u8 vf_id)
 {
        struct hclge_vlan_filter_ctrl_cmd *req;
        struct hclge_desc desc;
@@ -6348,6 +6348,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 ? fe_type : 0;
+       req->vf_id = vf_id;
 
        ret = hclge_cmd_send(&hdev->hw, &desc, 1);
        if (ret)
@@ -6376,12 +6377,13 @@ static void hclge_enable_vlan_filter(struct hnae3_handle *handle, bool enable)
 
        if (hdev->pdev->revision >= 0x21) {
                hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_VF,
-                                          HCLGE_FILTER_FE_EGRESS, enable);
+                                          HCLGE_FILTER_FE_EGRESS, enable, 0);
                hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_PORT,
-                                          HCLGE_FILTER_FE_INGRESS, enable);
+                                          HCLGE_FILTER_FE_INGRESS, enable, 0);
        } else {
                hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_VF,
-                                          HCLGE_FILTER_FE_EGRESS_V1_B, enable);
+                                          HCLGE_FILTER_FE_EGRESS_V1_B, enable,
+                                          0);
        }
        if (enable)
                handle->netdev_flags |= HNAE3_VLAN_FLTR;
@@ -6689,19 +6691,27 @@ static int hclge_init_vlan_config(struct hclge_dev *hdev)
        int i;
 
        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;
+               /* for revision 0x21, vf vlan filter is per function */
+               for (i = 0; i < hdev->num_alloc_vport; i++) {
+                       vport = &hdev->vport[i];
+                       ret = hclge_set_vlan_filter_ctrl(hdev,
+                                                        HCLGE_FILTER_TYPE_VF,
+                                                        HCLGE_FILTER_FE_EGRESS,
+                                                        true,
+                                                        vport->vport_id);
+                       if (ret)
+                               return ret;
+               }
 
                ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_PORT,
-                                                HCLGE_FILTER_FE_INGRESS, true);
+                                                HCLGE_FILTER_FE_INGRESS, true,
+                                                0);
                if (ret)
                        return ret;
        } else {
                ret = hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_VF,
                                                 HCLGE_FILTER_FE_EGRESS_V1_B,
-                                                true);
+                                                true, 0);
                if (ret)
                        return ret;
        }