net/bnxt: fix race condition when port is stopped
[dpdk.git] / drivers / net / bnxt / bnxt_cpr.c
index 118cf03..21565b1 100644 (file)
@@ -21,7 +21,7 @@ void bnxt_wait_for_device_shutdown(struct bnxt *bp)
         * the SHUTDOWN bit in health register
         */
        if (!(bp->recovery_info &&
-             (bp->flags & BNXT_FLAG_FW_CAP_ERR_RECOVER_RELOAD)))
+             (bp->fw_cap & BNXT_FW_CAP_ERR_RECOVER_RELOAD)))
                return;
 
        /* Driver has to wait for fw_reset_max_msecs or shutdown bit which comes
@@ -58,14 +58,12 @@ void bnxt_handle_async_event(struct bnxt *bp,
        struct bnxt_error_recovery_info *info;
        uint32_t event_data;
 
-       /* TODO: HWRM async events are not defined yet */
-       /* Needs to handle: link events, error events, etc. */
        switch (event_id) {
        case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE:
        case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CHANGE:
        case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CFG_CHANGE:
                /* FALLTHROUGH */
-               bnxt_link_update_op(bp->eth_dev, 0);
+               bnxt_link_update(bp->eth_dev, 0, ETH_LINK_UP);
                break;
        case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PF_DRVR_UNLOAD:
                PMD_DRV_LOG(INFO, "Async event: PF driver unloaded\n");
@@ -78,6 +76,12 @@ 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:
+               /* Ignore reset notify async events when stopping the port */
+               if (!bp->eth_dev->data->dev_started) {
+                       bp->flags |= BNXT_FLAG_FATAL_ERROR;
+                       return;
+               }
+
                event_data = rte_le_to_cpu_32(async_cmp->event_data1);
                /* timestamp_lo/hi values are in units of 100ms */
                bp->fw_reset_max_msecs = async_cmp->timestamp_hi ?
@@ -135,6 +139,11 @@ void bnxt_handle_async_event(struct bnxt *bp,
 
                bnxt_schedule_fw_health_check(bp);
                break;
+       case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_DEBUG_NOTIFICATION:
+               PMD_DRV_LOG(INFO, "DNC event: evt_data1 %#x evt_data2 %#x\n",
+                           rte_le_to_cpu_32(async_cmp->event_data1),
+                           rte_le_to_cpu_32(async_cmp->event_data2));
+               break;
        default:
                PMD_DRV_LOG(DEBUG, "handle_async_event id = 0x%x\n", event_id);
                break;