bnxt_en: Prevent TX timeout with a very small TX ring
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: c1056a59ae
("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>
This commit is contained in:
committed by
Jakub Kicinski
parent
18fe0a383c
commit
f12f551b5b
@@ -666,8 +666,11 @@ normal_tx:
|
|||||||
tx_done:
|
tx_done:
|
||||||
|
|
||||||
if (unlikely(bnxt_tx_avail(bp, txr) <= MAX_SKB_FRAGS + 1)) {
|
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);
|
bnxt_txr_db_kick(bp, txr, prod);
|
||||||
|
}
|
||||||
|
|
||||||
netif_txq_try_stop(txq, bnxt_tx_avail(bp, txr),
|
netif_txq_try_stop(txq, bnxt_tx_avail(bp, txr),
|
||||||
bp->tx_wake_thresh);
|
bp->tx_wake_thresh);
|
||||||
|
Reference in New Issue
Block a user