[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20200725002326.41407-3-snelson@pensando.io>
Date: Fri, 24 Jul 2020 17:23:24 -0700
From: Shannon Nelson <snelson@...sando.io>
To: netdev@...r.kernel.org, davem@...emloft.net
Cc: Shannon Nelson <snelson@...sando.io>
Subject: [PATCH net-next 2/4] ionic: recover from ringsize change failure
If the ringsize change fails, try restoring the previous setting.
Signed-off-by: Shannon Nelson <snelson@...sando.io>
---
.../ethernet/pensando/ionic/ionic_ethtool.c | 23 ++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
index e03ea9b18f95..b48f0e46584b 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
@@ -480,6 +480,8 @@ static int ionic_set_ringparam(struct net_device *netdev,
struct ethtool_ringparam *ring)
{
struct ionic_lif *lif = netdev_priv(netdev);
+ int tx_start, rx_start;
+ int err;
if (ring->rx_mini_pending || ring->rx_jumbo_pending) {
netdev_info(netdev, "Changing jumbo or mini descriptors not supported\n");
@@ -497,7 +499,26 @@ static int ionic_set_ringparam(struct net_device *netdev,
ring->rx_pending == lif->nrxq_descs)
return 0;
- return ionic_reset_queues(lif, ionic_set_ringsize, ring);
+ tx_start = lif->ntxq_descs;
+ rx_start = lif->nrxq_descs;
+
+ err = ionic_reset_queues(lif, ionic_set_ringsize, ring);
+
+ if (err) {
+ int my_err;
+
+ netdev_warn(netdev, "Ringsize change failed, restoring ring sizes\n");
+ ring->tx_pending = tx_start;
+ ring->rx_pending = rx_start;
+ my_err = ionic_reset_queues(lif, ionic_set_ringsize, ring);
+
+ if (my_err) {
+ netdev_err(netdev, "Ringsize restore failed\n");
+ err = my_err;
+ }
+ }
+
+ return err;
}
static void ionic_get_channels(struct net_device *netdev,
--
2.17.1
Powered by blists - more mailing lists