191 lines
5.7 KiB
Diff
191 lines
5.7 KiB
Diff
From e85a7e7b022c6e8518e3437b98f91dd5824c3558 Mon Sep 17 00:00:00 2001
|
|
From: Peng Li <lipeng321@huawei.com>
|
|
Date: Tue, 28 Sep 2021 11:52:10 +0800
|
|
Subject: [PATCH 118/283] net: hns3: reconstruct function hns3_self_test
|
|
|
|
mainline inclusion
|
|
from mainline-v5.15-rc1
|
|
commit 4c8dab1c709c5a715bce14efdb8f4e889d86aa04
|
|
category: feature
|
|
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMYT
|
|
CVE: NA
|
|
|
|
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4c8dab1c709c5a715bce14efdb8f4e889d86aa04
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
This patch reconstructs function hns3_self_test to reduce the code
|
|
cycle complexity and make code more concise.
|
|
|
|
Signed-off-by: Peng Li <lipeng321@huawei.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 | 111 +++++++++++-------
|
|
1 file changed, 66 insertions(+), 45 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
index 1c3d3036de35..f54d00a1e150 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
@@ -306,37 +306,8 @@ static int hns3_lp_run_test(struct net_device *ndev, enum hnae3_loop mode)
|
|
return ret_val;
|
|
}
|
|
|
|
-/**
|
|
- * hns3_nic_self_test - self test
|
|
- * @ndev: net device
|
|
- * @eth_test: test cmd
|
|
- * @data: test result
|
|
- */
|
|
-static void hns3_self_test(struct net_device *ndev,
|
|
- struct ethtool_test *eth_test, u64 *data)
|
|
+static void hns3_set_selftest_param(struct hnae3_handle *h, int (*st_param)[2])
|
|
{
|
|
- struct hns3_nic_priv *priv = netdev_priv(ndev);
|
|
- struct hnae3_handle *h = priv->ae_handle;
|
|
- int st_param[HNS3_SELF_TEST_TYPE_NUM][2];
|
|
- bool if_running = netif_running(ndev);
|
|
-#if IS_ENABLED(CONFIG_VLAN_8021Q)
|
|
- bool dis_vlan_filter;
|
|
-#endif
|
|
- int test_index = 0;
|
|
- u32 i;
|
|
-
|
|
- if (hns3_nic_resetting(ndev)) {
|
|
- netdev_err(ndev, "dev resetting!");
|
|
- return;
|
|
- }
|
|
-
|
|
- /* Only do offline selftest, or pass by default */
|
|
- if (eth_test->flags != ETH_TEST_FL_OFFLINE)
|
|
- return;
|
|
-
|
|
- if (netif_msg_ifdown(h))
|
|
- netdev_info(ndev, "self test start\n");
|
|
-
|
|
st_param[HNAE3_LOOP_APP][0] = HNAE3_LOOP_APP;
|
|
st_param[HNAE3_LOOP_APP][1] =
|
|
h->flags & HNAE3_SUPPORT_APP_LOOPBACK;
|
|
@@ -353,15 +324,26 @@ static void hns3_self_test(struct net_device *ndev,
|
|
st_param[HNAE3_LOOP_PHY][0] = HNAE3_LOOP_PHY;
|
|
st_param[HNAE3_LOOP_PHY][1] =
|
|
h->flags & HNAE3_SUPPORT_PHY_LOOPBACK;
|
|
+}
|
|
+
|
|
+static void hns3_selftest_prepare(struct net_device *ndev,
|
|
+ bool if_running, int (*st_param)[2])
|
|
+{
|
|
+ struct hns3_nic_priv *priv = netdev_priv(ndev);
|
|
+ struct hnae3_handle *h = priv->ae_handle;
|
|
+
|
|
+ if (netif_msg_ifdown(h))
|
|
+ netdev_info(ndev, "self test start\n");
|
|
+
|
|
+ hns3_set_selftest_param(h, st_param);
|
|
|
|
if (if_running)
|
|
ndev->netdev_ops->ndo_stop(ndev);
|
|
|
|
#if IS_ENABLED(CONFIG_VLAN_8021Q)
|
|
/* Disable the vlan filter for selftest does not support it */
|
|
- dis_vlan_filter = (ndev->features & NETIF_F_HW_VLAN_CTAG_FILTER) &&
|
|
- h->ae_algo->ops->enable_vlan_filter;
|
|
- if (dis_vlan_filter)
|
|
+ if (h->ae_algo->ops->enable_vlan_filter &&
|
|
+ ndev->features & NETIF_F_HW_VLAN_CTAG_FILTER)
|
|
h->ae_algo->ops->enable_vlan_filter(h, false);
|
|
#endif
|
|
|
|
@@ -373,6 +355,35 @@ static void hns3_self_test(struct net_device *ndev,
|
|
h->ae_algo->ops->halt_autoneg(h, true);
|
|
|
|
set_bit(HNS3_NIC_STATE_TESTING, &priv->state);
|
|
+}
|
|
+
|
|
+static void hns3_selftest_restore(struct net_device *ndev, bool if_running)
|
|
+{
|
|
+ struct hns3_nic_priv *priv = netdev_priv(ndev);
|
|
+ struct hnae3_handle *h = priv->ae_handle;
|
|
+
|
|
+ clear_bit(HNS3_NIC_STATE_TESTING, &priv->state);
|
|
+
|
|
+ if (h->ae_algo->ops->halt_autoneg)
|
|
+ h->ae_algo->ops->halt_autoneg(h, false);
|
|
+
|
|
+#if IS_ENABLED(CONFIG_VLAN_8021Q)
|
|
+ if (h->ae_algo->ops->enable_vlan_filter)
|
|
+ h->ae_algo->ops->enable_vlan_filter(h, true);
|
|
+#endif
|
|
+
|
|
+ if (if_running)
|
|
+ ndev->netdev_ops->ndo_open(ndev);
|
|
+
|
|
+ if (netif_msg_ifdown(h))
|
|
+ netdev_info(ndev, "self test end\n");
|
|
+}
|
|
+
|
|
+static void hns3_do_selftest(struct net_device *ndev, int (*st_param)[2],
|
|
+ struct ethtool_test *eth_test, u64 *data)
|
|
+{
|
|
+ int test_index = 0;
|
|
+ u32 i;
|
|
|
|
for (i = 0; i < HNS3_SELF_TEST_TYPE_NUM; i++) {
|
|
enum hnae3_loop loop_type = (enum hnae3_loop)st_param[i][0];
|
|
@@ -391,22 +402,32 @@ static void hns3_self_test(struct net_device *ndev,
|
|
|
|
test_index++;
|
|
}
|
|
+}
|
|
|
|
- clear_bit(HNS3_NIC_STATE_TESTING, &priv->state);
|
|
-
|
|
- if (h->ae_algo->ops->halt_autoneg)
|
|
- h->ae_algo->ops->halt_autoneg(h, false);
|
|
+/**
|
|
+ * hns3_nic_self_test - self test
|
|
+ * @ndev: net device
|
|
+ * @eth_test: test cmd
|
|
+ * @data: test result
|
|
+ */
|
|
+static void hns3_self_test(struct net_device *ndev,
|
|
+ struct ethtool_test *eth_test, u64 *data)
|
|
+{
|
|
+ int st_param[HNS3_SELF_TEST_TYPE_NUM][2];
|
|
+ bool if_running = netif_running(ndev);
|
|
|
|
-#if IS_ENABLED(CONFIG_VLAN_8021Q)
|
|
- if (dis_vlan_filter)
|
|
- h->ae_algo->ops->enable_vlan_filter(h, true);
|
|
-#endif
|
|
+ if (hns3_nic_resetting(ndev)) {
|
|
+ netdev_err(ndev, "dev resetting!");
|
|
+ return;
|
|
+ }
|
|
|
|
- if (if_running)
|
|
- ndev->netdev_ops->ndo_open(ndev);
|
|
+ /* Only do offline selftest, or pass by default */
|
|
+ if (eth_test->flags != ETH_TEST_FL_OFFLINE)
|
|
+ return;
|
|
|
|
- if (netif_msg_ifdown(h))
|
|
- netdev_info(ndev, "self test end\n");
|
|
+ hns3_selftest_prepare(ndev, if_running, st_param);
|
|
+ hns3_do_selftest(ndev, st_param, eth_test, data);
|
|
+ hns3_selftest_restore(ndev, if_running);
|
|
}
|
|
|
|
static void hns3_update_limit_promisc_mode(struct net_device *netdev,
|
|
--
|
|
2.34.1
|
|
|