| From 7b3fd1f063c6ede79a5d74a401ac6db014f73651 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 30 Aug 2021 14:06:37 +0800 |
| Subject: net: hns3: reconstruct function hns3_self_test |
| |
| From: Peng Li <lipeng321@huawei.com> |
| |
| [ Upstream commit 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| .../ethernet/hisilicon/hns3/hns3_ethtool.c | 101 +++++++++++------- |
| 1 file changed, 64 insertions(+), 37 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c |
| index 0aee100902ff..436d777cce06 100644 |
| --- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c |
| +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c |
| @@ -300,33 +300,8 @@ static int hns3_lp_run_test(struct net_device *ndev, enum hnae3_loop mode) |
| return ret_val; |
| } |
| |
| -/** |
| - * hns3_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); |
| - 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; |
| - |
| - netif_dbg(h, drv, ndev, "self test start"); |
| - |
| st_param[HNAE3_LOOP_APP][0] = HNAE3_LOOP_APP; |
| st_param[HNAE3_LOOP_APP][1] = |
| h->flags & HNAE3_SUPPORT_APP_LOOPBACK; |
| @@ -343,6 +318,18 @@ 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); |
| @@ -361,6 +348,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]; |
| @@ -379,21 +395,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 (h->ae_algo->ops->enable_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; |
| |
| - netif_dbg(h, drv, 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 int hns3_get_sset_count(struct net_device *netdev, int stringset) |
| -- |
| 2.33.0 |
| |