return ret;
 }
 
-#define HCLGE_SET_DEFAULT_RESET_REQUEST(reset_type) \
-       do { \
-               if (ae_dev->ops->set_default_reset_request) \
-                       ae_dev->ops->set_default_reset_request(ae_dev, \
-                                                              reset_type); \
-       } while (0)
-
 /* hclge_handle_mpf_ras_error: handle all main PF RAS errors
  * @hdev: pointer to struct hclge_dev
  * @desc: descriptor for describing the command
                reset_level = hclge_log_error(dev, "IMP_TCM_ECC_INT_STS",
                                              &hclge_imp_tcm_ecc_int[0],
                                              status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
+               set_bit(reset_level, &ae_dev->hw_err_reset_req);
        }
 
        status = le32_to_cpu(desc[0].data[1]);
                reset_level = hclge_log_error(dev, "CMDQ_MEM_ECC_INT_STS",
                                              &hclge_cmdq_nic_mem_ecc_int[0],
                                              status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
+               set_bit(reset_level, &ae_dev->hw_err_reset_req);
        }
 
-       if ((le32_to_cpu(desc[0].data[2])) & BIT(0)) {
+       if ((le32_to_cpu(desc[0].data[2])) & BIT(0))
                dev_warn(dev, "imp_rd_data_poison_err found\n");
-               HCLGE_SET_DEFAULT_RESET_REQUEST(HNAE3_NONE_RESET);
-       }
 
        status = le32_to_cpu(desc[0].data[3]);
        if (status) {
                reset_level = hclge_log_error(dev, "TQP_INT_ECC_INT_STS",
                                              &hclge_tqp_int_ecc_int[0],
                                              status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
+               set_bit(reset_level, &ae_dev->hw_err_reset_req);
        }
 
        status = le32_to_cpu(desc[0].data[4]);
                reset_level = hclge_log_error(dev, "MSIX_ECC_INT_STS",
                                              &hclge_msix_sram_ecc_int[0],
                                              status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
+               set_bit(reset_level, &ae_dev->hw_err_reset_req);
        }
 
        /* log SSU(Storage Switch Unit) errors */
                reset_level = hclge_log_error(dev, "SSU_ECC_MULTI_BIT_INT_0",
                                              &hclge_ssu_mem_ecc_err_int[0],
                                              status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
+               set_bit(reset_level, &ae_dev->hw_err_reset_req);
        }
 
        status = le32_to_cpu(*(desc_data + 3)) & BIT(0);
        if (status) {
                dev_warn(dev, "SSU_ECC_MULTI_BIT_INT_1 ssu_mem32_ecc_mbit_err found [error status=0x%x]\n",
                         status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(HNAE3_GLOBAL_RESET);
+               set_bit(HNAE3_GLOBAL_RESET, &ae_dev->hw_err_reset_req);
        }
 
        status = le32_to_cpu(*(desc_data + 4)) & HCLGE_SSU_COMMON_ERR_INT_MASK;
                reset_level = hclge_log_error(dev, "SSU_COMMON_ERR_INT",
                                              &hclge_ssu_com_err_int[0],
                                              status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
+               set_bit(reset_level, &ae_dev->hw_err_reset_req);
        }
 
        /* log IGU(Ingress Unit) errors */
        if (status) {
                reset_level = hclge_log_error(dev, "IGU_INT_STS",
                                              &hclge_igu_int[0], status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
+               set_bit(reset_level, &ae_dev->hw_err_reset_req);
        }
 
        /* log PPP(Programmable Packet Process) errors */
                        hclge_log_error(dev, "PPP_MPF_ABNORMAL_INT_ST1",
                                        &hclge_ppp_mpf_abnormal_int_st1[0],
                                        status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
+               set_bit(reset_level, &ae_dev->hw_err_reset_req);
        }
 
        status = le32_to_cpu(*(desc_data + 3)) & HCLGE_PPP_MPF_INT_ST3_MASK;
                        hclge_log_error(dev, "PPP_MPF_ABNORMAL_INT_ST3",
                                        &hclge_ppp_mpf_abnormal_int_st3[0],
                                        status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
+               set_bit(reset_level, &ae_dev->hw_err_reset_req);
        }
 
        /* log PPU(RCB) errors */
        if (status) {
                dev_warn(dev, "PPU_MPF_ABNORMAL_INT_ST1 %s found\n",
                         "rpu_rx_pkt_ecc_mbit_err");
-               HCLGE_SET_DEFAULT_RESET_REQUEST(HNAE3_GLOBAL_RESET);
+               set_bit(HNAE3_GLOBAL_RESET, &ae_dev->hw_err_reset_req);
        }
 
        status = le32_to_cpu(*(desc_data + 2));
                        hclge_log_error(dev, "PPU_MPF_ABNORMAL_INT_ST2",
                                        &hclge_ppu_mpf_abnormal_int_st2[0],
                                        status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
+               set_bit(reset_level, &ae_dev->hw_err_reset_req);
        }
 
        status = le32_to_cpu(*(desc_data + 3)) & HCLGE_PPU_MPF_INT_ST3_MASK;
                        hclge_log_error(dev, "PPU_MPF_ABNORMAL_INT_ST3",
                                        &hclge_ppu_mpf_abnormal_int_st3[0],
                                        status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
+               set_bit(reset_level, &ae_dev->hw_err_reset_req);
        }
 
        /* log TM(Traffic Manager) errors */
        if (status) {
                reset_level = hclge_log_error(dev, "TM_SCH_RINT",
                                              &hclge_tm_sch_rint[0], status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
+               set_bit(reset_level, &ae_dev->hw_err_reset_req);
        }
 
        /* log QCN(Quantized Congestion Control) errors */
        if (status) {
                reset_level = hclge_log_error(dev, "QCN_FIFO_RINT",
                                              &hclge_qcn_fifo_rint[0], status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
+               set_bit(reset_level, &ae_dev->hw_err_reset_req);
        }
 
        status = le32_to_cpu(*(desc_data + 1)) & HCLGE_QCN_ECC_INT_MASK;
                reset_level = hclge_log_error(dev, "QCN_ECC_RINT",
                                              &hclge_qcn_ecc_rint[0],
                                              status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
+               set_bit(reset_level, &ae_dev->hw_err_reset_req);
        }
 
        /* log NCSI errors */
        if (status) {
                reset_level = hclge_log_error(dev, "NCSI_ECC_INT_RPT",
                                              &hclge_ncsi_err_int[0], status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
+               set_bit(reset_level, &ae_dev->hw_err_reset_req);
        }
 
        /* clear all main PF RAS errors */
                reset_level = hclge_log_error(dev, "SSU_PORT_BASED_ERR_INT",
                                              &hclge_ssu_port_based_err_int[0],
                                              status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
+               set_bit(reset_level, &ae_dev->hw_err_reset_req);
        }
 
        status = le32_to_cpu(desc[0].data[1]);
                reset_level = hclge_log_error(dev, "SSU_FIFO_OVERFLOW_INT",
                                              &hclge_ssu_fifo_overflow_int[0],
                                              status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
+               set_bit(reset_level, &ae_dev->hw_err_reset_req);
        }
 
        status = le32_to_cpu(desc[0].data[2]);
                reset_level = hclge_log_error(dev, "SSU_ETS_TCG_INT",
                                              &hclge_ssu_ets_tcg_int[0],
                                              status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
+               set_bit(reset_level, &ae_dev->hw_err_reset_req);
        }
 
        /* log IGU(Ingress Unit) EGU(Egress Unit) TNL errors */
                reset_level = hclge_log_error(dev, "IGU_EGU_TNL_INT_STS",
                                              &hclge_igu_egu_tnl_int[0],
                                              status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
+               set_bit(reset_level, &ae_dev->hw_err_reset_req);
        }
 
        /* log PPU(RCB) errors */
                reset_level = hclge_log_error(dev, "PPU_PF_ABNORMAL_INT_ST0",
                                              &hclge_ppu_pf_abnormal_int[0],
                                              status);
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_level);
+               set_bit(reset_level, &ae_dev->hw_err_reset_req);
        }
 
        /* clear all PF RAS errors */
 
        reset_type = hclge_log_and_clear_rocee_ras_error(hdev);
        if (reset_type != HNAE3_NONE_RESET)
-               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_type);
+               set_bit(reset_type, &ae_dev->hw_err_reset_req);
 }
 
 static const struct hclge_hw_blk hw_blk[] = {
 
        status = hclge_read_dev(&hdev->hw, HCLGE_RAS_PF_OTHER_INT_STS_REG);
 
+       if (status & HCLGE_RAS_REG_NFE_MASK ||
+           status & HCLGE_RAS_REG_ROCEE_ERR_MASK)
+               ae_dev->hw_err_reset_req = 0;
+
        /* Handling Non-fatal HNS RAS errors */
        if (status & HCLGE_RAS_REG_NFE_MASK) {
                dev_warn(dev,
 
                               u16 *allocated_size, bool is_alloc);
 static void hclge_rfs_filter_expire(struct hclge_dev *hdev);
 static void hclge_clear_arfs_rules(struct hnae3_handle *handle);
+static enum hnae3_reset_type hclge_get_reset_level(struct hnae3_ae_dev *ae_dev,
+                                                  unsigned long *addr);
 
 static struct hnae3_ae_algo ae_algo;
 
        }
 }
 
-static enum hnae3_reset_type hclge_get_reset_level(struct hclge_dev *hdev,
+static enum hnae3_reset_type hclge_get_reset_level(struct hnae3_ae_dev *ae_dev,
                                                   unsigned long *addr)
 {
        enum hnae3_reset_type rst_level = HNAE3_NONE_RESET;
+       struct hclge_dev *hdev = ae_dev->priv;
 
        /* first, resolve any unknown reset type to the known type(s) */
        if (test_bit(HNAE3_UNKNOWN_RESET, addr)) {
                return;
        else if (hdev->default_reset_request)
                hdev->reset_level =
-                       hclge_get_reset_level(hdev,
+                       hclge_get_reset_level(ae_dev,
                                              &hdev->default_reset_request);
        else if (time_after(jiffies, (hdev->last_reset_time + 4 * 5 * HZ)))
                hdev->reset_level = HNAE3_FUNC_RESET;
 
 static void hclge_reset_subtask(struct hclge_dev *hdev)
 {
+       struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
+
        /* check if there is any ongoing reset in the hardware. This status can
         * be checked from reset_pending. If there is then, we need to wait for
         * hardware to complete reset.
         *       now.
         */
        hdev->last_reset_time = jiffies;
-       hdev->reset_type = hclge_get_reset_level(hdev, &hdev->reset_pending);
+       hdev->reset_type = hclge_get_reset_level(ae_dev, &hdev->reset_pending);
        if (hdev->reset_type != HNAE3_NONE_RESET)
                hclge_reset(hdev);
 
        /* check if we got any *new* reset requests to be honored */
-       hdev->reset_type = hclge_get_reset_level(hdev, &hdev->reset_request);
+       hdev->reset_type = hclge_get_reset_level(ae_dev, &hdev->reset_request);
        if (hdev->reset_type != HNAE3_NONE_RESET)
                hclge_do_reset(hdev);
 
        .set_vf_vlan_filter = hclge_set_vf_vlan_filter,
        .enable_hw_strip_rxvtag = hclge_en_hw_strip_rxvtag,
        .reset_event = hclge_reset_event,
+       .get_reset_level = hclge_get_reset_level,
        .set_default_reset_request = hclge_set_def_reset_request,
        .get_tqps_and_rss_info = hclge_get_tqps_and_rss_info,
        .set_channels = hclge_set_channels,