184 lines
6.5 KiB
Diff
184 lines
6.5 KiB
Diff
From ee9b56e619331100993c4682ba0d344ce959a44a Mon Sep 17 00:00:00 2001
|
|
From: Hao Chen <chenhao288@hisilicon.com>
|
|
Date: Mon, 27 Dec 2021 19:41:42 +0800
|
|
Subject: [PATCH 168/283] net: hns3: add support to set/get rx buf len via
|
|
ethtool for hns3 driver
|
|
|
|
mainline inclusion
|
|
from mainline-v5.17-rc1
|
|
commit e65a0231d2caf7d30548964c7bba4c3016dea1d2
|
|
category: feature
|
|
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EN3D
|
|
CVE: NA
|
|
|
|
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e65a0231d2caf7d30548964c7bba4c3016dea1d2
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
Rx buf len is for rx BD buffer size, support setting it via ethtool -G
|
|
parameter and getting it via ethtool -g parameter.
|
|
|
|
Signed-off-by: Hao Chen <chenhao288@hisilicon.com>
|
|
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
|
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
|
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
|
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
|
|
|
Conflicts:
|
|
drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
---
|
|
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 52 ++++++++++++++++---
|
|
1 file changed, 44 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
index 8da002d6d0b9..752cc41f529e 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
@@ -655,7 +655,7 @@ static void hns3_get_ringparam(struct net_device *netdev,
|
|
{
|
|
struct hns3_nic_priv *priv = netdev_priv(netdev);
|
|
struct hnae3_handle *h = priv->ae_handle;
|
|
- int queue_num = h->kinfo.num_tqps;
|
|
+ int rx_queue_index = h->kinfo.num_tqps;
|
|
|
|
if (hns3_nic_resetting(netdev)) {
|
|
netdev_err(netdev, "dev resetting!");
|
|
@@ -666,7 +666,8 @@ static void hns3_get_ringparam(struct net_device *netdev,
|
|
param->rx_max_pending = HNS3_RING_MAX_PENDING;
|
|
|
|
param->tx_pending = priv->ring[0].desc_num;
|
|
- param->rx_pending = priv->ring[queue_num].desc_num;
|
|
+ param->rx_pending = priv->ring[rx_queue_index].desc_num;
|
|
+ kernel_param->rx_buf_len = priv->ring[rx_queue_index].buf_size;
|
|
}
|
|
|
|
static void hns3_get_pauseparam(struct net_device *netdev,
|
|
@@ -1065,14 +1066,23 @@ static struct hns3_enet_ring *hns3_backup_ringparam(struct hns3_nic_priv *priv)
|
|
}
|
|
|
|
static int hns3_check_ringparam(struct net_device *ndev,
|
|
- struct ethtool_ringparam *param)
|
|
+ struct ethtool_ringparam *param,
|
|
+ struct kernel_ethtool_ringparam *kernel_param)
|
|
{
|
|
+#define RX_BUF_LEN_2K 2048
|
|
+#define RX_BUF_LEN_4K 4096
|
|
if (hns3_nic_resetting(ndev))
|
|
return -EBUSY;
|
|
|
|
if (param->rx_mini_pending || param->rx_jumbo_pending)
|
|
return -EINVAL;
|
|
|
|
+ if (kernel_param->rx_buf_len != RX_BUF_LEN_2K &&
|
|
+ kernel_param->rx_buf_len != RX_BUF_LEN_4K) {
|
|
+ netdev_err(ndev, "Rx buf len only support 2048 and 4096\n");
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
if (param->tx_pending > HNS3_RING_MAX_PENDING ||
|
|
param->tx_pending < HNS3_RING_MIN_PENDING ||
|
|
param->rx_pending > HNS3_RING_MAX_PENDING ||
|
|
@@ -1085,6 +1095,22 @@ static int hns3_check_ringparam(struct net_device *ndev,
|
|
return 0;
|
|
}
|
|
|
|
+static int hns3_change_rx_buf_len(struct net_device *ndev, u32 rx_buf_len)
|
|
+{
|
|
+ struct hns3_nic_priv *priv = netdev_priv(ndev);
|
|
+ struct hnae3_handle *h = priv->ae_handle;
|
|
+ int i;
|
|
+
|
|
+ h->kinfo.rx_buf_len = rx_buf_len;
|
|
+
|
|
+ for (i = 0; i < h->kinfo.num_tqps; i++) {
|
|
+ h->kinfo.tqp[i]->buf_size = rx_buf_len;
|
|
+ priv->ring[i + h->kinfo.num_tqps].buf_size = rx_buf_len;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static int hns3_set_ringparam(struct net_device *ndev,
|
|
struct ethtool_ringparam *param)
|
|
{
|
|
@@ -1095,9 +1121,10 @@ static int hns3_set_ringparam(struct net_device *ndev,
|
|
u32 old_rx_desc_num, new_rx_desc_num;
|
|
u16 queue_num = h->kinfo.num_tqps;
|
|
struct hns3_enet_ring *tmp_rings;
|
|
+ u32 old_rx_buf_len;
|
|
int ret, i;
|
|
|
|
- ret = hns3_check_ringparam(ndev, param);
|
|
+ ret = hns3_check_ringparam(ndev, param, kernel_param);
|
|
if (ret)
|
|
return ret;
|
|
|
|
@@ -1106,8 +1133,10 @@ static int hns3_set_ringparam(struct net_device *ndev,
|
|
new_rx_desc_num = ALIGN(param->rx_pending, HNS3_RING_BD_MULTIPLE);
|
|
old_tx_desc_num = priv->ring[0].desc_num;
|
|
old_rx_desc_num = priv->ring[queue_num].desc_num;
|
|
+ old_rx_buf_len = priv->ring[queue_num].buf_size;
|
|
if (old_tx_desc_num == new_tx_desc_num &&
|
|
- old_rx_desc_num == new_rx_desc_num)
|
|
+ old_rx_desc_num == new_rx_desc_num &&
|
|
+ kernel_param->rx_buf_len == old_rx_buf_len)
|
|
return 0;
|
|
|
|
tmp_rings = hns3_backup_ringparam(priv);
|
|
@@ -1118,19 +1147,22 @@ static int hns3_set_ringparam(struct net_device *ndev,
|
|
}
|
|
|
|
netdev_info(ndev,
|
|
- "Changing Tx/Rx ring depth from %u/%u to %u/%u\n",
|
|
+ "Changing Tx/Rx ring depth from %u/%u to %u/%u, Changing rx buffer len from %d to %d\n",
|
|
old_tx_desc_num, old_rx_desc_num,
|
|
- new_tx_desc_num, new_rx_desc_num);
|
|
+ new_tx_desc_num, new_rx_desc_num,
|
|
+ old_rx_buf_len, kernel_param->rx_buf_len);
|
|
|
|
if (if_running)
|
|
ndev->netdev_ops->ndo_stop(ndev);
|
|
|
|
hns3_change_all_ring_bd_num(priv, new_tx_desc_num, new_rx_desc_num);
|
|
+ hns3_change_rx_buf_len(ndev, kernel_param->rx_buf_len);
|
|
ret = hns3_init_all_ring(priv);
|
|
if (ret) {
|
|
- netdev_err(ndev, "Change bd num fail, revert to old value(%d)\n",
|
|
+ netdev_err(ndev, "set ringparam fail, revert to old value(%d)\n",
|
|
ret);
|
|
|
|
+ hns3_change_rx_buf_len(ndev, old_rx_buf_len);
|
|
hns3_change_all_ring_bd_num(priv, old_tx_desc_num,
|
|
old_rx_desc_num);
|
|
for (i = 0; i < h->kinfo.num_tqps * 2; i++)
|
|
@@ -1792,6 +1824,8 @@ static int hns3_set_tunable(struct net_device *netdev,
|
|
ETHTOOL_COALESCE_TX_USECS_HIGH | \
|
|
ETHTOOL_COALESCE_MAX_FRAMES)
|
|
|
|
+#define HNS3_ETHTOOL_RING ETHTOOL_RING_USE_RX_BUF_LEN
|
|
+
|
|
static int hns3_get_ts_info(struct net_device *netdev,
|
|
struct ethtool_ts_info *info)
|
|
{
|
|
@@ -1870,6 +1904,7 @@ static int hns3_get_link_ext_state(struct net_device *netdev,
|
|
|
|
static const struct ethtool_ops hns3vf_ethtool_ops = {
|
|
.supported_coalesce_params = HNS3_ETHTOOL_COALESCE,
|
|
+ .supported_ring_params = HNS3_ETHTOOL_RING,
|
|
.get_drvinfo = hns3_get_drvinfo,
|
|
.get_ringparam = hns3_get_ringparam,
|
|
.set_ringparam = hns3_set_ringparam,
|
|
@@ -1901,6 +1936,7 @@ static const struct ethtool_ops hns3vf_ethtool_ops = {
|
|
|
|
static const struct ethtool_ops hns3_ethtool_ops = {
|
|
.supported_coalesce_params = HNS3_ETHTOOL_COALESCE,
|
|
+ .supported_ring_params = HNS3_ETHTOOL_RING,
|
|
.self_test = hns3_self_test,
|
|
.get_drvinfo = hns3_get_drvinfo,
|
|
.get_link = hns3_get_link,
|
|
--
|
|
2.34.1
|
|
|