net: hns3: fix RSS config lost after VF reset.
authorGuojia Liao <liaoguojia@huawei.com>
Sat, 28 Mar 2020 07:09:57 +0000 (15:09 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 30 Mar 2020 17:57:53 +0000 (10:57 -0700)
Currently, VF's RSS configuration would be set to default
after VF reset, the the user's one will loss.

To fix it, this patch separates hclgevf_rss_init_hw() into
two parts, one sets up the default RSS configuration and
just be called when driver loading, one configures the hardware
and be called by driver loading or reset.

Fixes: d97b30721301 ("net: hns3: Add RSS tuples support for VF")
Signed-off-by: Guojia Liao <liaoguojia@huawei.com>
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c

index 3c58f0bbaebff085b46b25139729ea6a4660ef9a..768240f5dc4a2dbbe3926fd571921fa46df54498 100644 (file)
@@ -2124,50 +2124,51 @@ static int hclgevf_config_gro(struct hclgevf_dev *hdev, bool en)
        return ret;
 }
 
-static int hclgevf_rss_init_hw(struct hclgevf_dev *hdev)
+static void hclgevf_rss_init_cfg(struct hclgevf_dev *hdev)
 {
        struct hclgevf_rss_cfg *rss_cfg = &hdev->rss_cfg;
-       int ret;
+       struct hclgevf_rss_tuple_cfg *tuple_sets;
        u32 i;
 
+       rss_cfg->hash_algo = HCLGEVF_RSS_HASH_ALGO_TOEPLITZ;
        rss_cfg->rss_size = hdev->nic.kinfo.rss_size;
-
+       tuple_sets = &rss_cfg->rss_tuple_sets;
        if (hdev->pdev->revision >= 0x21) {
                rss_cfg->hash_algo = HCLGEVF_RSS_HASH_ALGO_SIMPLE;
                memcpy(rss_cfg->rss_hash_key, hclgevf_hash_key,
                       HCLGEVF_RSS_KEY_SIZE);
 
+               tuple_sets->ipv4_tcp_en = HCLGEVF_RSS_INPUT_TUPLE_OTHER;
+               tuple_sets->ipv4_udp_en = HCLGEVF_RSS_INPUT_TUPLE_OTHER;
+               tuple_sets->ipv4_sctp_en = HCLGEVF_RSS_INPUT_TUPLE_SCTP;
+               tuple_sets->ipv4_fragment_en = HCLGEVF_RSS_INPUT_TUPLE_OTHER;
+               tuple_sets->ipv6_tcp_en = HCLGEVF_RSS_INPUT_TUPLE_OTHER;
+               tuple_sets->ipv6_udp_en = HCLGEVF_RSS_INPUT_TUPLE_OTHER;
+               tuple_sets->ipv6_sctp_en = HCLGEVF_RSS_INPUT_TUPLE_SCTP;
+               tuple_sets->ipv6_fragment_en = HCLGEVF_RSS_INPUT_TUPLE_OTHER;
+       }
+
+       /* Initialize RSS indirect table */
+       for (i = 0; i < HCLGEVF_RSS_IND_TBL_SIZE; i++)
+               rss_cfg->rss_indirection_tbl[i] = i % rss_cfg->rss_size;
+}
+
+static int hclgevf_rss_init_hw(struct hclgevf_dev *hdev)
+{
+       struct hclgevf_rss_cfg *rss_cfg = &hdev->rss_cfg;
+       int ret;
+
+       if (hdev->pdev->revision >= 0x21) {
                ret = hclgevf_set_rss_algo_key(hdev, rss_cfg->hash_algo,
                                               rss_cfg->rss_hash_key);
                if (ret)
                        return ret;
 
-               rss_cfg->rss_tuple_sets.ipv4_tcp_en =
-                                       HCLGEVF_RSS_INPUT_TUPLE_OTHER;
-               rss_cfg->rss_tuple_sets.ipv4_udp_en =
-                                       HCLGEVF_RSS_INPUT_TUPLE_OTHER;
-               rss_cfg->rss_tuple_sets.ipv4_sctp_en =
-                                       HCLGEVF_RSS_INPUT_TUPLE_SCTP;
-               rss_cfg->rss_tuple_sets.ipv4_fragment_en =
-                                       HCLGEVF_RSS_INPUT_TUPLE_OTHER;
-               rss_cfg->rss_tuple_sets.ipv6_tcp_en =
-                                       HCLGEVF_RSS_INPUT_TUPLE_OTHER;
-               rss_cfg->rss_tuple_sets.ipv6_udp_en =
-                                       HCLGEVF_RSS_INPUT_TUPLE_OTHER;
-               rss_cfg->rss_tuple_sets.ipv6_sctp_en =
-                                       HCLGEVF_RSS_INPUT_TUPLE_SCTP;
-               rss_cfg->rss_tuple_sets.ipv6_fragment_en =
-                                       HCLGEVF_RSS_INPUT_TUPLE_OTHER;
-
                ret = hclgevf_set_rss_input_tuple(hdev, rss_cfg);
                if (ret)
                        return ret;
        }
 
-       /* Initialize RSS indirect table */
-       for (i = 0; i < HCLGEVF_RSS_IND_TBL_SIZE; i++)
-               rss_cfg->rss_indirection_tbl[i] = i % rss_cfg->rss_size;
-
        ret = hclgevf_set_rss_indir_table(hdev);
        if (ret)
                return ret;
@@ -2764,6 +2765,7 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev)
                goto err_config;
 
        /* Initialize RSS for this VF */
+       hclgevf_rss_init_cfg(hdev);
        ret = hclgevf_rss_init_hw(hdev);
        if (ret) {
                dev_err(&hdev->pdev->dev,
@@ -2936,6 +2938,8 @@ static int hclgevf_set_channels(struct hnae3_handle *handle, u32 new_tqps_num,
        for (i = 0; i < HCLGEVF_RSS_IND_TBL_SIZE; i++)
                rss_indir[i] = i % kinfo->rss_size;
 
+       hdev->rss_cfg.rss_size = kinfo->rss_size;
+
        ret = hclgevf_set_rss(handle, rss_indir, NULL, 0);
        if (ret)
                dev_err(&hdev->pdev->dev, "set rss indir table fail, ret=%d\n",