OSDN Git Service

iavf: Enable setting RSS hash key
authorTony Nguyen <anthony.l.nguyen@intel.com>
Fri, 16 Jul 2021 22:16:37 +0000 (15:16 -0700)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Tue, 30 Nov 2021 16:56:07 +0000 (08:56 -0800)
Driver support for changing the RSS hash key exists, however, checks
have caused it to be reported as unsupported. Remove the check and
allow the hash key to be specified.

Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Tested-by: Tony Brelinski <tony.brelinski@intel.com>
drivers/net/ethernet/intel/iavf/iavf_ethtool.c

index 27c7b36..f0e8b5a 100644 (file)
@@ -1910,7 +1910,7 @@ static int iavf_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,
  * @key: hash key
  * @hfunc: hash function to use
  *
- * Returns -EINVAL if the table specifies an inavlid queue id, otherwise
+ * Returns -EINVAL if the table specifies an invalid queue id, otherwise
  * returns 0 after programming the table.
  **/
 static int iavf_set_rxfh(struct net_device *netdev, const u32 *indir,
@@ -1919,19 +1919,21 @@ static int iavf_set_rxfh(struct net_device *netdev, const u32 *indir,
        struct iavf_adapter *adapter = netdev_priv(netdev);
        u16 i;
 
-       /* We do not allow change in unsupported parameters */
-       if (key ||
-           (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP))
+       /* Only support toeplitz hash function */
+       if (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP)
                return -EOPNOTSUPP;
-       if (!indir)
+
+       if (!key && !indir)
                return 0;
 
        if (key)
                memcpy(adapter->rss_key, key, adapter->rss_key_size);
 
-       /* Each 32 bits pointed by 'indir' is stored with a lut entry */
-       for (i = 0; i < adapter->rss_lut_size; i++)
-               adapter->rss_lut[i] = (u8)(indir[i]);
+       if (indir) {
+               /* Each 32 bits pointed by 'indir' is stored with a lut entry */
+               for (i = 0; i < adapter->rss_lut_size; i++)
+                       adapter->rss_lut[i] = (u8)(indir[i]);
+       }
 
        return iavf_config_rss(adapter);
 }