net: hns3: refactor the loopback related function
authorYunsheng Lin <linyunsheng@huawei.com>
Wed, 9 May 2018 16:24:41 +0000 (17:24 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 10 May 2018 21:27:10 +0000 (17:27 -0400)
This patch refactors the loopback related function in order
to support the serdes loopback.

Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
Signed-off-by: Peng Li <lipeng321@huawei.com>
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

index eb3c34f3cf87b93d80f5a28cfc6cca2b29672c75..c16bb6cb0564d65f3461336a7d672ba7dce6e45d 100644 (file)
@@ -74,7 +74,7 @@ struct hns3_link_mode_mapping {
        u32 ethtool_link_mode;
 };
 
-static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop)
+static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop, bool en)
 {
        struct hnae3_handle *h = hns3_get_handle(ndev);
        int ret;
@@ -85,11 +85,7 @@ static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop)
 
        switch (loop) {
        case HNAE3_MAC_INTER_LOOP_MAC:
-               ret = h->ae_algo->ops->set_loopback(h, loop, true);
-               break;
-       case HNAE3_MAC_LOOP_NONE:
-               ret = h->ae_algo->ops->set_loopback(h,
-                       HNAE3_MAC_INTER_LOOP_MAC, false);
+               ret = h->ae_algo->ops->set_loopback(h, loop, en);
                break;
        default:
                ret = -ENOTSUPP;
@@ -99,10 +95,7 @@ static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop)
        if (ret)
                return ret;
 
-       if (loop == HNAE3_MAC_LOOP_NONE)
-               h->ae_algo->ops->set_promisc_mode(h, ndev->flags & IFF_PROMISC);
-       else
-               h->ae_algo->ops->set_promisc_mode(h, 1);
+       h->ae_algo->ops->set_promisc_mode(h, en);
 
        return ret;
 }
@@ -122,13 +115,13 @@ static int hns3_lp_up(struct net_device *ndev, enum hnae3_loop loop_mode)
                return ret;
        }
 
-       ret = hns3_lp_setup(ndev, loop_mode);
+       ret = hns3_lp_setup(ndev, loop_mode, true);
        usleep_range(10000, 20000);
 
        return ret;
 }
 
-static int hns3_lp_down(struct net_device *ndev)
+static int hns3_lp_down(struct net_device *ndev, enum hnae3_loop loop_mode)
 {
        struct hnae3_handle *h = hns3_get_handle(ndev);
        int ret;
@@ -136,7 +129,7 @@ static int hns3_lp_down(struct net_device *ndev)
        if (!h->ae_algo->ops->stop)
                return -EOPNOTSUPP;
 
-       ret = hns3_lp_setup(ndev, HNAE3_MAC_LOOP_NONE);
+       ret = hns3_lp_setup(ndev, loop_mode, false);
        if (ret) {
                netdev_err(ndev, "lb_setup return error: %d\n", ret);
                return ret;
@@ -332,7 +325,7 @@ static void hns3_self_test(struct net_device *ndev,
                data[test_index] = hns3_lp_up(ndev, loop_type);
                if (!data[test_index]) {
                        data[test_index] = hns3_lp_run_test(ndev, loop_type);
-                       hns3_lp_down(ndev);
+                       hns3_lp_down(ndev, loop_type);
                }
 
                if (data[test_index])
index 084b90437e23ee95b68f8de1566ccd7365c8ee5a..316ec842789188a1d4df227f8e4e47591f5bcd5b 100644 (file)
@@ -3682,48 +3682,50 @@ static void hclge_cfg_mac_mode(struct hclge_dev *hdev, bool enable)
                        "mac enable fail, ret =%d.\n", ret);
 }
 
-static int hclge_set_loopback(struct hnae3_handle *handle,
-                             enum hnae3_loop loop_mode, bool en)
+static int hclge_set_mac_loopback(struct hclge_dev *hdev, bool en)
 {
-       struct hclge_vport *vport = hclge_get_vport(handle);
        struct hclge_config_mac_mode_cmd *req;
-       struct hclge_dev *hdev = vport->back;
        struct hclge_desc desc;
        u32 loop_en;
        int ret;
 
-       switch (loop_mode) {
-       case HNAE3_MAC_INTER_LOOP_MAC:
-               req = (struct hclge_config_mac_mode_cmd *)&desc.data[0];
-               /* 1 Read out the MAC mode config at first */
-               hclge_cmd_setup_basic_desc(&desc,
-                                          HCLGE_OPC_CONFIG_MAC_MODE,
-                                          true);
-               ret = hclge_cmd_send(&hdev->hw, &desc, 1);
-               if (ret) {
-                       dev_err(&hdev->pdev->dev,
-                               "mac loopback get fail, ret =%d.\n",
-                               ret);
-                       return ret;
-               }
+       req = (struct hclge_config_mac_mode_cmd *)&desc.data[0];
+       /* 1 Read out the MAC mode config at first */
+       hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CONFIG_MAC_MODE, true);
+       ret = hclge_cmd_send(&hdev->hw, &desc, 1);
+       if (ret) {
+               dev_err(&hdev->pdev->dev,
+                       "mac loopback get fail, ret =%d.\n", ret);
+               return ret;
+       }
 
-               /* 2 Then setup the loopback flag */
-               loop_en = le32_to_cpu(req->txrx_pad_fcs_loop_en);
-               if (en)
-                       hnae_set_bit(loop_en, HCLGE_MAC_APP_LP_B, 1);
-               else
-                       hnae_set_bit(loop_en, HCLGE_MAC_APP_LP_B, 0);
+       /* 2 Then setup the loopback flag */
+       loop_en = le32_to_cpu(req->txrx_pad_fcs_loop_en);
+       hnae_set_bit(loop_en, HCLGE_MAC_APP_LP_B, en ? 1 : 0);
 
-               req->txrx_pad_fcs_loop_en = cpu_to_le32(loop_en);
+       req->txrx_pad_fcs_loop_en = cpu_to_le32(loop_en);
 
-               /* 3 Config mac work mode with loopback flag
-                * and its original configure parameters
-                */
-               hclge_cmd_reuse_desc(&desc, false);
-               ret = hclge_cmd_send(&hdev->hw, &desc, 1);
-               if (ret)
-                       dev_err(&hdev->pdev->dev,
-                               "mac loopback set fail, ret =%d.\n", ret);
+       /* 3 Config mac work mode with loopback flag
+        * and its original configure parameters
+        */
+       hclge_cmd_reuse_desc(&desc, false);
+       ret = hclge_cmd_send(&hdev->hw, &desc, 1);
+       if (ret)
+               dev_err(&hdev->pdev->dev,
+                       "mac loopback set fail, ret =%d.\n", ret);
+       return ret;
+}
+
+static int hclge_set_loopback(struct hnae3_handle *handle,
+                             enum hnae3_loop loop_mode, bool en)
+{
+       struct hclge_vport *vport = hclge_get_vport(handle);
+       struct hclge_dev *hdev = vport->back;
+       int ret;
+
+       switch (loop_mode) {
+       case HNAE3_MAC_INTER_LOOP_MAC:
+               ret = hclge_set_mac_loopback(hdev, en);
                break;
        default:
                ret = -ENOTSUPP;