bnxt_en: Support up to 8 TX rings per MSIX
authorMichael Chan <michael.chan@broadcom.com>
Tue, 14 Nov 2023 00:16:17 +0000 (16:16 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 15 Nov 2023 10:07:40 +0000 (10:07 +0000)
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: Andy Gospodarek <andrew.gospodarek@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c

index c84a72b..6002b83 100644 (file)
@@ -758,9 +758,13 @@ next_tx_int:
 
 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_tx_int(bp, txr, budget);
+       bnxt_for_each_napi_tx(i, bnapi, txr) {
+               if (txr->tx_hw_cons != txr->tx_cons)
+                       __bnxt_tx_int(bp, txr, budget);
+       }
        bnapi->events &= ~BNXT_TX_CMP_EVENT;
 }
 
@@ -2596,7 +2600,6 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
 {
        struct bnxt_napi *bnapi = cpr->bnapi;
        u32 raw_cons = cpr->cp_raw_cons;
-       struct bnxt_tx_ring_info *txr;
        u32 cons;
        int rx_pkts = 0;
        u8 event = 0;
@@ -2604,7 +2607,6 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
 
        cpr->has_more_work = 0;
        cpr->had_work_done = 1;
-       txr = bnapi->tx_ring;
        while (1) {
                int rc;
 
@@ -2620,8 +2622,10 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
                dma_rmb();
                if (TX_CMP_TYPE(txcmp) == CMP_TYPE_TX_L2_CMP) {
                        u32 opaque = txcmp->tx_cmp_opaque;
+                       struct bnxt_tx_ring_info *txr;
                        u16 tx_freed;
 
+                       txr = bnapi->tx_ring[TX_OPAQUE_RING(opaque)];
                        event |= BNXT_TX_CMP_EVENT;
                        txr->tx_hw_cons = TX_OPAQUE_PROD(bp, opaque);
                        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,
                xdp_do_flush();
 
        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;
 
                /* Sync BD data before updating doorbell */
@@ -3657,7 +3661,7 @@ static int bnxt_alloc_cp_rings(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++) {
                struct bnxt_napi *bnapi = bp->bnapi[i];
@@ -3702,18 +3706,16 @@ static void bnxt_init_ring_struct(struct bnxt *bp)
                rmem->vmem = (void **)&rxr->rx_agg_ring;
 
 skip_rx:
-               txr = bnapi->tx_ring;
-               if (!txr)
-                       continue;
-
-               ring = &txr->tx_ring_struct;
-               rmem = &ring->ring_mem;
-               rmem->nr_pages = bp->tx_nr_pages;
-               rmem->page_size = HW_RXBD_RING_SIZE;
-               rmem->pg_arr = (void **)txr->tx_desc_ring;
-               rmem->dma_arr = txr->tx_desc_mapping;
-               rmem->vmem_size = SW_TXBD_RING_SIZE * bp->tx_nr_pages;
-               rmem->vmem = (void **)&txr->tx_buf_ring;
+               bnxt_for_each_napi_tx(j, bnapi, txr) {
+                       ring = &txr->tx_ring_struct;
+                       rmem = &ring->ring_mem;
+                       rmem->nr_pages = bp->tx_nr_pages;
+                       rmem->page_size = HW_TXBD_RING_SIZE;
+                       rmem->pg_arr = (void **)txr->tx_desc_ring;
+                       rmem->dma_arr = txr->tx_desc_mapping;
+                       rmem->vmem_size = SW_TXBD_RING_SIZE * bp->tx_nr_pages;
+                       rmem->vmem = (void **)&txr->tx_buf_ring;
+               }
        }
 }
 
@@ -4512,7 +4514,7 @@ alloc_tx_ext_stats:
 
 static void bnxt_clear_ring_indices(struct bnxt *bp)
 {
-       int i;
+       int i, j;
 
        if (!bp->bnapi)
                return;
@@ -4529,8 +4531,7 @@ static void bnxt_clear_ring_indices(struct bnxt *bp)
                cpr = &bnapi->cp_ring;
                cpr->cp_raw_cons = 0;
 
-               txr = bnapi->tx_ring;
-               if (txr) {
+               bnxt_for_each_napi_tx(j, bnapi, txr) {
                        txr->tx_prod = 0;
                        txr->tx_cons = 0;
                        txr->tx_hw_cons = 0;
@@ -4703,7 +4704,7 @@ static int bnxt_alloc_mem(struct bnxt *bp, bool irq_re_init)
                        else
                                txr->tx_cpr =  &bp->bnapi[i]->cp_ring;
                        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;
                        if (i >= bp->tx_nr_rings_xdp) {
                                txr->txq_index = i - bp->tx_nr_rings_xdp;
@@ -6910,10 +6911,21 @@ static int
 bnxt_hwrm_set_tx_coal(struct bnxt *bp, struct bnxt_napi *bnapi,
                      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;
 
-       req->ring_id = cpu_to_le16(ring_id);
-       return hwrm_req_send(bp, req);
+       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);
+               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)
@@ -6950,7 +6962,7 @@ int bnxt_hwrm_set_coal(struct bnxt *bp)
                if (!(bp->flags & BNXT_FLAG_CHIP_P5))
                        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);
                        if (rc)
                                break;
@@ -11575,15 +11587,13 @@ 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)
 {
-       struct bnxt_tx_ring_info *txr = bnapi->tx_ring;
-       int i = bnapi->index;
-
-       if (!txr)
-               return;
+       struct bnxt_tx_ring_info *txr;
+       int i = bnapi->index, j;
 
-       netdev_info(bnapi->bp->dev, "[%d]: tx{fw_ring: %d prod: %x cons: %x}\n",
-                   i, txr->tx_ring_struct.fw_ring_id, txr->tx_prod,
-                   txr->tx_cons);
+       bnxt_for_each_napi_tx(j, bnapi, txr)
+               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);
 }
 
 static void bnxt_dump_rx_sw_state(struct bnxt_napi *bnapi)
index 4305388..2028233 100644 (file)
@@ -1046,6 +1046,14 @@ struct bnxt_cp_ring_info {
        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 napi_struct      napi;
        struct bnxt             *bp;
@@ -1053,7 +1061,7 @@ struct bnxt_napi {
        int                     index;
        struct bnxt_cp_ring_info        cp_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 *,
                                          int budget);
@@ -1391,8 +1399,6 @@ struct bnxt_link_info {
        (PORT_PHY_CFG_REQ_FLAGS_FEC_CLAUSE74_DISABLE |          \
         BNXT_FEC_RS_OFF(link_info))
 
-#define BNXT_MAX_QUEUE 8
-
 struct bnxt_queue_info {
        u8      queue_id;
        u8      queue_profile;
index 3515a12..52b7510 100644 (file)
@@ -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)
 {
-       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;
        u16 tx_hw_cons = txr->tx_hw_cons;
        bool rx_doorbell_needed = false;
@@ -249,7 +249,7 @@ bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons,
        pdev = bp->pdev;
        offset = bp->rx_offset;
 
-       txr = rxr->bnapi->tx_ring;
+       txr = rxr->bnapi->tx_ring[0];
        /* BNXT_RX_PAGE_MODE(bp) when XDP enabled */
        orig_data = xdp.data;