]> git.droids-corp.org - dpdk.git/commitdiff
net/hns3: fix rollback after setting PVID failure
authorChengchang Tang <tangchengchang@huawei.com>
Wed, 31 Mar 2021 10:01:38 +0000 (18:01 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Thu, 8 Apr 2021 16:57:09 +0000 (18:57 +0200)
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: 411d23b9eafb ("net/hns3: support VLAN")
Cc: stable@dpdk.org
Signed-off-by: Chengchang Tang <tangchengchang@huawei.com>
Signed-off-by: Min Hu (Connor) <humin29@huawei.com>
drivers/net/hns3/hns3_ethdev.c

index a4d17ed0f48f6390d600ba697b289b333f7c5b95..56b3032e6b7c60cf4aae37840fd2e7efb0ec9c76 100644 (file)
@@ -981,7 +981,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)
@@ -1004,7 +1004,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)
@@ -1013,13 +1013,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