/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2014-2018 Broadcom
+ * Copyright(c) 2014-2021 Broadcom
* All rights reserved.
*/
if (!rxq || !rxq->rx_ring)
return;
- rte_spinlock_lock(&rxq->lock);
-
sw_ring = rxq->rx_ring->rx_buf_ring;
if (sw_ring) {
for (i = 0;
}
}
- rte_spinlock_unlock(&rxq->lock);
}
void bnxt_free_rx_mbufs(struct bnxt *bp)
if (rc)
return rc;
- if (queue_idx >= BNXT_MAX_RINGS(bp)) {
+ if (queue_idx >= bnxt_max_rings(bp)) {
PMD_DRV_LOG(ERR,
"Cannot create Rx ring %d. Only %d rings available\n",
queue_idx, bp->max_rx_rings);
eth_dev->data->rx_queues[queue_idx] = rxq;
/* Allocate RX ring hardware descriptors */
- if (bnxt_alloc_rings(bp, queue_idx, NULL, rxq, rxq->cp_ring, NULL,
- "rxr")) {
+ rc = bnxt_alloc_rings(bp, queue_idx, NULL, rxq, rxq->cp_ring, NULL,
+ "rxr");
+ if (rc) {
PMD_DRV_LOG(ERR,
"ring_dma_zone_reserve for rx_ring failed!\n");
goto err;
rxq->rx_started = true;
}
eth_dev->data->rx_queue_state[queue_idx] = queue_state;
- rte_spinlock_init(&rxq->lock);
/* Configure mtu if it is different from what was configured before */
if (!queue_idx)
if (rc)
return rc;
- if (BNXT_CHIP_THOR(bp)) {
+ if (BNXT_CHIP_P5(bp)) {
/* Reconfigure default receive ring and MRU. */
bnxt_hwrm_vnic_cfg(bp, rxq->vnic);
}
rc = bnxt_vnic_rss_configure(bp, vnic);
}
- if (BNXT_CHIP_THOR(bp)) {
- /* Compute current number of active receive queues. */
- for (i = vnic->start_grp_id; i < vnic->end_grp_id; i++)
- if (bp->rx_queues[i]->rx_started)
- active_queue_cnt++;
+ /* Compute current number of active receive queues. */
+ for (i = vnic->start_grp_id; i < vnic->end_grp_id; i++)
+ if (bp->rx_queues[i]->rx_started)
+ active_queue_cnt++;
+ if (BNXT_CHIP_P5(bp)) {
/*
* For Thor, we need to ensure that the VNIC default receive
* ring corresponds to an active receive queue. When no queue
/* Reconfigure default receive ring. */
bnxt_hwrm_vnic_cfg(bp, vnic);
}
+ } else if (active_queue_cnt) {
+ /*
+ * If the queue being stopped is the current default queue and
+ * there are other active queues, pick one of them as the
+ * default and reconfigure the vnic.
+ */
+ if (vnic->dflt_ring_grp == bp->grp_info[rx_queue_id].fw_grp_id) {
+ for (i = vnic->start_grp_id; i < vnic->end_grp_id; i++) {
+ if (bp->rx_queues[i]->rx_started) {
+ vnic->dflt_ring_grp =
+ bp->grp_info[i].fw_grp_id;
+ bnxt_hwrm_vnic_cfg(bp, vnic);
+ break;
+ }
+ }
+ }
}
if (rc == 0)