|
@@ -1102,20 +1102,21 @@ static int mlx4_en_check_rxfh_func(struct net_device *dev, u8 hfunc)
|
|
|
struct mlx4_en_priv *priv = netdev_priv(dev);
|
|
|
|
|
|
/* check if requested function is supported by the device */
|
|
|
- if ((hfunc == ETH_RSS_HASH_TOP &&
|
|
|
- !(priv->mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_RSS_TOP)) ||
|
|
|
- (hfunc == ETH_RSS_HASH_XOR &&
|
|
|
- !(priv->mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_RSS_XOR)))
|
|
|
- return -EINVAL;
|
|
|
+ if (hfunc == ETH_RSS_HASH_TOP) {
|
|
|
+ if (!(priv->mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_RSS_TOP))
|
|
|
+ return -EINVAL;
|
|
|
+ if (!(dev->features & NETIF_F_RXHASH))
|
|
|
+ en_warn(priv, "Toeplitz hash function should be used in conjunction with RX hashing for optimal performance\n");
|
|
|
+ return 0;
|
|
|
+ } else if (hfunc == ETH_RSS_HASH_XOR) {
|
|
|
+ if (!(priv->mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_RSS_XOR))
|
|
|
+ return -EINVAL;
|
|
|
+ if (dev->features & NETIF_F_RXHASH)
|
|
|
+ en_warn(priv, "Enabling both XOR Hash function and RX Hashing can limit RPS functionality\n");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
|
|
|
- priv->rss_hash_fn = hfunc;
|
|
|
- if (hfunc == ETH_RSS_HASH_TOP && !(dev->features & NETIF_F_RXHASH))
|
|
|
- en_warn(priv,
|
|
|
- "Toeplitz hash function should be used in conjunction with RX hashing for optimal performance\n");
|
|
|
- if (hfunc == ETH_RSS_HASH_XOR && (dev->features & NETIF_F_RXHASH))
|
|
|
- en_warn(priv,
|
|
|
- "Enabling both XOR Hash function and RX Hashing can limit RPS functionality\n");
|
|
|
- return 0;
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
static int mlx4_en_get_rxfh(struct net_device *dev, u32 *ring_index, u8 *key,
|
|
@@ -1189,6 +1190,8 @@ static int mlx4_en_set_rxfh(struct net_device *dev, const u32 *ring_index,
|
|
|
priv->prof->rss_rings = rss_rings;
|
|
|
if (key)
|
|
|
memcpy(priv->rss_key, key, MLX4_EN_RSS_KEY_SIZE);
|
|
|
+ if (hfunc != ETH_RSS_HASH_NO_CHANGE)
|
|
|
+ priv->rss_hash_fn = hfunc;
|
|
|
|
|
|
if (port_up) {
|
|
|
err = mlx4_en_start_port(dev);
|