static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop, bool en)
 {
        struct hnae3_handle *h = hns3_get_handle(ndev);
+       bool vlan_filter_enable;
        int ret;
 
        if (!h->ae_algo->ops->set_loopback ||
        if (ret)
                return ret;
 
-       h->ae_algo->ops->set_promisc_mode(h, en, en);
+       if (en) {
+               h->ae_algo->ops->set_promisc_mode(h, true, true);
+       } else {
+               /* recover promisc mode before loopback test */
+               hns3_update_promisc_mode(ndev, h->netdev_flags);
+               vlan_filter_enable = ndev->flags & IFF_PROMISC ? false : true;
+               hns3_enable_vlan_filter(ndev, vlan_filter_enable);
+       }
 
        return ret;
 }