OSDN Git Service

net: hns3: refactor out hclge_set_vf_vlan_common()
authorPeng Li <lipeng321@huawei.com>
Fri, 12 Feb 2021 03:21:05 +0000 (11:21 +0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 12 Feb 2021 21:13:15 +0000 (13:13 -0800)
To improve code readability and maintainability, separate
the command handling part and the status parsing part from
bloated hclge_set_vf_vlan_common().

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_main.c

index d3e6896..3eb675d 100644 (file)
@@ -8786,32 +8786,16 @@ static void hclge_enable_vlan_filter(struct hnae3_handle *handle, bool enable)
                handle->netdev_flags &= ~HNAE3_VLAN_FLTR;
 }
 
-static int hclge_set_vf_vlan_common(struct hclge_dev *hdev, u16 vfid,
-                                   bool is_kill, u16 vlan,
-                                   __be16 proto)
+static int hclge_set_vf_vlan_filter_cmd(struct hclge_dev *hdev, u16 vfid,
+                                       bool is_kill, u16 vlan,
+                                       struct hclge_desc *desc)
 {
-       struct hclge_vport *vport = &hdev->vport[vfid];
        struct hclge_vlan_filter_vf_cfg_cmd *req0;
        struct hclge_vlan_filter_vf_cfg_cmd *req1;
-       struct hclge_desc desc[2];
        u8 vf_byte_val;
        u8 vf_byte_off;
        int ret;
 
-       /* if vf vlan table is full, firmware will close vf vlan filter, it
-        * is unable and unnecessary to add new vlan id to vf vlan filter.
-        * If spoof check is enable, and vf vlan is full, it shouldn't add
-        * new vlan, because tx packets with these vlan id will be dropped.
-        */
-       if (test_bit(vfid, hdev->vf_vlan_full) && !is_kill) {
-               if (vport->vf_info.spoofchk && vlan) {
-                       dev_err(&hdev->pdev->dev,
-                               "Can't add vlan due to spoof check is on and vf vlan table is full\n");
-                       return -EPERM;
-               }
-               return 0;
-       }
-
        hclge_cmd_setup_basic_desc(&desc[0],
                                   HCLGE_OPC_VLAN_FILTER_VF_CFG, false);
        hclge_cmd_setup_basic_desc(&desc[1],
@@ -8841,12 +8825,22 @@ static int hclge_set_vf_vlan_common(struct hclge_dev *hdev, u16 vfid,
                return ret;
        }
 
+       return 0;
+}
+
+static int hclge_check_vf_vlan_cmd_status(struct hclge_dev *hdev, u16 vfid,
+                                         bool is_kill, struct hclge_desc *desc)
+{
+       struct hclge_vlan_filter_vf_cfg_cmd *req;
+
+       req = (struct hclge_vlan_filter_vf_cfg_cmd *)desc[0].data;
+
        if (!is_kill) {
 #define HCLGE_VF_VLAN_NO_ENTRY 2
-               if (!req0->resp_code || req0->resp_code == 1)
+               if (!req->resp_code || req->resp_code == 1)
                        return 0;
 
-               if (req0->resp_code == HCLGE_VF_VLAN_NO_ENTRY) {
+               if (req->resp_code == HCLGE_VF_VLAN_NO_ENTRY) {
                        set_bit(vfid, hdev->vf_vlan_full);
                        dev_warn(&hdev->pdev->dev,
                                 "vf vlan table is full, vf vlan filter is disabled\n");
@@ -8855,10 +8849,10 @@ static int hclge_set_vf_vlan_common(struct hclge_dev *hdev, u16 vfid,
 
                dev_err(&hdev->pdev->dev,
                        "Add vf vlan filter fail, ret =%u.\n",
-                       req0->resp_code);
+                       req->resp_code);
        } else {
 #define HCLGE_VF_VLAN_DEL_NO_FOUND     1
-               if (!req0->resp_code)
+               if (!req->resp_code)
                        return 0;
 
                /* vf vlan filter is disabled when vf vlan table is full,
@@ -8866,17 +8860,46 @@ static int hclge_set_vf_vlan_common(struct hclge_dev *hdev, u16 vfid,
                 * Just return 0 without warning, avoid massive verbose
                 * print logs when unload.
                 */
-               if (req0->resp_code == HCLGE_VF_VLAN_DEL_NO_FOUND)
+               if (req->resp_code == HCLGE_VF_VLAN_DEL_NO_FOUND)
                        return 0;
 
                dev_err(&hdev->pdev->dev,
                        "Kill vf vlan filter fail, ret =%u.\n",
-                       req0->resp_code);
+                       req->resp_code);
        }
 
        return -EIO;
 }
 
+static int hclge_set_vf_vlan_common(struct hclge_dev *hdev, u16 vfid,
+                                   bool is_kill, u16 vlan,
+                                   __be16 proto)
+{
+       struct hclge_vport *vport = &hdev->vport[vfid];
+       struct hclge_desc desc[2];
+       int ret;
+
+       /* if vf vlan table is full, firmware will close vf vlan filter, it
+        * is unable and unnecessary to add new vlan id to vf vlan filter.
+        * If spoof check is enable, and vf vlan is full, it shouldn't add
+        * new vlan, because tx packets with these vlan id will be dropped.
+        */
+       if (test_bit(vfid, hdev->vf_vlan_full) && !is_kill) {
+               if (vport->vf_info.spoofchk && vlan) {
+                       dev_err(&hdev->pdev->dev,
+                               "Can't add vlan due to spoof check is on and vf vlan table is full\n");
+                       return -EPERM;
+               }
+               return 0;
+       }
+
+       ret = hclge_set_vf_vlan_filter_cmd(hdev, vfid, is_kill, vlan, desc);
+       if (ret)
+               return ret;
+
+       return hclge_check_vf_vlan_cmd_status(hdev, vfid, is_kill, desc);
+}
+
 static int hclge_set_port_vlan_filter(struct hclge_dev *hdev, __be16 proto,
                                      u16 vlan_id, bool is_kill)
 {