Denis Kirjanov cc02db
From 0411e3d3435ad66957c2e3d08f6356e9ce7b470f Mon Sep 17 00:00:00 2001
Denis Kirjanov cc02db
From: Joakim Zhang <qiangqing.zhang@nxp.com>
Denis Kirjanov cc02db
Date: Thu, 25 Feb 2021 17:01:11 +0800
Denis Kirjanov cc02db
Subject: [PATCH 10/19] net: stmmac: fix watchdog timeout during suspend/resume
Denis Kirjanov cc02db
 stress test
Denis Kirjanov cc02db
Git-commit: c511819d138de38e1637eedb645c207e09680d0f
Denis Kirjanov cc02db
Patch-mainline: v5.12-rc3
Denis Kirjanov cc02db
References: git-fixes
Denis Kirjanov cc02db
Denis Kirjanov cc02db
stmmac_xmit() call stmmac_tx_timer_arm() at the end to modify tx timer to
Denis Kirjanov cc02db
do the transmission cleanup work. Imagine such a situation, stmmac enters
Denis Kirjanov cc02db
suspend immediately after tx timer modified, it's expire callback
Denis Kirjanov cc02db
stmmac_tx_clean() would not be invoked. This could affect BQL, since
Denis Kirjanov cc02db
netdev_tx_sent_queue() has been called, but netdev_tx_completed_queue()
Denis Kirjanov cc02db
have not been involved, as a result, dql_avail(&dev_queue->dql) finally
Denis Kirjanov cc02db
always return a negative value.
Denis Kirjanov cc02db
Denis Kirjanov cc02db
__dev_queue_xmit->__dev_xmit_skb->qdisc_run->__qdisc_run->qdisc_restart->dequeue_skb:
Denis Kirjanov cc02db
	if ((q->flags & TCQ_F_ONETXQUEUE) &&
Denis Kirjanov cc02db
		netif_xmit_frozen_or_stopped(txq)) // __QUEUE_STATE_STACK_XOFF is set
Denis Kirjanov cc02db
Denis Kirjanov cc02db
Net core will stop transmitting any more. Finillay, net watchdong would timeout.
Denis Kirjanov cc02db
To fix this issue, we should call netdev_tx_reset_queue() in stmmac_resume().
Denis Kirjanov cc02db
Denis Kirjanov cc02db
Fixes: 54139cf3bb33 ("net: stmmac: adding multiple buffers for rx")
Denis Kirjanov cc02db
Signed-off-by: Joakim Zhang <qiangqing.zhang@nxp.com>
Denis Kirjanov cc02db
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Denis Kirjanov cc02db
Signed-off-by: Denis Kirjanov <denis.kirjanov@suse.com>
Denis Kirjanov cc02db
---
Denis Kirjanov cc02db
 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 2 ++
Denis Kirjanov cc02db
 1 file changed, 2 insertions(+)
Denis Kirjanov cc02db
Denis Kirjanov cc02db
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
Denis Kirjanov cc02db
index b2a313ef33ec..3df7cd7a2216 100644
Denis Kirjanov cc02db
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
Denis Kirjanov cc02db
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
Denis Kirjanov cc02db
@@ -4450,6 +4450,8 @@ static void stmmac_reset_queues_param(struct stmmac_priv *priv)
Denis Kirjanov cc02db
 		tx_q->cur_tx = 0;
Denis Kirjanov cc02db
 		tx_q->dirty_tx = 0;
Denis Kirjanov cc02db
 		tx_q->mss = 0;
Denis Kirjanov cc02db
+
Denis Kirjanov cc02db
+		netdev_tx_reset_queue(netdev_get_tx_queue(priv->dev, queue));
Denis Kirjanov cc02db
 	}
Denis Kirjanov cc02db
 }
Denis Kirjanov cc02db
 
Denis Kirjanov cc02db
-- 
Denis Kirjanov cc02db
2.16.4
Denis Kirjanov cc02db