net: hns3: modify how pause options is displayed
authorYonglong Liu <liuyonglong@huawei.com>
Fri, 9 Aug 2019 02:31:11 +0000 (10:31 +0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 9 Aug 2019 20:44:32 +0000 (13:44 -0700)
Currently, the pause options of HNS3 shown like this:
"RX/TX" is always the same with "RX negotiated/TX negotiated".
Because of the driver covered the value of "RX/TX" with the value
of "RX negotiated/TX negotiated" after adjust link.

This patch records the pause configurations of the user, and never
covered them in adjust link.

Signed-off-by: Yonglong Liu <liuyonglong@huawei.com>
Reviewed-by: Yunsheng Lin <linyunsheng@huawei.com>
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

index c0feae3a9f86671695e0396ef7ab461d379aecc7..381f19527d9dc280e6fa93c7a447b4b3352c8b05 100644 (file)
@@ -8207,28 +8207,15 @@ static int hclge_cfg_pauseparam(struct hclge_dev *hdev, u32 rx_en, u32 tx_en)
 {
        int ret;
 
-       if (rx_en && tx_en)
-               hdev->fc_mode_last_time = HCLGE_FC_FULL;
-       else if (rx_en && !tx_en)
-               hdev->fc_mode_last_time = HCLGE_FC_RX_PAUSE;
-       else if (!rx_en && tx_en)
-               hdev->fc_mode_last_time = HCLGE_FC_TX_PAUSE;
-       else
-               hdev->fc_mode_last_time = HCLGE_FC_NONE;
-
        if (hdev->tm_info.fc_mode == HCLGE_FC_PFC)
                return 0;
 
        ret = hclge_mac_pause_en_cfg(hdev, tx_en, rx_en);
-       if (ret) {
-               dev_err(&hdev->pdev->dev, "configure pauseparam error, ret = %d.\n",
-                       ret);
-               return ret;
-       }
-
-       hdev->tm_info.fc_mode = hdev->fc_mode_last_time;
+       if (ret)
+               dev_err(&hdev->pdev->dev,
+                       "configure pauseparam error, ret = %d.\n", ret);
 
-       return 0;
+       return ret;
 }
 
 int hclge_cfg_flowctrl(struct hclge_dev *hdev)
@@ -8293,6 +8280,21 @@ static void hclge_get_pauseparam(struct hnae3_handle *handle, u32 *auto_neg,
        }
 }
 
+static void hclge_record_user_pauseparam(struct hclge_dev *hdev,
+                                        u32 rx_en, u32 tx_en)
+{
+       if (rx_en && tx_en)
+               hdev->fc_mode_last_time = HCLGE_FC_FULL;
+       else if (rx_en && !tx_en)
+               hdev->fc_mode_last_time = HCLGE_FC_RX_PAUSE;
+       else if (!rx_en && tx_en)
+               hdev->fc_mode_last_time = HCLGE_FC_TX_PAUSE;
+       else
+               hdev->fc_mode_last_time = HCLGE_FC_NONE;
+
+       hdev->tm_info.fc_mode = hdev->fc_mode_last_time;
+}
+
 static int hclge_set_pauseparam(struct hnae3_handle *handle, u32 auto_neg,
                                u32 rx_en, u32 tx_en)
 {
@@ -8318,6 +8320,8 @@ static int hclge_set_pauseparam(struct hnae3_handle *handle, u32 auto_neg,
 
        hclge_set_flowctrl_adv(hdev, rx_en, tx_en);
 
+       hclge_record_user_pauseparam(hdev, rx_en, tx_en);
+
        if (!auto_neg)
                return hclge_cfg_pauseparam(hdev, rx_en, tx_en);