Skip to content

Commit 6d1add9

Browse files
Michael Chankuba-moo
authored andcommitted
bnxt_en: Modify TX ring indexing logic.
Change the TX ring logic so that the index increments unbounded and mask it only when needed. Modify the existing macros so that the index is not masked. Add a new macro RING_TX() to mask it only when needed to get the index of txr->tx_buf_ring[]. Reviewed-by: Pavan Chebbi <[email protected]> Signed-off-by: Michael Chan <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent b9e0c47 commit 6d1add9

File tree

3 files changed

+21
-20
lines changed

3 files changed

+21
-20
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -432,9 +432,9 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
432432
len = skb_headlen(skb);
433433
last_frag = skb_shinfo(skb)->nr_frags;
434434

435-
txbd = &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
435+
txbd = &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
436436

437-
tx_buf = &txr->tx_buf_ring[prod];
437+
tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
438438
tx_buf->skb = skb;
439439
tx_buf->nr_frags = last_frag;
440440

@@ -522,7 +522,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
522522
txbd->tx_bd_opaque = SET_TX_OPAQUE(bp, txr, prod, 2);
523523
prod = NEXT_TX(prod);
524524
tx_push->tx_bd_opaque = txbd->tx_bd_opaque;
525-
txbd = &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
525+
txbd = &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
526526
memcpy(txbd, tx_push1, sizeof(*txbd));
527527
prod = NEXT_TX(prod);
528528
tx_push->doorbell =
@@ -569,7 +569,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
569569

570570
prod = NEXT_TX(prod);
571571
txbd1 = (struct tx_bd_ext *)
572-
&txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
572+
&txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
573573

574574
txbd1->tx_bd_hsize_lflags = lflags;
575575
if (skb_is_gso(skb)) {
@@ -610,7 +610,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
610610
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
611611

612612
prod = NEXT_TX(prod);
613-
txbd = &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
613+
txbd = &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
614614

615615
len = skb_frag_size(frag);
616616
mapping = skb_frag_dma_map(&pdev->dev, frag, 0, len,
@@ -619,7 +619,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
619619
if (unlikely(dma_mapping_error(&pdev->dev, mapping)))
620620
goto tx_dma_error;
621621

622-
tx_buf = &txr->tx_buf_ring[prod];
622+
tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
623623
dma_unmap_addr_set(tx_buf, mapping, mapping);
624624

625625
txbd->tx_bd_haddr = cpu_to_le64(mapping);
@@ -668,15 +668,15 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
668668

669669
/* start back at beginning and unmap skb */
670670
prod = txr->tx_prod;
671-
tx_buf = &txr->tx_buf_ring[prod];
671+
tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
672672
dma_unmap_single(&pdev->dev, dma_unmap_addr(tx_buf, mapping),
673673
skb_headlen(skb), DMA_TO_DEVICE);
674674
prod = NEXT_TX(prod);
675675

676676
/* unmap remaining mapped pages */
677677
for (i = 0; i < last_frag; i++) {
678678
prod = NEXT_TX(prod);
679-
tx_buf = &txr->tx_buf_ring[prod];
679+
tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
680680
dma_unmap_page(&pdev->dev, dma_unmap_addr(tx_buf, mapping),
681681
skb_frag_size(&skb_shinfo(skb)->frags[i]),
682682
DMA_TO_DEVICE);
@@ -702,12 +702,12 @@ static void __bnxt_tx_int(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
702702
u16 cons = txr->tx_cons;
703703
int tx_pkts = 0;
704704

705-
while (cons != hw_cons) {
705+
while (RING_TX(bp, cons) != hw_cons) {
706706
struct bnxt_sw_tx_bd *tx_buf;
707707
struct sk_buff *skb;
708708
int j, last;
709709

710-
tx_buf = &txr->tx_buf_ring[cons];
710+
tx_buf = &txr->tx_buf_ring[RING_TX(bp, cons)];
711711
cons = NEXT_TX(cons);
712712
skb = tx_buf->skb;
713713
tx_buf->skb = NULL;
@@ -731,7 +731,7 @@ static void __bnxt_tx_int(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
731731

732732
for (j = 0; j < last; j++) {
733733
cons = NEXT_TX(cons);
734-
tx_buf = &txr->tx_buf_ring[cons];
734+
tx_buf = &txr->tx_buf_ring[RING_TX(bp, cons)];
735735
dma_unmap_page(
736736
&pdev->dev,
737737
dma_unmap_addr(tx_buf, mapping),

drivers/net/ethernet/broadcom/bnxt/bnxt.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -689,7 +689,7 @@ struct nqe_cn {
689689
#define RX_RING(x) (((x) & ~(RX_DESC_CNT - 1)) >> (BNXT_PAGE_SHIFT - 4))
690690
#define RX_IDX(x) ((x) & (RX_DESC_CNT - 1))
691691

692-
#define TX_RING(x) (((x) & ~(TX_DESC_CNT - 1)) >> (BNXT_PAGE_SHIFT - 4))
692+
#define TX_RING(bp, x) (((x) & (bp)->tx_ring_mask) >> (BNXT_PAGE_SHIFT - 4))
693693
#define TX_IDX(x) ((x) & (TX_DESC_CNT - 1))
694694

695695
#define CP_RING(x) (((x) & ~(CP_DESC_CNT - 1)) >> (BNXT_PAGE_SHIFT - 4))
@@ -720,7 +720,8 @@ struct nqe_cn {
720720

721721
#define NEXT_RX_AGG(idx) (((idx) + 1) & bp->rx_agg_ring_mask)
722722

723-
#define NEXT_TX(idx) (((idx) + 1) & bp->tx_ring_mask)
723+
#define RING_TX(bp, idx) ((idx) & (bp)->tx_ring_mask)
724+
#define NEXT_TX(idx) ((idx) + 1)
724725

725726
#define ADV_RAW_CMP(idx, n) ((idx) + (n))
726727
#define NEXT_RAW_CMP(idx) ADV_RAW_CMP(idx, 1)

drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@ struct bnxt_sw_tx_bd *bnxt_xmit_bd(struct bnxt *bp,
4242

4343
/* fill up the first buffer */
4444
prod = txr->tx_prod;
45-
tx_buf = &txr->tx_buf_ring[prod];
45+
tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
4646
tx_buf->nr_frags = num_frags;
4747
if (xdp)
4848
tx_buf->page = virt_to_head_page(xdp->data);
4949

50-
txbd = &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
50+
txbd = &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
5151
flags = (len << TX_BD_LEN_SHIFT) |
5252
((num_frags + 1) << TX_BD_FLAGS_BD_CNT_SHIFT) |
5353
bnxt_lhint_arr[len >> 9];
@@ -67,10 +67,10 @@ struct bnxt_sw_tx_bd *bnxt_xmit_bd(struct bnxt *bp,
6767
WRITE_ONCE(txr->tx_prod, prod);
6868

6969
/* first fill up the first buffer */
70-
frag_tx_buf = &txr->tx_buf_ring[prod];
70+
frag_tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
7171
frag_tx_buf->page = skb_frag_page(frag);
7272

73-
txbd = &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)];
73+
txbd = &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
7474

7575
frag_len = skb_frag_size(frag);
7676
frag_mapping = skb_frag_dma_map(&pdev->dev, frag, 0,
@@ -139,8 +139,8 @@ void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
139139
if (!budget)
140140
return;
141141

142-
while (tx_cons != tx_hw_cons) {
143-
tx_buf = &txr->tx_buf_ring[tx_cons];
142+
while (RING_TX(bp, tx_cons) != tx_hw_cons) {
143+
tx_buf = &txr->tx_buf_ring[RING_TX(bp, tx_cons)];
144144

145145
if (tx_buf->action == XDP_REDIRECT) {
146146
struct pci_dev *pdev = bp->pdev;
@@ -160,7 +160,7 @@ void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
160160
frags = tx_buf->nr_frags;
161161
for (j = 0; j < frags; j++) {
162162
tx_cons = NEXT_TX(tx_cons);
163-
tx_buf = &txr->tx_buf_ring[tx_cons];
163+
tx_buf = &txr->tx_buf_ring[RING_TX(bp, tx_cons)];
164164
page_pool_recycle_direct(rxr->page_pool, tx_buf->page);
165165
}
166166
} else {

0 commit comments

Comments
 (0)