summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c
diff options
context:
space:
mode:
authorHelin Zhang <helin.zhang@intel.com>2015-10-27 23:15:06 +0300
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2015-12-02 09:39:45 +0300
commit2c86ac3c70794f0ecc3684b0ae0fd75b0cf0c1f6 (patch)
treeb4814525debd6700d5cef794eb3d7dda470edb81 /drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c
parent96a8198652e5b80a2cfc87397a3512bf8e45cd63 (diff)
downloadlinux-2c86ac3c70794f0ecc3684b0ae0fd75b0cf0c1f6.tar.xz
i40evf: create a generic config RSS function
There are two ways to configure RSS, this patch adjusts those two functions with the same input parameters, and creates a more generic function for configuring RSS. Change-ID: Iace73bdeba4831909979bef221011060ab327f71 Signed-off-by: Helin Zhang <helin.zhang@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c')
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c b/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c
index 4790437a50ac..cf253df7f3b2 100644
--- a/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c
+++ b/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c
@@ -668,9 +668,11 @@ static int i40evf_set_rxfh(struct net_device *netdev, const u32 *indir,
const u8 *key, const u8 hfunc)
{
struct i40evf_adapter *adapter = netdev_priv(netdev);
- struct i40e_hw *hw = &adapter->hw;
- u32 hlut_val;
- int i, j;
+ struct i40e_vsi *vsi = &adapter->vsi;
+ u8 seed_def[I40EVF_HKEY_ARRAY_SIZE];
+ u8 *seed = NULL, *lut;
+ int ret;
+ u16 i;
/* We do not allow change in unsupported parameters */
if (key ||
@@ -679,15 +681,22 @@ static int i40evf_set_rxfh(struct net_device *netdev, const u32 *indir,
if (!indir)
return 0;
- for (i = 0, j = 0; i <= I40E_VFQF_HLUT_MAX_INDEX; i++) {
- hlut_val = indir[j++];
- hlut_val |= indir[j++] << 8;
- hlut_val |= indir[j++] << 16;
- hlut_val |= indir[j++] << 24;
- wr32(hw, I40E_VFQF_HLUT(i), hlut_val);
+ if (key) {
+ memcpy(seed_def, key, I40EVF_HKEY_ARRAY_SIZE);
+ seed = seed_def;
}
+ lut = kzalloc(I40EVF_HLUT_ARRAY_SIZE, GFP_KERNEL);
+ if (!lut)
+ return -ENOMEM;
- return 0;
+ /* Each 32 bits pointed by 'indir' is stored with a lut entry */
+ for (i = 0; i < I40EVF_HLUT_ARRAY_SIZE; i++)
+ lut[i] = (u8)(indir[i]);
+
+ ret = i40evf_config_rss(vsi, seed, lut, I40EVF_HLUT_ARRAY_SIZE);
+ kfree(lut);
+
+ return ret;
}
static const struct ethtool_ops i40evf_ethtool_ops = {