net/bnxt: fix group info usage
Ring groups is a Rx only attribute. Make sure there are sufficient
ring groups available. Return an error if they are not available.
Fixes: 37d6161a68
("net/bnxt: add ring group alloc/free")
Cc: stable@dpdk.org
Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
This commit is contained in:
parent
294ca8e3ad
commit
ee5d7bddab
@ -165,7 +165,6 @@ int bnxt_alloc_def_cp_ring(struct bnxt *bp)
|
||||
goto err_out;
|
||||
cpr->cp_doorbell = bp->pdev->mem_resource[2].addr;
|
||||
B_CP_DIS_DB(cpr, cpr->cp_raw_cons);
|
||||
bp->grp_info[0].cp_fw_ring_id = cp_ring->fw_ring_id;
|
||||
if (BNXT_PF(bp))
|
||||
rc = bnxt_hwrm_func_cfg_def_cp(bp);
|
||||
else
|
||||
|
@ -393,7 +393,10 @@ static int bnxt_init_nic(struct bnxt *bp)
|
||||
{
|
||||
int rc;
|
||||
|
||||
bnxt_init_ring_grps(bp);
|
||||
rc = bnxt_init_ring_grps(bp);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
bnxt_init_vnics(bp);
|
||||
bnxt_init_filters(bp);
|
||||
|
||||
@ -3207,11 +3210,19 @@ bnxt_dev_init(struct rte_eth_dev *eth_dev)
|
||||
/* Copy the permanent MAC from the qcap response address now. */
|
||||
memcpy(bp->mac_addr, bp->dflt_mac_addr, sizeof(bp->mac_addr));
|
||||
memcpy(ð_dev->data->mac_addrs[0], bp->mac_addr, ETHER_ADDR_LEN);
|
||||
|
||||
if (bp->max_ring_grps < bp->rx_cp_nr_rings) {
|
||||
/* 1 ring is for default completion ring */
|
||||
RTE_LOG(ERR, PMD, "Insufficient resource: Ring Group\n");
|
||||
rc = -ENOSPC;
|
||||
goto error_free;
|
||||
}
|
||||
|
||||
bp->grp_info = rte_zmalloc("bnxt_grp_info",
|
||||
sizeof(*bp->grp_info) * bp->max_ring_grps, 0);
|
||||
if (!bp->grp_info) {
|
||||
RTE_LOG(ERR, PMD,
|
||||
"Failed to alloc %zu bytes needed to store group info table\n",
|
||||
"Failed to alloc %zu bytes to store group info table\n",
|
||||
sizeof(*bp->grp_info) * bp->max_ring_grps);
|
||||
rc = -ENOMEM;
|
||||
goto error_free;
|
||||
|
@ -1138,7 +1138,6 @@ int bnxt_hwrm_stat_ctx_alloc(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
|
||||
cpr->hw_stats_ctx_id = rte_le_to_cpu_16(resp->stat_ctx_id);
|
||||
|
||||
HWRM_UNLOCK();
|
||||
bp->grp_info[idx].fw_stats_ctx = cpr->hw_stats_ctx_id;
|
||||
|
||||
return rc;
|
||||
}
|
||||
@ -1661,19 +1660,15 @@ int bnxt_free_all_hwrm_stat_ctxs(struct bnxt *bp)
|
||||
|
||||
for (i = 0; i < bp->rx_cp_nr_rings + bp->tx_cp_nr_rings; i++) {
|
||||
|
||||
if (i >= bp->rx_cp_nr_rings)
|
||||
if (i >= bp->rx_cp_nr_rings) {
|
||||
cpr = bp->tx_queues[i - bp->rx_cp_nr_rings]->cp_ring;
|
||||
else
|
||||
} else {
|
||||
cpr = bp->rx_queues[i]->cp_ring;
|
||||
bp->grp_info[i].fw_stats_ctx = -1;
|
||||
}
|
||||
if (cpr->hw_stats_ctx_id != HWRM_NA_SIGNATURE) {
|
||||
rc = bnxt_hwrm_stat_ctx_free(bp, cpr, i);
|
||||
cpr->hw_stats_ctx_id = HWRM_NA_SIGNATURE;
|
||||
/*
|
||||
* TODO. Need a better way to reset grp_info.stats_ctx
|
||||
* for Rx rings only. stats_ctx is not saved for Tx
|
||||
* in grp_info.
|
||||
*/
|
||||
bp->grp_info[i].fw_stats_ctx = cpr->hw_stats_ctx_id;
|
||||
if (rc)
|
||||
return rc;
|
||||
}
|
||||
@ -1733,7 +1728,6 @@ static void bnxt_free_cp_ring(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
|
||||
bnxt_hwrm_ring_free(bp, cp_ring,
|
||||
HWRM_RING_FREE_INPUT_RING_TYPE_L2_CMPL);
|
||||
cp_ring->fw_ring_id = INVALID_HW_RING_ID;
|
||||
bp->grp_info[idx].cp_fw_ring_id = INVALID_HW_RING_ID;
|
||||
memset(cpr->cp_desc_ring, 0, cpr->cp_ring_struct->ring_size *
|
||||
sizeof(*cpr->cp_desc_ring));
|
||||
cpr->cp_raw_cons = 0;
|
||||
|
@ -63,13 +63,15 @@ void bnxt_free_ring(struct bnxt_ring *ring)
|
||||
* Ring groups
|
||||
*/
|
||||
|
||||
void bnxt_init_ring_grps(struct bnxt *bp)
|
||||
int bnxt_init_ring_grps(struct bnxt *bp)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < bp->max_ring_grps; i++)
|
||||
memset(&bp->grp_info[i], (uint8_t)HWRM_NA_SIGNATURE,
|
||||
sizeof(struct bnxt_ring_grp_info));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -94,7 +94,7 @@ struct bnxt_tx_ring_info;
|
||||
struct bnxt_rx_ring_info;
|
||||
struct bnxt_cp_ring_info;
|
||||
void bnxt_free_ring(struct bnxt_ring *ring);
|
||||
void bnxt_init_ring_grps(struct bnxt *bp);
|
||||
int bnxt_init_ring_grps(struct bnxt *bp);
|
||||
int bnxt_alloc_rings(struct bnxt *bp, uint16_t qidx,
|
||||
struct bnxt_tx_ring_info *tx_ring_info,
|
||||
struct bnxt_rx_ring_info *rx_ring_info,
|
||||
|
Loading…
Reference in New Issue
Block a user