From: Yunsheng Lin <linyunsh...@huawei.com>

Currently rss configuration set by user will be lost when setting
channel.

This patch fixes it by not setting rss configuration to default
if user has configured the rss.

Fixes: 09f2af6405b8 ("net: hns3: add support to modify tqps number")
Signed-off-by: Yunsheng Lin <linyunsh...@huawei.com>
Signed-off-by: Peng Li <lipeng...@huawei.com>
Signed-off-by: Huazhong Tan <tanhuazh...@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns3/hnae3.h             | 3 ++-
 drivers/net/ethernet/hisilicon/hns3/hns3_enet.c         | 6 ++++--
 drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 8 +++++++-
 3 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h 
b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
index d486748d5883..dc3db45361d3 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
@@ -433,7 +433,8 @@ struct hnae3_ae_ops {
                             struct ethtool_channels *ch);
        void (*get_tqps_and_rss_info)(struct hnae3_handle *h,
                                      u16 *alloc_tqps, u16 *max_rss_size);
-       int (*set_channels)(struct hnae3_handle *handle, u32 new_tqps_num);
+       int (*set_channels)(struct hnae3_handle *handle, u32 new_tqps_num,
+                           bool rxfh_configured);
        void (*get_flowctrl_adv)(struct hnae3_handle *handle,
                                 u32 *flowctrl_adv);
        int (*set_led_id)(struct hnae3_handle *handle,
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c 
b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
index 1f15864fb8db..544f0d2f1e12 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
@@ -4163,6 +4163,7 @@ int hns3_set_channels(struct net_device *netdev,
 {
        struct hnae3_handle *h = hns3_get_handle(netdev);
        struct hnae3_knic_private_info *kinfo = &h->kinfo;
+       bool rxfh_configured = netif_is_rxfh_configured(netdev);
        u32 new_tqp_num = ch->combined_count;
        u16 org_tqp_num;
        int ret;
@@ -4190,9 +4191,10 @@ int hns3_set_channels(struct net_device *netdev,
                return ret;
 
        org_tqp_num = h->kinfo.num_tqps;
-       ret = h->ae_algo->ops->set_channels(h, new_tqp_num);
+       ret = h->ae_algo->ops->set_channels(h, new_tqp_num, rxfh_configured);
        if (ret) {
-               ret = h->ae_algo->ops->set_channels(h, org_tqp_num);
+               ret = h->ae_algo->ops->set_channels(h, org_tqp_num,
+                                                   rxfh_configured);
                if (ret) {
                        /* If revert to old tqp failed, fatal error occurred */
                        dev_err(&netdev->dev,
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c 
b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
index bf0931c6764f..3ba8de93bc3d 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
@@ -7518,7 +7518,8 @@ static void hclge_get_tqps_and_rss_info(struct 
hnae3_handle *handle,
        *max_rss_size = hdev->rss_size_max;
 }
 
-static int hclge_set_channels(struct hnae3_handle *handle, u32 new_tqps_num)
+static int hclge_set_channels(struct hnae3_handle *handle, u32 new_tqps_num,
+                             bool rxfh_configured)
 {
        struct hclge_vport *vport = hclge_get_vport(handle);
        struct hnae3_knic_private_info *kinfo = &vport->nic.kinfo;
@@ -7557,6 +7558,10 @@ static int hclge_set_channels(struct hnae3_handle 
*handle, u32 new_tqps_num)
        if (ret)
                return ret;
 
+       /* RSS indirection table has been configuared by user */
+       if (rxfh_configured)
+               goto out;
+
        /* Reinitializes the rss indirect table according to the new RSS size */
        rss_indir = kcalloc(HCLGE_RSS_IND_TBL_SIZE, sizeof(u32), GFP_KERNEL);
        if (!rss_indir)
@@ -7572,6 +7577,7 @@ static int hclge_set_channels(struct hnae3_handle 
*handle, u32 new_tqps_num)
 
        kfree(rss_indir);
 
+out:
        if (!ret)
                dev_info(&hdev->pdev->dev,
                         "Channels changed, rss_size from %d to %d, tqps from 
%d to %d",
-- 
2.20.1


Reply via email to