bnxt_en: Prevent TX timeout with a very small TX ring
authorMichael Chan <michael.chan@broadcom.com>
Tue, 12 Dec 2023 00:51:13 +0000 (16:51 -0800)
committerJakub Kicinski <kuba@kernel.org>
Wed, 13 Dec 2023 00:05:57 +0000 (16:05 -0800)
If xmit_more condition is true, the driver may set the
TX_BD_FLAGS_NO_CMPL flag.  If after this packet, the TX ring can no
longer hold a packet with maximum fragments, we will stop the TX
queue.  When this happens, we must clear the TX_BD_FLAGS_NO_CMPL flag
on the last packet or there will be no completion and cause TX
timeout.

Fixes: c1056a59aee1 ("bnxt_en: Optimize xmit_more TX path")
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
Reviewed-by: Hongguang Gao <hongguang.gao@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Link: https://lore.kernel.org/r/20231212005122.2401-5-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c

index 83a47feaf8693c6d3369e857d41c8b8ae5eb6cf6..cc6cab340423a724b9b383f1f22d9b3604fc6a18 100644 (file)
@@ -666,8 +666,11 @@ normal_tx:
 tx_done:
 
        if (unlikely(bnxt_tx_avail(bp, txr) <= MAX_SKB_FRAGS + 1)) {
-               if (netdev_xmit_more() && !tx_buf->is_push)
+               if (netdev_xmit_more() && !tx_buf->is_push) {
+                       txbd0->tx_bd_len_flags_type &=
+                               cpu_to_le32(~TX_BD_FLAGS_NO_CMPL);
                        bnxt_txr_db_kick(bp, txr, prod);
+               }
 
                netif_txq_try_stop(txq, bnxt_tx_avail(bp, txr),
                                   bp->tx_wake_thresh);