BNXT_DEFAULT_VNIC_CHANGE_VF_ID_SFT;
PMD_DRV_LOG(INFO, "async event received vf_id 0x%x\n", vf_fid);
- for (vf_id = 0; vf_id < BNXT_MAX_VF_REPS; vf_id++) {
+ for (vf_id = 0; vf_id < BNXT_MAX_VF_REPS(bp); vf_id++) {
eth_dev = bp->rep_info[vf_id].vfr_eth_dev;
if (!eth_dev)
continue;
}
}
+void bnxt_handle_vf_cfg_change(void *arg)
+{
+ struct bnxt *bp = arg;
+ struct rte_eth_dev *eth_dev = bp->eth_dev;
+ int rc;
+
+ /* Free and recreate filters with default VLAN */
+ if (eth_dev->data->dev_started) {
+ rc = bnxt_dev_stop_op(eth_dev);
+ if (rc != 0) {
+ PMD_DRV_LOG(ERR, "Failed to stop Port:%u\n", eth_dev->data->port_id);
+ return;
+ }
+
+ rc = bnxt_dev_start_op(eth_dev);
+ if (rc != 0)
+ PMD_DRV_LOG(ERR, "Failed to start Port:%u\n", eth_dev->data->port_id);
+ }
+}
+
/*
* Async event handling
*/
struct bnxt_error_recovery_info *info;
uint32_t event_data;
uint32_t data1, data2;
+ uint32_t status;
data1 = rte_le_to_cpu_32(async_cmp->event_data1);
data2 = rte_le_to_cpu_32(async_cmp->event_data2);
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");
+ PMD_DRV_LOG(INFO, "Port %u: VF config change async event\n", port_id);
+ PMD_DRV_LOG(INFO, "event: data1 %#x data2 %#x\n", data1, data2);
bnxt_hwrm_func_qcfg(bp, NULL);
+ if (BNXT_VF(bp))
+ rte_eal_alarm_set(1, bnxt_handle_vf_cfg_change, (void *)bp);
break;
case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PORT_CONN_NOT_ALLOWED:
PMD_DRV_LOG(INFO, "Port conn async event\n");
* Avoid any rx/tx packet processing during firmware reset
* operation.
*/
- bnxt_stop_rxtx(bp);
+ bnxt_stop_rxtx(bp->eth_dev);
/* Ignore reset notify async events when stopping the port */
if (!bp->eth_dev->data->dev_started) {
if (!info)
return;
- PMD_DRV_LOG(INFO, "Port %u: Error recovery async event received\n",
- port_id);
-
event_data = 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)
+ if (event_data & EVENT_DATA1_FLAGS_RECOVERY_ENABLED) {
info->flags |= BNXT_FLAG_RECOVERY_ENABLED;
- else
+ } else {
info->flags &= ~BNXT_FLAG_RECOVERY_ENABLED;
+ PMD_DRV_LOG(INFO, "Driver recovery watchdog is disabled\n");
+ return;
+ }
- 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 (event_data & EVENT_DATA1_FLAGS_MASTER_FUNC)
+ info->flags |= BNXT_FLAG_PRIMARY_FUNC;
+ else
+ info->flags &= ~BNXT_FLAG_PRIMARY_FUNC;
+
+ status = bnxt_read_fw_status_reg(bp, BNXT_FW_STATUS_REG);
+ PMD_DRV_LOG(INFO,
+ "Port: %u Driver recovery watchdog, role: %s, FW status: 0x%x (%s)\n",
+ port_id, bnxt_is_primary_func(bp) ? "primary" : "backup", status,
+ (status == BNXT_FW_STATUS_HEALTHY) ? "healthy" : "unhealthy");
if (bp->flags & BNXT_FLAG_FW_HEALTH_CHECK_SCHEDULED)
return;
return evt;
}
-bool bnxt_is_master_func(struct bnxt *bp)
+bool bnxt_is_primary_func(struct bnxt *bp)
{
- if (bp->recovery_info->flags & BNXT_FLAG_MASTER_FUNC)
+ if (bp->recovery_info->flags & BNXT_FLAG_PRIMARY_FUNC)
return true;
return false;
return false;
}
-void bnxt_stop_rxtx(struct bnxt *bp)
+void bnxt_stop_rxtx(struct rte_eth_dev *eth_dev)
{
- bp->eth_dev->rx_pkt_burst = &bnxt_dummy_recv_pkts;
- bp->eth_dev->tx_pkt_burst = &bnxt_dummy_xmit_pkts;
+ eth_dev->rx_pkt_burst = &bnxt_dummy_recv_pkts;
+ eth_dev->tx_pkt_burst = &bnxt_dummy_xmit_pkts;
+
+ rte_eth_fp_ops[eth_dev->data->port_id].rx_pkt_burst =
+ eth_dev->rx_pkt_burst;
+ rte_eth_fp_ops[eth_dev->data->port_id].tx_pkt_burst =
+ eth_dev->tx_pkt_burst;
+ rte_mb();
+
+ /* Allow time for threads to exit the real burst functions. */
+ rte_delay_ms(100);
}