net/i40e: fix negative VEB index
[dpdk.git] / drivers / net / bnxt / bnxt_ethdev.c
index d346f96..dba5b9f 100644 (file)
@@ -219,16 +219,19 @@ uint16_t bnxt_rss_hash_tbl_size(const struct bnxt *bp)
 static void bnxt_free_parent_info(struct bnxt *bp)
 {
        rte_free(bp->parent);
+       bp->parent = NULL;
 }
 
 static void bnxt_free_pf_info(struct bnxt *bp)
 {
        rte_free(bp->pf);
+       bp->pf = NULL;
 }
 
 static void bnxt_free_link_info(struct bnxt *bp)
 {
        rte_free(bp->link_info);
+       bp->link_info = NULL;
 }
 
 static void bnxt_free_leds_info(struct bnxt *bp)
@@ -249,7 +252,9 @@ static void bnxt_free_flow_stats_info(struct bnxt *bp)
 static void bnxt_free_cos_queues(struct bnxt *bp)
 {
        rte_free(bp->rx_cos_queue);
+       bp->rx_cos_queue = NULL;
        rte_free(bp->tx_cos_queue);
+       bp->tx_cos_queue = NULL;
 }
 
 static void bnxt_free_mem(struct bnxt *bp, bool reconfig)
@@ -417,12 +422,13 @@ static int bnxt_setup_one_vnic(struct bnxt *bp, uint16_t vnic_id)
        if (dev_conf->rxmode.mq_mode & ETH_MQ_RX_RSS) {
                int j, nr_ctxs = bnxt_rss_ctxts(bp);
 
+               /* RSS table size in Thor is 512.
+                * Cap max Rx rings to same value
+                */
                if (bp->rx_nr_rings > BNXT_RSS_TBL_SIZE_P5) {
                        PMD_DRV_LOG(ERR, "RxQ cnt %d > reta_size %d\n",
                                    bp->rx_nr_rings, BNXT_RSS_TBL_SIZE_P5);
-                       PMD_DRV_LOG(ERR,
-                                   "Only queues 0-%d will be in RSS table\n",
-                                   BNXT_RSS_TBL_SIZE_P5 - 1);
+                       goto err_out;
                }
 
                rc = 0;
@@ -479,10 +485,11 @@ static int bnxt_setup_one_vnic(struct bnxt *bp, uint16_t vnic_id)
 
        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);
+       rc = bnxt_hwrm_vnic_tpa_cfg(bp, vnic,
+                                   (rx_offloads & DEV_RX_OFFLOAD_TCP_LRO) ?
+                                   true : false);
+       if (rc)
+               goto err_out;
 
        return 0;
 err_out:
@@ -793,7 +800,7 @@ skip_cosq_cfg:
                        PMD_DRV_LOG(ERR, "Failed to allocate %d rx_queues"
                                " intr_vec", bp->eth_dev->data->nb_rx_queues);
                        rc = -ENOMEM;
-                       goto err_disable;
+                       goto err_out;
                }
                PMD_DRV_LOG(DEBUG, "intr_handle->intr_vec = %p "
                        "intr_handle->nb_efd = %d intr_handle->max_intr = %d\n",
@@ -813,12 +820,12 @@ skip_cosq_cfg:
 #ifndef RTE_EXEC_ENV_FREEBSD
        /* In FreeBSD OS, nic_uio driver does not support interrupts */
        if (rc)
-               goto err_free;
+               goto err_out;
 #endif
 
        rc = bnxt_update_phy_setting(bp);
        if (rc)
-               goto err_free;
+               goto err_out;
 
        bp->mark_table = rte_zmalloc("bnxt_mark_table", BNXT_MARK_TABLE_SZ, 0);
        if (!bp->mark_table)
@@ -826,10 +833,6 @@ skip_cosq_cfg:
 
        return 0;
 
-err_free:
-       rte_free(intr_handle->intr_vec);
-err_disable:
-       rte_intr_efd_disable(intr_handle);
 err_out:
        /* Some of the error status returned by FW may not be from errno.h */
        if (rc > 0)
@@ -852,9 +855,14 @@ static int bnxt_shutdown_nic(struct bnxt *bp)
 
 uint32_t bnxt_get_speed_capabilities(struct bnxt *bp)
 {
-       uint32_t link_speed = bp->link_info->support_speeds;
+       uint32_t link_speed = 0;
        uint32_t speed_capa = 0;
 
+       if (bp->link_info == NULL)
+               return 0;
+
+       link_speed = bp->link_info->support_speeds;
+
        /* If PAM4 is configured, use PAM4 supported speed */
        if (link_speed == 0 && bp->link_info->support_pam4_speeds > 0)
                link_speed = bp->link_info->support_pam4_speeds;
@@ -1296,12 +1304,13 @@ static void bnxt_free_switch_domain(struct bnxt *bp)
 {
        int rc = 0;
 
-       if (bp->switch_domain_id) {
-               rc = rte_eth_switch_domain_free(bp->switch_domain_id);
-               if (rc)
-                       PMD_DRV_LOG(ERR, "free switch domain:%d fail: %d\n",
-                                   bp->switch_domain_id, rc);
-       }
+       if (!(BNXT_PF(bp) || BNXT_VF_IS_TRUSTED(bp)))
+               return;
+
+       rc = rte_eth_switch_domain_free(bp->switch_domain_id);
+       if (rc)
+               PMD_DRV_LOG(ERR, "free switch domain:%d fail: %d\n",
+                           bp->switch_domain_id, rc);
 }
 
 static void bnxt_ptp_get_current_time(void *arg)
@@ -1548,11 +1557,9 @@ bnxt_uninit_locks(struct bnxt *bp)
 
 static void bnxt_drv_uninit(struct bnxt *bp)
 {
-       bnxt_free_switch_domain(bp);
        bnxt_free_leds_info(bp);
        bnxt_free_cos_queues(bp);
        bnxt_free_link_info(bp);
-       bnxt_free_pf_info(bp);
        bnxt_free_parent_info(bp);
        bnxt_uninit_locks(bp);
 
@@ -1562,6 +1569,7 @@ static void bnxt_drv_uninit(struct bnxt *bp)
        bp->rx_mem_zone = NULL;
 
        bnxt_free_vf_info(bp);
+       bnxt_free_pf_info(bp);
 
        rte_free(bp->grp_info);
        bp->grp_info = NULL;
@@ -1723,6 +1731,10 @@ int bnxt_link_update_op(struct rte_eth_dev *eth_dev, int wait_to_complete)
                return rc;
 
        memset(&new, 0, sizeof(new));
+
+       if (bp->link_info == NULL)
+               goto out;
+
        do {
                /* Retrieve link info from hardware */
                rc = bnxt_get_hwrm_link_config(bp, &new);
@@ -2782,9 +2794,11 @@ bnxt_fw_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size)
 
        ret = snprintf(fw_version, fw_size, "%d.%d.%d.%d",
                        fw_major, fw_minor, fw_updt, fw_rsvd);
+       if (ret < 0)
+               return -EINVAL;
 
        ret += 1; /* add the size of '\0' */
-       if (fw_size < (uint32_t)ret)
+       if (fw_size < (size_t)ret)
                return ret;
        else
                return 0;
@@ -4262,9 +4276,6 @@ done:
 
 static void bnxt_cancel_fw_health_check(struct bnxt *bp)
 {
-       if (!bnxt_is_recovery_enabled(bp))
-               return;
-
        rte_eal_alarm_cancel(bnxt_check_fw_health, (void *)bp);
        bp->flags &= ~BNXT_FLAG_FW_HEALTH_CHECK_SCHEDULED;
 }
@@ -5751,7 +5762,10 @@ bnxt_uninit_resources(struct bnxt *bp, bool reconfig_dev)
        bnxt_free_mem(bp, reconfig_dev);
 
        bnxt_hwrm_func_buf_unrgtr(bp);
-       rte_free(bp->pf->vf_req_buf);
+       if (bp->pf != NULL) {
+               rte_free(bp->pf->vf_req_buf);
+               bp->pf->vf_req_buf = NULL;
+       }
 
        rc = bnxt_hwrm_func_driver_unregister(bp, 0);
        bp->flags &= ~BNXT_FLAG_REGISTERED;
@@ -5764,6 +5778,8 @@ bnxt_uninit_resources(struct bnxt *bp, bool reconfig_dev)
        bnxt_uninit_ctx_mem(bp);
 
        bnxt_free_flow_stats_info(bp);
+       if (bp->rep_info != NULL)
+               bnxt_free_switch_domain(bp);
        bnxt_free_rep_info(bp);
        rte_free(bp->ptp_cfg);
        bp->ptp_cfg = NULL;