[PATCH net-next v6 14/15] bnxt_en: Add support for inline transmit BDs
Michael Chan <[email protected]>
| Newsgroups | org.kernel.vger.netdev |
|---|---|
| Message-ID | <[email protected]> |
Newer chips (P5_PLUS) support inline transmit BDs that contain extra data. One such use case is to transmit out-of-sequence kTLS packets with encryption enabled. To account for these inline BDs during TX completion, we add the inline_data_bds field to struct bnxt_sw_tx_bd (tx_buf). tx_buf->is_push will always be set when sending these inline BDs as the operation is similar to push packets. tx_buf->skb will always be NULL as there is no associated SKB. The next patch will make use of this feature. Reviewed-by: Andy Gospodarek <[email protected]> Signed-off-by: Michael Chan <[email protected]> --- v6: Clear is_push and inline_data_bds during TX ring free. --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 21 ++++++++++++++++++--- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 + 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 15b329ee878b..55f999dbe7ad 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -848,7 +848,7 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnxt_tx_ring_info *txr, head_buf = tx_buf; skb = tx_buf->skb; - if (unlikely(!skb)) { + if (unlikely(!skb && !tx_buf->is_push)) { bnxt_sched_reset_txr(bp, txr, cons); return rc; } @@ -860,13 +860,22 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnxt_tx_ring_info *txr, } cons = NEXT_TX(cons); - tx_pkts++; - tx_bytes += skb->len; + if (skb) { + tx_pkts++; + tx_bytes += skb->len; + } tx_buf->skb = NULL; tx_buf->is_ts_pkt = 0; if (tx_buf->is_push) { tx_buf->is_push = 0; + cons += tx_buf->inline_data_bds; + tx_buf->inline_data_bds = 0; + if (!skb) { + /* presync BD */ + cons = NEXT_TX(cons); + continue; + } goto next_tx_int; } @@ -3481,6 +3490,10 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt *bp, skb = tx_buf->skb; if (!skb) { + if (tx_buf->is_push) { + tx_buf->is_push = 0; + tx_buf->inline_data_bds = 0; + } i++; continue; } @@ -3489,6 +3502,8 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt *bp, if (tx_buf->is_push) { dev_kfree_skb(skb); + tx_buf->is_push = 0; + tx_buf->inline_data_bds = 0; i += 2; continue; } diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h index 5ff70623e849..e500178d5f80 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -918,6 +918,7 @@ struct bnxt_sw_tx_bd { u8 is_push; u8 is_sw_gso; u8 action; + u8 inline_data_bds; unsigned short nr_frags; union { u16 rx_prod; -- 2.51.0