If the ringsize change fails, try restoring the previous setting. Signed-off-by: Shannon Nelson <snel...@pensando.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