bnxt_en: Add support for user configured RSS key
authorPavan Chebbi <pavan.chebbi@broadcom.com>
Mon, 5 Feb 2024 22:32:00 +0000 (14:32 -0800)
committerJakub Kicinski <kuba@kernel.org>
Fri, 9 Feb 2024 20:37:42 +0000 (12:37 -0800)
Store the user configured or generated Toeplitz key in
bp->rss_hash_key.  The key stays constant across ifdown/ifup
unless updated by the user.

Signed-off-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Link: https://lore.kernel.org/r/20240205223202.25341-12-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index d6fd37347f5a63a3bdd898d3cff2f5c638fe06bd..b66002171e36979d4fa6433b4a34f334cb934f89 100644 (file)
@@ -4246,9 +4246,23 @@ static void bnxt_init_vnics(struct bnxt *bp)
                                u8 *key = (void *)vnic->rss_hash_key;
                                int k;
 
+                               if (!bp->rss_hash_key_valid &&
+                                   !bp->rss_hash_key_updated) {
+                                       get_random_bytes(bp->rss_hash_key,
+                                                        HW_HASH_KEY_SIZE);
+                                       bp->rss_hash_key_updated = true;
+                               }
+
+                               memcpy(vnic->rss_hash_key, bp->rss_hash_key,
+                                      HW_HASH_KEY_SIZE);
+
+                               if (!bp->rss_hash_key_updated)
+                                       continue;
+
+                               bp->rss_hash_key_updated = false;
+                               bp->rss_hash_key_valid = true;
+
                                bp->toeplitz_prefix = 0;
-                               get_random_bytes(vnic->rss_hash_key,
-                                             HW_HASH_KEY_SIZE);
                                for (k = 0; k < 8; k++) {
                                        bp->toeplitz_prefix <<= 8;
                                        bp->toeplitz_prefix |= key[k];
index a6b6db1546cc66ec239a069bd06e0149909f9cd3..28091889615b689bc0679db03db02383cd51119d 100644 (file)
@@ -2222,6 +2222,10 @@ struct bnxt {
 #define BNXT_RSS_CAP_NEW_RSS_CAP               BIT(2)
 #define BNXT_RSS_CAP_RSS_TCAM                  BIT(3)
 
+       u8                      rss_hash_key[HW_HASH_KEY_SIZE];
+       u8                      rss_hash_key_valid:1;
+       u8                      rss_hash_key_updated:1;
+
        u16                     max_mtu;
        u8                      max_tc;
        u8                      max_lltc;       /* lossless TCs */
index 57fef0fc21d8af587d4e50b7d79046481fa1fc62..af6e5ab5428459299585477934ff59a265ad3bd2 100644 (file)
@@ -1755,8 +1755,10 @@ static int bnxt_set_rxfh(struct net_device *dev,
        if (rxfh->hfunc && rxfh->hfunc != ETH_RSS_HASH_TOP)
                return -EOPNOTSUPP;
 
-       if (rxfh->key)
-               return -EOPNOTSUPP;
+       if (rxfh->key) {
+               memcpy(bp->rss_hash_key, rxfh->key, HW_HASH_KEY_SIZE);
+               bp->rss_hash_key_updated = true;
+       }
 
        if (rxfh->indir) {
                u32 i, pad, tbl_size = bnxt_get_rxfh_indir_size(dev);