int (*set_loopback)(struct hnae3_handle *handle,
                            enum hnae3_loop loop_mode, bool en);
 
-       void (*set_promisc_mode)(struct hnae3_handle *handle, u32 en);
+       void (*set_promisc_mode)(struct hnae3_handle *handle, bool en_uc_pmc,
+                                bool en_mc_pmc);
        int (*set_mtu)(struct hnae3_handle *handle, int new_mtu);
 
        void (*get_pauseparam)(struct hnae3_handle *handle,
 
 
        if (h->ae_algo->ops->set_promisc_mode) {
                if (netdev->flags & IFF_PROMISC)
-                       h->ae_algo->ops->set_promisc_mode(h, 1);
+                       h->ae_algo->ops->set_promisc_mode(h, true, true);
+               else if (netdev->flags & IFF_ALLMULTI)
+                       h->ae_algo->ops->set_promisc_mode(h, false, true);
                else
-                       h->ae_algo->ops->set_promisc_mode(h, 0);
+                       h->ae_algo->ops->set_promisc_mode(h, false, false);
        }
        if (__dev_uc_sync(netdev, hns3_nic_uc_sync, hns3_nic_uc_unsync))
                netdev_err(netdev, "sync uc address fail\n");
 
        if (ret)
                return ret;
 
-       h->ae_algo->ops->set_promisc_mode(h, en);
+       h->ae_algo->ops->set_promisc_mode(h, en, en);
 
        return ret;
 }
 
        param->vf_id = vport_id;
 }
 
-static void hclge_set_promisc_mode(struct hnae3_handle *handle, u32 en)
+static void hclge_set_promisc_mode(struct hnae3_handle *handle, bool en_uc_pmc,
+                                  bool en_mc_pmc)
 {
        struct hclge_vport *vport = hclge_get_vport(handle);
        struct hclge_dev *hdev = vport->back;
        struct hclge_promisc_param param;
 
-       hclge_promisc_param_init(¶m, en, en, true, vport->vport_id);
+       hclge_promisc_param_init(¶m, en_uc_pmc, en_mc_pmc, true,
+                                vport->vport_id);
        hclge_cmd_set_promisc_mode(hdev, ¶m);
 }
 
 
 static int hclge_set_vf_promisc_mode(struct hclge_vport *vport,
                                     struct hclge_mbx_vf_to_pf_cmd *req)
 {
-       bool en = req->msg[1] ? true : false;
+       bool en_uc = req->msg[1] ? true : false;
+       bool en_mc = req->msg[2] ? true : false;
        struct hclge_promisc_param param;
 
        /* always enable broadcast promisc bit */
-       hclge_promisc_param_init(¶m, en, en, true, vport->vport_id);
+       hclge_promisc_param_init(¶m, en_uc, en_mc, true, vport->vport_id);
        return hclge_cmd_set_promisc_mode(vport->back, ¶m);
 }
 
 
        return 0;
 }
 
-static int hclgevf_cmd_set_promisc_mode(struct hclgevf_dev *hdev, u32 en)
+static int hclgevf_cmd_set_promisc_mode(struct hclgevf_dev *hdev,
+                                       bool en_uc_pmc, bool en_mc_pmc)
 {
        struct hclge_mbx_vf_to_pf_cmd *req;
        struct hclgevf_desc desc;
 
        hclgevf_cmd_setup_basic_desc(&desc, HCLGEVF_OPC_MBX_VF_TO_PF, false);
        req->msg[0] = HCLGE_MBX_SET_PROMISC_MODE;
-       req->msg[1] = en;
+       req->msg[1] = en_uc_pmc ? 1 : 0;
+       req->msg[2] = en_mc_pmc ? 1 : 0;
 
        status = hclgevf_cmd_send(&hdev->hw, &desc, 1);
        if (status)
        return status;
 }
 
-static void hclgevf_set_promisc_mode(struct hnae3_handle *handle, u32 en)
+static void hclgevf_set_promisc_mode(struct hnae3_handle *handle,
+                                    bool en_uc_pmc, bool en_mc_pmc)
 {
        struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
 
-       hclgevf_cmd_set_promisc_mode(hdev, en);
+       hclgevf_cmd_set_promisc_mode(hdev, en_uc_pmc, en_mc_pmc);
 }
 
 static int hclgevf_tqp_enable(struct hclgevf_dev *hdev, int tqp_id,