net/bnxt: get rid of ff pools and use VNIC info array
[dpdk.git] / drivers / net / bnxt / bnxt_ethdev.c
index 54b92bb..28e2be7 100644 (file)
@@ -26,6 +26,7 @@
 #include "bnxt_vnic.h"
 #include "hsi_struct_def_dpdk.h"
 #include "bnxt_nvm_defs.h"
+#include "bnxt_util.h"
 
 #define DRV_MODULE_NAME                "bnxt"
 static const char bnxt_version[] =
@@ -73,6 +74,7 @@ int bnxt_logtype_driver;
 #define BROADCOM_DEV_ID_58802 0xd802
 #define BROADCOM_DEV_ID_58804 0xd804
 #define BROADCOM_DEV_ID_58808 0x16f0
+#define BROADCOM_DEV_ID_58802_VF 0xd800
 
 static const struct rte_pci_id bnxt_pci_id_map[] = {
        { RTE_PCI_DEVICE(PCI_VENDOR_ID_BROADCOM,
@@ -116,6 +118,7 @@ static const struct rte_pci_id bnxt_pci_id_map[] = {
        { RTE_PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, BROADCOM_DEV_ID_58802) },
        { RTE_PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, BROADCOM_DEV_ID_58804) },
        { RTE_PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, BROADCOM_DEV_ID_58808) },
+       { RTE_PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, BROADCOM_DEV_ID_58802_VF) },
        { .vendor_id = 0, /* sentinel */ },
 };
 
@@ -146,7 +149,6 @@ static const struct rte_pci_id bnxt_pci_id_map[] = {
                                     DEV_RX_OFFLOAD_TCP_CKSUM | \
                                     DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM | \
                                     DEV_RX_OFFLOAD_JUMBO_FRAME | \
-                                    DEV_RX_OFFLOAD_CRC_STRIP | \
                                     DEV_RX_OFFLOAD_KEEP_CRC | \
                                     DEV_RX_OFFLOAD_TCP_LRO)
 
@@ -197,13 +199,14 @@ alloc_mem_err:
 
 static int bnxt_init_chip(struct bnxt *bp)
 {
-       unsigned int i;
+       struct bnxt_rx_queue *rxq;
        struct rte_eth_link new;
        struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(bp->eth_dev);
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
        uint32_t intr_vector = 0;
        uint32_t queue_id, base = BNXT_MISC_VEC_ID;
        uint32_t vec = BNXT_MISC_VEC_ID;
+       unsigned int i, j;
        int rc;
 
        /* disable uio/vfio intr/eventfd mapping */
@@ -245,7 +248,22 @@ static int bnxt_init_chip(struct bnxt *bp)
 
        /* 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];
+               uint32_t size = sizeof(*vnic->fw_grp_ids) * bp->max_ring_grps;
+
+               vnic->fw_grp_ids = rte_zmalloc("vnic_fw_grp_ids", size, 0);
+               if (!vnic->fw_grp_ids) {
+                       PMD_DRV_LOG(ERR,
+                                   "Failed to alloc %d bytes for group ids\n",
+                                   size);
+                       rc = -ENOMEM;
+                       goto err_out;
+               }
+               memset(vnic->fw_grp_ids, -1, size);
+
+               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) {
@@ -254,12 +272,15 @@ static int bnxt_init_chip(struct bnxt *bp)
                        goto err_out;
                }
 
-               rc = bnxt_hwrm_vnic_ctx_alloc(bp, vnic);
-               if (rc) {
-                       PMD_DRV_LOG(ERR,
-                               "HWRM vnic %d ctx 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) {
+                       rc = bnxt_hwrm_vnic_ctx_alloc(bp, vnic);
+                       if (rc) {
+                               PMD_DRV_LOG(ERR,
+                                       "HWRM vnic %d ctx alloc failure rc: %x\n",
+                                       i, rc);
+                               goto err_out;
+                       }
                }
 
                rc = bnxt_hwrm_vnic_cfg(bp, vnic);
@@ -277,6 +298,17 @@ static int bnxt_init_chip(struct bnxt *bp)
                        goto err_out;
                }
 
+               for (j = 0; j < bp->rx_nr_rings; 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 (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,
@@ -412,7 +444,7 @@ static void bnxt_dev_info_get_op(struct rte_eth_dev *eth_dev,
        /* For the sake of symmetry, max_rx_queues = max_tx_queues */
        dev_info->max_rx_queues = max_rx_rings;
        dev_info->max_tx_queues = max_rx_rings;
-       dev_info->reta_size = bp->max_rsscos_ctx;
+       dev_info->reta_size = HW_HASH_INDEX_SIZE;
        dev_info->hash_key_size = 40;
        max_vnics = bp->max_vnics;
 
@@ -495,6 +527,7 @@ static int bnxt_dev_configure_op(struct rte_eth_dev *eth_dev)
 {
        struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
        uint64_t rx_offloads = eth_dev->data->dev_conf.rxmode.offloads;
+       int rc;
 
        bp->rx_queues = (void *)eth_dev->data->rx_queues;
        bp->tx_queues = (void *)eth_dev->data->tx_queues;
@@ -502,19 +535,23 @@ static int bnxt_dev_configure_op(struct rte_eth_dev *eth_dev)
        bp->rx_nr_rings = eth_dev->data->nb_rx_queues;
 
        if (BNXT_VF(bp) && (bp->flags & BNXT_FLAG_NEW_RM)) {
-               int rc;
+               rc = bnxt_hwrm_check_vf_rings(bp);
+               if (rc) {
+                       PMD_DRV_LOG(ERR, "HWRM insufficient resources\n");
+                       return -ENOSPC;
+               }
 
-               rc = bnxt_hwrm_func_reserve_vf_resc(bp);
+               rc = bnxt_hwrm_func_reserve_vf_resc(bp, false);
                if (rc) {
                        PMD_DRV_LOG(ERR, "HWRM resource alloc fail:%x\n", rc);
                        return -ENOSPC;
                }
-
+       } else {
                /* legacy driver needs to get updated values */
                rc = bnxt_hwrm_func_qcaps(bp);
                if (rc) {
                        PMD_DRV_LOG(ERR, "hwrm func qcaps fail:%d\n", rc);
-                       return -ENOSPC;
+                       return rc;
                }
        }
 
@@ -525,7 +562,9 @@ static int bnxt_dev_configure_op(struct rte_eth_dev *eth_dev)
            bp->max_cp_rings ||
            eth_dev->data->nb_rx_queues + eth_dev->data->nb_tx_queues >
            bp->max_stat_ctx ||
-           (uint32_t)(eth_dev->data->nb_rx_queues) > bp->max_ring_grps) {
+           (uint32_t)(eth_dev->data->nb_rx_queues) > bp->max_ring_grps ||
+           (!(eth_dev->data->dev_conf.rxmode.mq_mode & ETH_MQ_RX_RSS) &&
+            bp->max_vnics < eth_dev->data->nb_rx_queues)) {
                PMD_DRV_LOG(ERR,
                        "Insufficient resources to support requested config\n");
                PMD_DRV_LOG(ERR,
@@ -533,9 +572,9 @@ static int bnxt_dev_configure_op(struct rte_eth_dev *eth_dev)
                        eth_dev->data->nb_tx_queues,
                        eth_dev->data->nb_rx_queues);
                PMD_DRV_LOG(ERR,
-                       "Res available: TxQ %d, RxQ %d, CQ %d Stat %d, Grp %d\n",
+                       "MAX: TxQ %d, RxQ %d, CQ %d Stat %d, Grp %d, Vnic %d\n",
                        bp->max_tx_rings, bp->max_rx_rings, bp->max_cp_rings,
-                       bp->max_stat_ctx, bp->max_ring_grps);
+                       bp->max_stat_ctx, bp->max_ring_grps, bp->max_vnics);
                return -ENOSPC;
        }
 
@@ -661,7 +700,6 @@ static void bnxt_dev_close_op(struct rte_eth_dev *eth_dev)
        if (bp->dev_stopped == 0)
                bnxt_dev_stop_op(eth_dev);
 
-       bnxt_free_mem(bp);
        if (eth_dev->data->mac_addrs != NULL) {
                rte_free(eth_dev->data->mac_addrs);
                eth_dev->data->mac_addrs = NULL;
@@ -681,34 +719,30 @@ static void bnxt_mac_addr_remove_op(struct rte_eth_dev *eth_dev,
        uint64_t pool_mask = eth_dev->data->mac_pool_sel[index];
        struct bnxt_vnic_info *vnic;
        struct bnxt_filter_info *filter, *temp_filter;
-       uint32_t pool = RTE_MIN(MAX_FF_POOLS, ETH_64_POOLS);
        uint32_t i;
 
        /*
         * Loop through all VNICs from the specified filter flow pools to
         * remove the corresponding MAC addr filter
         */
-       for (i = 0; i < pool; i++) {
+       for (i = 0; i < bp->nr_vnics; i++) {
                if (!(pool_mask & (1ULL << i)))
                        continue;
 
-               STAILQ_FOREACH(vnic, &bp->ff_pool[i], next) {
-                       filter = STAILQ_FIRST(&vnic->filter);
-                       while (filter) {
-                               temp_filter = STAILQ_NEXT(filter, next);
-                               if (filter->mac_index == index) {
-                                       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,
-                                              ETHER_ADDR_LEN);
-                                       STAILQ_INSERT_TAIL(
-                                                       &bp->free_filter_list,
-                                                       filter, next);
-                               }
-                               filter = temp_filter;
+               vnic = &bp->vnic_info[i];
+               filter = STAILQ_FIRST(&vnic->filter);
+               while (filter) {
+                       temp_filter = STAILQ_NEXT(filter, next);
+                       if (filter->mac_index == index) {
+                               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, ETHER_ADDR_LEN);
+                               STAILQ_INSERT_TAIL(&bp->free_filter_list,
+                                                  filter, next);
                        }
+                       filter = temp_filter;
                }
        }
 }
@@ -718,7 +752,7 @@ static int bnxt_mac_addr_add_op(struct rte_eth_dev *eth_dev,
                                uint32_t index, uint32_t pool)
 {
        struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
-       struct bnxt_vnic_info *vnic = STAILQ_FIRST(&bp->ff_pool[pool]);
+       struct bnxt_vnic_info *vnic = &bp->vnic_info[pool];
        struct bnxt_filter_info *filter;
 
        if (BNXT_VF(bp)) {
@@ -865,12 +899,10 @@ static int bnxt_reta_update_op(struct rte_eth_dev *eth_dev,
                return -EINVAL;
        }
        /* Update the RSS VNIC(s) */
-       for (i = 0; i < MAX_FF_POOLS; i++) {
-               STAILQ_FOREACH(vnic, &bp->ff_pool[i], next) {
-                       memcpy(vnic->rss_table, reta_conf, reta_size);
-
-                       bnxt_hwrm_vnic_rss_cfg(bp, vnic);
-               }
+       for (i = 0; i < bp->max_vnics; i++) {
+               vnic = &bp->vnic_info[i];
+               memcpy(vnic->rss_table, reta_conf, reta_size);
+               bnxt_hwrm_vnic_rss_cfg(bp, vnic);
        }
        return 0;
 }
@@ -914,7 +946,7 @@ static int bnxt_rss_hash_update_op(struct rte_eth_dev *eth_dev,
        struct rte_eth_conf *dev_conf = &bp->eth_dev->data->dev_conf;
        struct bnxt_vnic_info *vnic;
        uint16_t hash_type = 0;
-       int i;
+       unsigned int i;
 
        /*
         * If RSS enablement were different than dev_configure,
@@ -945,21 +977,20 @@ static int bnxt_rss_hash_update_op(struct rte_eth_dev *eth_dev,
                hash_type |= HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_UDP_IPV6;
 
        /* Update the RSS VNIC(s) */
-       for (i = 0; i < MAX_FF_POOLS; i++) {
-               STAILQ_FOREACH(vnic, &bp->ff_pool[i], next) {
-                       vnic->hash_type = hash_type;
-
-                       /*
-                        * Use the supplied key if the key length is
-                        * acceptable and the rss_key is not NULL
-                        */
-                       if (rss_conf->rss_key &&
-                           rss_conf->rss_key_len <= HW_HASH_KEY_SIZE)
-                               memcpy(vnic->rss_hash_key, rss_conf->rss_key,
-                                      rss_conf->rss_key_len);
-
-                       bnxt_hwrm_vnic_rss_cfg(bp, vnic);
-               }
+       for (i = 0; i < bp->nr_vnics; i++) {
+               vnic = &bp->vnic_info[i];
+               vnic->hash_type = hash_type;
+
+               /*
+                * Use the supplied key if the key length is
+                * acceptable and the rss_key is not NULL
+                */
+               if (rss_conf->rss_key &&
+                   rss_conf->rss_key_len <= HW_HASH_KEY_SIZE)
+                       memcpy(vnic->rss_hash_key, rss_conf->rss_key,
+                              rss_conf->rss_key_len);
+
+               bnxt_hwrm_vnic_rss_cfg(bp, vnic);
        }
        return 0;
 }
@@ -1236,53 +1267,51 @@ static int bnxt_del_vlan_filter(struct bnxt *bp, uint16_t vlan_id)
                 * else
                 *      VLAN filter doesn't exist, just skip and continue
                 */
-               STAILQ_FOREACH(vnic, &bp->ff_pool[i], next) {
-                       filter = STAILQ_FIRST(&vnic->filter);
-                       while (filter) {
-                               temp_filter = STAILQ_NEXT(filter, next);
-
-                               if (filter->enables & chk &&
-                                   filter->l2_ovlan == vlan_id) {
-                                       /* Must delete the filter */
-                                       STAILQ_REMOVE(&vnic->filter, filter,
-                                                     bnxt_filter_info, next);
-                                       bnxt_hwrm_clear_l2_filter(bp, filter);
-                                       STAILQ_INSERT_TAIL(
-                                                       &bp->free_filter_list,
-                                                       filter, next);
-
-                                       /*
-                                        * Need to examine to see if the MAC
-                                        * filter already existed or not before
-                                        * allocating a new one
-                                        */
-
-                                       new_filter = bnxt_alloc_filter(bp);
-                                       if (!new_filter) {
-                                               PMD_DRV_LOG(ERR,
+               vnic = &bp->vnic_info[i];
+               filter = STAILQ_FIRST(&vnic->filter);
+               while (filter) {
+                       temp_filter = STAILQ_NEXT(filter, next);
+
+                       if (filter->enables & chk &&
+                           filter->l2_ovlan == vlan_id) {
+                               /* Must delete the filter */
+                               STAILQ_REMOVE(&vnic->filter, filter,
+                                             bnxt_filter_info, next);
+                               bnxt_hwrm_clear_l2_filter(bp, filter);
+                               STAILQ_INSERT_TAIL(&bp->free_filter_list,
+                                                  filter, next);
+
+                               /*
+                                * Need to examine to see if the MAC
+                                * filter already existed or not before
+                                * allocating a new one
+                                */
+
+                               new_filter = bnxt_alloc_filter(bp);
+                               if (!new_filter) {
+                                       PMD_DRV_LOG(ERR,
                                                        "MAC/VLAN filter alloc failed\n");
-                                               rc = -ENOMEM;
-                                               goto exit;
-                                       }
-                                       STAILQ_INSERT_TAIL(&vnic->filter,
-                                                          new_filter, next);
-                                       /* Inherit MAC from previous filter */
-                                       new_filter->mac_index =
-                                                       filter->mac_index;
-                                       memcpy(new_filter->l2_addr,
-                                              filter->l2_addr, ETHER_ADDR_LEN);
-                                       /* MAC only filter */
-                                       rc = bnxt_hwrm_set_l2_filter(bp,
-                                                       vnic->fw_vnic_id,
-                                                       new_filter);
-                                       if (rc)
-                                               goto exit;
-                                       PMD_DRV_LOG(INFO,
-                                               "Del Vlan filter for %d\n",
-                                               vlan_id);
+                                       rc = -ENOMEM;
+                                       goto exit;
                                }
-                               filter = temp_filter;
+                               STAILQ_INSERT_TAIL(&vnic->filter,
+                                               new_filter, next);
+                               /* Inherit MAC from previous filter */
+                               new_filter->mac_index =
+                                       filter->mac_index;
+                               memcpy(new_filter->l2_addr, filter->l2_addr,
+                                      ETHER_ADDR_LEN);
+                               /* MAC only filter */
+                               rc = bnxt_hwrm_set_l2_filter(bp,
+                                                            vnic->fw_vnic_id,
+                                                            new_filter);
+                               if (rc)
+                                       goto exit;
+                               PMD_DRV_LOG(INFO,
+                                           "Del Vlan filter for %d\n",
+                                           vlan_id);
                        }
+                       filter = temp_filter;
                }
        }
 exit:
@@ -1295,9 +1324,9 @@ static int bnxt_add_vlan_filter(struct bnxt *bp, uint16_t vlan_id)
        struct bnxt_vnic_info *vnic;
        unsigned int i;
        int rc = 0;
-       uint32_t en = HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_OVLAN |
-               HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_OVLAN_MASK;
-       uint32_t chk = HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_OVLAN;
+       uint32_t en = HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_IVLAN |
+               HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_IVLAN_MASK;
+       uint32_t chk = HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_IVLAN;
 
        /* Cycle through all VNICs */
        for (i = 0; i < bp->nr_vnics; i++) {
@@ -1312,51 +1341,48 @@ static int bnxt_add_vlan_filter(struct bnxt *bp, uint16_t vlan_id)
                 *   Remove the old MAC only filter
                 *    Add a new MAC+VLAN filter
                 */
-               STAILQ_FOREACH(vnic, &bp->ff_pool[i], next) {
-                       filter = STAILQ_FIRST(&vnic->filter);
-                       while (filter) {
-                               temp_filter = STAILQ_NEXT(filter, next);
-
-                               if (filter->enables & chk) {
-                                       if (filter->l2_ovlan == vlan_id)
-                                               goto cont;
-                               } else {
-                                       /* Must delete the MAC filter */
-                                       STAILQ_REMOVE(&vnic->filter, filter,
-                                                     bnxt_filter_info, next);
-                                       bnxt_hwrm_clear_l2_filter(bp, filter);
-                                       filter->l2_ovlan = 0;
-                                       STAILQ_INSERT_TAIL(
-                                                       &bp->free_filter_list,
-                                                       filter, next);
-                               }
-                               new_filter = bnxt_alloc_filter(bp);
-                               if (!new_filter) {
-                                       PMD_DRV_LOG(ERR,
+               vnic = &bp->vnic_info[i];
+               filter = STAILQ_FIRST(&vnic->filter);
+               while (filter) {
+                       temp_filter = STAILQ_NEXT(filter, next);
+
+                       if (filter->enables & chk) {
+                               if (filter->l2_ivlan == vlan_id)
+                                       goto cont;
+                       } else {
+                               /* Must delete the MAC filter */
+                               STAILQ_REMOVE(&vnic->filter, filter,
+                                               bnxt_filter_info, next);
+                               bnxt_hwrm_clear_l2_filter(bp, filter);
+                               filter->l2_ovlan = 0;
+                               STAILQ_INSERT_TAIL(&bp->free_filter_list,
+                                                  filter, next);
+                       }
+                       new_filter = bnxt_alloc_filter(bp);
+                       if (!new_filter) {
+                               PMD_DRV_LOG(ERR,
                                                "MAC/VLAN filter alloc failed\n");
-                                       rc = -ENOMEM;
-                                       goto exit;
-                               }
-                               STAILQ_INSERT_TAIL(&vnic->filter, new_filter,
-                                                  next);
-                               /* Inherit MAC from the previous filter */
-                               new_filter->mac_index = filter->mac_index;
-                               memcpy(new_filter->l2_addr, filter->l2_addr,
-                                      ETHER_ADDR_LEN);
-                               /* MAC + VLAN ID filter */
-                               new_filter->l2_ovlan = vlan_id;
-                               new_filter->l2_ovlan_mask = 0xF000;
-                               new_filter->enables |= en;
-                               rc = bnxt_hwrm_set_l2_filter(bp,
-                                                            vnic->fw_vnic_id,
-                                                            new_filter);
-                               if (rc)
-                                       goto exit;
-                               PMD_DRV_LOG(INFO,
-                                       "Added Vlan filter for %d\n", vlan_id);
-cont:
-                               filter = temp_filter;
+                               rc = -ENOMEM;
+                               goto exit;
                        }
+                       STAILQ_INSERT_TAIL(&vnic->filter, new_filter, next);
+                       /* Inherit MAC from the previous filter */
+                       new_filter->mac_index = filter->mac_index;
+                       memcpy(new_filter->l2_addr, filter->l2_addr,
+                              ETHER_ADDR_LEN);
+                       /* MAC + VLAN ID filter */
+                       new_filter->l2_ivlan = vlan_id;
+                       new_filter->l2_ivlan_mask = 0xF000;
+                       new_filter->enables |= en;
+                       rc = bnxt_hwrm_set_l2_filter(bp,
+                                       vnic->fw_vnic_id,
+                                       new_filter);
+                       if (rc)
+                               goto exit;
+                       PMD_DRV_LOG(INFO,
+                                   "Added Vlan filter for %d\n", vlan_id);
+cont:
+                       filter = temp_filter;
                }
        }
 exit:
@@ -1364,7 +1390,7 @@ exit:
 }
 
 static int bnxt_vlan_filter_set_op(struct rte_eth_dev *eth_dev,
-                                  uint16_t vlan_id, int on)
+               uint16_t vlan_id, int on)
 {
        struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
 
@@ -1571,6 +1597,7 @@ static int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu)
 
        for (i = 0; i < bp->nr_vnics; i++) {
                struct bnxt_vnic_info *vnic = &bp->vnic_info[i];
+               uint16_t size = 0;
 
                vnic->mru = bp->eth_dev->data->mtu + ETHER_HDR_LEN +
                                        ETHER_CRC_LEN + VLAN_TAG_SIZE * 2;
@@ -1578,9 +1605,14 @@ static int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu)
                if (rc)
                        break;
 
-               rc = bnxt_hwrm_vnic_plcmode_cfg(bp, vnic);
-               if (rc)
-                       return rc;
+               size = rte_pktmbuf_data_room_size(bp->rx_queues[0]->mb_pool);
+               size -= RTE_PKTMBUF_HEADROOM;
+
+               if (size < new_mtu) {
+                       rc = bnxt_hwrm_vnic_plcmode_cfg(bp, vnic);
+                       if (rc)
+                               return rc;
+               }
        }
 
        return rc;
@@ -1766,8 +1798,8 @@ bnxt_match_and_validate_ether_filter(struct bnxt *bp,
                goto exit;
        }
 
-       vnic0 = STAILQ_FIRST(&bp->ff_pool[0]);
-       vnic = STAILQ_FIRST(&bp->ff_pool[efilter->queue]);
+       vnic0 = &bp->vnic_info[0];
+       vnic = &bp->vnic_info[efilter->queue];
        if (vnic == NULL) {
                PMD_DRV_LOG(ERR, "Invalid queue %d\n", efilter->queue);
                *ret = -EINVAL;
@@ -1825,8 +1857,8 @@ bnxt_ethertype_filter(struct rte_eth_dev *dev,
                return -EINVAL;
        }
 
-       vnic0 = STAILQ_FIRST(&bp->ff_pool[0]);
-       vnic = STAILQ_FIRST(&bp->ff_pool[efilter->queue]);
+       vnic0 = &bp->vnic_info[0];
+       vnic = &bp->vnic_info[efilter->queue];
 
        switch (filter_op) {
        case RTE_ETH_FILTER_ADD:
@@ -2042,8 +2074,8 @@ bnxt_cfg_ntuple_filter(struct bnxt *bp,
        if (ret < 0)
                goto free_filter;
 
-       vnic = STAILQ_FIRST(&bp->ff_pool[nfilter->queue]);
-       vnic0 = STAILQ_FIRST(&bp->ff_pool[0]);
+       vnic = &bp->vnic_info[nfilter->queue];
+       vnic0 = &bp->vnic_info[0];
        filter1 = STAILQ_FIRST(&vnic0->filter);
        if (filter1 == NULL) {
                ret = -1;
@@ -2336,8 +2368,8 @@ bnxt_parse_fdir_filter(struct bnxt *bp,
                return -EINVAL;
        }
 
-       vnic0 = STAILQ_FIRST(&bp->ff_pool[0]);
-       vnic = STAILQ_FIRST(&bp->ff_pool[fdir->action.rx_queue]);
+       vnic0 = &bp->vnic_info[0];
+       vnic = &bp->vnic_info[fdir->action.rx_queue];
        if (vnic == NULL) {
                PMD_DRV_LOG(ERR, "Invalid queue %d\n", fdir->action.rx_queue);
                return -EINVAL;
@@ -2458,9 +2490,9 @@ bnxt_fdir_filter(struct rte_eth_dev *dev,
                filter->filter_type = HWRM_CFA_NTUPLE_FILTER;
 
                if (fdir->action.behavior == RTE_ETH_FDIR_REJECT)
-                       vnic = STAILQ_FIRST(&bp->ff_pool[0]);
+                       vnic = &bp->vnic_info[0];
                else
-                       vnic = STAILQ_FIRST(&bp->ff_pool[fdir->action.rx_queue]);
+                       vnic = &bp->vnic_info[fdir->action.rx_queue];
 
                match = bnxt_match_fdir(bp, filter, &mvnic);
                if (match != NULL && filter_op == RTE_ETH_FILTER_ADD) {
@@ -3069,7 +3101,8 @@ static bool bnxt_vf_pciid(uint16_t id)
            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_STRATUS_NIC_VF2 ||
+           id == BROADCOM_DEV_ID_58802_VF)
                return true;
        return false;
 }
@@ -3500,9 +3533,7 @@ bool is_bnxt_supported(struct rte_eth_dev *dev)
        return is_device_supported(dev, &bnxt_rte_pmd);
 }
 
-RTE_INIT(bnxt_init_log);
-static void
-bnxt_init_log(void)
+RTE_INIT(bnxt_init_log)
 {
        bnxt_logtype_driver = rte_log_register("pmd.bnxt.driver");
        if (bnxt_logtype_driver >= 0)