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: Peng Li <lipeng321@huawei.com> Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
eaede83567
commit
88936e320c
@ -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,
|
|||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
* 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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user