net: hns3: refactor function hclge_set_vlan_filter_hw
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>
This commit is contained in:
parent
23e0316049
commit
e7a51bf590
@ -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++;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user