+ /* FALLTHROUGH */
+ bnxt_link_update_op(bp->eth_dev, 0);
+ break;
+ case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PF_DRVR_UNLOAD:
+ PMD_DRV_LOG(INFO, "Async event: PF driver unloaded\n");
+ break;
+ case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_VF_CFG_CHANGE:
+ PMD_DRV_LOG(INFO, "Async event: VF config changed\n");
+ bnxt_hwrm_func_qcfg(bp, NULL);
+ break;
+ case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PORT_CONN_NOT_ALLOWED:
+ 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);
+
+ /* Ignore reset notify async events when stopping the port */
+ if (!bp->eth_dev->data->dev_started) {
+ bp->flags |= BNXT_FLAG_FATAL_ERROR;
+ return;
+ }
+
+ pthread_mutex_lock(&bp->err_recovery_lock);
+ 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 ?
+ rte_le_to_cpu_16(async_cmp->timestamp_hi) * 100 :
+ BNXT_MAX_FW_RESET_TIMEOUT;
+ bp->fw_reset_min_msecs = async_cmp->timestamp_lo ?
+ async_cmp->timestamp_lo * 100 :
+ BNXT_MIN_FW_READY_TIMEOUT;
+ if ((event_data & EVENT_DATA1_REASON_CODE_MASK) ==
+ EVENT_DATA1_REASON_CODE_FW_EXCEPTION_FATAL) {
+ PMD_DRV_LOG(INFO,
+ "Port %u: Firmware fatal reset event received\n",
+ port_id);
+ bp->flags |= BNXT_FLAG_FATAL_ERROR;
+ } else {
+ PMD_DRV_LOG(INFO,
+ "Port %u: Firmware non-fatal reset event received\n",
+ port_id);
+ }
+
+ bp->flags |= BNXT_FLAG_FW_RESET;
+ pthread_mutex_unlock(&bp->err_recovery_lock);
+ rte_eal_alarm_set(US_PER_MS, bnxt_dev_reset_and_resume,
+ (void *)bp);
+ break;
+ case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY:
+ info = bp->recovery_info;
+
+ if (!info)
+ return;
+
+ PMD_DRV_LOG(INFO, "Port %u: Error recovery async event received\n",
+ port_id);
+
+ event_data = rte_le_to_cpu_32(async_cmp->event_data1) &
+ EVENT_DATA1_FLAGS_MASK;
+
+ if (event_data & EVENT_DATA1_FLAGS_MASTER_FUNC)
+ info->flags |= BNXT_FLAG_MASTER_FUNC;
+ else
+ info->flags &= ~BNXT_FLAG_MASTER_FUNC;
+
+ if (event_data & EVENT_DATA1_FLAGS_RECOVERY_ENABLED)
+ info->flags |= BNXT_FLAG_RECOVERY_ENABLED;
+ else
+ info->flags &= ~BNXT_FLAG_RECOVERY_ENABLED;
+
+ PMD_DRV_LOG(INFO, "Port %u: recovery enabled(%d), master function(%d)\n",
+ port_id, bnxt_is_recovery_enabled(bp),
+ bnxt_is_master_func(bp));
+
+ if (bp->flags & BNXT_FLAG_FW_HEALTH_CHECK_SCHEDULED)
+ return;
+
+ info->last_heart_beat =
+ bnxt_read_fw_status_reg(bp, BNXT_FW_HEARTBEAT_CNT_REG);
+ info->last_reset_counter =
+ bnxt_read_fw_status_reg(bp, BNXT_FW_RECOVERY_CNT_REG);
+
+ 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;
+ case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_DEFAULT_VNIC_CHANGE:
+ bnxt_process_default_vnic_change(bp, async_cmp);
+ break;
+ case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_ECHO_REQUEST:
+ echo_req_data1 = rte_le_to_cpu_32(async_cmp->event_data1);
+ echo_req_data2 = rte_le_to_cpu_32(async_cmp->event_data2);
+ PMD_DRV_LOG(INFO,
+ "Port %u: Received fw echo request: data1 %#x data2 %#x\n",
+ port_id, echo_req_data1, echo_req_data2);
+ if (bp->recovery_info)
+ bnxt_hwrm_fw_echo_reply(bp, echo_req_data1,
+ echo_req_data2);