net: hns3: fix PFC not setting problem for DCB module
authorYunsheng Lin <linyunsheng@huawei.com>
Tue, 22 Jan 2019 23:39:38 +0000 (07:39 +0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 23 Jan 2019 19:13:02 +0000 (11:13 -0800)
The PFC enabling is based on user priority, currently it is
based on TC, which may cause PFC not setting correctly when pri
to TC mapping is not one to one relation.

This patch adds pfc_en in tm_info to fix it.

Fixes: cacde272dd00 ("net: hns3: Add hclge_dcb module for the support of DCB feature")
Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
Signed-off-by: Peng Li <lipeng321@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_dcb.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c

index 7db491086feaaaca252953b9d28a35f4029d4d99..3a4a54ee52041d98535aa3d0c5db9a6bfc21bc4d 100644 (file)
@@ -296,6 +296,9 @@ static int hclge_ieee_setpfc(struct hnae3_handle *h, struct ieee_pfc *pfc)
            hdev->flag & HCLGE_FLAG_MQPRIO_ENABLE)
                return -EINVAL;
 
+       if (pfc->pfc_en == hdev->tm_info.pfc_en)
+               return 0;
+
        prio_tc = hdev->tm_info.prio_tc;
        pfc_map = 0;
 
@@ -308,10 +311,8 @@ static int hclge_ieee_setpfc(struct hnae3_handle *h, struct ieee_pfc *pfc)
                }
        }
 
-       if (pfc_map == hdev->tm_info.hw_pfc_map)
-               return 0;
-
        hdev->tm_info.hw_pfc_map = pfc_map;
+       hdev->tm_info.pfc_en = pfc->pfc_en;
 
        return hclge_pause_setup_hw(hdev, false);
 }
index b5a38fc1af91f8661ebd343b97c3425e516fcc89..2c413c63c6c9c708f7f9a99d5dbf921dea507d65 100644 (file)
@@ -325,6 +325,7 @@ struct hclge_tm_info {
        struct hclge_tc_info tc_info[HNAE3_MAX_TC];
        enum hclge_fc_mode fc_mode;
        u8 hw_pfc_map; /* Allow for packet drop or not on this TC */
+       u8 pfc_en;      /* PFC enabled or not for user priority */
 };
 
 struct hclge_comm_stats_str {
index bad975ebe137bb514cb1b731c8fd085f43b97547..9f4069fb786be5aed3af67348b680526fb5bf4e3 100644 (file)
@@ -1215,7 +1215,7 @@ static int hclge_pfc_setup_hw(struct hclge_dev *hdev)
                                HCLGE_RX_MAC_PAUSE_EN_MSK;
 
        return hclge_pfc_pause_en_cfg(hdev, enable_bitmap,
-                                     hdev->tm_info.hw_pfc_map);
+                                     hdev->tm_info.pfc_en);
 }
 
 /* Each Tc has a 1024 queue sets to backpress, it divides to