Skip to content

Commit

Permalink
net/hns3: fix rollback after setting PVID failure
Browse files Browse the repository at this point in the history
[ upstream commit 39c4fe7 ]

Currently, three hardware operations are involved in setting the PVID.
If any operation fails, a failure will be returned. And there may be
residual hardware configurations because no rollback is performed.

This patch adds rollback operation for setting PVID to avoid residual
hardware configuration after the PVID fails to be configured.

Fixes: 411d23b ("net/hns3: support VLAN")

Signed-off-by: Chengchang Tang <tangchengchang@huawei.com>
Signed-off-by: Min Hu (Connor) <humin29@huawei.com>
  • Loading branch information
Chengchang Tang authored and steevenlee committed May 8, 2021
1 parent c718e75 commit 73db182
Showing 1 changed file with 17 additions and 3 deletions.
20 changes: 17 additions & 3 deletions drivers/net/hns3/hns3_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -894,7 +894,7 @@ hns3_vlan_pvid_configure(struct hns3_adapter *hns, uint16_t pvid, int on)
{
struct hns3_hw *hw = &hns->hw;
uint16_t port_base_vlan_state;
int ret;
int ret, err;

if (on == 0 && pvid != hw->port_base_vlan_cfg.pvid) {
if (hw->port_base_vlan_cfg.pvid != HNS3_INVALID_PVID)
Expand All @@ -917,7 +917,7 @@ hns3_vlan_pvid_configure(struct hns3_adapter *hns, uint16_t pvid, int on)
if (ret) {
hns3_err(hw, "failed to config rx vlan strip for pvid, "
"ret = %d", ret);
return ret;
goto pvid_vlan_strip_fail;
}

if (pvid == HNS3_INVALID_PVID)
Expand All @@ -926,13 +926,27 @@ hns3_vlan_pvid_configure(struct hns3_adapter *hns, uint16_t pvid, int on)
if (ret) {
hns3_err(hw, "failed to update vlan filter entries, ret = %d",
ret);
return ret;
goto vlan_filter_set_fail;
}

out:
hw->port_base_vlan_cfg.state = port_base_vlan_state;
hw->port_base_vlan_cfg.pvid = on ? pvid : HNS3_INVALID_PVID;
return ret;

vlan_filter_set_fail:
err = hns3_en_pvid_strip(hns, hw->port_base_vlan_cfg.state ==
HNS3_PORT_BASE_VLAN_ENABLE);
if (err)
hns3_err(hw, "fail to rollback pvid strip, ret = %d", err);

pvid_vlan_strip_fail:
err = hns3_vlan_txvlan_cfg(hns, hw->port_base_vlan_cfg.state,
hw->port_base_vlan_cfg.pvid);
if (err)
hns3_err(hw, "fail to rollback txvlan status, ret = %d", err);

return ret;
}

static int
Expand Down

0 comments on commit 73db182

Please sign in to comment.