len = skb_headlen(skb);
        last_frag = skb_shinfo(skb)->nr_frags;
 
-       txbd = &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
+       txbd = &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
 
-       tx_buf = &txr->tx_buf_ring[prod];
+       tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
        tx_buf->skb = skb;
        tx_buf->nr_frags = last_frag;
 
                txbd->tx_bd_opaque = SET_TX_OPAQUE(bp, txr, prod, 2);
                prod = NEXT_TX(prod);
                tx_push->tx_bd_opaque = txbd->tx_bd_opaque;
-               txbd = &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
+               txbd = &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
                memcpy(txbd, tx_push1, sizeof(*txbd));
                prod = NEXT_TX(prod);
                tx_push->doorbell =
 
        prod = NEXT_TX(prod);
        txbd1 = (struct tx_bd_ext *)
-               &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
+               &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
 
        txbd1->tx_bd_hsize_lflags = lflags;
        if (skb_is_gso(skb)) {
                skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
 
                prod = NEXT_TX(prod);
-               txbd = &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
+               txbd = &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
 
                len = skb_frag_size(frag);
                mapping = skb_frag_dma_map(&pdev->dev, frag, 0, len,
                if (unlikely(dma_mapping_error(&pdev->dev, mapping)))
                        goto tx_dma_error;
 
-               tx_buf = &txr->tx_buf_ring[prod];
+               tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
                dma_unmap_addr_set(tx_buf, mapping, mapping);
 
                txbd->tx_bd_haddr = cpu_to_le64(mapping);
 
        /* start back at beginning and unmap skb */
        prod = txr->tx_prod;
-       tx_buf = &txr->tx_buf_ring[prod];
+       tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
        dma_unmap_single(&pdev->dev, dma_unmap_addr(tx_buf, mapping),
                         skb_headlen(skb), DMA_TO_DEVICE);
        prod = NEXT_TX(prod);
        /* unmap remaining mapped pages */
        for (i = 0; i < last_frag; i++) {
                prod = NEXT_TX(prod);
-               tx_buf = &txr->tx_buf_ring[prod];
+               tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
                dma_unmap_page(&pdev->dev, dma_unmap_addr(tx_buf, mapping),
                               skb_frag_size(&skb_shinfo(skb)->frags[i]),
                               DMA_TO_DEVICE);
        u16 cons = txr->tx_cons;
        int tx_pkts = 0;
 
-       while (cons != hw_cons) {
+       while (RING_TX(bp, cons) != hw_cons) {
                struct bnxt_sw_tx_bd *tx_buf;
                struct sk_buff *skb;
                int j, last;
 
-               tx_buf = &txr->tx_buf_ring[cons];
+               tx_buf = &txr->tx_buf_ring[RING_TX(bp, cons)];
                cons = NEXT_TX(cons);
                skb = tx_buf->skb;
                tx_buf->skb = NULL;
 
                for (j = 0; j < last; j++) {
                        cons = NEXT_TX(cons);
-                       tx_buf = &txr->tx_buf_ring[cons];
+                       tx_buf = &txr->tx_buf_ring[RING_TX(bp, cons)];
                        dma_unmap_page(
                                &pdev->dev,
                                dma_unmap_addr(tx_buf, mapping),
 
 #define RX_RING(x)     (((x) & ~(RX_DESC_CNT - 1)) >> (BNXT_PAGE_SHIFT - 4))
 #define RX_IDX(x)      ((x) & (RX_DESC_CNT - 1))
 
-#define TX_RING(x)     (((x) & ~(TX_DESC_CNT - 1)) >> (BNXT_PAGE_SHIFT - 4))
+#define TX_RING(bp, x) (((x) & (bp)->tx_ring_mask) >> (BNXT_PAGE_SHIFT - 4))
 #define TX_IDX(x)      ((x) & (TX_DESC_CNT - 1))
 
 #define CP_RING(x)     (((x) & ~(CP_DESC_CNT - 1)) >> (BNXT_PAGE_SHIFT - 4))
 
 #define NEXT_RX_AGG(idx)       (((idx) + 1) & bp->rx_agg_ring_mask)
 
-#define NEXT_TX(idx)           (((idx) + 1) & bp->tx_ring_mask)
+#define RING_TX(bp, idx)       ((idx) & (bp)->tx_ring_mask)
+#define NEXT_TX(idx)           ((idx) + 1)
 
 #define ADV_RAW_CMP(idx, n)    ((idx) + (n))
 #define NEXT_RAW_CMP(idx)      ADV_RAW_CMP(idx, 1)
 
 
        /* fill up the first buffer */
        prod = txr->tx_prod;
-       tx_buf = &txr->tx_buf_ring[prod];
+       tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
        tx_buf->nr_frags = num_frags;
        if (xdp)
                tx_buf->page = virt_to_head_page(xdp->data);
 
-       txbd = &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
+       txbd = &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
        flags = (len << TX_BD_LEN_SHIFT) |
                ((num_frags + 1) << TX_BD_FLAGS_BD_CNT_SHIFT) |
                bnxt_lhint_arr[len >> 9];
                WRITE_ONCE(txr->tx_prod, prod);
 
                /* first fill up the first buffer */
-               frag_tx_buf = &txr->tx_buf_ring[prod];
+               frag_tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
                frag_tx_buf->page = skb_frag_page(frag);
 
-               txbd = &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
+               txbd = &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
 
                frag_len = skb_frag_size(frag);
                frag_mapping = skb_frag_dma_map(&pdev->dev, frag, 0,
        if (!budget)
                return;
 
-       while (tx_cons != tx_hw_cons) {
-               tx_buf = &txr->tx_buf_ring[tx_cons];
+       while (RING_TX(bp, tx_cons) != tx_hw_cons) {
+               tx_buf = &txr->tx_buf_ring[RING_TX(bp, tx_cons)];
 
                if (tx_buf->action == XDP_REDIRECT) {
                        struct pci_dev *pdev = bp->pdev;
                        frags = tx_buf->nr_frags;
                        for (j = 0; j < frags; j++) {
                                tx_cons = NEXT_TX(tx_cons);
-                               tx_buf = &txr->tx_buf_ring[tx_cons];
+                               tx_buf = &txr->tx_buf_ring[RING_TX(bp, tx_cons)];
                                page_pool_recycle_direct(rxr->page_pool, tx_buf->page);
                        }
                } else {