]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
net: hns3: refactor function hclge_set_vlan_filter_hw
authorGuangbin Huang <huangguangbin2@huawei.com>
Fri, 3 Dec 2021 09:20:50 +0000 (17:20 +0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 3 Dec 2021 11:00:58 +0000 (11:00 +0000)
Function hclge_set_vlan_filter_hw() is a bit too long, so add a new
function hclge_need_update_port_vlan() to simplify code and improve
code readability.

Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

index 5a5e74dfd0beab7ea6895c1699cd6cf86b240833..0d2ed05c4f50a0bfadac485847e9a7c360c36c4f 100644 (file)
@@ -10005,6 +10005,32 @@ static int hclge_set_port_vlan_filter(struct hclge_dev *hdev, __be16 proto,
        return ret;
 }
 
+static bool hclge_need_update_port_vlan(struct hclge_dev *hdev, u16 vport_id,
+                                       u16 vlan_id, bool is_kill)
+{
+       /* vlan 0 may be added twice when 8021q module is enabled */
+       if (!is_kill && !vlan_id &&
+           test_bit(vport_id, hdev->vlan_table[vlan_id]))
+               return false;
+
+       if (!is_kill && test_and_set_bit(vport_id, hdev->vlan_table[vlan_id])) {
+               dev_warn(&hdev->pdev->dev,
+                        "Add port vlan failed, vport %u is already in vlan %u\n",
+                        vport_id, vlan_id);
+               return false;
+       }
+
+       if (is_kill &&
+           !test_and_clear_bit(vport_id, hdev->vlan_table[vlan_id])) {
+               dev_warn(&hdev->pdev->dev,
+                        "Delete port vlan failed, vport %u is not in vlan %u\n",
+                        vport_id, vlan_id);
+               return false;
+       }
+
+       return true;
+}
+
 static int hclge_set_vlan_filter_hw(struct hclge_dev *hdev, __be16 proto,
                                    u16 vport_id, u16 vlan_id,
                                    bool is_kill)
@@ -10026,26 +10052,9 @@ static int hclge_set_vlan_filter_hw(struct hclge_dev *hdev, __be16 proto,
                return ret;
        }
 
-       /* vlan 0 may be added twice when 8021q module is enabled */
-       if (!is_kill && !vlan_id &&
-           test_bit(vport_id, hdev->vlan_table[vlan_id]))
+       if (!hclge_need_update_port_vlan(hdev, vport_id, vlan_id, is_kill))
                return 0;
 
-       if (!is_kill && test_and_set_bit(vport_id, hdev->vlan_table[vlan_id])) {
-               dev_err(&hdev->pdev->dev,
-                       "Add port vlan failed, vport %u is already in vlan %u\n",
-                       vport_id, vlan_id);
-               return -EINVAL;
-       }
-
-       if (is_kill &&
-           !test_and_clear_bit(vport_id, hdev->vlan_table[vlan_id])) {
-               dev_err(&hdev->pdev->dev,
-                       "Delete port vlan failed, vport %u is not in vlan %u\n",
-                       vport_id, vlan_id);
-               return -EINVAL;
-       }
-
        for_each_set_bit(vport_idx, hdev->vlan_table[vlan_id], HCLGE_VPORT_NUM)
                vport_num++;