Commit 0589a1ed authored by Michael Chan's avatar Michael Chan Committed by David S. Miller

bnxt_en: Support up to 8 TX rings per MSIX

For each mqprio TC, we allocate a set of TX rings to map to the new
hardware CoS queue.  Expand the tx_ring pointer in struct bnxt_napi
to an array of 8 to support up to 8 TX rings, one for each TC.
Only array entry 0 is used at this time.  The rest of the array
entries will be used in later patches.
Reviewed-by: default avatarAndy Gospodarek <andrew.gospodarek@broadcom.com>
Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 877edb34
...@@ -758,9 +758,13 @@ static void __bnxt_tx_int(struct bnxt *bp, struct bnxt_tx_ring_info *txr, ...@@ -758,9 +758,13 @@ static void __bnxt_tx_int(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi *bnapi, int budget) static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
{ {
struct bnxt_tx_ring_info *txr = bnapi->tx_ring; struct bnxt_tx_ring_info *txr;
int i;
bnxt_for_each_napi_tx(i, bnapi, txr) {
if (txr->tx_hw_cons != txr->tx_cons)
__bnxt_tx_int(bp, txr, budget); __bnxt_tx_int(bp, txr, budget);
}
bnapi->events &= ~BNXT_TX_CMP_EVENT; bnapi->events &= ~BNXT_TX_CMP_EVENT;
} }
...@@ -2596,7 +2600,6 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, ...@@ -2596,7 +2600,6 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
{ {
struct bnxt_napi *bnapi = cpr->bnapi; struct bnxt_napi *bnapi = cpr->bnapi;
u32 raw_cons = cpr->cp_raw_cons; u32 raw_cons = cpr->cp_raw_cons;
struct bnxt_tx_ring_info *txr;
u32 cons; u32 cons;
int rx_pkts = 0; int rx_pkts = 0;
u8 event = 0; u8 event = 0;
...@@ -2604,7 +2607,6 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, ...@@ -2604,7 +2607,6 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
cpr->has_more_work = 0; cpr->has_more_work = 0;
cpr->had_work_done = 1; cpr->had_work_done = 1;
txr = bnapi->tx_ring;
while (1) { while (1) {
int rc; int rc;
...@@ -2620,8 +2622,10 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, ...@@ -2620,8 +2622,10 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
dma_rmb(); dma_rmb();
if (TX_CMP_TYPE(txcmp) == CMP_TYPE_TX_L2_CMP) { if (TX_CMP_TYPE(txcmp) == CMP_TYPE_TX_L2_CMP) {
u32 opaque = txcmp->tx_cmp_opaque; u32 opaque = txcmp->tx_cmp_opaque;
struct bnxt_tx_ring_info *txr;
u16 tx_freed; u16 tx_freed;
txr = bnapi->tx_ring[TX_OPAQUE_RING(opaque)];
event |= BNXT_TX_CMP_EVENT; event |= BNXT_TX_CMP_EVENT;
txr->tx_hw_cons = TX_OPAQUE_PROD(bp, opaque); txr->tx_hw_cons = TX_OPAQUE_PROD(bp, opaque);
tx_freed = (txr->tx_hw_cons - txr->tx_cons) & tx_freed = (txr->tx_hw_cons - txr->tx_cons) &
...@@ -2671,7 +2675,7 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, ...@@ -2671,7 +2675,7 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
xdp_do_flush(); xdp_do_flush();
if (event & BNXT_TX_EVENT) { if (event & BNXT_TX_EVENT) {
struct bnxt_tx_ring_info *txr = bnapi->tx_ring; struct bnxt_tx_ring_info *txr = bnapi->tx_ring[0];
u16 prod = txr->tx_prod; u16 prod = txr->tx_prod;
/* Sync BD data before updating doorbell */ /* Sync BD data before updating doorbell */
...@@ -3657,7 +3661,7 @@ static int bnxt_alloc_cp_rings(struct bnxt *bp) ...@@ -3657,7 +3661,7 @@ static int bnxt_alloc_cp_rings(struct bnxt *bp)
static void bnxt_init_ring_struct(struct bnxt *bp) static void bnxt_init_ring_struct(struct bnxt *bp)
{ {
int i; int i, j;
for (i = 0; i < bp->cp_nr_rings; i++) { for (i = 0; i < bp->cp_nr_rings; i++) {
struct bnxt_napi *bnapi = bp->bnapi[i]; struct bnxt_napi *bnapi = bp->bnapi[i];
...@@ -3702,19 +3706,17 @@ static void bnxt_init_ring_struct(struct bnxt *bp) ...@@ -3702,19 +3706,17 @@ static void bnxt_init_ring_struct(struct bnxt *bp)
rmem->vmem = (void **)&rxr->rx_agg_ring; rmem->vmem = (void **)&rxr->rx_agg_ring;
skip_rx: skip_rx:
txr = bnapi->tx_ring; bnxt_for_each_napi_tx(j, bnapi, txr) {
if (!txr)
continue;
ring = &txr->tx_ring_struct; ring = &txr->tx_ring_struct;
rmem = &ring->ring_mem; rmem = &ring->ring_mem;
rmem->nr_pages = bp->tx_nr_pages; rmem->nr_pages = bp->tx_nr_pages;
rmem->page_size = HW_RXBD_RING_SIZE; rmem->page_size = HW_TXBD_RING_SIZE;
rmem->pg_arr = (void **)txr->tx_desc_ring; rmem->pg_arr = (void **)txr->tx_desc_ring;
rmem->dma_arr = txr->tx_desc_mapping; rmem->dma_arr = txr->tx_desc_mapping;
rmem->vmem_size = SW_TXBD_RING_SIZE * bp->tx_nr_pages; rmem->vmem_size = SW_TXBD_RING_SIZE * bp->tx_nr_pages;
rmem->vmem = (void **)&txr->tx_buf_ring; rmem->vmem = (void **)&txr->tx_buf_ring;
} }
}
} }
static void bnxt_init_rxbd_pages(struct bnxt_ring_struct *ring, u32 type) static void bnxt_init_rxbd_pages(struct bnxt_ring_struct *ring, u32 type)
...@@ -4512,7 +4514,7 @@ static int bnxt_alloc_stats(struct bnxt *bp) ...@@ -4512,7 +4514,7 @@ static int bnxt_alloc_stats(struct bnxt *bp)
static void bnxt_clear_ring_indices(struct bnxt *bp) static void bnxt_clear_ring_indices(struct bnxt *bp)
{ {
int i; int i, j;
if (!bp->bnapi) if (!bp->bnapi)
return; return;
...@@ -4529,8 +4531,7 @@ static void bnxt_clear_ring_indices(struct bnxt *bp) ...@@ -4529,8 +4531,7 @@ static void bnxt_clear_ring_indices(struct bnxt *bp)
cpr = &bnapi->cp_ring; cpr = &bnapi->cp_ring;
cpr->cp_raw_cons = 0; cpr->cp_raw_cons = 0;
txr = bnapi->tx_ring; bnxt_for_each_napi_tx(j, bnapi, txr) {
if (txr) {
txr->tx_prod = 0; txr->tx_prod = 0;
txr->tx_cons = 0; txr->tx_cons = 0;
txr->tx_hw_cons = 0; txr->tx_hw_cons = 0;
...@@ -4703,7 +4704,7 @@ static int bnxt_alloc_mem(struct bnxt *bp, bool irq_re_init) ...@@ -4703,7 +4704,7 @@ static int bnxt_alloc_mem(struct bnxt *bp, bool irq_re_init)
else else
txr->tx_cpr = &bp->bnapi[i]->cp_ring; txr->tx_cpr = &bp->bnapi[i]->cp_ring;
txr->bnapi = bp->bnapi[j]; txr->bnapi = bp->bnapi[j];
bp->bnapi[j]->tx_ring = txr; bp->bnapi[j]->tx_ring[0] = txr;
bp->tx_ring_map[i] = bp->tx_nr_rings_xdp + i; bp->tx_ring_map[i] = bp->tx_nr_rings_xdp + i;
if (i >= bp->tx_nr_rings_xdp) { if (i >= bp->tx_nr_rings_xdp) {
txr->txq_index = i - bp->tx_nr_rings_xdp; txr->txq_index = i - bp->tx_nr_rings_xdp;
...@@ -6910,10 +6911,21 @@ static int ...@@ -6910,10 +6911,21 @@ static int
bnxt_hwrm_set_tx_coal(struct bnxt *bp, struct bnxt_napi *bnapi, bnxt_hwrm_set_tx_coal(struct bnxt *bp, struct bnxt_napi *bnapi,
struct hwrm_ring_cmpl_ring_cfg_aggint_params_input *req) struct hwrm_ring_cmpl_ring_cfg_aggint_params_input *req)
{ {
u16 ring_id = bnxt_cp_ring_for_tx(bp, bnapi->tx_ring); struct bnxt_tx_ring_info *txr;
int i, rc;
bnxt_for_each_napi_tx(i, bnapi, txr) {
u16 ring_id;
ring_id = bnxt_cp_ring_for_tx(bp, txr);
req->ring_id = cpu_to_le16(ring_id); req->ring_id = cpu_to_le16(ring_id);
return hwrm_req_send(bp, req); rc = hwrm_req_send(bp, req);
if (rc)
return rc;
if (!(bp->flags & BNXT_FLAG_CHIP_P5))
return 0;
}
return 0;
} }
int bnxt_hwrm_set_coal(struct bnxt *bp) int bnxt_hwrm_set_coal(struct bnxt *bp)
...@@ -6950,7 +6962,7 @@ int bnxt_hwrm_set_coal(struct bnxt *bp) ...@@ -6950,7 +6962,7 @@ int bnxt_hwrm_set_coal(struct bnxt *bp)
if (!(bp->flags & BNXT_FLAG_CHIP_P5)) if (!(bp->flags & BNXT_FLAG_CHIP_P5))
continue; continue;
if (bnapi->rx_ring && bnapi->tx_ring) { if (bnapi->rx_ring && bnapi->tx_ring[0]) {
rc = bnxt_hwrm_set_tx_coal(bp, bnapi, req_tx); rc = bnxt_hwrm_set_tx_coal(bp, bnapi, req_tx);
if (rc) if (rc)
break; break;
...@@ -11575,14 +11587,12 @@ static int bnxt_dbg_hwrm_ring_info_get(struct bnxt *bp, u8 ring_type, ...@@ -11575,14 +11587,12 @@ static int bnxt_dbg_hwrm_ring_info_get(struct bnxt *bp, u8 ring_type,
static void bnxt_dump_tx_sw_state(struct bnxt_napi *bnapi) static void bnxt_dump_tx_sw_state(struct bnxt_napi *bnapi)
{ {
struct bnxt_tx_ring_info *txr = bnapi->tx_ring; struct bnxt_tx_ring_info *txr;
int i = bnapi->index; int i = bnapi->index, j;
if (!txr)
return;
netdev_info(bnapi->bp->dev, "[%d]: tx{fw_ring: %d prod: %x cons: %x}\n", bnxt_for_each_napi_tx(j, bnapi, txr)
i, txr->tx_ring_struct.fw_ring_id, txr->tx_prod, netdev_info(bnapi->bp->dev, "[%d.%d]: tx{fw_ring: %d prod: %x cons: %x}\n",
i, j, txr->tx_ring_struct.fw_ring_id, txr->tx_prod,
txr->tx_cons); txr->tx_cons);
} }
......
...@@ -1046,6 +1046,14 @@ struct bnxt_cp_ring_info { ...@@ -1046,6 +1046,14 @@ struct bnxt_cp_ring_info {
struct bnxt_cp_ring_info *cp_ring_arr; struct bnxt_cp_ring_info *cp_ring_arr;
}; };
#define BNXT_MAX_QUEUE 8
#define BNXT_MAX_TXR_PER_NAPI BNXT_MAX_QUEUE
#define bnxt_for_each_napi_tx(iter, bnapi, txr) \
for (iter = 0, txr = (bnapi)->tx_ring[0]; txr; \
txr = (iter < BNXT_MAX_TXR_PER_NAPI - 1) ? \
(bnapi)->tx_ring[++iter] : NULL)
struct bnxt_napi { struct bnxt_napi {
struct napi_struct napi; struct napi_struct napi;
struct bnxt *bp; struct bnxt *bp;
...@@ -1053,7 +1061,7 @@ struct bnxt_napi { ...@@ -1053,7 +1061,7 @@ struct bnxt_napi {
int index; int index;
struct bnxt_cp_ring_info cp_ring; struct bnxt_cp_ring_info cp_ring;
struct bnxt_rx_ring_info *rx_ring; struct bnxt_rx_ring_info *rx_ring;
struct bnxt_tx_ring_info *tx_ring; struct bnxt_tx_ring_info *tx_ring[BNXT_MAX_TXR_PER_NAPI];
void (*tx_int)(struct bnxt *, struct bnxt_napi *, void (*tx_int)(struct bnxt *, struct bnxt_napi *,
int budget); int budget);
...@@ -1391,8 +1399,6 @@ struct bnxt_link_info { ...@@ -1391,8 +1399,6 @@ struct bnxt_link_info {
(PORT_PHY_CFG_REQ_FLAGS_FEC_CLAUSE74_DISABLE | \ (PORT_PHY_CFG_REQ_FLAGS_FEC_CLAUSE74_DISABLE | \
BNXT_FEC_RS_OFF(link_info)) BNXT_FEC_RS_OFF(link_info))
#define BNXT_MAX_QUEUE 8
struct bnxt_queue_info { struct bnxt_queue_info {
u8 queue_id; u8 queue_id;
u8 queue_profile; u8 queue_profile;
......
...@@ -127,7 +127,7 @@ static void __bnxt_xmit_xdp_redirect(struct bnxt *bp, ...@@ -127,7 +127,7 @@ static void __bnxt_xmit_xdp_redirect(struct bnxt *bp,
void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int budget) void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
{ {
struct bnxt_tx_ring_info *txr = bnapi->tx_ring; struct bnxt_tx_ring_info *txr = bnapi->tx_ring[0];
struct bnxt_rx_ring_info *rxr = bnapi->rx_ring; struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
u16 tx_hw_cons = txr->tx_hw_cons; u16 tx_hw_cons = txr->tx_hw_cons;
bool rx_doorbell_needed = false; bool rx_doorbell_needed = false;
...@@ -249,7 +249,7 @@ bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons, ...@@ -249,7 +249,7 @@ bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons,
pdev = bp->pdev; pdev = bp->pdev;
offset = bp->rx_offset; offset = bp->rx_offset;
txr = rxr->bnapi->tx_ring; txr = rxr->bnapi->tx_ring[0];
/* BNXT_RX_PAGE_MODE(bp) when XDP enabled */ /* BNXT_RX_PAGE_MODE(bp) when XDP enabled */
orig_data = xdp.data; orig_data = xdp.data;
......
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