If set data path functions to dummy functions before reports error
recovering event, there maybe a race-condition with data path threads,
this patch fixes it by setting data path functions to dummy functions
only after reports such event.

Fixes: e11052f3a46f ("net/bnxt: support proactive error handling mode")
Cc: sta...@dpdk.org

Signed-off-by: Chengwen Feng <fengcheng...@huawei.com>
Acked-by: Konstantin Ananyev <konstantin.anan...@huawei.com>
---
 drivers/net/bnxt/bnxt_cpr.c    | 13 +++++++------
 drivers/net/bnxt/bnxt_ethdev.c |  4 ++--
 2 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/drivers/net/bnxt/bnxt_cpr.c b/drivers/net/bnxt/bnxt_cpr.c
index 0733cf4df2..d8947d5b5f 100644
--- a/drivers/net/bnxt/bnxt_cpr.c
+++ b/drivers/net/bnxt/bnxt_cpr.c
@@ -168,14 +168,9 @@ void bnxt_handle_async_event(struct bnxt *bp,
                PMD_DRV_LOG(INFO, "Port conn async event\n");
                break;
        case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY:
-               /*
-                * Avoid any rx/tx packet processing during firmware reset
-                * operation.
-                */
-               bnxt_stop_rxtx(bp->eth_dev);
-
                /* Ignore reset notify async events when stopping the port */
                if (!bp->eth_dev->data->dev_started) {
+                       bnxt_stop_rxtx(bp->eth_dev);
                        bp->flags |= BNXT_FLAG_FATAL_ERROR;
                        return;
                }
@@ -184,6 +179,12 @@ void bnxt_handle_async_event(struct bnxt *bp,
                                             RTE_ETH_EVENT_ERR_RECOVERING,
                                             NULL);
 
+               /*
+                * Avoid any rx/tx packet processing during firmware reset
+                * operation.
+                */
+               bnxt_stop_rxtx(bp->eth_dev);
+
                pthread_mutex_lock(&bp->err_recovery_lock);
                event_data = data1;
                /* timestamp_lo/hi values are in units of 100ms */
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index 5c4d96d4b1..003a6eec11 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -4616,14 +4616,14 @@ static void bnxt_check_fw_health(void *arg)
        bp->flags |= BNXT_FLAG_FATAL_ERROR;
        bp->flags |= BNXT_FLAG_FW_RESET;
 
-       bnxt_stop_rxtx(bp->eth_dev);
-
        PMD_DRV_LOG(ERR, "Detected FW dead condition\n");
 
        rte_eth_dev_callback_process(bp->eth_dev,
                                     RTE_ETH_EVENT_ERR_RECOVERING,
                                     NULL);
 
+       bnxt_stop_rxtx(bp->eth_dev);
+
        if (bnxt_is_primary_func(bp))
                wait_msec = info->primary_func_wait_period;
        else
-- 
2.17.1

Reply via email to