net/bnxt: limit queue count for NS3/Stingray devices
[dpdk.git] / drivers / net / bnxt / bnxt_ethdev.c
index 90a97fa..b009669 100644 (file)
@@ -32,54 +32,9 @@ static const char bnxt_version[] =
        "Broadcom NetXtreme driver " DRV_MODULE_NAME;
 int bnxt_logtype_driver;
 
-#define PCI_VENDOR_ID_BROADCOM 0x14E4
-
-#define BROADCOM_DEV_ID_STRATUS_NIC_VF1 0x1606
-#define BROADCOM_DEV_ID_STRATUS_NIC_VF2 0x1609
-#define BROADCOM_DEV_ID_STRATUS_NIC 0x1614
-#define BROADCOM_DEV_ID_57414_VF 0x16c1
-#define BROADCOM_DEV_ID_57301 0x16c8
-#define BROADCOM_DEV_ID_57302 0x16c9
-#define BROADCOM_DEV_ID_57304_PF 0x16ca
-#define BROADCOM_DEV_ID_57304_VF 0x16cb
-#define BROADCOM_DEV_ID_57417_MF 0x16cc
-#define BROADCOM_DEV_ID_NS2 0x16cd
-#define BROADCOM_DEV_ID_57311 0x16ce
-#define BROADCOM_DEV_ID_57312 0x16cf
-#define BROADCOM_DEV_ID_57402 0x16d0
-#define BROADCOM_DEV_ID_57404 0x16d1
-#define BROADCOM_DEV_ID_57406_PF 0x16d2
-#define BROADCOM_DEV_ID_57406_VF 0x16d3
-#define BROADCOM_DEV_ID_57402_MF 0x16d4
-#define BROADCOM_DEV_ID_57407_RJ45 0x16d5
-#define BROADCOM_DEV_ID_57412 0x16d6
-#define BROADCOM_DEV_ID_57414 0x16d7
-#define BROADCOM_DEV_ID_57416_RJ45 0x16d8
-#define BROADCOM_DEV_ID_57417_RJ45 0x16d9
-#define BROADCOM_DEV_ID_5741X_VF 0x16dc
-#define BROADCOM_DEV_ID_57412_MF 0x16de
-#define BROADCOM_DEV_ID_57314 0x16df
-#define BROADCOM_DEV_ID_57317_RJ45 0x16e0
-#define BROADCOM_DEV_ID_5731X_VF 0x16e1
-#define BROADCOM_DEV_ID_57417_SFP 0x16e2
-#define BROADCOM_DEV_ID_57416_SFP 0x16e3
-#define BROADCOM_DEV_ID_57317_SFP 0x16e4
-#define BROADCOM_DEV_ID_57404_MF 0x16e7
-#define BROADCOM_DEV_ID_57406_MF 0x16e8
-#define BROADCOM_DEV_ID_57407_SFP 0x16e9
-#define BROADCOM_DEV_ID_57407_MF 0x16ea
-#define BROADCOM_DEV_ID_57414_MF 0x16ec
-#define BROADCOM_DEV_ID_57416_MF 0x16ee
-#define BROADCOM_DEV_ID_57508 0x1750
-#define BROADCOM_DEV_ID_57504 0x1751
-#define BROADCOM_DEV_ID_57502 0x1752
-#define BROADCOM_DEV_ID_57500_VF1 0x1806
-#define BROADCOM_DEV_ID_57500_VF2 0x1807
-#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
-
+/*
+ * The set of PCI devices this driver supports
+ */
 static const struct rte_pci_id bnxt_pci_id_map[] = {
        { RTE_PCI_DEVICE(PCI_VENDOR_ID_BROADCOM,
                         BROADCOM_DEV_ID_STRATUS_NIC_VF1) },
@@ -128,6 +83,12 @@ static const struct rte_pci_id bnxt_pci_id_map[] = {
        { RTE_PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, BROADCOM_DEV_ID_57502) },
        { RTE_PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, BROADCOM_DEV_ID_57500_VF1) },
        { RTE_PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, BROADCOM_DEV_ID_57500_VF2) },
+       { RTE_PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, BROADCOM_DEV_ID_57508_MF1) },
+       { RTE_PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, BROADCOM_DEV_ID_57504_MF1) },
+       { RTE_PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, BROADCOM_DEV_ID_57502_MF1) },
+       { RTE_PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, BROADCOM_DEV_ID_57508_MF2) },
+       { RTE_PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, BROADCOM_DEV_ID_57504_MF2) },
+       { RTE_PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, BROADCOM_DEV_ID_57502_MF2) },
        { .vendor_id = 0, /* sentinel */ },
 };
 
@@ -162,11 +123,11 @@ static const struct rte_pci_id bnxt_pci_id_map[] = {
                                     DEV_RX_OFFLOAD_KEEP_CRC | \
                                     DEV_RX_OFFLOAD_VLAN_EXTEND | \
                                     DEV_RX_OFFLOAD_TCP_LRO | \
-                                    DEV_RX_OFFLOAD_SCATTER)
+                                    DEV_RX_OFFLOAD_SCATTER | \
+                                    DEV_RX_OFFLOAD_RSS_HASH)
 
 static int bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask);
 static void bnxt_print_link_info(struct rte_eth_dev *eth_dev);
-static int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu);
 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);
@@ -223,6 +184,9 @@ static void bnxt_free_mem(struct bnxt *bp, bool reconfig)
        }
        bnxt_free_async_cp_ring(bp);
        bnxt_free_rxtx_nq_ring(bp);
+
+       rte_free(bp->grp_info);
+       bp->grp_info = NULL;
 }
 
 static int bnxt_alloc_mem(struct bnxt *bp, bool reconfig)
@@ -516,22 +480,6 @@ static int bnxt_shutdown_nic(struct bnxt *bp)
        return 0;
 }
 
-static int bnxt_init_nic(struct bnxt *bp)
-{
-       int rc;
-
-       if (BNXT_HAS_RING_GRPS(bp)) {
-               rc = bnxt_init_ring_grps(bp);
-               if (rc)
-                       return rc;
-       }
-
-       bnxt_init_vnics(bp);
-       bnxt_init_filters(bp);
-
-       return 0;
-}
-
 /*
  * Device configuration and status function
  */
@@ -557,7 +505,7 @@ static int bnxt_dev_info_get_op(struct rte_eth_dev *eth_dev,
        if (BNXT_PF(bp))
                dev_info->max_vfs = pdev->max_vfs;
 
-       max_rx_rings = RTE_MIN(bp->max_rx_rings, bp->max_stat_ctx);
+       max_rx_rings = BNXT_MAX_RINGS(bp);
        /* 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;
@@ -672,6 +620,9 @@ static int bnxt_dev_configure_op(struct rte_eth_dev *eth_dev)
                 * resource reservation. This will ensure the resource counts
                 * are calculated correctly.
                 */
+
+               pthread_mutex_lock(&bp->def_cp_lock);
+
                if (!BNXT_HAS_NQ(bp) && bp->async_cp_ring) {
                        bnxt_disable_int(bp);
                        bnxt_free_cp_ring(bp, bp->async_cp_ring);
@@ -680,15 +631,20 @@ static int bnxt_dev_configure_op(struct rte_eth_dev *eth_dev)
                rc = bnxt_hwrm_func_reserve_vf_resc(bp, false);
                if (rc) {
                        PMD_DRV_LOG(ERR, "HWRM resource alloc fail:%x\n", rc);
+                       pthread_mutex_unlock(&bp->def_cp_lock);
                        return -ENOSPC;
                }
 
                if (!BNXT_HAS_NQ(bp) && bp->async_cp_ring) {
                        rc = bnxt_alloc_async_cp_ring(bp);
-                       if (rc)
+                       if (rc) {
+                               pthread_mutex_unlock(&bp->def_cp_lock);
                                return rc;
+                       }
                        bnxt_enable_int(bp);
                }
+
+               pthread_mutex_unlock(&bp->def_cp_lock);
        } else {
                /* legacy driver needs to get updated values */
                rc = bnxt_hwrm_func_qcaps(bp);
@@ -718,6 +674,9 @@ static int bnxt_dev_configure_op(struct rte_eth_dev *eth_dev)
        bp->rx_cp_nr_rings = bp->rx_nr_rings;
        bp->tx_cp_nr_rings = bp->tx_nr_rings;
 
+       rx_offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+       eth_dev->data->dev_conf.rxmode.offloads = rx_offloads;
+
        if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
                eth_dev->data->mtu =
                        eth_dev->data->dev_conf.rxmode.max_rx_pkt_len -
@@ -868,6 +827,11 @@ static int bnxt_dev_start_op(struct rte_eth_dev *eth_dev)
        int vlan_mask = 0;
        int rc;
 
+       if (!eth_dev->data->nb_tx_queues || !eth_dev->data->nb_rx_queues) {
+               PMD_DRV_LOG(ERR, "Queues are not configured yet!\n");
+               return -EINVAL;
+       }
+
        if (bp->rx_cp_nr_rings > RTE_ETHDEV_QUEUE_STAT_CNTRS) {
                PMD_DRV_LOG(ERR,
                        "RxQ cnt %d > CONFIG_RTE_ETHDEV_QUEUE_STAT_CNTRS %d\n",
@@ -906,7 +870,9 @@ 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);
        return 0;
 
 error:
@@ -989,6 +955,7 @@ static void bnxt_dev_stop_op(struct rte_eth_dev *eth_dev)
        bnxt_shutdown_nic(bp);
        bnxt_hwrm_if_change(bp, 0);
        bp->dev_stopped = 1;
+       bp->rx_cosq_cnt = 0;
 }
 
 static void bnxt_dev_close_op(struct rte_eth_dev *eth_dev)
@@ -1040,8 +1007,7 @@ static void bnxt_mac_addr_remove_op(struct rte_eth_dev *eth_dev,
                                bnxt_hwrm_clear_l2_filter(bp, filter);
                                filter->mac_index = INVALID_MAC_INDEX;
                                memset(&filter->l2_addr, 0, RTE_ETHER_ADDR_LEN);
-                               STAILQ_INSERT_TAIL(&bp->free_filter_list,
-                                                  filter, next);
+                               bnxt_free_filter(bp, filter);
                        }
                        filter = temp_filter;
                }
@@ -1049,19 +1015,21 @@ static void bnxt_mac_addr_remove_op(struct rte_eth_dev *eth_dev,
 }
 
 static int bnxt_add_mac_filter(struct bnxt *bp, struct bnxt_vnic_info *vnic,
-                              struct rte_ether_addr *mac_addr, uint32_t index)
+                              struct rte_ether_addr *mac_addr, uint32_t index,
+                              uint32_t pool)
 {
        struct bnxt_filter_info *filter;
        int rc = 0;
 
-       filter = STAILQ_FIRST(&vnic->filter);
-       /* During bnxt_mac_addr_add_op, default MAC is
-        * already programmed, so skip it. But, when
-        * hw-vlan-filter is turned OFF from ON, default
-        * MAC filter should be restored
-        */
-       if (filter->dflt)
-               return 0;
+       /* Attach requested MAC address to the new l2_filter */
+       STAILQ_FOREACH(filter, &vnic->filter, next) {
+               if (filter->mac_index == index) {
+                       PMD_DRV_LOG(ERR,
+                                   "MAC addr already existed for pool %d\n",
+                                   pool);
+                       return 0;
+               }
+       }
 
        filter = bnxt_alloc_filter(bp);
        if (!filter) {
@@ -1069,7 +1037,6 @@ static int bnxt_add_mac_filter(struct bnxt *bp, struct bnxt_vnic_info *vnic,
                return -ENODEV;
        }
 
-       filter->mac_index = index;
        /* bnxt_alloc_filter copies default MAC to filter->l2_addr. So,
         * if the MAC that's been programmed now is a different one, then,
         * copy that addr to filter->l2_addr
@@ -1080,14 +1047,12 @@ static int bnxt_add_mac_filter(struct bnxt *bp, struct bnxt_vnic_info *vnic,
 
        rc = bnxt_hwrm_set_l2_filter(bp, vnic->fw_vnic_id, filter);
        if (!rc) {
-               if (filter->mac_index == 0) {
-                       filter->dflt = true;
+               filter->mac_index = index;
+               if (filter->mac_index == 0)
                        STAILQ_INSERT_HEAD(&vnic->filter, filter, next);
-               } else {
+               else
                        STAILQ_INSERT_TAIL(&vnic->filter, filter, next);
-               }
        } else {
-               filter->mac_index = INVALID_MAC_INDEX;
                memset(&filter->l2_addr, 0, RTE_ETHER_ADDR_LEN);
                bnxt_free_filter(bp, filter);
        }
@@ -1101,7 +1066,6 @@ static int bnxt_mac_addr_add_op(struct rte_eth_dev *eth_dev,
 {
        struct bnxt *bp = eth_dev->data->dev_private;
        struct bnxt_vnic_info *vnic = &bp->vnic_info[pool];
-       struct bnxt_filter_info *filter;
        int rc = 0;
 
        rc = is_bnxt_in_error(bp);
@@ -1117,16 +1081,8 @@ static int bnxt_mac_addr_add_op(struct rte_eth_dev *eth_dev,
                PMD_DRV_LOG(ERR, "VNIC not found for pool %d!\n", pool);
                return -EINVAL;
        }
-       /* Attach requested MAC address to the new l2_filter */
-       STAILQ_FOREACH(filter, &vnic->filter, next) {
-               if (filter->mac_index == index) {
-                       PMD_DRV_LOG(ERR,
-                               "MAC addr already existed for pool %d\n", pool);
-                       return 0;
-               }
-       }
 
-       rc = bnxt_add_mac_filter(bp, vnic, mac_addr, index);
+       rc = bnxt_add_mac_filter(bp, vnic, mac_addr, index, pool);
 
        return rc;
 }
@@ -1359,9 +1315,6 @@ static int bnxt_reta_update_op(struct rte_eth_dev *eth_dev,
                        vnic->rss_table[i] =
                            vnic->fw_grp_ids[reta_conf[idx].reta[sft]];
                }
-
-               vnic->rss_table[i] =
-                   vnic->fw_grp_ids[reta_conf[idx].reta[sft]];
        }
 
        bnxt_hwrm_vnic_rss_cfg(bp, vnic);
@@ -1751,33 +1704,22 @@ static int bnxt_del_vlan_filter(struct bnxt *bp, uint16_t vlan_id)
        int rc = 0;
        uint32_t chk = HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_IVLAN;
 
-       /* if VLAN exists && VLAN matches vlan_id
-        *      remove the MAC+VLAN filter
-        *      add a new MAC only filter
-        * else
-        *      VLAN filter doesn't exist, just skip and continue
-        */
        vnic = BNXT_GET_DEFAULT_VNIC(bp);
        filter = STAILQ_FIRST(&vnic->filter);
        while (filter) {
                /* Search for this matching MAC+VLAN filter */
-               if ((filter->enables & chk) &&
-                   (filter->l2_ivlan == vlan_id &&
-                    filter->l2_ivlan_mask != 0) &&
-                   !memcmp(filter->l2_addr, bp->mac_addr,
-                           RTE_ETHER_ADDR_LEN)) {
+               if (bnxt_vlan_filter_exists(bp, filter, chk, vlan_id)) {
                        /* Delete the filter */
                        rc = bnxt_hwrm_clear_l2_filter(bp, filter);
                        if (rc)
                                return rc;
                        STAILQ_REMOVE(&vnic->filter, filter,
                                      bnxt_filter_info, next);
-                       STAILQ_INSERT_TAIL(&bp->free_filter_list, filter, next);
-
+                       bnxt_free_filter(bp, filter);
                        PMD_DRV_LOG(INFO,
-                                   "Del Vlan filter for %d\n",
+                                   "Deleted vlan filter for %d\n",
                                    vlan_id);
-                       return rc;
+                       return 0;
                }
                filter = STAILQ_NEXT(filter, next);
        }
@@ -1805,11 +1747,7 @@ static int bnxt_add_vlan_filter(struct bnxt *bp, uint16_t vlan_id)
        filter = STAILQ_FIRST(&vnic->filter);
        /* Check if the VLAN has already been added */
        while (filter) {
-               if ((filter->enables & chk) &&
-                   (filter->l2_ivlan == vlan_id &&
-                    filter->l2_ivlan_mask == 0x0FFF) &&
-                    !memcmp(filter->l2_addr, bp->mac_addr,
-                            RTE_ETHER_ADDR_LEN))
+               if (bnxt_vlan_filter_exists(bp, filter, chk, vlan_id))
                        return -EEXIST;
 
                filter = STAILQ_NEXT(filter, next);
@@ -1842,18 +1780,17 @@ static int bnxt_add_vlan_filter(struct bnxt *bp, uint16_t vlan_id)
                 * not able to create the filter in hardware.
                 */
                filter->fw_l2_filter_id = UINT64_MAX;
-               STAILQ_INSERT_TAIL(&bp->free_filter_list, filter, next);
+               bnxt_free_filter(bp, filter);
                return rc;
-       } else {
-               /* Add this new filter to the list */
-               if (vlan_id == 0) {
-                       filter->dflt = true;
-                       STAILQ_INSERT_HEAD(&vnic->filter, filter, next);
-               } else {
-                       STAILQ_INSERT_TAIL(&vnic->filter, filter, next);
-               }
        }
 
+       filter->mac_index = 0;
+       /* Add this new filter to the list */
+       if (vlan_id == 0)
+               STAILQ_INSERT_HEAD(&vnic->filter, filter, next);
+       else
+               STAILQ_INSERT_TAIL(&vnic->filter, filter, next);
+
        PMD_DRV_LOG(INFO,
                    "Added Vlan filter for %d\n", vlan_id);
        return rc;
@@ -1884,19 +1821,17 @@ static int bnxt_del_dflt_mac_filter(struct bnxt *bp,
 
        filter = STAILQ_FIRST(&vnic->filter);
        while (filter) {
-               if (filter->dflt &&
+               if (filter->mac_index == 0 &&
                    !memcmp(filter->l2_addr, bp->mac_addr,
                            RTE_ETHER_ADDR_LEN)) {
                        rc = bnxt_hwrm_clear_l2_filter(bp, filter);
-                       if (rc)
-                               return rc;
-                       filter->dflt = false;
-                       STAILQ_REMOVE(&vnic->filter, filter,
-                                     bnxt_filter_info, next);
-                       STAILQ_INSERT_TAIL(&bp->free_filter_list,
-                                          filter, next);
-                       filter->fw_l2_filter_id = -1;
-                       break;
+                       if (!rc) {
+                               STAILQ_REMOVE(&vnic->filter, filter,
+                                             bnxt_filter_info, next);
+                               bnxt_free_filter(bp, filter);
+                               filter->fw_l2_filter_id = UINT64_MAX;
+                       }
+                       return rc;
                }
                filter = STAILQ_NEXT(filter, next);
        }
@@ -1919,10 +1854,10 @@ bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask)
        vnic = BNXT_GET_DEFAULT_VNIC(bp);
        if (!(rx_offloads & DEV_RX_OFFLOAD_VLAN_FILTER)) {
                /* Remove any VLAN filters programmed */
-               for (i = 0; i < 4095; i++)
+               for (i = 0; i < RTE_ETHER_MAX_VLAN_ID; i++)
                        bnxt_del_vlan_filter(bp, i);
 
-               rc = bnxt_add_mac_filter(bp, vnic, NULL, 0);
+               rc = bnxt_add_mac_filter(bp, vnic, NULL, 0, 0);
                if (rc)
                        return rc;
        } else {
@@ -2132,8 +2067,12 @@ static void
 bnxt_rxq_info_get_op(struct rte_eth_dev *dev, uint16_t queue_id,
        struct rte_eth_rxq_info *qinfo)
 {
+       struct bnxt *bp = dev->data->dev_private;
        struct bnxt_rx_queue *rxq;
 
+       if (is_bnxt_in_error(bp))
+               return;
+
        rxq = dev->data->rx_queues[queue_id];
 
        qinfo->mp = rxq->mb_pool;
@@ -2149,8 +2088,12 @@ static void
 bnxt_txq_info_get_op(struct rte_eth_dev *dev, uint16_t queue_id,
        struct rte_eth_txq_info *qinfo)
 {
+       struct bnxt *bp = dev->data->dev_private;
        struct bnxt_tx_queue *txq;
 
+       if (is_bnxt_in_error(bp))
+               return;
+
        txq = dev->data->tx_queues[queue_id];
 
        qinfo->nb_desc = txq->nb_tx_desc;
@@ -2164,7 +2107,7 @@ bnxt_txq_info_get_op(struct rte_eth_dev *dev, uint16_t queue_id,
        qinfo->conf.tx_deferred_start = txq->tx_deferred_start;
 }
 
-static int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu)
+int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu)
 {
        struct bnxt *bp = eth_dev->data->dev_private;
        uint32_t new_pkt_size;
@@ -2175,6 +2118,10 @@ static int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu)
        if (rc)
                return rc;
 
+       /* Exit if receive queues are not configured yet */
+       if (!eth_dev->data->nb_rx_queues)
+               return rc;
+
        new_pkt_size = new_mtu + RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN +
                       VLAN_TAG_SIZE * BNXT_NUM_VLANS;
 
@@ -2205,14 +2152,15 @@ static int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu)
                bp->flags &= ~BNXT_FLAG_JUMBO;
        }
 
-       eth_dev->data->dev_conf.rxmode.max_rx_pkt_len = new_pkt_size;
+       /* Is there a change in mtu setting? */
+       if (eth_dev->data->dev_conf.rxmode.max_rx_pkt_len == new_pkt_size)
+               return rc;
 
        for (i = 0; i < bp->nr_vnics; i++) {
                struct bnxt_vnic_info *vnic = &bp->vnic_info[i];
                uint16_t size = 0;
 
-               vnic->mru = new_mtu + RTE_ETHER_HDR_LEN +
-                               RTE_ETHER_CRC_LEN + VLAN_TAG_SIZE * 2;
+               vnic->mru = BNXT_VNIC_MRU(new_mtu);
                rc = bnxt_hwrm_vnic_cfg(bp, vnic);
                if (rc)
                        break;
@@ -2227,6 +2175,9 @@ static int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu)
                }
        }
 
+       if (!rc)
+               eth_dev->data->dev_conf.rxmode.max_rx_pkt_len = new_pkt_size;
+
        PMD_DRV_LOG(INFO, "New MTU is %d\n", new_mtu);
 
        return rc;
@@ -2633,9 +2584,6 @@ parse_ntuple_filter(struct bnxt *bp,
                return -EINVAL;
        }
 
-       //TODO Priority
-       //nfilter->priority = (uint8_t)filter->priority;
-
        bfilter->enables = en;
        return 0;
 }
@@ -4094,6 +4042,24 @@ static bool bnxt_vf_pciid(uint16_t id)
        return false;
 }
 
+static bool bnxt_thor_device(uint16_t 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)
+               return true;
+
+       return false;
+}
+
 bool bnxt_stratus_device(struct bnxt *bp)
 {
        uint16_t id = bp->pdev->id.device_id;
@@ -4630,8 +4596,14 @@ bnxt_init_locks(struct bnxt *bp)
        int err;
 
        err = pthread_mutex_init(&bp->flow_lock, NULL);
-       if (err)
+       if (err) {
                PMD_DRV_LOG(ERR, "Unable to initialize flow_lock\n");
+               return err;
+       }
+
+       err = pthread_mutex_init(&bp->def_cp_lock, NULL);
+       if (err)
+               PMD_DRV_LOG(ERR, "Unable to initialize def_cp_lock\n");
        return err;
 }
 
@@ -4686,8 +4658,6 @@ static int bnxt_init_resources(struct bnxt *bp, bool reconfig_dev)
        if (rc)
                return rc;
 
-       bnxt_init_nic(bp);
-
        rc = bnxt_request_int(bp);
        if (rc)
                return rc;
@@ -4730,11 +4700,7 @@ bnxt_dev_init(struct rte_eth_dev *eth_dev)
        if (bnxt_vf_pciid(pci_dev->id.device_id))
                bp->flags |= BNXT_FLAG_VF;
 
-       if (pci_dev->id.device_id == BROADCOM_DEV_ID_57508 ||
-           pci_dev->id.device_id == BROADCOM_DEV_ID_57504 ||
-           pci_dev->id.device_id == BROADCOM_DEV_ID_57502 ||
-           pci_dev->id.device_id == BROADCOM_DEV_ID_57500_VF1 ||
-           pci_dev->id.device_id == BROADCOM_DEV_ID_57500_VF2)
+       if (bnxt_thor_device(pci_dev->id.device_id))
                bp->flags |= BNXT_FLAG_THOR_CHIP;
 
        if (pci_dev->id.device_id == BROADCOM_DEV_ID_58802 ||
@@ -4780,6 +4746,7 @@ static void
 bnxt_uninit_locks(struct bnxt *bp)
 {
        pthread_mutex_destroy(&bp->flow_lock);
+       pthread_mutex_destroy(&bp->def_cp_lock);
 }
 
 static int
@@ -4802,6 +4769,7 @@ bnxt_uninit_resources(struct bnxt *bp, bool reconfig_dev)
                }
        }
 
+       bnxt_uninit_locks(bp);
        rte_free(bp->ptp_cfg);
        bp->ptp_cfg = NULL;
        return rc;
@@ -4820,11 +4788,6 @@ bnxt_dev_uninit(struct rte_eth_dev *eth_dev)
 
        rc = bnxt_uninit_resources(bp, false);
 
-       if (bp->grp_info != NULL) {
-               rte_free(bp->grp_info);
-               bp->grp_info = NULL;
-       }
-
        if (bp->tx_mem_zone) {
                rte_memzone_free((const struct rte_memzone *)bp->tx_mem_zone);
                bp->tx_mem_zone = NULL;
@@ -4843,8 +4806,6 @@ bnxt_dev_uninit(struct rte_eth_dev *eth_dev)
        eth_dev->rx_pkt_burst = NULL;
        eth_dev->tx_pkt_burst = NULL;
 
-       bnxt_uninit_locks(bp);
-
        return rc;
 }