Commit 9899bb59 authored by Michael Chan's avatar Michael Chan Committed by David S. Miller

bnxt_en: Improve ring allocation logic.

Currently, the driver code makes some assumptions about the group index
and the map index of rings.  This makes the code more difficult to
understand and less flexible.

Improve it by adding the grp_idx and map_idx fields explicitly to the
bnxt_ring_struct as a union.  The grp_idx is initialized for each tx ring
and rx agg ring during init. time.  We do the same for the map_idx for
each cmpl ring.

The grp_idx ties the tx ring to the ring group.  The map_idx is the
doorbell index of the ring.  With this new infrastructure, we can change
the ring index mapping scheme easily in the future.
Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 845adfe4
...@@ -2317,6 +2317,7 @@ static int bnxt_alloc_rx_rings(struct bnxt *bp) ...@@ -2317,6 +2317,7 @@ static int bnxt_alloc_rx_rings(struct bnxt *bp)
if (rc) if (rc)
return rc; return rc;
ring->grp_idx = i;
rxr->rx_agg_bmap_size = bp->rx_agg_ring_mask + 1; rxr->rx_agg_bmap_size = bp->rx_agg_ring_mask + 1;
mem_size = rxr->rx_agg_bmap_size / 8; mem_size = rxr->rx_agg_bmap_size / 8;
rxr->rx_agg_bmap = kzalloc(mem_size, GFP_KERNEL); rxr->rx_agg_bmap = kzalloc(mem_size, GFP_KERNEL);
...@@ -2389,6 +2390,7 @@ static int bnxt_alloc_tx_rings(struct bnxt *bp) ...@@ -2389,6 +2390,7 @@ static int bnxt_alloc_tx_rings(struct bnxt *bp)
if (rc) if (rc)
return rc; return rc;
ring->grp_idx = txr->bnapi->index;
if (bp->tx_push_size) { if (bp->tx_push_size) {
dma_addr_t mapping; dma_addr_t mapping;
...@@ -2458,6 +2460,7 @@ static int bnxt_alloc_cp_rings(struct bnxt *bp) ...@@ -2458,6 +2460,7 @@ static int bnxt_alloc_cp_rings(struct bnxt *bp)
rc = bnxt_alloc_ring(bp, ring); rc = bnxt_alloc_ring(bp, ring);
if (rc) if (rc)
return rc; return rc;
ring->map_idx = i;
} }
return 0; return 0;
} }
...@@ -4253,12 +4256,12 @@ static int bnxt_hwrm_ring_grp_free(struct bnxt *bp) ...@@ -4253,12 +4256,12 @@ static int bnxt_hwrm_ring_grp_free(struct bnxt *bp)
static int hwrm_ring_alloc_send_msg(struct bnxt *bp, static int hwrm_ring_alloc_send_msg(struct bnxt *bp,
struct bnxt_ring_struct *ring, struct bnxt_ring_struct *ring,
u32 ring_type, u32 map_index, u32 ring_type, u32 map_index)
u32 stats_ctx_id)
{ {
int rc = 0, err = 0; int rc = 0, err = 0;
struct hwrm_ring_alloc_input req = {0}; struct hwrm_ring_alloc_input req = {0};
struct hwrm_ring_alloc_output *resp = bp->hwrm_cmd_resp_addr; struct hwrm_ring_alloc_output *resp = bp->hwrm_cmd_resp_addr;
struct bnxt_ring_grp_info *grp_info;
u16 ring_id; u16 ring_id;
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_RING_ALLOC, -1, -1); bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_RING_ALLOC, -1, -1);
...@@ -4280,10 +4283,10 @@ static int hwrm_ring_alloc_send_msg(struct bnxt *bp, ...@@ -4280,10 +4283,10 @@ static int hwrm_ring_alloc_send_msg(struct bnxt *bp,
case HWRM_RING_ALLOC_TX: case HWRM_RING_ALLOC_TX:
req.ring_type = RING_ALLOC_REQ_RING_TYPE_TX; req.ring_type = RING_ALLOC_REQ_RING_TYPE_TX;
/* Association of transmit ring with completion ring */ /* Association of transmit ring with completion ring */
req.cmpl_ring_id = grp_info = &bp->grp_info[ring->grp_idx];
cpu_to_le16(bp->grp_info[map_index].cp_fw_ring_id); req.cmpl_ring_id = cpu_to_le16(grp_info->cp_fw_ring_id);
req.length = cpu_to_le32(bp->tx_ring_mask + 1); req.length = cpu_to_le32(bp->tx_ring_mask + 1);
req.stat_ctx_id = cpu_to_le32(stats_ctx_id); req.stat_ctx_id = cpu_to_le32(grp_info->fw_stats_ctx);
req.queue_id = cpu_to_le16(ring->queue_id); req.queue_id = cpu_to_le16(ring->queue_id);
break; break;
case HWRM_RING_ALLOC_RX: case HWRM_RING_ALLOC_RX:
...@@ -4370,10 +4373,11 @@ static int bnxt_hwrm_ring_alloc(struct bnxt *bp) ...@@ -4370,10 +4373,11 @@ static int bnxt_hwrm_ring_alloc(struct bnxt *bp)
struct bnxt_napi *bnapi = bp->bnapi[i]; struct bnxt_napi *bnapi = bp->bnapi[i];
struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring; struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
struct bnxt_ring_struct *ring = &cpr->cp_ring_struct; struct bnxt_ring_struct *ring = &cpr->cp_ring_struct;
u32 map_idx = ring->map_idx;
cpr->cp_doorbell = bp->bar1 + i * 0x80; cpr->cp_doorbell = bp->bar1 + map_idx * 0x80;
rc = hwrm_ring_alloc_send_msg(bp, ring, HWRM_RING_ALLOC_CMPL, i, rc = hwrm_ring_alloc_send_msg(bp, ring, HWRM_RING_ALLOC_CMPL,
INVALID_STATS_CTX_ID); map_idx);
if (rc) if (rc)
goto err_out; goto err_out;
BNXT_CP_DB(cpr->cp_doorbell, cpr->cp_raw_cons); BNXT_CP_DB(cpr->cp_doorbell, cpr->cp_raw_cons);
...@@ -4389,11 +4393,10 @@ static int bnxt_hwrm_ring_alloc(struct bnxt *bp) ...@@ -4389,11 +4393,10 @@ static int bnxt_hwrm_ring_alloc(struct bnxt *bp)
for (i = 0; i < bp->tx_nr_rings; i++) { for (i = 0; i < bp->tx_nr_rings; i++) {
struct bnxt_tx_ring_info *txr = &bp->tx_ring[i]; struct bnxt_tx_ring_info *txr = &bp->tx_ring[i];
struct bnxt_ring_struct *ring = &txr->tx_ring_struct; struct bnxt_ring_struct *ring = &txr->tx_ring_struct;
u32 map_idx = txr->bnapi->index; u32 map_idx = i;
u16 fw_stats_ctx = bp->grp_info[map_idx].fw_stats_ctx;
rc = hwrm_ring_alloc_send_msg(bp, ring, HWRM_RING_ALLOC_TX, rc = hwrm_ring_alloc_send_msg(bp, ring, HWRM_RING_ALLOC_TX,
map_idx, fw_stats_ctx); map_idx);
if (rc) if (rc)
goto err_out; goto err_out;
txr->tx_doorbell = bp->bar1 + map_idx * 0x80; txr->tx_doorbell = bp->bar1 + map_idx * 0x80;
...@@ -4405,7 +4408,7 @@ static int bnxt_hwrm_ring_alloc(struct bnxt *bp) ...@@ -4405,7 +4408,7 @@ static int bnxt_hwrm_ring_alloc(struct bnxt *bp)
u32 map_idx = rxr->bnapi->index; u32 map_idx = rxr->bnapi->index;
rc = hwrm_ring_alloc_send_msg(bp, ring, HWRM_RING_ALLOC_RX, rc = hwrm_ring_alloc_send_msg(bp, ring, HWRM_RING_ALLOC_RX,
map_idx, INVALID_STATS_CTX_ID); map_idx);
if (rc) if (rc)
goto err_out; goto err_out;
rxr->rx_doorbell = bp->bar1 + map_idx * 0x80; rxr->rx_doorbell = bp->bar1 + map_idx * 0x80;
...@@ -4418,13 +4421,12 @@ static int bnxt_hwrm_ring_alloc(struct bnxt *bp) ...@@ -4418,13 +4421,12 @@ static int bnxt_hwrm_ring_alloc(struct bnxt *bp)
struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i]; struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
struct bnxt_ring_struct *ring = struct bnxt_ring_struct *ring =
&rxr->rx_agg_ring_struct; &rxr->rx_agg_ring_struct;
u32 grp_idx = rxr->bnapi->index; u32 grp_idx = ring->grp_idx;
u32 map_idx = grp_idx + bp->rx_nr_rings; u32 map_idx = grp_idx + bp->rx_nr_rings;
rc = hwrm_ring_alloc_send_msg(bp, ring, rc = hwrm_ring_alloc_send_msg(bp, ring,
HWRM_RING_ALLOC_AGG, HWRM_RING_ALLOC_AGG,
map_idx, map_idx);
INVALID_STATS_CTX_ID);
if (rc) if (rc)
goto err_out; goto err_out;
......
...@@ -573,6 +573,10 @@ struct bnxt_ring_struct { ...@@ -573,6 +573,10 @@ struct bnxt_ring_struct {
void **vmem; void **vmem;
u16 fw_ring_id; /* Ring id filled by Chimp FW */ u16 fw_ring_id; /* Ring id filled by Chimp FW */
union {
u16 grp_idx;
u16 map_idx; /* Used by cmpl rings */
};
u8 queue_id; u8 queue_id;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment