39a03b
From 58b410488be18be30c28410f630db604bdf66b93 Mon Sep 17 00:00:00 2001
39a03b
From: Izabela Bakollari <ibakolla@redhat.com>
39a03b
Date: Wed, 23 Nov 2022 11:10:08 +0100
39a03b
Subject: [PATCH 13/13] aquantia: Do not purge addresses when setting the
39a03b
 number of rings
39a03b
Patch-mainline: v6.1-rc8
39a03b
Git-commit: 2a83891130512dafb321418a8e7c9c09268d8c59
39a03b
References: jsc#PED-1530
39a03b
39a03b
IPV6 addresses are purged when setting the number of rx/tx
39a03b
rings using ethtool -G. The function aq_set_ringparam
39a03b
calls dev_close, which removes the addresses. As a solution,
39a03b
call an internal function (aq_ndev_close).
39a03b
39a03b
Fixes: c1af5427954b ("net: aquantia: Ethtool based ring size configuration")
39a03b
Signed-off-by: Izabela Bakollari <ibakolla@redhat.com>
39a03b
Signed-off-by: David S. Miller <davem@davemloft.net>
39a03b
Signed-off-by: Denis Kirjanov <denis.kirjanov@suse.com>
39a03b
---
39a03b
 drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c | 5 +++--
39a03b
 drivers/net/ethernet/aquantia/atlantic/aq_main.c    | 4 ++--
39a03b
 drivers/net/ethernet/aquantia/atlantic/aq_main.h    | 2 ++
39a03b
 3 files changed, 7 insertions(+), 4 deletions(-)
39a03b
39a03b
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c b/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c
39a03b
index 812f037a694e..1130395fa973 100644
39a03b
--- a/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c
39a03b
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c
39a03b
@@ -13,6 +13,7 @@
39a03b
 #include "aq_ptp.h"
39a03b
 #include "aq_filters.h"
39a03b
 #include "aq_macsec.h"
39a03b
+#include "aq_main.h"
39a03b
 
39a03b
 #include <linux/ptp_clock_kernel.h>
39a03b
 
39a03b
@@ -849,7 +850,7 @@ static int aq_set_ringparam(struct net_device *ndev,
39a03b
 
39a03b
 	if (netif_running(ndev)) {
39a03b
 		ndev_running = true;
39a03b
-		dev_close(ndev);
39a03b
+		aq_ndev_close(ndev);
39a03b
 	}
39a03b
 
39a03b
 	cfg->rxds = max(ring->rx_pending, hw_caps->rxds_min);
39a03b
@@ -865,7 +866,7 @@ static int aq_set_ringparam(struct net_device *ndev,
39a03b
 		goto err_exit;
39a03b
 
39a03b
 	if (ndev_running)
39a03b
-		err = dev_open(ndev, NULL);
39a03b
+		err = aq_ndev_open(ndev);
39a03b
 
39a03b
 err_exit:
39a03b
 	return err;
39a03b
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_main.c b/drivers/net/ethernet/aquantia/atlantic/aq_main.c
39a03b
index f069312463fb..45ed097bfe49 100644
39a03b
--- a/drivers/net/ethernet/aquantia/atlantic/aq_main.c
39a03b
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_main.c
39a03b
@@ -53,7 +53,7 @@ struct net_device *aq_ndev_alloc(void)
39a03b
 	return ndev;
39a03b
 }
39a03b
 
39a03b
-static int aq_ndev_open(struct net_device *ndev)
39a03b
+int aq_ndev_open(struct net_device *ndev)
39a03b
 {
39a03b
 	struct aq_nic_s *aq_nic = netdev_priv(ndev);
39a03b
 	int err = 0;
39a03b
@@ -83,7 +83,7 @@ static int aq_ndev_open(struct net_device *ndev)
39a03b
 	return err;
39a03b
 }
39a03b
 
39a03b
-static int aq_ndev_close(struct net_device *ndev)
39a03b
+int aq_ndev_close(struct net_device *ndev)
39a03b
 {
39a03b
 	struct aq_nic_s *aq_nic = netdev_priv(ndev);
39a03b
 	int err = 0;
39a03b
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_main.h b/drivers/net/ethernet/aquantia/atlantic/aq_main.h
39a03b
index a5a624b9ce73..2a562ab7a5af 100644
39a03b
--- a/drivers/net/ethernet/aquantia/atlantic/aq_main.h
39a03b
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_main.h
39a03b
@@ -14,5 +14,7 @@
39a03b
 
39a03b
 void aq_ndev_schedule_work(struct work_struct *work);
39a03b
 struct net_device *aq_ndev_alloc(void);
39a03b
+int aq_ndev_open(struct net_device *ndev);
39a03b
+int aq_ndev_close(struct net_device *ndev);
39a03b
 
39a03b
 #endif /* AQ_MAIN_H */
39a03b
-- 
39a03b
2.16.4
39a03b