axienet_dma_err_handler() resets the DMA engine, frees every TX descriptor and sets lp->tx_bd_ci and lp->tx_bd_tail back to 0, but it never restarts the transmit queue. If the queue was stopped by axienet_start_xmit() because the ring was full - __QUEUE_STATE_DRV_XOFF - it stays stopped. The only queue-state clearing the handler does is netdev_reset_queue(), which touches __QUEUE_STATE_STACK_XOFF and does nothing at all when CONFIG_BQL is disabled. The remaining wake in axienet_tx_poll() is reached only when axienet_free_tx_chain() returns a non-zero packet count, which cannot happen after the handler has cleared the status word of every descriptor, and the wake in axienet_start_xmit() cannot run while the queue is stopped. The transmit timestamp is not refreshed either, so on a kernel with a TX timeout handler the watchdog condition stays true and the reset can be retried indefinitely. axienet_device_reset(), the driver's other reset path, already calls netif_trans_update() for this reason. Wake the queue and refresh the timestamp at the end of the handler. The descriptor ring has just been reinitialised at that point, so it is ready to accept transmits. Fixes: 8a3b7a252dca ("drivers/net/ethernet/xilinx: added Xilinx AXI Ethernet driver") Signed-off-by: Sagi Maimon --- Compile-tested only; the board I found this on is not available to me for about a month. The BQL/STACK_XOFF case was exercised on hardware on 2026-08-26 and did recover, which is why the gap went unnoticed - see the discussion on the TX timeout patch. The DRV_XOFF case is reasoned from the code, not measured. axienet_dma_err_handler() also tears down the TX ring without excluding axienet_start_xmit(). That is a separate pre-existing problem and needs a separate patch; I would rather send it once I can test it. drivers/net/ethernet/xilinx/xilinx_axienet_main.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c index 782f903d318f..b6440c06f260 100644 --- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c +++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c @@ -2778,6 +2778,15 @@ static void axienet_dma_err_handler(struct work_struct *work) napi_enable(&lp->napi_rx); napi_enable(&lp->napi_tx); axienet_setoptions(ndev, lp->options); + + /* The ring is empty again, so let the stack transmit. The queue may + * have been stopped by axienet_start_xmit(); netdev_reset_queue() + * above clears only __QUEUE_STATE_STACK_XOFF, and nothing at all + * without CONFIG_BQL. Refresh the transmit timestamp first, or the + * watchdog fires again on the next tick. + */ + netif_trans_update(ndev); + netif_wake_queue(ndev); } /** -- 2.47.0