net/bnxt: fix crash after removing and adding slaves
[dpdk.git] / drivers / net / bnxt / bnxt_ethdev.c
index e24fd41..4187247 100644 (file)
@@ -121,7 +121,6 @@ static const struct rte_pci_id bnxt_pci_id_map[] = {
 
 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);
@@ -831,6 +830,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",
@@ -2126,7 +2130,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;
@@ -2137,6 +2141,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;
 
@@ -2167,7 +2175,9 @@ 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];
@@ -2188,6 +2198,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;