From: Huisong Li <lihuis...@huawei.com>

Support setting and querying RSS hash function by ethdev ops.

Signed-off-by: Huisong Li <lihuis...@huawei.com>
Signed-off-by: Dongdong Liu <liudongdo...@huawei.com>
---
 drivers/net/hns3/hns3_rss.c | 47 +++++++++++++++++++++----------------
 1 file changed, 27 insertions(+), 20 deletions(-)

diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c
index 6126512bd780..c8346d43d15c 100644
--- a/drivers/net/hns3/hns3_rss.c
+++ b/drivers/net/hns3/hns3_rss.c
@@ -646,14 +646,14 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev,
        if (ret)
                goto set_tuple_fail;
 
-       if (key) {
-               ret = hns3_rss_set_algo_key(hw, hw->rss_info.hash_algo,
-                                           key, hw->rss_key_size);
-               if (ret)
-                       goto set_algo_key_fail;
-               /* Update the shadow RSS key with user specified */
+       ret = hns3_update_rss_algo_key(hw, rss_conf->func, key, key_len);
+       if (ret != 0)
+               goto set_algo_key_fail;
+
+       if (rss_conf->func != RTE_ETH_HASH_FUNCTION_DEFAULT)
+               hw->rss_info.hash_algo = hns3_hash_func_map[rss_conf->func];
+       if (key != NULL)
                memcpy(hw->rss_info.key, key, hw->rss_key_size);
-       }
        hw->rss_info.rss_hf = rss_hf;
        rte_spinlock_unlock(&hw->lock);
 
@@ -769,7 +769,13 @@ int
 hns3_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
                           struct rte_eth_rss_conf *rss_conf)
 {
+       const uint8_t hash_func_map[] = {
+               [HNS3_RSS_HASH_ALGO_TOEPLITZ] = RTE_ETH_HASH_FUNCTION_TOEPLITZ,
+               [HNS3_RSS_HASH_ALGO_SIMPLE] = RTE_ETH_HASH_FUNCTION_SIMPLE_XOR,
+               [HNS3_RSS_HASH_ALGO_SYMMETRIC_TOEP] = 
RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ,
+       };
        struct hns3_adapter *hns = dev->data->dev_private;
+       uint8_t rss_key[HNS3_RSS_KEY_SIZE_MAX] = {0};
        struct hns3_hw *hw = &hns->hw;
        uint8_t hash_algo;
        int ret;
@@ -777,26 +783,27 @@ hns3_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
        rte_spinlock_lock(&hw->lock);
        ret = hns3_rss_hash_get_rss_hf(hw, &rss_conf->rss_hf);
        if (ret != 0) {
+               rte_spinlock_unlock(&hw->lock);
                hns3_err(hw, "obtain hash tuples failed, ret = %d", ret);
-               goto out;
+               return ret;
+       }
+
+       ret = hns3_rss_get_algo_key(hw, &hash_algo, rss_key, hw->rss_key_size);
+       if (ret != 0) {
+               rte_spinlock_unlock(&hw->lock);
+               hns3_err(hw, "obtain hash algo and key failed, ret = %d", ret);
+               return ret;
        }
+       rte_spinlock_unlock(&hw->lock);
 
-       /* Get the RSS Key required by the user */
+       /* Get the RSS Key if user required. */
        if (rss_conf->rss_key && rss_conf->rss_key_len >= hw->rss_key_size) {
-               ret = hns3_rss_get_algo_key(hw, &hash_algo, rss_conf->rss_key,
-                                           hw->rss_key_size);
-               if (ret != 0) {
-                       hns3_err(hw, "obtain hash algo and key failed, ret = 
%d",
-                                ret);
-                       goto out;
-               }
+               memcpy(rss_conf->rss_key, rss_key, hw->rss_key_size);
                rss_conf->rss_key_len = hw->rss_key_size;
        }
+       rss_conf->func = hash_func_map[hash_algo];
 
-out:
-       rte_spinlock_unlock(&hw->lock);
-
-       return ret;
+       return 0;
 }
 
 /*
-- 
2.33.0

Reply via email to