Michal Suchanek 64cbcb
From ea94e7b11702e12d44ba6b0525aee4a55e52c825 Mon Sep 17 00:00:00 2001
Michal Suchanek 64cbcb
From: Dany Madden <drt@linux.ibm.com>
Michal Suchanek 64cbcb
Date: Wed, 27 Apr 2022 18:51:46 -0500
Michal Suchanek 64cbcb
Subject: [PATCH] Revert "ibmvnic: Add ethtool private flag for driver-defined
Michal Suchanek 64cbcb
 queue limits"
Michal Suchanek 64cbcb
Michal Suchanek 64cbcb
References: bsc#1121726 ltc#174633 git-fixes
Michal Suchanek 64cbcb
Patch-mainline: v5.18-rc5
Michal Suchanek 64cbcb
Git-commit: aeaf59b78712c7a1827c76f086acff4f586e072f
Michal Suchanek 64cbcb
Michal Suchanek 64cbcb
This reverts commit 723ad916134784b317b72f3f6cf0f7ba774e5dae
Michal Suchanek 64cbcb
Michal Suchanek 64cbcb
When client requests channel or ring size larger than what the server
Michal Suchanek 64cbcb
can support the server will cap the request to the supported max. So,
Michal Suchanek 64cbcb
the client would not be able to successfully request resources that
Michal Suchanek 64cbcb
exceed the server limit.
Michal Suchanek 64cbcb
Michal Suchanek 64cbcb
Fixes: 723ad9161347 ("ibmvnic: Add ethtool private flag for driver-defined queue limits")
Michal Suchanek 64cbcb
Signed-off-by: Dany Madden <drt@linux.ibm.com>
Michal Suchanek 64cbcb
Link: https://lore.kernel.org/r/20220427235146.23189-1-drt@linux.ibm.com
Michal Suchanek 64cbcb
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Michal Suchanek 64cbcb
Acked-by: Michal Suchanek <msuchanek@suse.de>
Michal Suchanek 64cbcb
---
Michal Suchanek 64cbcb
 drivers/net/ethernet/ibm/ibmvnic.c | 129 ++++++++---------------------
Michal Suchanek 64cbcb
 drivers/net/ethernet/ibm/ibmvnic.h |   6 --
Michal Suchanek 64cbcb
 2 files changed, 35 insertions(+), 100 deletions(-)
Michal Suchanek 64cbcb
Michal Suchanek 64cbcb
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
Michal Suchanek 64cbcb
index a84d459f204f..13acff619cf4 100644
Michal Suchanek 64cbcb
--- a/drivers/net/ethernet/ibm/ibmvnic.c
Michal Suchanek 64cbcb
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
Michal Suchanek 64cbcb
@@ -2918,13 +2918,8 @@ static void ibmvnic_get_ringparam(struct net_device *netdev,
Michal Suchanek 64cbcb
 {
Michal Suchanek 64cbcb
 	struct ibmvnic_adapter *adapter = netdev_priv(netdev);
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
-	if (adapter->priv_flags & IBMVNIC_USE_SERVER_MAXES) {
Michal Suchanek 64cbcb
-		ring->rx_max_pending = adapter->max_rx_add_entries_per_subcrq;
Michal Suchanek 64cbcb
-		ring->tx_max_pending = adapter->max_tx_entries_per_subcrq;
Michal Suchanek 64cbcb
-	} else {
Michal Suchanek 64cbcb
-		ring->rx_max_pending = IBMVNIC_MAX_QUEUE_SZ;
Michal Suchanek 64cbcb
-		ring->tx_max_pending = IBMVNIC_MAX_QUEUE_SZ;
Michal Suchanek 64cbcb
-	}
Michal Suchanek 64cbcb
+	ring->rx_max_pending = adapter->max_rx_add_entries_per_subcrq;
Michal Suchanek 64cbcb
+	ring->tx_max_pending = adapter->max_tx_entries_per_subcrq;
Michal Suchanek 64cbcb
 	ring->rx_mini_max_pending = 0;
Michal Suchanek 64cbcb
 	ring->rx_jumbo_max_pending = 0;
Michal Suchanek 64cbcb
 	ring->rx_pending = adapter->req_rx_add_entries_per_subcrq;
Michal Suchanek 64cbcb
@@ -2937,23 +2932,21 @@ static int ibmvnic_set_ringparam(struct net_device *netdev,
Michal Suchanek 64cbcb
 				 struct ethtool_ringparam *ring)
Michal Suchanek 64cbcb
 {
Michal Suchanek 64cbcb
 	struct ibmvnic_adapter *adapter = netdev_priv(netdev);
Michal Suchanek 64cbcb
-	int ret;
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
-	ret = 0;
Michal Suchanek 64cbcb
+	if (ring->rx_pending > adapter->max_rx_add_entries_per_subcrq  ||
Michal Suchanek 64cbcb
+	    ring->tx_pending > adapter->max_tx_entries_per_subcrq) {
Michal Suchanek 64cbcb
+		netdev_err(netdev, "Invalid request.\n");
Michal Suchanek 64cbcb
+		netdev_err(netdev, "Max tx buffers = %llu\n",
Michal Suchanek 64cbcb
+			   adapter->max_rx_add_entries_per_subcrq);
Michal Suchanek 64cbcb
+		netdev_err(netdev, "Max rx buffers = %llu\n",
Michal Suchanek 64cbcb
+			   adapter->max_tx_entries_per_subcrq);
Michal Suchanek 64cbcb
+		return -EINVAL;
Michal Suchanek 64cbcb
+	}
Michal Suchanek 64cbcb
+
Michal Suchanek 64cbcb
 	adapter->desired.rx_entries = ring->rx_pending;
Michal Suchanek 64cbcb
 	adapter->desired.tx_entries = ring->tx_pending;
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
-	ret = wait_for_reset(adapter);
Michal Suchanek 64cbcb
-
Michal Suchanek 64cbcb
-	if (!ret &&
Michal Suchanek 64cbcb
-	    (adapter->req_rx_add_entries_per_subcrq != ring->rx_pending ||
Michal Suchanek 64cbcb
-	     adapter->req_tx_entries_per_subcrq != ring->tx_pending))
Michal Suchanek 64cbcb
-		netdev_info(netdev,
Michal Suchanek 64cbcb
-			    "Could not match full ringsize request. Requested: RX %d, TX %d; Allowed: RX %llu, TX %llu\n",
Michal Suchanek 64cbcb
-			    ring->rx_pending, ring->tx_pending,
Michal Suchanek 64cbcb
-			    adapter->req_rx_add_entries_per_subcrq,
Michal Suchanek 64cbcb
-			    adapter->req_tx_entries_per_subcrq);
Michal Suchanek 64cbcb
-	return ret;
Michal Suchanek 64cbcb
+	return wait_for_reset(adapter);
Michal Suchanek 64cbcb
 }
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
 static void ibmvnic_get_channels(struct net_device *netdev,
Michal Suchanek 64cbcb
@@ -2961,14 +2954,8 @@ static void ibmvnic_get_channels(struct net_device *netdev,
Michal Suchanek 64cbcb
 {
Michal Suchanek 64cbcb
 	struct ibmvnic_adapter *adapter = netdev_priv(netdev);
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
-	if (adapter->priv_flags & IBMVNIC_USE_SERVER_MAXES) {
Michal Suchanek 64cbcb
-		channels->max_rx = adapter->max_rx_queues;
Michal Suchanek 64cbcb
-		channels->max_tx = adapter->max_tx_queues;
Michal Suchanek 64cbcb
-	} else {
Michal Suchanek 64cbcb
-		channels->max_rx = IBMVNIC_MAX_QUEUES;
Michal Suchanek 64cbcb
-		channels->max_tx = IBMVNIC_MAX_QUEUES;
Michal Suchanek 64cbcb
-	}
Michal Suchanek 64cbcb
-
Michal Suchanek 64cbcb
+	channels->max_rx = adapter->max_rx_queues;
Michal Suchanek 64cbcb
+	channels->max_tx = adapter->max_tx_queues;
Michal Suchanek 64cbcb
 	channels->max_other = 0;
Michal Suchanek 64cbcb
 	channels->max_combined = 0;
Michal Suchanek 64cbcb
 	channels->rx_count = adapter->req_rx_queues;
Michal Suchanek 64cbcb
@@ -2981,22 +2968,11 @@ static int ibmvnic_set_channels(struct net_device *netdev,
Michal Suchanek 64cbcb
 				struct ethtool_channels *channels)
Michal Suchanek 64cbcb
 {
Michal Suchanek 64cbcb
 	struct ibmvnic_adapter *adapter = netdev_priv(netdev);
Michal Suchanek 64cbcb
-	int ret;
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
-	ret = 0;
Michal Suchanek 64cbcb
 	adapter->desired.rx_queues = channels->rx_count;
Michal Suchanek 64cbcb
 	adapter->desired.tx_queues = channels->tx_count;
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
-	ret = wait_for_reset(adapter);
Michal Suchanek 64cbcb
-
Michal Suchanek 64cbcb
-	if (!ret &&
Michal Suchanek 64cbcb
-	    (adapter->req_rx_queues != channels->rx_count ||
Michal Suchanek 64cbcb
-	     adapter->req_tx_queues != channels->tx_count))
Michal Suchanek 64cbcb
-		netdev_info(netdev,
Michal Suchanek 64cbcb
-			    "Could not match full channels request. Requested: RX %d, TX %d; Allowed: RX %llu, TX %llu\n",
Michal Suchanek 64cbcb
-			    channels->rx_count, channels->tx_count,
Michal Suchanek 64cbcb
-			    adapter->req_rx_queues, adapter->req_tx_queues);
Michal Suchanek 64cbcb
-	return ret;
Michal Suchanek 64cbcb
+	return wait_for_reset(adapter);
Michal Suchanek 64cbcb
 }
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
 static void ibmvnic_get_strings(struct net_device *dev, u32 stringset, u8 *data)
Michal Suchanek 64cbcb
@@ -3004,43 +2980,32 @@ static void ibmvnic_get_strings(struct net_device *dev, u32 stringset, u8 *data)
Michal Suchanek 64cbcb
 	struct ibmvnic_adapter *adapter = netdev_priv(dev);
Michal Suchanek 64cbcb
 	int i;
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
-	switch (stringset) {
Michal Suchanek 64cbcb
-	case ETH_SS_STATS:
Michal Suchanek 64cbcb
-		for (i = 0; i < ARRAY_SIZE(ibmvnic_stats);
Michal Suchanek 64cbcb
-				i++, data += ETH_GSTRING_LEN)
Michal Suchanek 64cbcb
-			memcpy(data, ibmvnic_stats[i].name, ETH_GSTRING_LEN);
Michal Suchanek 64cbcb
+	if (stringset != ETH_SS_STATS)
Michal Suchanek 64cbcb
+		return;
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
-		for (i = 0; i < adapter->req_tx_queues; i++) {
Michal Suchanek 64cbcb
-			snprintf(data, ETH_GSTRING_LEN, "tx%d_packets", i);
Michal Suchanek 64cbcb
-			data += ETH_GSTRING_LEN;
Michal Suchanek 64cbcb
+	for (i = 0; i < ARRAY_SIZE(ibmvnic_stats); i++, data += ETH_GSTRING_LEN)
Michal Suchanek 64cbcb
+		memcpy(data, ibmvnic_stats[i].name, ETH_GSTRING_LEN);
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
-			snprintf(data, ETH_GSTRING_LEN, "tx%d_bytes", i);
Michal Suchanek 64cbcb
-			data += ETH_GSTRING_LEN;
Michal Suchanek 64cbcb
+	for (i = 0; i < adapter->req_tx_queues; i++) {
Michal Suchanek 64cbcb
+		snprintf(data, ETH_GSTRING_LEN, "tx%d_packets", i);
Michal Suchanek 64cbcb
+		data += ETH_GSTRING_LEN;
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
-			snprintf(data, ETH_GSTRING_LEN,
Michal Suchanek 64cbcb
-				 "tx%d_dropped_packets", i);
Michal Suchanek 64cbcb
-			data += ETH_GSTRING_LEN;
Michal Suchanek 64cbcb
-		}
Michal Suchanek 64cbcb
+		snprintf(data, ETH_GSTRING_LEN, "tx%d_bytes", i);
Michal Suchanek 64cbcb
+		data += ETH_GSTRING_LEN;
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
-		for (i = 0; i < adapter->req_rx_queues; i++) {
Michal Suchanek 64cbcb
-			snprintf(data, ETH_GSTRING_LEN, "rx%d_packets", i);
Michal Suchanek 64cbcb
-			data += ETH_GSTRING_LEN;
Michal Suchanek 64cbcb
+		snprintf(data, ETH_GSTRING_LEN, "tx%d_dropped_packets", i);
Michal Suchanek 64cbcb
+		data += ETH_GSTRING_LEN;
Michal Suchanek 64cbcb
+	}
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
-			snprintf(data, ETH_GSTRING_LEN, "rx%d_bytes", i);
Michal Suchanek 64cbcb
-			data += ETH_GSTRING_LEN;
Michal Suchanek 64cbcb
+	for (i = 0; i < adapter->req_rx_queues; i++) {
Michal Suchanek 64cbcb
+		snprintf(data, ETH_GSTRING_LEN, "rx%d_packets", i);
Michal Suchanek 64cbcb
+		data += ETH_GSTRING_LEN;
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
-			snprintf(data, ETH_GSTRING_LEN, "rx%d_interrupts", i);
Michal Suchanek 64cbcb
-			data += ETH_GSTRING_LEN;
Michal Suchanek 64cbcb
-		}
Michal Suchanek 64cbcb
-		break;
Michal Suchanek 64cbcb
+		snprintf(data, ETH_GSTRING_LEN, "rx%d_bytes", i);
Michal Suchanek 64cbcb
+		data += ETH_GSTRING_LEN;
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
-	case ETH_SS_PRIV_FLAGS:
Michal Suchanek 64cbcb
-		for (i = 0; i < ARRAY_SIZE(ibmvnic_priv_flags); i++)
Michal Suchanek 64cbcb
-			strcpy(data + i * ETH_GSTRING_LEN,
Michal Suchanek 64cbcb
-			       ibmvnic_priv_flags[i]);
Michal Suchanek 64cbcb
-		break;
Michal Suchanek 64cbcb
-	default:
Michal Suchanek 64cbcb
-		return;
Michal Suchanek 64cbcb
+		snprintf(data, ETH_GSTRING_LEN, "rx%d_interrupts", i);
Michal Suchanek 64cbcb
+		data += ETH_GSTRING_LEN;
Michal Suchanek 64cbcb
 	}
Michal Suchanek 64cbcb
 }
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
@@ -3053,8 +3018,6 @@ static int ibmvnic_get_sset_count(struct net_device *dev, int sset)
Michal Suchanek 64cbcb
 		return ARRAY_SIZE(ibmvnic_stats) +
Michal Suchanek 64cbcb
 		       adapter->req_tx_queues * NUM_TX_STATS +
Michal Suchanek 64cbcb
 		       adapter->req_rx_queues * NUM_RX_STATS;
Michal Suchanek 64cbcb
-	case ETH_SS_PRIV_FLAGS:
Michal Suchanek 64cbcb
-		return ARRAY_SIZE(ibmvnic_priv_flags);
Michal Suchanek 64cbcb
 	default:
Michal Suchanek 64cbcb
 		return -EOPNOTSUPP;
Michal Suchanek 64cbcb
 	}
Michal Suchanek 64cbcb
@@ -3107,26 +3070,6 @@ static void ibmvnic_get_ethtool_stats(struct net_device *dev,
Michal Suchanek 64cbcb
 	}
Michal Suchanek 64cbcb
 }
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
-static u32 ibmvnic_get_priv_flags(struct net_device *netdev)
Michal Suchanek 64cbcb
-{
Michal Suchanek 64cbcb
-	struct ibmvnic_adapter *adapter = netdev_priv(netdev);
Michal Suchanek 64cbcb
-
Michal Suchanek 64cbcb
-	return adapter->priv_flags;
Michal Suchanek 64cbcb
-}
Michal Suchanek 64cbcb
-
Michal Suchanek 64cbcb
-static int ibmvnic_set_priv_flags(struct net_device *netdev, u32 flags)
Michal Suchanek 64cbcb
-{
Michal Suchanek 64cbcb
-	struct ibmvnic_adapter *adapter = netdev_priv(netdev);
Michal Suchanek 64cbcb
-	bool which_maxes = !!(flags & IBMVNIC_USE_SERVER_MAXES);
Michal Suchanek 64cbcb
-
Michal Suchanek 64cbcb
-	if (which_maxes)
Michal Suchanek 64cbcb
-		adapter->priv_flags |= IBMVNIC_USE_SERVER_MAXES;
Michal Suchanek 64cbcb
-	else
Michal Suchanek 64cbcb
-		adapter->priv_flags &= ~IBMVNIC_USE_SERVER_MAXES;
Michal Suchanek 64cbcb
-
Michal Suchanek 64cbcb
-	return 0;
Michal Suchanek 64cbcb
-}
Michal Suchanek 64cbcb
-
Michal Suchanek 64cbcb
 static const struct ethtool_ops ibmvnic_ethtool_ops = {
Michal Suchanek 64cbcb
 	.get_drvinfo		= ibmvnic_get_drvinfo,
Michal Suchanek 64cbcb
 	.get_msglevel		= ibmvnic_get_msglevel,
Michal Suchanek 64cbcb
@@ -3140,8 +3083,6 @@ static const struct ethtool_ops ibmvnic_ethtool_ops = {
Michal Suchanek 64cbcb
 	.get_sset_count         = ibmvnic_get_sset_count,
Michal Suchanek 64cbcb
 	.get_ethtool_stats	= ibmvnic_get_ethtool_stats,
Michal Suchanek 64cbcb
 	.get_link_ksettings	= ibmvnic_get_link_ksettings,
Michal Suchanek 64cbcb
-	.get_priv_flags		= ibmvnic_get_priv_flags,
Michal Suchanek 64cbcb
-	.set_priv_flags		= ibmvnic_set_priv_flags,
Michal Suchanek 64cbcb
 };
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
 /* Routines for managing CRQs/sCRQs  */
Michal Suchanek 64cbcb
diff --git a/drivers/net/ethernet/ibm/ibmvnic.h b/drivers/net/ethernet/ibm/ibmvnic.h
Michal Suchanek 64cbcb
index 9fc4d3068018..d87f88d1552d 100644
Michal Suchanek 64cbcb
--- a/drivers/net/ethernet/ibm/ibmvnic.h
Michal Suchanek 64cbcb
+++ b/drivers/net/ethernet/ibm/ibmvnic.h
Michal Suchanek 64cbcb
@@ -52,11 +52,6 @@
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
 #define IBMVNIC_RESET_DELAY 100
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
-static const char ibmvnic_priv_flags[][ETH_GSTRING_LEN] = {
Michal Suchanek 64cbcb
-#define IBMVNIC_USE_SERVER_MAXES 0x1
Michal Suchanek 64cbcb
-	"use-server-maxes"
Michal Suchanek 64cbcb
-};
Michal Suchanek 64cbcb
-
Michal Suchanek 64cbcb
 struct ibmvnic_login_buffer {
Michal Suchanek 64cbcb
 	__be32 len;
Michal Suchanek 64cbcb
 	__be32 version;
Michal Suchanek 64cbcb
@@ -895,7 +890,6 @@ struct ibmvnic_adapter {
Michal Suchanek 64cbcb
 	struct ibmvnic_control_ip_offload_buffer ip_offload_ctrl;
Michal Suchanek 64cbcb
 	dma_addr_t ip_offload_ctrl_tok;
Michal Suchanek 64cbcb
 	u32 msg_enable;
Michal Suchanek 64cbcb
-	u32 priv_flags;
Michal Suchanek 64cbcb
 
Michal Suchanek 64cbcb
 	/* Vital Product Data (VPD) */
Michal Suchanek 64cbcb
 	struct ibmvnic_vpd *vpd;
Michal Suchanek 64cbcb
-- 
Michal Suchanek 64cbcb
2.34.1
Michal Suchanek 64cbcb