net/bnxt: allow group ID 0 for RSS action
[dpdk.git] / drivers / net / bnxt / bnxt_ethdev.c
index 06033e3..fc3f1a8 100644 (file)
@@ -132,6 +132,7 @@ static int bnxt_dev_uninit(struct rte_eth_dev *eth_dev);
 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);
 
 int is_bnxt_in_error(struct bnxt *bp)
 {
@@ -228,14 +229,101 @@ alloc_mem_err:
        return rc;
 }
 
-static int bnxt_init_chip(struct bnxt *bp)
+static int bnxt_setup_one_vnic(struct bnxt *bp, uint16_t vnic_id)
 {
+       struct rte_eth_conf *dev_conf = &bp->eth_dev->data->dev_conf;
+       struct bnxt_vnic_info *vnic = &bp->vnic_info[vnic_id];
+       uint64_t rx_offloads = dev_conf->rxmode.offloads;
        struct bnxt_rx_queue *rxq;
+       unsigned int j;
+       int rc;
+
+       rc = bnxt_vnic_grp_alloc(bp, vnic);
+       if (rc)
+               goto err_out;
+
+       PMD_DRV_LOG(DEBUG, "vnic[%d] = %p vnic->fw_grp_ids = %p\n",
+                   vnic_id, vnic, vnic->fw_grp_ids);
+
+       rc = bnxt_hwrm_vnic_alloc(bp, vnic);
+       if (rc)
+               goto err_out;
+
+       /* Alloc RSS context only if RSS mode is enabled */
+       if (dev_conf->rxmode.mq_mode & ETH_MQ_RX_RSS) {
+               int j, nr_ctxs = bnxt_rss_ctxts(bp);
+
+               rc = 0;
+               for (j = 0; j < nr_ctxs; j++) {
+                       rc = bnxt_hwrm_vnic_ctx_alloc(bp, vnic, j);
+                       if (rc)
+                               break;
+               }
+               if (rc) {
+                       PMD_DRV_LOG(ERR,
+                                   "HWRM vnic %d ctx %d alloc failure rc: %x\n",
+                                   vnic_id, j, rc);
+                       goto err_out;
+               }
+               vnic->num_lb_ctxts = nr_ctxs;
+       }
+
+       /*
+        * Firmware sets pf pair in default vnic cfg. If the VLAN strip
+        * setting is not available at this time, it will not be
+        * configured correctly in the CFA.
+        */
+       if (rx_offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
+               vnic->vlan_strip = true;
+       else
+               vnic->vlan_strip = false;
+
+       rc = bnxt_hwrm_vnic_cfg(bp, vnic);
+       if (rc)
+               goto err_out;
+
+       rc = bnxt_set_hwrm_vnic_filters(bp, vnic);
+       if (rc)
+               goto err_out;
+
+       for (j = 0; j < bp->rx_num_qs_per_vnic; j++) {
+               rxq = bp->eth_dev->data->rx_queues[j];
+
+               PMD_DRV_LOG(DEBUG,
+                           "rxq[%d]->vnic=%p vnic->fw_grp_ids=%p\n",
+                           j, rxq->vnic, rxq->vnic->fw_grp_ids);
+
+               if (BNXT_HAS_RING_GRPS(bp) && rxq->rx_deferred_start)
+                       rxq->vnic->fw_grp_ids[j] = INVALID_HW_RING_ID;
+               else
+                       vnic->rx_queue_cnt++;
+       }
+
+       PMD_DRV_LOG(DEBUG, "vnic->rx_queue_cnt = %d\n", vnic->rx_queue_cnt);
+
+       rc = bnxt_vnic_rss_configure(bp, vnic);
+       if (rc)
+               goto err_out;
+
+       bnxt_hwrm_vnic_plcmode_cfg(bp, vnic);
+
+       if (rx_offloads & DEV_RX_OFFLOAD_TCP_LRO)
+               bnxt_hwrm_vnic_tpa_cfg(bp, vnic, 1);
+       else
+               bnxt_hwrm_vnic_tpa_cfg(bp, vnic, 0);
+
+       return 0;
+err_out:
+       PMD_DRV_LOG(ERR, "HWRM vnic %d cfg failure rc: %x\n",
+                   vnic_id, rc);
+       return rc;
+}
+
+static int bnxt_init_chip(struct bnxt *bp)
+{
        struct rte_eth_link new;
        struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(bp->eth_dev);
-       struct rte_eth_conf *dev_conf = &bp->eth_dev->data->dev_conf;
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
-       uint64_t rx_offloads = dev_conf->rxmode.offloads;
        uint32_t intr_vector = 0;
        uint32_t queue_id, base = BNXT_MISC_VEC_ID;
        uint32_t vec = BNXT_MISC_VEC_ID;
@@ -303,93 +391,11 @@ skip_cosq_cfg:
 
        /* VNIC configuration */
        for (i = 0; i < bp->nr_vnics; i++) {
-               struct rte_eth_conf *dev_conf = &bp->eth_dev->data->dev_conf;
-               struct bnxt_vnic_info *vnic = &bp->vnic_info[i];
-
-               rc = bnxt_vnic_grp_alloc(bp, vnic);
+               rc = bnxt_setup_one_vnic(bp, i);
                if (rc)
                        goto err_out;
-
-               PMD_DRV_LOG(DEBUG, "vnic[%d] = %p vnic->fw_grp_ids = %p\n",
-                           i, vnic, vnic->fw_grp_ids);
-
-               rc = bnxt_hwrm_vnic_alloc(bp, vnic);
-               if (rc) {
-                       PMD_DRV_LOG(ERR, "HWRM vnic %d alloc failure rc: %x\n",
-                               i, rc);
-                       goto err_out;
-               }
-
-               /* Alloc RSS context only if RSS mode is enabled */
-               if (dev_conf->rxmode.mq_mode & ETH_MQ_RX_RSS) {
-                       int j, nr_ctxs = bnxt_rss_ctxts(bp);
-
-                       rc = 0;
-                       for (j = 0; j < nr_ctxs; j++) {
-                               rc = bnxt_hwrm_vnic_ctx_alloc(bp, vnic, j);
-                               if (rc)
-                                       break;
-                       }
-                       if (rc) {
-                               PMD_DRV_LOG(ERR,
-                                 "HWRM vnic %d ctx %d alloc failure rc: %x\n",
-                                 i, j, rc);
-                               goto err_out;
-                       }
-                       vnic->num_lb_ctxts = nr_ctxs;
-               }
-
-               /*
-                * Firmware sets pf pair in default vnic cfg. If the VLAN strip
-                * setting is not available at this time, it will not be
-                * configured correctly in the CFA.
-                */
-               if (rx_offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
-                       vnic->vlan_strip = true;
-               else
-                       vnic->vlan_strip = false;
-
-               rc = bnxt_hwrm_vnic_cfg(bp, vnic);
-               if (rc) {
-                       PMD_DRV_LOG(ERR, "HWRM vnic %d cfg failure rc: %x\n",
-                               i, rc);
-                       goto err_out;
-               }
-
-               rc = bnxt_set_hwrm_vnic_filters(bp, vnic);
-               if (rc) {
-                       PMD_DRV_LOG(ERR,
-                               "HWRM vnic %d filter failure rc: %x\n",
-                               i, rc);
-                       goto err_out;
-               }
-
-               for (j = 0; j < bp->rx_num_qs_per_vnic; j++) {
-                       rxq = bp->eth_dev->data->rx_queues[j];
-
-                       PMD_DRV_LOG(DEBUG,
-                                   "rxq[%d]->vnic=%p vnic->fw_grp_ids=%p\n",
-                                   j, rxq->vnic, rxq->vnic->fw_grp_ids);
-
-                       if (BNXT_HAS_RING_GRPS(bp) && rxq->rx_deferred_start)
-                               rxq->vnic->fw_grp_ids[j] = INVALID_HW_RING_ID;
-               }
-
-               rc = bnxt_vnic_rss_configure(bp, vnic);
-               if (rc) {
-                       PMD_DRV_LOG(ERR,
-                                   "HWRM vnic set RSS failure rc: %x\n", rc);
-                       goto err_out;
-               }
-
-               bnxt_hwrm_vnic_plcmode_cfg(bp, vnic);
-
-               if (bp->eth_dev->data->dev_conf.rxmode.offloads &
-                   DEV_RX_OFFLOAD_TCP_LRO)
-                       bnxt_hwrm_vnic_tpa_cfg(bp, vnic, 1);
-               else
-                       bnxt_hwrm_vnic_tpa_cfg(bp, vnic, 0);
        }
+
        rc = bnxt_hwrm_cfa_l2_set_rx_mask(bp, &bp->vnic_info[0], 0, NULL);
        if (rc) {
                PMD_DRV_LOG(ERR,
@@ -439,8 +445,11 @@ skip_cosq_cfg:
 
        /* enable uio/vfio intr/eventfd mapping */
        rc = rte_intr_enable(intr_handle);
+#ifndef RTE_EXEC_ENV_FREEBSD
+       /* In FreeBSD OS, nic_uio driver does not support interrupts */
        if (rc)
                goto err_free;
+#endif
 
        rc = bnxt_get_hwrm_link_config(bp, &new);
        if (rc) {
@@ -458,6 +467,10 @@ skip_cosq_cfg:
        }
        bnxt_print_link_info(bp->eth_dev);
 
+       bp->mark_table = rte_zmalloc("bnxt_mark_table", BNXT_MARK_TABLE_SZ, 0);
+       if (!bp->mark_table)
+               PMD_DRV_LOG(ERR, "Allocation of mark table failed\n");
+
        return 0;
 
 err_free:
@@ -740,8 +753,10 @@ static int bnxt_scattered_rx(struct rte_eth_dev *eth_dev)
 }
 
 static eth_rx_burst_t
-bnxt_receive_function(__rte_unused struct rte_eth_dev *eth_dev)
+bnxt_receive_function(struct rte_eth_dev *eth_dev)
 {
+       struct bnxt *bp = eth_dev->data->dev_private;
+
 #ifdef RTE_ARCH_X86
 #ifndef RTE_LIBRTE_IEEE1588
        /*
@@ -758,9 +773,11 @@ bnxt_receive_function(__rte_unused struct rte_eth_dev *eth_dev)
                DEV_RX_OFFLOAD_UDP_CKSUM |
                DEV_RX_OFFLOAD_TCP_CKSUM |
                DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
+               DEV_RX_OFFLOAD_RSS_HASH |
                DEV_RX_OFFLOAD_VLAN_FILTER))) {
                PMD_DRV_LOG(INFO, "Using vector mode receive for port %d\n",
                            eth_dev->data->port_id);
+               bp->flags |= BNXT_FLAG_RX_VECTOR_PKT_MODE;
                return bnxt_recv_pkts_vec;
        }
        PMD_DRV_LOG(INFO, "Vector mode receive disabled for port %d\n",
@@ -772,6 +789,7 @@ bnxt_receive_function(__rte_unused struct rte_eth_dev *eth_dev)
                    eth_dev->data->dev_conf.rxmode.offloads);
 #endif
 #endif
+       bp->flags &= ~BNXT_FLAG_RX_VECTOR_PKT_MODE;
        return bnxt_recv_pkts;
 }
 
@@ -855,7 +873,8 @@ static int bnxt_dev_start_op(struct rte_eth_dev *eth_dev)
 
        eth_dev->data->scattered_rx = bnxt_scattered_rx(eth_dev);
 
-       bnxt_link_update_op(eth_dev, 1);
+       bnxt_link_update(eth_dev, 1, ETH_LINK_UP);
+       bp->dev_stopped = 0;
 
        if (rx_offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
                vlan_mask |= ETH_VLAN_FILTER_MASK;
@@ -870,7 +889,6 @@ static int bnxt_dev_start_op(struct rte_eth_dev *eth_dev)
 
        bp->flags |= BNXT_FLAG_INIT_DONE;
        eth_dev->data->dev_started = 1;
-       bp->dev_stopped = 0;
        pthread_mutex_lock(&bp->def_cp_lock);
        bnxt_schedule_fw_health_check(bp);
        pthread_mutex_unlock(&bp->def_cp_lock);
@@ -881,6 +899,7 @@ error:
        bnxt_shutdown_nic(bp);
        bnxt_free_tx_mbufs(bp);
        bnxt_free_rx_mbufs(bp);
+       bp->dev_stopped = 1;
        return rc;
 }
 
@@ -939,7 +958,7 @@ static void bnxt_dev_stop_op(struct rte_eth_dev *eth_dev)
         * During reset recovery, there is no need to wait
         */
        if (!is_bnxt_in_error(bp))
-               rte_delay_ms(BNXT_LINK_WAIT_INTERVAL * 2);
+               bnxt_link_update(eth_dev, 1, ETH_LINK_DOWN);
 
        /* Clean queue intr-vector mapping */
        rte_intr_efd_disable(intr_handle);
@@ -955,6 +974,11 @@ static void bnxt_dev_stop_op(struct rte_eth_dev *eth_dev)
        bnxt_int_handler(eth_dev);
        bnxt_shutdown_nic(bp);
        bnxt_hwrm_if_change(bp, 0);
+
+       rte_free(bp->mark_table);
+       bp->mark_table = NULL;
+
+       bp->flags &= ~BNXT_FLAG_RX_VECTOR_PKT_MODE;
        bp->dev_stopped = 1;
        bp->rx_cosq_cnt = 0;
 }
@@ -966,16 +990,22 @@ static void bnxt_dev_close_op(struct rte_eth_dev *eth_dev)
        if (bp->dev_stopped == 0)
                bnxt_dev_stop_op(eth_dev);
 
-       if (eth_dev->data->mac_addrs != NULL) {
-               rte_free(eth_dev->data->mac_addrs);
-               eth_dev->data->mac_addrs = NULL;
-       }
-       if (bp->grp_info != NULL) {
-               rte_free(bp->grp_info);
-               bp->grp_info = NULL;
-       }
+       bnxt_uninit_resources(bp, false);
 
-       bnxt_dev_uninit(eth_dev);
+       eth_dev->dev_ops = NULL;
+       eth_dev->rx_pkt_burst = NULL;
+       eth_dev->tx_pkt_burst = NULL;
+
+       rte_memzone_free((const struct rte_memzone *)bp->tx_mem_zone);
+       bp->tx_mem_zone = NULL;
+       rte_memzone_free((const struct rte_memzone *)bp->rx_mem_zone);
+       bp->rx_mem_zone = NULL;
+
+       rte_free(bp->pf.vf_info);
+       bp->pf.vf_info = NULL;
+
+       rte_free(bp->grp_info);
+       bp->grp_info = NULL;
 }
 
 static void bnxt_mac_addr_remove_op(struct rte_eth_dev *eth_dev,
@@ -1006,8 +1036,6 @@ static void bnxt_mac_addr_remove_op(struct rte_eth_dev *eth_dev,
                                STAILQ_REMOVE(&vnic->filter, filter,
                                                bnxt_filter_info, next);
                                bnxt_hwrm_clear_l2_filter(bp, filter);
-                               filter->mac_index = INVALID_MAC_INDEX;
-                               memset(&filter->l2_addr, 0, RTE_ETHER_ADDR_LEN);
                                bnxt_free_filter(bp, filter);
                        }
                        filter = temp_filter;
@@ -1054,7 +1082,6 @@ static int bnxt_add_mac_filter(struct bnxt *bp, struct bnxt_vnic_info *vnic,
                else
                        STAILQ_INSERT_TAIL(&vnic->filter, filter, next);
        } else {
-               memset(&filter->l2_addr, 0, RTE_ETHER_ADDR_LEN);
                bnxt_free_filter(bp, filter);
        }
 
@@ -1088,12 +1115,14 @@ static int bnxt_mac_addr_add_op(struct rte_eth_dev *eth_dev,
        return rc;
 }
 
-int bnxt_link_update_op(struct rte_eth_dev *eth_dev, int wait_to_complete)
+int bnxt_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete,
+                    bool exp_link_status)
 {
        int rc = 0;
        struct bnxt *bp = eth_dev->data->dev_private;
        struct rte_eth_link new;
-       unsigned int cnt = BNXT_LINK_WAIT_CNT;
+       int cnt = exp_link_status ? BNXT_LINK_UP_WAIT_CNT :
+                 BNXT_LINK_DOWN_WAIT_CNT;
 
        rc = is_bnxt_in_error(bp);
        if (rc)
@@ -1111,7 +1140,7 @@ int bnxt_link_update_op(struct rte_eth_dev *eth_dev, int wait_to_complete)
                        goto out;
                }
 
-               if (!wait_to_complete || new.link_status)
+               if (!wait_to_complete || new.link_status == exp_link_status)
                        break;
 
                rte_delay_ms(BNXT_LINK_WAIT_INTERVAL);
@@ -1133,6 +1162,12 @@ out:
        return rc;
 }
 
+static int bnxt_link_update_op(struct rte_eth_dev *eth_dev,
+                              int wait_to_complete)
+{
+       return bnxt_link_update(eth_dev, wait_to_complete, ETH_LINK_UP);
+}
+
 static int bnxt_promiscuous_enable_op(struct rte_eth_dev *eth_dev)
 {
        struct bnxt *bp = eth_dev->data->dev_private;
@@ -1144,6 +1179,10 @@ static int bnxt_promiscuous_enable_op(struct rte_eth_dev *eth_dev)
        if (rc)
                return rc;
 
+       /* Filter settings will get applied when port is started */
+       if (bp->dev_stopped == 1)
+               return 0;
+
        if (bp->vnic_info == NULL)
                return 0;
 
@@ -1169,6 +1208,10 @@ static int bnxt_promiscuous_disable_op(struct rte_eth_dev *eth_dev)
        if (rc)
                return rc;
 
+       /* Filter settings will get applied when port is started */
+       if (bp->dev_stopped == 1)
+               return 0;
+
        if (bp->vnic_info == NULL)
                return 0;
 
@@ -1194,6 +1237,10 @@ static int bnxt_allmulticast_enable_op(struct rte_eth_dev *eth_dev)
        if (rc)
                return rc;
 
+       /* Filter settings will get applied when port is started */
+       if (bp->dev_stopped == 1)
+               return 0;
+
        if (bp->vnic_info == NULL)
                return 0;
 
@@ -1219,6 +1266,10 @@ static int bnxt_allmulticast_disable_op(struct rte_eth_dev *eth_dev)
        if (rc)
                return rc;
 
+       /* Filter settings will get applied when port is started */
+       if (bp->dev_stopped == 1)
+               return 0;
+
        if (bp->vnic_info == NULL)
                return 0;
 
@@ -1270,7 +1321,7 @@ static int bnxt_reta_update_op(struct rte_eth_dev *eth_dev,
 {
        struct bnxt *bp = eth_dev->data->dev_private;
        struct rte_eth_conf *dev_conf = &bp->eth_dev->data->dev_conf;
-       struct bnxt_vnic_info *vnic = &bp->vnic_info[0];
+       struct bnxt_vnic_info *vnic = BNXT_GET_DEFAULT_VNIC(bp);
        uint16_t tbl_size = bnxt_rss_hash_tbl_size(bp);
        uint16_t idx, sft;
        int i, rc;
@@ -1327,7 +1378,7 @@ static int bnxt_reta_query_op(struct rte_eth_dev *eth_dev,
                              uint16_t reta_size)
 {
        struct bnxt *bp = eth_dev->data->dev_private;
-       struct bnxt_vnic_info *vnic = &bp->vnic_info[0];
+       struct bnxt_vnic_info *vnic = BNXT_GET_DEFAULT_VNIC(bp);
        uint16_t tbl_size = bnxt_rss_hash_tbl_size(bp);
        uint16_t idx, sft, i;
        int rc;
@@ -1401,7 +1452,7 @@ static int bnxt_rss_hash_update_op(struct rte_eth_dev *eth_dev,
        memcpy(&bp->rss_conf, rss_conf, sizeof(*rss_conf));
 
        /* Update the default RSS VNIC(s) */
-       vnic = &bp->vnic_info[0];
+       vnic = BNXT_GET_DEFAULT_VNIC(bp);
        vnic->hash_type = bnxt_rte_to_hwrm_hash_types(rss_conf->rss_hf);
 
        /*
@@ -1427,7 +1478,7 @@ static int bnxt_rss_hash_conf_get_op(struct rte_eth_dev *eth_dev,
                                     struct rte_eth_rss_conf *rss_conf)
 {
        struct bnxt *bp = eth_dev->data->dev_private;
-       struct bnxt_vnic_info *vnic = &bp->vnic_info[0];
+       struct bnxt_vnic_info *vnic = BNXT_GET_DEFAULT_VNIC(bp);
        int len, rc;
        uint32_t hash_types;
 
@@ -1780,7 +1831,6 @@ static int bnxt_add_vlan_filter(struct bnxt *bp, uint16_t vlan_id)
                /* Free the newly allocated filter as we were
                 * not able to create the filter in hardware.
                 */
-               filter->fw_l2_filter_id = UINT64_MAX;
                bnxt_free_filter(bp, filter);
                return rc;
        }
@@ -1830,7 +1880,6 @@ static int bnxt_del_dflt_mac_filter(struct bnxt *bp,
                                STAILQ_REMOVE(&vnic->filter, filter,
                                              bnxt_filter_info, next);
                                bnxt_free_filter(bp, filter);
-                               filter->fw_l2_filter_id = UINT64_MAX;
                        }
                        return rc;
                }
@@ -1840,18 +1889,12 @@ static int bnxt_del_dflt_mac_filter(struct bnxt *bp,
 }
 
 static int
-bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask)
+bnxt_config_vlan_hw_filter(struct bnxt *bp, uint64_t rx_offloads)
 {
-       struct bnxt *bp = dev->data->dev_private;
-       uint64_t rx_offloads = dev->data->dev_conf.rxmode.offloads;
        struct bnxt_vnic_info *vnic;
        unsigned int i;
        int rc;
 
-       rc = is_bnxt_in_error(bp);
-       if (rc)
-               return rc;
-
        vnic = BNXT_GET_DEFAULT_VNIC(bp);
        if (!(rx_offloads & DEV_RX_OFFLOAD_VLAN_FILTER)) {
                /* Remove any VLAN filters programmed */
@@ -1875,18 +1918,94 @@ bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask)
        PMD_DRV_LOG(DEBUG, "VLAN Filtering: %d\n",
                    !!(rx_offloads & DEV_RX_OFFLOAD_VLAN_FILTER));
 
+       return 0;
+}
+
+static int bnxt_free_one_vnic(struct bnxt *bp, uint16_t vnic_id)
+{
+       struct bnxt_vnic_info *vnic = &bp->vnic_info[vnic_id];
+       unsigned int i;
+       int rc;
+
+       /* Destroy vnic filters and vnic */
+       if (bp->eth_dev->data->dev_conf.rxmode.offloads &
+           DEV_RX_OFFLOAD_VLAN_FILTER) {
+               for (i = 0; i < RTE_ETHER_MAX_VLAN_ID; i++)
+                       bnxt_del_vlan_filter(bp, i);
+       }
+       bnxt_del_dflt_mac_filter(bp, vnic);
+
+       rc = bnxt_hwrm_vnic_free(bp, vnic);
+       if (rc)
+               return rc;
+
+       rte_free(vnic->fw_grp_ids);
+       vnic->fw_grp_ids = NULL;
+
+       return 0;
+}
+
+static int
+bnxt_config_vlan_hw_stripping(struct bnxt *bp, uint64_t rx_offloads)
+{
+       struct bnxt_vnic_info *vnic = BNXT_GET_DEFAULT_VNIC(bp);
+       int rc;
+
+       /* Destroy, recreate and reconfigure the default vnic */
+       rc = bnxt_free_one_vnic(bp, 0);
+       if (rc)
+               return rc;
+
+       /* default vnic 0 */
+       rc = bnxt_setup_one_vnic(bp, 0);
+       if (rc)
+               return rc;
+
+       if (bp->eth_dev->data->dev_conf.rxmode.offloads &
+           DEV_RX_OFFLOAD_VLAN_FILTER) {
+               rc = bnxt_add_vlan_filter(bp, 0);
+               bnxt_restore_vlan_filters(bp);
+       } else {
+               rc = bnxt_add_mac_filter(bp, vnic, NULL, 0, 0);
+       }
+
+       rc = bnxt_hwrm_cfa_l2_set_rx_mask(bp, vnic, 0, NULL);
+       if (rc)
+               return rc;
+
+       PMD_DRV_LOG(DEBUG, "VLAN Strip Offload: %d\n",
+                   !!(rx_offloads & DEV_RX_OFFLOAD_VLAN_STRIP));
+
+       return rc;
+}
+
+static int
+bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask)
+{
+       uint64_t rx_offloads = dev->data->dev_conf.rxmode.offloads;
+       struct bnxt *bp = dev->data->dev_private;
+       int rc;
+
+       rc = is_bnxt_in_error(bp);
+       if (rc)
+               return rc;
+
+       /* Filter settings will get applied when port is started */
+       if (bp->dev_stopped == 1)
+               return 0;
+
+       if (mask & ETH_VLAN_FILTER_MASK) {
+               /* Enable or disable VLAN filtering */
+               rc = bnxt_config_vlan_hw_filter(bp, rx_offloads);
+               if (rc)
+                       return rc;
+       }
+
        if (mask & ETH_VLAN_STRIP_MASK) {
                /* Enable or disable VLAN stripping */
-               for (i = 0; i < bp->nr_vnics; i++) {
-                       struct bnxt_vnic_info *vnic = &bp->vnic_info[i];
-                       if (rx_offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
-                               vnic->vlan_strip = true;
-                       else
-                               vnic->vlan_strip = false;
-                       bnxt_hwrm_vnic_cfg(bp, vnic);
-               }
-               PMD_DRV_LOG(DEBUG, "VLAN Strip Offload: %d\n",
-                       !!(rx_offloads & DEV_RX_OFFLOAD_VLAN_STRIP));
+               rc = bnxt_config_vlan_hw_stripping(bp, rx_offloads);
+               if (rc)
+                       return rc;
        }
 
        if (mask & ETH_VLAN_EXTEND_MASK) {
@@ -1963,8 +2082,7 @@ bnxt_set_default_mac_addr_op(struct rte_eth_dev *dev,
 {
        struct bnxt *bp = dev->data->dev_private;
        /* Default Filter is tied to VNIC 0 */
-       struct bnxt_vnic_info *vnic = &bp->vnic_info[0];
-       struct bnxt_filter_info *filter;
+       struct bnxt_vnic_info *vnic = BNXT_GET_DEFAULT_VNIC(bp);
        int rc;
 
        rc = is_bnxt_in_error(bp);
@@ -1977,32 +2095,23 @@ bnxt_set_default_mac_addr_op(struct rte_eth_dev *dev,
        if (rte_is_zero_ether_addr(addr))
                return -EINVAL;
 
-       STAILQ_FOREACH(filter, &vnic->filter, next) {
-               /* Default Filter is at Index 0 */
-               if (filter->mac_index != 0)
-                       continue;
-
-               memcpy(filter->l2_addr, addr, RTE_ETHER_ADDR_LEN);
-               memset(filter->l2_addr_mask, 0xff, RTE_ETHER_ADDR_LEN);
-               filter->flags |= HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_PATH_RX |
-                       HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_OUTERMOST;
-               filter->enables |=
-                       HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_ADDR |
-                       HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_ADDR_MASK;
+       /* Check if the requested MAC is already added */
+       if (memcmp(addr, bp->mac_addr, RTE_ETHER_ADDR_LEN) == 0)
+               return 0;
 
-               rc = bnxt_hwrm_set_l2_filter(bp, vnic->fw_vnic_id, filter);
-               if (rc) {
-                       memcpy(filter->l2_addr, bp->mac_addr,
-                              RTE_ETHER_ADDR_LEN);
-                       return rc;
-               }
+       /* Destroy filter and re-create it */
+       bnxt_del_dflt_mac_filter(bp, vnic);
 
-               memcpy(bp->mac_addr, addr, RTE_ETHER_ADDR_LEN);
-               PMD_DRV_LOG(DEBUG, "Set MAC addr\n");
-               return 0;
+       memcpy(bp->mac_addr, addr, RTE_ETHER_ADDR_LEN);
+       if (dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_VLAN_FILTER) {
+               /* This filter will allow only untagged packets */
+               rc = bnxt_add_vlan_filter(bp, 0);
+       } else {
+               rc = bnxt_add_mac_filter(bp, vnic, addr, 0, 0);
        }
 
-       return 0;
+       PMD_DRV_LOG(DEBUG, "Set MAC addr\n");
+       return rc;
 }
 
 static int
@@ -2377,7 +2486,7 @@ bnxt_match_and_validate_ether_filter(struct bnxt *bp,
                goto exit;
        }
 
-       vnic0 = &bp->vnic_info[0];
+       vnic0 = BNXT_GET_DEFAULT_VNIC(bp);
        vnic = &bp->vnic_info[efilter->queue];
        if (vnic == NULL) {
                PMD_DRV_LOG(ERR, "Invalid queue %d\n", efilter->queue);
@@ -2436,7 +2545,7 @@ bnxt_ethertype_filter(struct rte_eth_dev *dev,
                return -EINVAL;
        }
 
-       vnic0 = &bp->vnic_info[0];
+       vnic0 = BNXT_GET_DEFAULT_VNIC(bp);
        vnic = &bp->vnic_info[efilter->queue];
 
        switch (filter_op) {
@@ -2651,7 +2760,7 @@ bnxt_cfg_ntuple_filter(struct bnxt *bp,
                goto free_filter;
 
        vnic = &bp->vnic_info[nfilter->queue];
-       vnic0 = &bp->vnic_info[0];
+       vnic0 = BNXT_GET_DEFAULT_VNIC(bp);
        filter1 = STAILQ_FIRST(&vnic0->filter);
        if (filter1 == NULL) {
                ret = -EINVAL;
@@ -2704,14 +2813,11 @@ bnxt_cfg_ntuple_filter(struct bnxt *bp,
 
                STAILQ_REMOVE(&vnic->filter, mfilter, bnxt_filter_info, next);
                bnxt_free_filter(bp, mfilter);
-               mfilter->fw_l2_filter_id = -1;
                bnxt_free_filter(bp, bfilter);
-               bfilter->fw_l2_filter_id = -1;
        }
 
        return 0;
 free_filter:
-       bfilter->fw_l2_filter_id = -1;
        bnxt_free_filter(bp, bfilter);
        return ret;
 }
@@ -2944,7 +3050,7 @@ bnxt_parse_fdir_filter(struct bnxt *bp,
                return -EINVAL;
        }
 
-       vnic0 = &bp->vnic_info[0];
+       vnic0 = BNXT_GET_DEFAULT_VNIC(bp);
        vnic = &bp->vnic_info[fdir->action.rx_queue];
        if (vnic == NULL) {
                PMD_DRV_LOG(ERR, "Invalid queue %d\n", fdir->action.rx_queue);
@@ -3109,7 +3215,6 @@ bnxt_fdir_filter(struct rte_eth_dev *dev,
                        STAILQ_REMOVE(&vnic->filter, match,
                                      bnxt_filter_info, next);
                        bnxt_free_filter(bp, match);
-                       filter->fw_l2_filter_id = -1;
                        bnxt_free_filter(bp, filter);
                }
                break;
@@ -3142,13 +3247,12 @@ bnxt_fdir_filter(struct rte_eth_dev *dev,
        return ret;
 
 free_filter:
-       filter->fw_l2_filter_id = -1;
        bnxt_free_filter(bp, filter);
        return ret;
 }
 
 static int
-bnxt_filter_ctrl_op(struct rte_eth_dev *dev __rte_unused,
+bnxt_filter_ctrl_op(struct rte_eth_dev *dev,
                    enum rte_filter_type filter_type,
                    enum rte_filter_op filter_op, void *arg)
 {
@@ -3499,9 +3603,9 @@ bnxt_get_eeprom_length_op(struct rte_eth_dev *dev)
        if (rc)
                return rc;
 
-       PMD_DRV_LOG(INFO, "%04x:%02x:%02x:%02x\n",
-               bp->pdev->addr.domain, bp->pdev->addr.bus,
-               bp->pdev->addr.devid, bp->pdev->addr.function);
+       PMD_DRV_LOG(INFO, PCI_PRI_FMT "\n",
+                   bp->pdev->addr.domain, bp->pdev->addr.bus,
+                   bp->pdev->addr.devid, bp->pdev->addr.function);
 
        rc = bnxt_hwrm_nvm_get_dir_info(bp, &dir_entries, &entry_length);
        if (rc != 0)
@@ -3523,10 +3627,10 @@ bnxt_get_eeprom_op(struct rte_eth_dev *dev,
        if (rc)
                return rc;
 
-       PMD_DRV_LOG(INFO, "%04x:%02x:%02x:%02x in_eeprom->offset = %d "
-               "len = %d\n", bp->pdev->addr.domain,
-               bp->pdev->addr.bus, bp->pdev->addr.devid,
-               bp->pdev->addr.function, in_eeprom->offset, in_eeprom->length);
+       PMD_DRV_LOG(INFO, PCI_PRI_FMT " in_eeprom->offset = %d len = %d\n",
+                   bp->pdev->addr.domain, bp->pdev->addr.bus,
+                   bp->pdev->addr.devid, bp->pdev->addr.function,
+                   in_eeprom->offset, in_eeprom->length);
 
        if (in_eeprom->offset == 0) /* special offset value to get directory */
                return bnxt_get_nvram_directory(bp, in_eeprom->length,
@@ -3599,10 +3703,10 @@ bnxt_set_eeprom_op(struct rte_eth_dev *dev,
        if (rc)
                return rc;
 
-       PMD_DRV_LOG(INFO, "%04x:%02x:%02x:%02x in_eeprom->offset = %d "
-               "len = %d\n", bp->pdev->addr.domain,
-               bp->pdev->addr.bus, bp->pdev->addr.devid,
-               bp->pdev->addr.function, in_eeprom->offset, in_eeprom->length);
+       PMD_DRV_LOG(INFO, PCI_PRI_FMT " in_eeprom->offset = %d len = %d\n",
+                   bp->pdev->addr.domain, bp->pdev->addr.bus,
+                   bp->pdev->addr.devid, bp->pdev->addr.function,
+                   in_eeprom->offset, in_eeprom->length);
 
        if (!BNXT_PF(bp)) {
                PMD_DRV_LOG(ERR, "NVM write not supported from a VF\n");
@@ -3795,6 +3899,71 @@ static void bnxt_dev_cleanup(struct bnxt *bp)
        bnxt_uninit_resources(bp, true);
 }
 
+static int bnxt_restore_vlan_filters(struct bnxt *bp)
+{
+       struct rte_eth_dev *dev = bp->eth_dev;
+       struct rte_vlan_filter_conf *vfc;
+       int vidx, vbit, rc;
+       uint16_t vlan_id;
+
+       for (vlan_id = 1; vlan_id <= RTE_ETHER_MAX_VLAN_ID; vlan_id++) {
+               vfc = &dev->data->vlan_filter_conf;
+               vidx = vlan_id / 64;
+               vbit = vlan_id % 64;
+
+               /* Each bit corresponds to a VLAN id */
+               if (vfc->ids[vidx] & (UINT64_C(1) << vbit)) {
+                       rc = bnxt_add_vlan_filter(bp, vlan_id);
+                       if (rc)
+                               return rc;
+               }
+       }
+
+       return 0;
+}
+
+static int bnxt_restore_mac_filters(struct bnxt *bp)
+{
+       struct rte_eth_dev *dev = bp->eth_dev;
+       struct rte_eth_dev_info dev_info;
+       struct rte_ether_addr *addr;
+       uint64_t pool_mask;
+       uint32_t pool = 0;
+       uint16_t i;
+       int rc;
+
+       if (BNXT_VF(bp) & !BNXT_VF_IS_TRUSTED(bp))
+               return 0;
+
+       rc = bnxt_dev_info_get_op(dev, &dev_info);
+       if (rc)
+               return rc;
+
+       /* replay MAC address configuration */
+       for (i = 1; i < dev_info.max_mac_addrs; i++) {
+               addr = &dev->data->mac_addrs[i];
+
+               /* skip zero address */
+               if (rte_is_zero_ether_addr(addr))
+                       continue;
+
+               pool = 0;
+               pool_mask = dev->data->mac_pool_sel[i];
+
+               do {
+                       if (pool_mask & 1ULL) {
+                               rc = bnxt_mac_addr_add_op(dev, addr, i, pool);
+                               if (rc)
+                                       return rc;
+                       }
+                       pool_mask >>= 1;
+                       pool++;
+               } while (pool_mask);
+       }
+
+       return 0;
+}
+
 static int bnxt_restore_filters(struct bnxt *bp)
 {
        struct rte_eth_dev *dev = bp->eth_dev;
@@ -3805,6 +3974,11 @@ static int bnxt_restore_filters(struct bnxt *bp)
        if (dev->data->promiscuous)
                ret = bnxt_promiscuous_enable_op(dev);
 
+       ret = bnxt_restore_mac_filters(bp);
+       if (ret)
+               return ret;
+
+       ret = bnxt_restore_vlan_filters(bp);
        /* TODO restore other filters as well */
        return ret;
 }
@@ -4027,49 +4201,60 @@ static void bnxt_cancel_fw_health_check(struct bnxt *bp)
        bp->flags &= ~BNXT_FLAG_FW_HEALTH_CHECK_SCHEDULED;
 }
 
-static bool bnxt_vf_pciid(uint16_t id)
+static bool bnxt_vf_pciid(uint16_t device_id)
 {
-       if (id == BROADCOM_DEV_ID_57304_VF ||
-           id == BROADCOM_DEV_ID_57406_VF ||
-           id == BROADCOM_DEV_ID_5731X_VF ||
-           id == BROADCOM_DEV_ID_5741X_VF ||
-           id == BROADCOM_DEV_ID_57414_VF ||
-           id == BROADCOM_DEV_ID_STRATUS_NIC_VF1 ||
-           id == BROADCOM_DEV_ID_STRATUS_NIC_VF2 ||
-           id == BROADCOM_DEV_ID_58802_VF ||
-           id == BROADCOM_DEV_ID_57500_VF1 ||
-           id == BROADCOM_DEV_ID_57500_VF2)
+       switch (device_id) {
+       case BROADCOM_DEV_ID_57304_VF:
+       case BROADCOM_DEV_ID_57406_VF:
+       case BROADCOM_DEV_ID_5731X_VF:
+       case BROADCOM_DEV_ID_5741X_VF:
+       case BROADCOM_DEV_ID_57414_VF:
+       case BROADCOM_DEV_ID_STRATUS_NIC_VF1:
+       case BROADCOM_DEV_ID_STRATUS_NIC_VF2:
+       case BROADCOM_DEV_ID_58802_VF:
+       case BROADCOM_DEV_ID_57500_VF1:
+       case BROADCOM_DEV_ID_57500_VF2:
+               /* FALLTHROUGH */
                return true;
-       return false;
+       default:
+               return false;
+       }
 }
 
-static bool bnxt_thor_device(uint16_t id)
+static bool bnxt_thor_device(uint16_t device_id)
 {
-       if (id == BROADCOM_DEV_ID_57508 ||
-           id == BROADCOM_DEV_ID_57504 ||
-           id == BROADCOM_DEV_ID_57502 ||
-           id == BROADCOM_DEV_ID_57508_MF1 ||
-           id == BROADCOM_DEV_ID_57504_MF1 ||
-           id == BROADCOM_DEV_ID_57502_MF1 ||
-           id == BROADCOM_DEV_ID_57508_MF2 ||
-           id == BROADCOM_DEV_ID_57504_MF2 ||
-           id == BROADCOM_DEV_ID_57502_MF2 ||
-           id == BROADCOM_DEV_ID_57500_VF1 ||
-           id == BROADCOM_DEV_ID_57500_VF2)
+       switch (device_id) {
+       case BROADCOM_DEV_ID_57508:
+       case BROADCOM_DEV_ID_57504:
+       case BROADCOM_DEV_ID_57502:
+       case BROADCOM_DEV_ID_57508_MF1:
+       case BROADCOM_DEV_ID_57504_MF1:
+       case BROADCOM_DEV_ID_57502_MF1:
+       case BROADCOM_DEV_ID_57508_MF2:
+       case BROADCOM_DEV_ID_57504_MF2:
+       case BROADCOM_DEV_ID_57502_MF2:
+       case BROADCOM_DEV_ID_57500_VF1:
+       case BROADCOM_DEV_ID_57500_VF2:
+               /* FALLTHROUGH */
                return true;
-
-       return false;
+       default:
+               return false;
+       }
 }
 
 bool bnxt_stratus_device(struct bnxt *bp)
 {
-       uint16_t id = bp->pdev->id.device_id;
+       uint16_t device_id = bp->pdev->id.device_id;
 
-       if (id == BROADCOM_DEV_ID_STRATUS_NIC ||
-           id == BROADCOM_DEV_ID_STRATUS_NIC_VF1 ||
-           id == BROADCOM_DEV_ID_STRATUS_NIC_VF2)
+       switch (device_id) {
+       case BROADCOM_DEV_ID_STRATUS_NIC:
+       case BROADCOM_DEV_ID_STRATUS_NIC_VF1:
+       case BROADCOM_DEV_ID_STRATUS_NIC_VF2:
+               /* FALLTHROUGH */
                return true;
-       return false;
+       default:
+               return false;
+       }
 }
 
 static int bnxt_init_board(struct rte_eth_dev *eth_dev)
@@ -4091,7 +4276,7 @@ static int bnxt_init_board(struct rte_eth_dev *eth_dev)
        return 0;
 }
 
-static int bnxt_alloc_ctx_mem_blk(__rte_unused struct bnxt *bp,
+static int bnxt_alloc_ctx_mem_blk(struct bnxt *bp,
                                  struct bnxt_ctx_pg_info *ctx_pg,
                                  uint32_t mem_size,
                                  const char *suffix,
@@ -4137,18 +4322,6 @@ static int bnxt_alloc_ctx_mem_blk(__rte_unused struct bnxt *bp,
 
                memset(mz->addr, 0, mz->len);
                mz_phys_addr = mz->iova;
-               if ((unsigned long)mz->addr == mz_phys_addr) {
-                       PMD_DRV_LOG(DEBUG,
-                                   "physical address same as virtual\n");
-                       PMD_DRV_LOG(DEBUG, "Using rte_mem_virt2iova()\n");
-                       mz_phys_addr = rte_mem_virt2iova(mz->addr);
-                       if (mz_phys_addr == RTE_BAD_IOVA) {
-                               PMD_DRV_LOG(ERR,
-                                       "unable to map addr to phys memory\n");
-                               return -ENOMEM;
-                       }
-               }
-               rte_mem_lock_page(((char *)mz->addr));
 
                rmem->pg_tbl = mz->addr;
                rmem->pg_tbl_map = mz_phys_addr;
@@ -4172,22 +4345,8 @@ static int bnxt_alloc_ctx_mem_blk(__rte_unused struct bnxt *bp,
 
        memset(mz->addr, 0, mz->len);
        mz_phys_addr = mz->iova;
-       if ((unsigned long)mz->addr == mz_phys_addr) {
-               PMD_DRV_LOG(DEBUG,
-                           "Memzone physical address same as virtual.\n");
-               PMD_DRV_LOG(DEBUG, "Using rte_mem_virt2iova()\n");
-               for (sz = 0; sz < mem_size; sz += BNXT_PAGE_SIZE)
-                       rte_mem_lock_page(((char *)mz->addr) + sz);
-               mz_phys_addr = rte_mem_virt2iova(mz->addr);
-               if (mz_phys_addr == RTE_BAD_IOVA) {
-                       PMD_DRV_LOG(ERR,
-                                   "unable to map addr to phys memory\n");
-                       return -ENOMEM;
-               }
-       }
 
        for (sz = 0, i = 0; sz < mem_size; sz += BNXT_PAGE_SIZE, i++) {
-               rte_mem_lock_page(((char *)mz->addr) + sz);
                rmem->pg_arr[i] = ((char *)mz->addr) + sz;
                rmem->dma_arr[i] = mz_phys_addr + sz;
 
@@ -4364,18 +4523,6 @@ static int bnxt_alloc_stats_mem(struct bnxt *bp)
        }
        memset(mz->addr, 0, mz->len);
        mz_phys_addr = mz->iova;
-       if ((unsigned long)mz->addr == mz_phys_addr) {
-               PMD_DRV_LOG(DEBUG,
-                           "Memzone physical address same as virtual.\n");
-               PMD_DRV_LOG(DEBUG,
-                           "Using rte_mem_virt2iova()\n");
-               mz_phys_addr = rte_mem_virt2iova(mz->addr);
-               if (mz_phys_addr == RTE_BAD_IOVA) {
-                       PMD_DRV_LOG(ERR,
-                                   "Can't map address to physical memory\n");
-                       return -ENOMEM;
-               }
-       }
 
        bp->rx_mem_zone = (const void *)mz;
        bp->hw_rx_port_stats = mz->addr;
@@ -4402,17 +4549,6 @@ static int bnxt_alloc_stats_mem(struct bnxt *bp)
        }
        memset(mz->addr, 0, mz->len);
        mz_phys_addr = mz->iova;
-       if ((unsigned long)mz->addr == mz_phys_addr) {
-               PMD_DRV_LOG(DEBUG,
-                           "Memzone physical address same as virtual\n");
-               PMD_DRV_LOG(DEBUG, "Using rte_mem_virt2iova()\n");
-               mz_phys_addr = rte_mem_virt2iova(mz->addr);
-               if (mz_phys_addr == RTE_BAD_IOVA) {
-                       PMD_DRV_LOG(ERR,
-                                   "Can't map address to physical memory\n");
-                       return -ENOMEM;
-               }
-       }
 
        bp->tx_mem_zone = (const void *)mz;
        bp->hw_tx_port_stats = mz->addr;
@@ -4545,6 +4681,8 @@ static int bnxt_init_fw(struct bnxt *bp)
        uint16_t mtu;
        int rc = 0;
 
+       bp->fw_cap = 0;
+
        rc = bnxt_hwrm_ver_get(bp);
        if (rc)
                return rc;
@@ -4580,11 +4718,7 @@ static int bnxt_init_fw(struct bnxt *bp)
        /* Get the adapter error recovery support info */
        rc = bnxt_hwrm_error_recovery_qcfg(bp);
        if (rc)
-               bp->flags &= ~BNXT_FLAG_FW_CAP_ERROR_RECOVERY;
-
-       if (mtu >= RTE_ETHER_MIN_MTU && mtu <= BNXT_MAX_MTU &&
-           mtu != bp->eth_dev->data->mtu)
-               bp->eth_dev->data->mtu = mtu;
+               bp->fw_cap &= ~BNXT_FW_CAP_ERROR_RECOVERY;
 
        bnxt_hwrm_port_led_qcaps(bp);
 
@@ -4697,6 +4831,7 @@ bnxt_dev_init(struct rte_eth_dev *eth_dev)
        bp = eth_dev->data->dev_private;
 
        bp->dev_stopped = 1;
+       bp->flags &= ~BNXT_FLAG_RX_VECTOR_PKT_MODE;
 
        if (bnxt_vf_pciid(pci_dev->id.device_id))
                bp->flags |= BNXT_FLAG_VF;
@@ -4731,6 +4866,11 @@ bnxt_dev_init(struct rte_eth_dev *eth_dev)
        if (rc)
                goto error_free;
 
+       /* Pass the information to the rte_eth_dev_close() that it should also
+        * release the private port resources.
+        */
+       eth_dev->data->dev_flags |= RTE_ETH_DEV_CLOSE_REMOVE;
+
        PMD_DRV_LOG(INFO,
                    DRV_MODULE_NAME "found at mem %" PRIX64 ", node addr %pM\n",
                    pci_dev->mem_resource[0].phys_addr,
@@ -4779,35 +4919,15 @@ bnxt_uninit_resources(struct bnxt *bp, bool reconfig_dev)
 static int
 bnxt_dev_uninit(struct rte_eth_dev *eth_dev)
 {
-       struct bnxt *bp = eth_dev->data->dev_private;
-       int rc;
-
        if (rte_eal_process_type() != RTE_PROC_PRIMARY)
                return -EPERM;
 
        PMD_DRV_LOG(DEBUG, "Calling Device uninit\n");
 
-       rc = bnxt_uninit_resources(bp, false);
-
-       if (bp->tx_mem_zone) {
-               rte_memzone_free((const struct rte_memzone *)bp->tx_mem_zone);
-               bp->tx_mem_zone = NULL;
-       }
-
-       if (bp->rx_mem_zone) {
-               rte_memzone_free((const struct rte_memzone *)bp->rx_mem_zone);
-               bp->rx_mem_zone = NULL;
-       }
-
-       if (bp->dev_stopped == 0)
+       if (eth_dev->state != RTE_ETH_DEV_UNUSED)
                bnxt_dev_close_op(eth_dev);
-       if (bp->pf.vf_info)
-               rte_free(bp->pf.vf_info);
-       eth_dev->dev_ops = NULL;
-       eth_dev->rx_pkt_burst = NULL;
-       eth_dev->tx_pkt_burst = NULL;
 
-       return rc;
+       return 0;
 }
 
 static int bnxt_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,