Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 90b02b43 authored by Helin Zhang's avatar Helin Zhang Committed by Jeff Kirsher
Browse files

i40evf: create a generic get RSS function



There are two ways to get RSS, this patch implements two functions
with the same input parameters, and creates a more generic function
for getting RSS configuration.

Change-ID: I12d3b712c21455d47dd0a5aae58fc9b7c680db59
Signed-off-by: default avatarHelin Zhang <helin.zhang@intel.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 2c86ac3c
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -316,4 +316,6 @@ void i40evf_virtchnl_completion(struct i40evf_adapter *adapter,
				i40e_status v_retval, u8 *msg, u16 msglen);
int i40evf_config_rss(struct i40e_vsi *vsi, const u8 *seed, u8 *lut,
		      u16 lut_size);
int i40evf_get_rss(struct i40e_vsi *vsi, const u8 *seed, u8 *lut,
		   u16 lut_size);
#endif /* _I40EVF_H_ */
+22 −13
Original line number Diff line number Diff line
@@ -634,25 +634,34 @@ static int i40evf_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,
			   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 = NULL, *lut;
	int ret;
	u16 i;

	if (hfunc)
		*hfunc = ETH_RSS_HASH_TOP;
	if (!indir)
		return 0;

	if (indir) {
		for (i = 0, j = 0; i <= I40E_VFQF_HLUT_MAX_INDEX; i++) {
			hlut_val = rd32(hw, I40E_VFQF_HLUT(i));
			indir[j++] = hlut_val & 0xff;
			indir[j++] = (hlut_val >> 8) & 0xff;
			indir[j++] = (hlut_val >> 16) & 0xff;
			indir[j++] = (hlut_val >> 24) & 0xff;
		}
	}
	return 0;
	seed = key;

	lut = kzalloc(I40EVF_HLUT_ARRAY_SIZE, GFP_KERNEL);
	if (!lut)
		return -ENOMEM;

	ret = i40evf_get_rss(vsi, seed, lut, I40EVF_HLUT_ARRAY_SIZE);
	if (ret)
		goto out;

	/* Each 32 bits pointed by 'indir' is stored with a lut entry */
	for (i = 0; i < I40EVF_HLUT_ARRAY_SIZE; i++)
		indir[i] = (u32)lut[i];

out:
	kfree(lut);

	return ret;
}

/**
+97 −0
Original line number Diff line number Diff line
@@ -1299,6 +1299,84 @@ static int i40evf_config_rss_reg(struct i40e_vsi *vsi, const u8 *seed,
	return 0;
}

/**
 *  * i40evf_get_rss_aq - Get RSS keys and lut by using AQ commands
 *  @vsi: Pointer to vsi structure
 *  @seed: RSS hash seed
 *  @lut: Lookup table
 *  @lut_size: Lookup table size
 *
 *  Return 0 on success, negative on failure
 **/
static int i40evf_get_rss_aq(struct i40e_vsi *vsi, const u8 *seed,
			     u8 *lut, u16 lut_size)
{
	struct i40evf_adapter *adapter = vsi->back;
	struct i40e_hw *hw = &adapter->hw;
	int ret = 0;

	if (seed) {
		ret = i40evf_aq_get_rss_key(hw, vsi->id,
			(struct i40e_aqc_get_set_rss_key_data *)seed);
		if (ret) {
			dev_err(&adapter->pdev->dev,
				"Cannot get RSS key, err %s aq_err %s\n",
				i40evf_stat_str(hw, ret),
				i40evf_aq_str(hw, hw->aq.asq_last_status));
			return ret;
		}
	}

	if (lut) {
		ret = i40evf_aq_get_rss_lut(hw, vsi->id, seed, lut, lut_size);
		if (ret) {
			dev_err(&adapter->pdev->dev,
				"Cannot get RSS lut, err %s aq_err %s\n",
				i40evf_stat_str(hw, ret),
				i40evf_aq_str(hw, hw->aq.asq_last_status));
			return ret;
		}
	}

	return ret;
}

/**
 *  * i40evf_get_rss_reg - Get RSS keys and lut by reading registers
 *  @vsi: Pointer to vsi structure
 *  @seed: RSS hash seed
 *  @lut: Lookup table
 *  @lut_size: Lookup table size
 *
 *  Returns 0 on success, negative on failure
 **/
static int i40evf_get_rss_reg(struct i40e_vsi *vsi, const u8 *seed,
			      const u8 *lut, u16 lut_size)
{
	struct i40evf_adapter *adapter = vsi->back;
	struct i40e_hw *hw = &adapter->hw;
	u16 i;

	if (seed) {
		u32 *seed_dw = (u32 *)seed;

		for (i = 0; i <= I40E_VFQF_HKEY_MAX_INDEX; i++)
			seed_dw[i] = rd32(hw, I40E_VFQF_HKEY(i));
	}

	if (lut) {
		u32 *lut_dw = (u32 *)lut;

		if (lut_size != I40EVF_HLUT_ARRAY_SIZE)
			return -EINVAL;

		for (i = 0; i <= I40E_VFQF_HLUT_MAX_INDEX; i++)
			lut_dw[i] = rd32(hw, I40E_VFQF_HLUT(i));
	}

	return 0;
}

/**
 * i40evf_config_rss - Configure RSS keys and lut
 * @vsi: Pointer to vsi structure
@@ -1319,6 +1397,25 @@ int i40evf_config_rss(struct i40e_vsi *vsi, const u8 *seed,
		return i40evf_config_rss_reg(vsi, seed, lut, lut_size);
}

/**
 * i40evf_get_rss - Get RSS keys and lut
 * @vsi: Pointer to vsi structure
 * @seed: RSS hash seed
 * @lut: Lookup table
 * @lut_size: Lookup table size
 *
 * Returns 0 on success, negative on failure
 **/
int i40evf_get_rss(struct i40e_vsi *vsi, const u8 *seed, u8 *lut, u16 lut_size)
{
	struct i40evf_adapter *adapter = vsi->back;

	if (RSS_AQ(adapter))
		return i40evf_get_rss_aq(vsi, seed, lut, lut_size);
	else
		return i40evf_get_rss_reg(vsi, seed, lut, lut_size);
}

/**
 * i40evf_fill_rss_lut - Fill the lut with default values
 * @lut: Lookup table to be filled with