net/ice/base: add hook to send AdminQ command
[dpdk.git] / drivers / net / bnxt / bnxt_ethdev.c
index 7147cc8..93d0062 100644 (file)
@@ -133,6 +133,7 @@ static int bnxt_init_resources(struct bnxt *bp, bool reconfig_dev);
 static int bnxt_uninit_resources(struct bnxt *bp, bool reconfig_dev);
 static void bnxt_cancel_fw_health_check(struct bnxt *bp);
 static int bnxt_restore_vlan_filters(struct bnxt *bp);
+static void bnxt_dev_recover(void *arg);
 
 int is_bnxt_in_error(struct bnxt *bp)
 {
@@ -150,7 +151,7 @@ int is_bnxt_in_error(struct bnxt *bp)
  * High level utility functions
  */
 
-uint16_t bnxt_rss_ctxts(const struct bnxt *bp)
+static uint16_t bnxt_rss_ctxts(const struct bnxt *bp)
 {
        if (!BNXT_CHIP_THOR(bp))
                return 1;
@@ -980,6 +981,10 @@ static void bnxt_dev_close_op(struct rte_eth_dev *eth_dev)
 {
        struct bnxt *bp = eth_dev->data->dev_private;
 
+       /* cancel the recovery handler before remove dev */
+       rte_eal_alarm_cancel(bnxt_dev_reset_and_resume, (void *)bp);
+       rte_eal_alarm_cancel(bnxt_dev_recover, (void *)bp);
+
        if (eth_dev->data->dev_started)
                bnxt_dev_stop_op(eth_dev);
 
@@ -1103,6 +1108,10 @@ static int bnxt_mac_addr_add_op(struct rte_eth_dev *eth_dev,
                return -EINVAL;
        }
 
+       /* Filter settings will get applied when port is started */
+       if (!eth_dev->data->dev_started)
+               return 0;
+
        rc = bnxt_add_mac_filter(bp, vnic, mac_addr, index, pool);
 
        return rc;
@@ -2094,6 +2103,10 @@ bnxt_set_default_mac_addr_op(struct rte_eth_dev *dev,
        if (rte_is_zero_ether_addr(addr))
                return -EINVAL;
 
+       /* Filter settings will get applied when port is started */
+       if (!dev->data->dev_started)
+               return 0;
+
        /* Check if the requested MAC is already added */
        if (memcmp(addr, bp->mac_addr, RTE_ETHER_ADDR_LEN) == 0)
                return 0;
@@ -4022,15 +4035,17 @@ static void bnxt_dev_recover(void *arg)
        rc = bnxt_dev_start_op(bp->eth_dev);
        if (rc) {
                PMD_DRV_LOG(ERR, "Failed to start port after reset\n");
-               goto err;
+               goto err_start;
        }
 
        rc = bnxt_restore_filters(bp);
        if (rc)
-               goto err;
+               goto err_start;
 
        PMD_DRV_LOG(INFO, "Recovered from FW reset\n");
        return;
+err_start:
+       bnxt_dev_stop_op(bp->eth_dev);
 err:
        bp->flags |= BNXT_FLAG_FATAL_ERROR;
        bnxt_uninit_resources(bp, false);