From: Huaxing Zhu <huaxing....@corigine.com>

Accessing device memory during soft reset may result in some
errors being recorded in PCIE's AER register, which is normal.
Therefore, after the soft reset is completed, these errors
should be cleared.

Signed-off-by: Huaxing Zhu <huaxing....@corigine.com>
Reviewed-by: Long Wu <long...@corigine.com>
Reviewed-by: Peng Zhang <peng.zh...@corigine.com>
Reviewed-by: Chaoyong He <chaoyong...@corigine.com>
---
 drivers/net/nfp/nfp_ethdev.c | 40 ++++++++++++++++++++++++++++++++++--
 1 file changed, 38 insertions(+), 2 deletions(-)

diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
index 8cbbadb4de..b16fbe7db7 100644
--- a/drivers/net/nfp/nfp_ethdev.c
+++ b/drivers/net/nfp/nfp_ethdev.c
@@ -1338,9 +1338,37 @@ nfp_fw_check_change(struct nfp_cpp *cpp,
        return 0;
 }
 
+static void
+nfp_pcie_reg32_write_clear(struct rte_pci_device *pci_dev,
+               int position)
+{
+       int ret;
+       uint32_t capability;
+
+       ret = rte_pci_read_config(pci_dev, &capability, 4, position);
+       if (ret < 0)
+               capability = 0xffffffff;
+
+       (void)rte_pci_write_config(pci_dev, &capability, 4, position);
+}
+
+static void
+nfp_pcie_aer_clear(struct rte_pci_device *pci_dev)
+{
+       int pos;
+
+       pos = rte_pci_find_ext_capability(pci_dev, RTE_PCI_EXT_CAP_ID_ERR);
+       if (pos <= 0)
+               return;
+
+       nfp_pcie_reg32_write_clear(pci_dev, pos + RTE_PCI_ERR_UNCOR_STATUS);
+       nfp_pcie_reg32_write_clear(pci_dev, pos + RTE_PCI_ERR_COR_STATUS);
+}
+
 static int
 nfp_fw_reload(struct nfp_nsp *nsp,
                char *fw_name,
+               struct rte_pci_device *pci_dev,
                int reset)
 {
        int err;
@@ -1357,6 +1385,14 @@ nfp_fw_reload(struct nfp_nsp *nsp,
                }
        }
 
+       /*
+        * Accessing device memory during soft reset may result in some
+        * errors being recorded in PCIE's AER register, which is normal.
+        * Therefore, after the soft reset is completed, these errors
+        * should be cleared.
+        */
+       nfp_pcie_aer_clear(pci_dev);
+
        err = nfp_fw_upload(nsp, fw_name);
        if (err != 0) {
                PMD_DRV_LOG(ERR, "NFP firmware load failed");
@@ -1463,7 +1499,7 @@ nfp_fw_reload_for_single_pf_from_disk(struct nfp_nsp *nsp,
        if (!fw_changed)
                return 0;
 
-       ret = nfp_fw_reload(nsp, fw_name, reset);
+       ret = nfp_fw_reload(nsp, fw_name, pf_dev->pci_dev, reset);
        if (ret != 0)
                return ret;
 
@@ -1523,7 +1559,7 @@ nfp_fw_reload_for_multi_pf_from_disk(struct nfp_nsp *nsp,
        if (skip_load_fw && !reload_fw)
                return 0;
 
-       err = nfp_fw_reload(nsp, fw_name, reset);
+       err = nfp_fw_reload(nsp, fw_name, pf_dev->pci_dev, reset);
        if (err != 0)
                return err;
 
-- 
2.39.1

Reply via email to