Commit 88936e32 authored by Peng Li's avatar Peng Li Committed by David S. Miller

net: hns3: refactor out hclge_set_vf_vlan_common()

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: default avatarPeng Li <lipeng321@huawei.com>
Signed-off-by: default avatarHuazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent eaede835
...@@ -8786,32 +8786,16 @@ static void hclge_enable_vlan_filter(struct hnae3_handle *handle, bool enable) ...@@ -8786,32 +8786,16 @@ static void hclge_enable_vlan_filter(struct hnae3_handle *handle, bool enable)
handle->netdev_flags &= ~HNAE3_VLAN_FLTR; handle->netdev_flags &= ~HNAE3_VLAN_FLTR;
} }
static int hclge_set_vf_vlan_common(struct hclge_dev *hdev, u16 vfid, static int hclge_set_vf_vlan_filter_cmd(struct hclge_dev *hdev, u16 vfid,
bool is_kill, u16 vlan, bool is_kill, u16 vlan,
__be16 proto) 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 *req0;
struct hclge_vlan_filter_vf_cfg_cmd *req1; struct hclge_vlan_filter_vf_cfg_cmd *req1;
struct hclge_desc desc[2];
u8 vf_byte_val; u8 vf_byte_val;
u8 vf_byte_off; u8 vf_byte_off;
int ret; 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_cmd_setup_basic_desc(&desc[0],
HCLGE_OPC_VLAN_FILTER_VF_CFG, false); HCLGE_OPC_VLAN_FILTER_VF_CFG, false);
hclge_cmd_setup_basic_desc(&desc[1], hclge_cmd_setup_basic_desc(&desc[1],
...@@ -8841,12 +8825,22 @@ static int hclge_set_vf_vlan_common(struct hclge_dev *hdev, u16 vfid, ...@@ -8841,12 +8825,22 @@ static int hclge_set_vf_vlan_common(struct hclge_dev *hdev, u16 vfid,
return ret; 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) { if (!is_kill) {
#define HCLGE_VF_VLAN_NO_ENTRY 2 #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; 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); set_bit(vfid, hdev->vf_vlan_full);
dev_warn(&hdev->pdev->dev, dev_warn(&hdev->pdev->dev,
"vf vlan table is full, vf vlan filter is disabled\n"); "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, ...@@ -8855,10 +8849,10 @@ static int hclge_set_vf_vlan_common(struct hclge_dev *hdev, u16 vfid,
dev_err(&hdev->pdev->dev, dev_err(&hdev->pdev->dev,
"Add vf vlan filter fail, ret =%u.\n", "Add vf vlan filter fail, ret =%u.\n",
req0->resp_code); req->resp_code);
} else { } else {
#define HCLGE_VF_VLAN_DEL_NO_FOUND 1 #define HCLGE_VF_VLAN_DEL_NO_FOUND 1
if (!req0->resp_code) if (!req->resp_code)
return 0; return 0;
/* vf vlan filter is disabled when vf vlan table is full, /* 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, ...@@ -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 * Just return 0 without warning, avoid massive verbose
* print logs when unload. * 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; return 0;
dev_err(&hdev->pdev->dev, dev_err(&hdev->pdev->dev,
"Kill vf vlan filter fail, ret =%u.\n", "Kill vf vlan filter fail, ret =%u.\n",
req0->resp_code); req->resp_code);
} }
return -EIO; 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, static int hclge_set_port_vlan_filter(struct hclge_dev *hdev, __be16 proto,
u16 vlan_id, bool is_kill) u16 vlan_id, bool is_kill)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment