164 lines
5.4 KiB
Diff
164 lines
5.4 KiB
Diff
From 45cf3372a56d4606fbd6e0483be31c4c819cd56c Mon Sep 17 00:00:00 2001
|
|
From: Hao Chen <chenhao288@hisilicon.com>
|
|
Date: Mon, 27 Dec 2021 19:41:39 +0800
|
|
Subject: [PATCH 166/283] net: hns3: add support to set/get tx copybreak buf
|
|
size via ethtool for hns3 driver
|
|
|
|
mainline inclusion
|
|
from mainline-v5.17-rc1
|
|
commit e445f08af2b15035474439fbbb8649f466ad2501
|
|
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=e445f08af2b15035474439fbbb8649f466ad2501
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
Tx copybreak buf size is used for tx copybreak feature, the feature is
|
|
used for small size packet or frag. It adds a queue based tx shared
|
|
bounce buffer to memcpy the small packet when the len of xmitted skb is
|
|
below tx_copybreak(value to distinguish small size and normal size),
|
|
and reduce the overhead of dma map and unmap when IOMMU is on.
|
|
|
|
Support setting it via ethtool --set-tunable parameter and getting
|
|
it via ethtool --get-tunable 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>
|
|
---
|
|
.../net/ethernet/hisilicon/hns3/hns3_enet.c | 4 +-
|
|
.../net/ethernet/hisilicon/hns3/hns3_enet.h | 2 +
|
|
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 56 +++++++++++++++++++
|
|
3 files changed, 60 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
|
index 6cf947cd96eb..363b92e6298c 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
|
@@ -5165,8 +5165,8 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle)
|
|
return ret;
|
|
}
|
|
|
|
-static int hns3_reset_notify(struct hnae3_handle *handle,
|
|
- enum hnae3_reset_notify_type type)
|
|
+int hns3_reset_notify(struct hnae3_handle *handle,
|
|
+ enum hnae3_reset_notify_type type)
|
|
{
|
|
int ret = 0;
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
|
index 433422fda7b8..f889ec9fc24e 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
|
@@ -695,6 +695,8 @@ void hns3_set_vector_coalesce_tx_ql(struct hns3_enet_tqp_vector *tqp_vector,
|
|
u32 ql_value);
|
|
|
|
void hns3_request_update_promisc_mode(struct hnae3_handle *handle);
|
|
+int hns3_reset_notify(struct hnae3_handle *handle,
|
|
+ enum hnae3_reset_notify_type type);
|
|
|
|
#ifdef CONFIG_HNS3_DCB
|
|
void hns3_dcbnl_setup(struct hnae3_handle *handle);
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
index f7bb9c85e243..8da002d6d0b9 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
@@ -1681,6 +1681,7 @@ static int hns3_get_tunable(struct net_device *netdev,
|
|
void *data)
|
|
{
|
|
struct hns3_nic_priv *priv = netdev_priv(netdev);
|
|
+ struct hnae3_handle *h = priv->ae_handle;
|
|
int ret = 0;
|
|
|
|
switch (tuna->id) {
|
|
@@ -1691,6 +1692,9 @@ static int hns3_get_tunable(struct net_device *netdev,
|
|
case ETHTOOL_RX_COPYBREAK:
|
|
*(u32 *)data = priv->rx_copybreak;
|
|
break;
|
|
+ case ETHTOOL_TX_COPYBREAK_BUF_SIZE:
|
|
+ *(u32 *)data = h->kinfo.tx_spare_buf_size;
|
|
+ break;
|
|
default:
|
|
ret = -EOPNOTSUPP;
|
|
break;
|
|
@@ -1699,11 +1703,43 @@ static int hns3_get_tunable(struct net_device *netdev,
|
|
return ret;
|
|
}
|
|
|
|
+static int hns3_set_tx_spare_buf_size(struct net_device *netdev,
|
|
+ u32 data)
|
|
+{
|
|
+ struct hns3_nic_priv *priv = netdev_priv(netdev);
|
|
+ struct hnae3_handle *h = priv->ae_handle;
|
|
+ int ret;
|
|
+
|
|
+ if (hns3_nic_resetting(netdev))
|
|
+ return -EBUSY;
|
|
+
|
|
+ h->kinfo.tx_spare_buf_size = data;
|
|
+
|
|
+ ret = hns3_reset_notify(h, HNAE3_DOWN_CLIENT);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ ret = hns3_reset_notify(h, HNAE3_UNINIT_CLIENT);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ ret = hns3_reset_notify(h, HNAE3_INIT_CLIENT);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ ret = hns3_reset_notify(h, HNAE3_UP_CLIENT);
|
|
+ if (ret)
|
|
+ hns3_reset_notify(h, HNAE3_UNINIT_CLIENT);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
static int hns3_set_tunable(struct net_device *netdev,
|
|
const struct ethtool_tunable *tuna,
|
|
const void *data)
|
|
{
|
|
struct hns3_nic_priv *priv = netdev_priv(netdev);
|
|
+ u32 old_tx_spare_buf_size, new_tx_spare_buf_size;
|
|
struct hnae3_handle *h = priv->ae_handle;
|
|
int i, ret = 0;
|
|
|
|
@@ -1721,6 +1757,26 @@ static int hns3_set_tunable(struct net_device *netdev,
|
|
for (i = h->kinfo.num_tqps; i < h->kinfo.num_tqps * 2; i++)
|
|
priv->ring[i].rx_copybreak = priv->rx_copybreak;
|
|
|
|
+ break;
|
|
+ case ETHTOOL_TX_COPYBREAK_BUF_SIZE:
|
|
+ old_tx_spare_buf_size = h->kinfo.tx_spare_buf_size;
|
|
+ new_tx_spare_buf_size = *(u32 *)data;
|
|
+ ret = hns3_set_tx_spare_buf_size(netdev, new_tx_spare_buf_size);
|
|
+ if (ret) {
|
|
+ int ret1;
|
|
+
|
|
+ netdev_warn(netdev,
|
|
+ "change tx spare buf size fail, revert to old value\n");
|
|
+ ret1 = hns3_set_tx_spare_buf_size(netdev,
|
|
+ old_tx_spare_buf_size);
|
|
+ if (ret1) {
|
|
+ netdev_err(netdev,
|
|
+ "revert to old tx spare buf size fail\n");
|
|
+ return ret1;
|
|
+ }
|
|
+
|
|
+ return ret;
|
|
+ }
|
|
break;
|
|
default:
|
|
ret = -EOPNOTSUPP;
|
|
--
|
|
2.34.1
|
|
|