Blame SOURCES/0016-ionic_tame_the_watchdog_timer_on_reconfig.patch

1632d2
Date: Mon, 22 Jun 2020 01:25:29 -0400
1632d2
From: Jonathan Toppins <jtoppins@redhat.com>
1632d2
To: rhkernel-list@redhat.com
1632d2
Cc: darcari@redhat.com, nhorman@redhat.com, linville@redhat.com
1632d2
Subject: [PATCH RHEL-8.3] ionic: tame the watchdog timer on reconfig
1632d2
1632d2
Even with moving netif_tx_disable() to an earlier point when
1632d2
taking down the queues for a reconfiguration, we still end
1632d2
up with the occasional netdev watchdog Tx Timeout complaint.
1632d2
The old method of using netif_trans_update() works fine for
1632d2
queue 0, but has no effect on the remaining queues.  Using
1632d2
netif_device_detach() allows us to signal to the watchdog to
1632d2
ignore us for the moment.
1632d2
1632d2
Fixes: beead698b173 ("ionic: Add the basic NDO callbacks for netdev support")
1632d2
Signed-off-by: Shannon Nelson <snelson@pensando.io>
1632d2
Acked-by: Jonathan Toppins <jtoppins@redhat.com>
1632d2
Signed-off-by: David S. Miller <davem@davemloft.net>
1632d2
(cherry picked from commit b59eabd23ee53e8c3492602722e1697f9a2f63ad)
1632d2
Bugzilla: 1846879
1632d2
Bugzilla: 1846280
1632d2
Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=29551761
1632d2
Tested: partner tested
1632d2
Signed-off-by: Jonathan Toppins <jtoppins@redhat.com>
1632d2
---
1632d2
 drivers/net/ethernet/pensando/ionic/ionic_lif.c | 15 ++++++++-------
1632d2
 1 file changed, 8 insertions(+), 7 deletions(-)
1632d2
1632d2
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
1632d2
index 8f29ef133743..aaa00edd9d5b 100644
1632d2
--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c
1632d2
+++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
1632d2
@@ -1694,15 +1694,15 @@ static void ionic_stop_queues(struct ionic_lif *lif)
1632d2
 	if (!test_and_clear_bit(IONIC_LIF_F_UP, lif->state))
1632d2
 		return;
1632d2
 
1632d2
-	ionic_txrx_disable(lif);
1632d2
 	netif_tx_disable(lif->netdev);
1632d2
+	ionic_txrx_disable(lif);
1632d2
 }
1632d2
 
1632d2
 int ionic_stop(struct net_device *netdev)
1632d2
 {
1632d2
 	struct ionic_lif *lif = netdev_priv(netdev);
1632d2
 
1632d2
-	if (!netif_device_present(netdev))
1632d2
+	if (test_bit(IONIC_LIF_F_FW_RESET, lif->state))
1632d2
 		return 0;
1632d2
 
1632d2
 	ionic_stop_queues(lif);
1632d2
@@ -1985,18 +1985,19 @@ int ionic_reset_queues(struct ionic_lif *lif)
1632d2
 	bool running;
1632d2
 	int err = 0;
1632d2
 
1632d2
-	/* Put off the next watchdog timeout */
1632d2
-	netif_trans_update(lif->netdev);
1632d2
-
1632d2
 	err = ionic_wait_for_bit(lif, IONIC_LIF_F_QUEUE_RESET);
1632d2
 	if (err)
1632d2
 		return err;
1632d2
 
1632d2
 	running = netif_running(lif->netdev);
1632d2
-	if (running)
1632d2
+	if (running) {
1632d2
+		netif_device_detach(lif->netdev);
1632d2
 		err = ionic_stop(lif->netdev);
1632d2
-	if (!err && running)
1632d2
+	}
1632d2
+	if (!err && running) {
1632d2
 		ionic_open(lif->netdev);
1632d2
+		netif_device_attach(lif->netdev);
1632d2
+	}
1632d2
 
1632d2
 	clear_bit(IONIC_LIF_F_QUEUE_RESET, lif->state);
1632d2
 
1632d2
-- 
1632d2
2.16.4
1632d2
1632d2