net: hns3: add support for external loopback test
[platform/kernel/linux-starfive.git] / drivers / net / ethernet / hisilicon / hns3 / hns3pf / hclge_main.c
index c760fed..d7278d9 100644 (file)
@@ -149,10 +149,11 @@ static const u32 tqp_intr_reg_addr_list[] = {HCLGE_TQP_INTR_CTRL_REG,
                                             HCLGE_TQP_INTR_RL_REG};
 
 static const char hns3_nic_test_strs[][ETH_GSTRING_LEN] = {
-       "App    Loopback test",
-       "Serdes serial Loopback test",
-       "Serdes parallel Loopback test",
-       "Phy    Loopback test"
+       "External Loopback test",
+       "App      Loopback test",
+       "Serdes   serial Loopback test",
+       "Serdes   parallel Loopback test",
+       "Phy      Loopback test"
 };
 
 static const struct hclge_comm_stats_str g_mac_stats_string[] = {
@@ -718,7 +719,8 @@ static int hclge_get_sset_count(struct hnae3_handle *handle, int stringset)
 #define HCLGE_LOOPBACK_TEST_FLAGS (HNAE3_SUPPORT_APP_LOOPBACK | \
                HNAE3_SUPPORT_PHY_LOOPBACK | \
                HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK | \
-               HNAE3_SUPPORT_SERDES_PARALLEL_LOOPBACK)
+               HNAE3_SUPPORT_SERDES_PARALLEL_LOOPBACK | \
+               HNAE3_SUPPORT_EXTERNAL_LOOPBACK)
 
        struct hclge_vport *vport = hclge_get_vport(handle);
        struct hclge_dev *hdev = vport->back;
@@ -740,9 +742,12 @@ static int hclge_get_sset_count(struct hnae3_handle *handle, int stringset)
                        handle->flags |= HNAE3_SUPPORT_APP_LOOPBACK;
                }
 
-               count += 2;
+               count += 1;
                handle->flags |= HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK;
+               count += 1;
                handle->flags |= HNAE3_SUPPORT_SERDES_PARALLEL_LOOPBACK;
+               count += 1;
+               handle->flags |= HNAE3_SUPPORT_EXTERNAL_LOOPBACK;
 
                if ((hdev->hw.mac.phydev && hdev->hw.mac.phydev->drv &&
                     hdev->hw.mac.phydev->drv->set_loopback) ||
@@ -773,6 +778,11 @@ static void hclge_get_strings(struct hnae3_handle *handle, u32 stringset,
                                           size, p);
                p = hclge_comm_tqps_get_strings(handle, p);
        } else if (stringset == ETH_SS_TEST) {
+               if (handle->flags & HNAE3_SUPPORT_EXTERNAL_LOOPBACK) {
+                       memcpy(p, hns3_nic_test_strs[HNAE3_LOOP_EXTERNAL],
+                              ETH_GSTRING_LEN);
+                       p += ETH_GSTRING_LEN;
+               }
                if (handle->flags & HNAE3_SUPPORT_APP_LOOPBACK) {
                        memcpy(p, hns3_nic_test_strs[HNAE3_LOOP_APP],
                               ETH_GSTRING_LEN);
@@ -7901,7 +7911,7 @@ static int hclge_set_loopback(struct hnae3_handle *handle,
 {
        struct hclge_vport *vport = hclge_get_vport(handle);
        struct hclge_dev *hdev = vport->back;
-       int ret;
+       int ret = 0;
 
        /* Loopback can be enabled in three places: SSU, MAC, and serdes. By
         * default, SSU loopback is enabled, so if the SMAC and the DMAC are
@@ -7928,6 +7938,8 @@ static int hclge_set_loopback(struct hnae3_handle *handle,
        case HNAE3_LOOP_PHY:
                ret = hclge_set_phy_loopback(hdev, en);
                break;
+       case HNAE3_LOOP_EXTERNAL:
+               break;
        default:
                ret = -ENOTSUPP;
                dev_err(&hdev->pdev->dev,