From: Long Li <lon...@microsoft.com>

Currently this PMD supports RSS configuration when the device is stopped.
Configuring RSS in running state will be supported in the future.

Signed-off-by: Long Li <lon...@microsoft.com>
---
 doc/guides/nics/features/mana.ini |  1 +
 drivers/net/mana/mana.c           | 61 +++++++++++++++++++++++++++++++
 drivers/net/mana/mana.h           |  1 +
 3 files changed, 63 insertions(+)

diff --git a/doc/guides/nics/features/mana.ini 
b/doc/guides/nics/features/mana.ini
index 566b3e8770..a59c21cc10 100644
--- a/doc/guides/nics/features/mana.ini
+++ b/doc/guides/nics/features/mana.ini
@@ -8,6 +8,7 @@ Link status          = P
 Linux                = Y
 Multiprocess aware   = Y
 Removal event        = Y
+RSS hash             = Y
 Speed capabilities   = P
 Usage doc            = Y
 x86-64               = Y
diff --git a/drivers/net/mana/mana.c b/drivers/net/mana/mana.c
index 15950a27ee..6563fe3661 100644
--- a/drivers/net/mana/mana.c
+++ b/drivers/net/mana/mana.c
@@ -211,6 +211,65 @@ static const uint32_t *mana_supported_ptypes(struct 
rte_eth_dev *dev __rte_unuse
        return ptypes;
 }
 
+static int mana_rss_hash_update(struct rte_eth_dev *dev,
+                               struct rte_eth_rss_conf *rss_conf)
+{
+       struct mana_priv *priv = dev->data->dev_private;
+
+       /* Currently can only update RSS hash when device is stopped */
+       if (dev->data->dev_started) {
+               DRV_LOG(ERR, "Can't update RSS after device has started");
+               return -ENODEV;
+       }
+
+       if (rss_conf->rss_hf & ~BNIC_ETH_RSS_SUPPORT) {
+               DRV_LOG(ERR, "Port %u invalid RSS HF 0x%" PRIx64,
+                       dev->data->port_id, rss_conf->rss_hf);
+               return -EINVAL;
+       }
+
+       if (rss_conf->rss_key && rss_conf->rss_key_len) {
+               if (rss_conf->rss_key_len != TOEPLITZ_HASH_KEY_SIZE_IN_BYTES) {
+                       DRV_LOG(ERR, "Port %u key len must be %u long",
+                               dev->data->port_id,
+                               TOEPLITZ_HASH_KEY_SIZE_IN_BYTES);
+                       return -EINVAL;
+               }
+
+               priv->rss_conf.rss_key_len = rss_conf->rss_key_len;
+               priv->rss_conf.rss_key =
+                       rte_zmalloc("mana_rss", rss_conf->rss_key_len,
+                                   RTE_CACHE_LINE_SIZE);
+               if (!priv->rss_conf.rss_key)
+                       return -ENOMEM;
+               memcpy(priv->rss_conf.rss_key, rss_conf->rss_key,
+                      rss_conf->rss_key_len);
+       }
+       priv->rss_conf.rss_hf = rss_conf->rss_hf;
+
+       return 0;
+}
+
+static int mana_rss_hash_conf_get(struct rte_eth_dev *dev,
+                                 struct rte_eth_rss_conf *rss_conf)
+{
+       struct mana_priv *priv = dev->data->dev_private;
+
+       if (!rss_conf)
+               return -EINVAL;
+
+       if (rss_conf->rss_key &&
+           rss_conf->rss_key_len >= priv->rss_conf.rss_key_len) {
+               memcpy(rss_conf->rss_key, priv->rss_conf.rss_key,
+                      priv->rss_conf.rss_key_len);
+       }
+
+       rss_conf->rss_key_len = priv->rss_conf.rss_key_len;
+       rss_conf->rss_hf = priv->rss_conf.rss_hf;
+
+       return 0;
+}
+
 static int mana_dev_link_update(struct rte_eth_dev *dev,
                                int wait_to_complete __rte_unused)
 {
@@ -232,6 +291,8 @@ const struct eth_dev_ops mana_dev_ops = {
        .dev_close              = mana_dev_close,
        .dev_infos_get          = mana_dev_info_get,
        .dev_supported_ptypes_get = mana_supported_ptypes,
+       .rss_hash_update        = mana_rss_hash_update,
+       .rss_hash_conf_get      = mana_rss_hash_conf_get,
        .link_update            = mana_dev_link_update,
 };
 
diff --git a/drivers/net/mana/mana.h b/drivers/net/mana/mana.h
index f97eed2e81..33f68b3d1b 100644
--- a/drivers/net/mana/mana.h
+++ b/drivers/net/mana/mana.h
@@ -72,6 +72,7 @@ struct mana_priv {
        uint8_t ind_table_key[40];
        struct ibv_qp *rwq_qp;
        void *db_page;
+       struct rte_eth_rss_conf rss_conf;
        struct rte_intr_handle *intr_handle;
        int max_rx_queues;
        int max_tx_queues;
-- 
2.17.1

Reply via email to