| From c80111b7b83459c697b2001fe4346e0be246e896 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 28 Nov 2020 11:51:50 +0800 |
| Subject: net: hns3: keep MAC pause mode when multiple TCs are enabled |
| |
| From: Yonglong Liu <liuyonglong@huawei.com> |
| |
| [ Upstream commit d78e5b6a6764cb6e83668806b63d74566db36399 ] |
| |
| Bellow HNAE3_DEVICE_VERSION_V3, MAC pause mode just support one |
| TC, when enabled multiple TCs, force enable PFC mode. |
| |
| HNAE3_DEVICE_VERSION_V3 can support MAC pause mode on multiple |
| TCs, so when enable multiple TCs, just keep MAC pause mode, |
| and enable PFC mode just according to the user settings. |
| |
| Signed-off-by: Yonglong Liu <liuyonglong@huawei.com> |
| Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com> |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| .../ethernet/hisilicon/hns3/hns3pf/hclge_tm.c | 23 ++++++++++++++++++- |
| 1 file changed, 22 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c |
| index e8495f58a1a8..42e82bf69b8e 100644 |
| --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c |
| +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c |
| @@ -682,7 +682,7 @@ static void hclge_tm_pg_info_init(struct hclge_dev *hdev) |
| } |
| } |
| |
| -static void hclge_pfc_info_init(struct hclge_dev *hdev) |
| +static void hclge_update_fc_mode_by_dcb_flag(struct hclge_dev *hdev) |
| { |
| if (!(hdev->flag & HCLGE_FLAG_DCB_ENABLE)) { |
| if (hdev->fc_mode_last_time == HCLGE_FC_PFC) |
| @@ -700,6 +700,27 @@ static void hclge_pfc_info_init(struct hclge_dev *hdev) |
| } |
| } |
| |
| +static void hclge_update_fc_mode(struct hclge_dev *hdev) |
| +{ |
| + if (!hdev->tm_info.pfc_en) { |
| + hdev->tm_info.fc_mode = hdev->fc_mode_last_time; |
| + return; |
| + } |
| + |
| + if (hdev->tm_info.fc_mode != HCLGE_FC_PFC) { |
| + hdev->fc_mode_last_time = hdev->tm_info.fc_mode; |
| + hdev->tm_info.fc_mode = HCLGE_FC_PFC; |
| + } |
| +} |
| + |
| +static void hclge_pfc_info_init(struct hclge_dev *hdev) |
| +{ |
| + if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V3) |
| + hclge_update_fc_mode(hdev); |
| + else |
| + hclge_update_fc_mode_by_dcb_flag(hdev); |
| +} |
| + |
| static void hclge_tm_schd_info_init(struct hclge_dev *hdev) |
| { |
| hclge_tm_pg_info_init(hdev); |
| -- |
| 2.33.0 |
| |