bnxt_en: New encoding for the TX opaque field
authorMichael Chan <michael.chan@broadcom.com>
Tue, 14 Nov 2023 00:16:15 +0000 (16:16 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 15 Nov 2023 10:07:39 +0000 (10:07 +0000)
In order to support multiple TX rings on the same MSIX, we'll use the
upper byte of the TX opaque field to store the ring index in the new
tx_napi_idx field.  This tx_napi_idx field is currently always 0 until
more infrastructure is added 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 ad56ca9d3ceb9b98da6cdb78af411c002b221af6..1a7f14d086f75cbcb28d2ae3fb33b11259127dab 100644 (file)
@@ -517,7 +517,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
                txbd->tx_bd_len_flags_type = tx_push->tx_bd_len_flags_type;
                txbd->tx_bd_haddr = txr->data_mapping;
-               txbd->tx_bd_opaque = SET_TX_OPAQUE(bp, prod, 2);
+               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)];
@@ -562,7 +562,7 @@ normal_tx:
                ((last_frag + 2) << TX_BD_FLAGS_BD_CNT_SHIFT);
 
        txbd->tx_bd_haddr = cpu_to_le64(mapping);
-       txbd->tx_bd_opaque = SET_TX_OPAQUE(bp, prod, 2 + last_frag);
+       txbd->tx_bd_opaque = SET_TX_OPAQUE(bp, txr, prod, 2 + last_frag);
 
        prod = NEXT_TX(prod);
        txbd1 = (struct tx_bd_ext *)
index efb0db54575be5847c1e56a3b26ddb6f4d66071d..4305388441787f1b7a38f349aabf374c6e40fe51 100644 (file)
@@ -64,11 +64,16 @@ struct tx_bd {
 #define TX_OPAQUE_IDX_MASK     0x0000ffff
 #define TX_OPAQUE_BDS_MASK     0x00ff0000
 #define TX_OPAQUE_BDS_SHIFT    16
+#define TX_OPAQUE_RING_MASK    0xff000000
+#define TX_OPAQUE_RING_SHIFT   24
 
-#define SET_TX_OPAQUE(bp, idx, bds)                                    \
-       (((bds) << TX_OPAQUE_BDS_SHIFT) | ((idx) & (bp)->tx_ring_mask))
+#define SET_TX_OPAQUE(bp, txr, idx, bds)                               \
+       (((txr)->tx_napi_idx << TX_OPAQUE_RING_SHIFT) |                 \
+        ((bds) << TX_OPAQUE_BDS_SHIFT) | ((idx) & (bp)->tx_ring_mask))
 
 #define TX_OPAQUE_IDX(opq)     ((opq) & TX_OPAQUE_IDX_MASK)
+#define TX_OPAQUE_RING(opq)    (((opq) & TX_OPAQUE_RING_MASK) >>       \
+                                TX_OPAQUE_RING_SHIFT)
 #define TX_OPAQUE_BDS(opq)     (((opq) & TX_OPAQUE_BDS_MASK) >>        \
                                 TX_OPAQUE_BDS_SHIFT)
 #define TX_OPAQUE_PROD(bp, opq)        ((TX_OPAQUE_IDX(opq) + TX_OPAQUE_BDS(opq)) &\
@@ -824,6 +829,7 @@ struct bnxt_tx_ring_info {
        u16                     tx_cons;
        u16                     tx_hw_cons;
        u16                     txq_index;
+       u8                      tx_napi_idx;
        u8                      kick_pending;
        struct bnxt_db_info     tx_db;
 
index 23476100fad2f72c116fdc91069186966fc2a664..3515a12a6feae33fabc698539db76a8c77b0b706 100644 (file)
@@ -52,7 +52,7 @@ struct bnxt_sw_tx_bd *bnxt_xmit_bd(struct bnxt *bp,
                ((num_frags + 1) << TX_BD_FLAGS_BD_CNT_SHIFT) |
                bnxt_lhint_arr[len >> 9];
        txbd->tx_bd_len_flags_type = cpu_to_le32(flags);
-       txbd->tx_bd_opaque = SET_TX_OPAQUE(bp, prod, 1 + num_frags);
+       txbd->tx_bd_opaque = SET_TX_OPAQUE(bp, txr, prod, 1 + num_frags);
        txbd->tx_bd_haddr = cpu_to_le64(mapping);
 
        /* now let us fill up the frags into the next buffers */