net/hns3: support wait in link update
authorHuisong Li <lihuisong@huawei.com>
Tue, 30 Mar 2021 12:53:25 +0000 (20:53 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Thu, 8 Apr 2021 14:12:42 +0000 (16:12 +0200)
There are two APIs in ethdev layer to get link status of device, namely,
"rte_eth_link_get" and "rte_eth_link_get_nowait". When the device link
is unstable or auto-negotiation is in progress, the first API supports
the function of waiting for the NIC to link up, and the maximum waiting
time is 9 seconds based on DPDK Documentation. For the hns3 PMD driver,
the link can be established within 2 seconds.

Signed-off-by: Huisong Li <lihuisong@huawei.com>
Signed-off-by: Min Hu (Connor) <humin29@huawei.com>
drivers/net/hns3/hns3_ethdev.c

index a9e2e93..ca59a80 100644 (file)
@@ -2779,19 +2779,31 @@ hns3_setup_linkstatus(struct rte_eth_dev *eth_dev,
 }
 
 static int
-hns3_dev_link_update(struct rte_eth_dev *eth_dev,
-                    __rte_unused int wait_to_complete)
+hns3_dev_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete)
 {
+#define HNS3_LINK_CHECK_INTERVAL 100  /* 100ms */
+#define HNS3_MAX_LINK_CHECK_TIMES 20  /* 2s (100 * 20ms) in total */
+
        struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
+       uint32_t retry_cnt = HNS3_MAX_LINK_CHECK_TIMES;
        struct hns3_mac *mac = &hw->mac;
        struct rte_eth_link new_link;
        int ret;
 
-       ret = hns3_update_port_link_info(eth_dev);
-       if (ret) {
-               mac->link_status = ETH_LINK_DOWN;
-               hns3_err(hw, "failed to get port link info, ret = %d.", ret);
-       }
+       do {
+               ret = hns3_update_port_link_info(eth_dev);
+               if (ret) {
+                       mac->link_status = ETH_LINK_DOWN;
+                       hns3_err(hw, "failed to get port link info, ret = %d.",
+                                ret);
+                       break;
+               }
+
+               if (!wait_to_complete || mac->link_status == ETH_LINK_UP)
+                       break;
+
+               rte_delay_ms(HNS3_LINK_CHECK_INTERVAL);
+       } while (retry_cnt--);
 
        memset(&new_link, 0, sizeof(new_link));
        hns3_setup_linkstatus(eth_dev, &new_link);