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

Commit 66f9af85 authored by Helin Zhang's avatar Helin Zhang Committed by Jeff Kirsher
Browse files

i40evf: add new fields to store user configuration of RSS



This patch adds new fields to i40e_vsi to store user configured
RSS config data and code to use it.

Change-ID: Ic5d3db8d9df52182b560248f8cdca9c5c7546879
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 90b02b43
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -67,6 +67,8 @@ struct i40e_vsi {
	u16 rx_itr_setting;
	u16 tx_itr_setting;
	u16 qs_handle;
	u8 *rss_hkey_user; /* User configured hash keys */
	u8 *rss_lut_user;  /* User configured lookup table entries */
};

/* How many Rx Buffers do we bundle into one write to the hardware ? */
+18 −13
Original line number Diff line number Diff line
@@ -678,9 +678,7 @@ static int i40evf_set_rxfh(struct net_device *netdev, const u32 *indir,
{
	struct i40evf_adapter *adapter = netdev_priv(netdev);
	struct i40e_vsi *vsi = &adapter->vsi;
	u8 seed_def[I40EVF_HKEY_ARRAY_SIZE];
	u8 *seed = NULL, *lut;
	int ret;
	u8 *seed = NULL;
	u16 i;

	/* We do not allow change in unsupported parameters */
@@ -691,21 +689,28 @@ static int i40evf_set_rxfh(struct net_device *netdev, const u32 *indir,
		return 0;

	if (key) {
		memcpy(seed_def, key, I40EVF_HKEY_ARRAY_SIZE);
		seed = seed_def;
		if (!vsi->rss_hkey_user) {
			vsi->rss_hkey_user = kzalloc(I40EVF_HKEY_ARRAY_SIZE,
						     GFP_KERNEL);
			if (!vsi->rss_hkey_user)
				return -ENOMEM;
		}
	lut = kzalloc(I40EVF_HLUT_ARRAY_SIZE, GFP_KERNEL);
	if (!lut)
		memcpy(vsi->rss_hkey_user, key, I40EVF_HKEY_ARRAY_SIZE);
		seed = vsi->rss_hkey_user;
	}
	if (!vsi->rss_lut_user) {
		vsi->rss_lut_user = kzalloc(I40EVF_HLUT_ARRAY_SIZE,
					    GFP_KERNEL);
		if (!vsi->rss_lut_user)
			return -ENOMEM;
	}

	/* 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]);
		vsi->rss_lut_user[i] = (u8)(indir[i]);

	ret = i40evf_config_rss(vsi, seed, lut, I40EVF_HLUT_ARRAY_SIZE);
	kfree(lut);

	return ret;
	return i40evf_config_rss(vsi, seed, vsi->rss_lut_user,
				 I40EVF_HLUT_ARRAY_SIZE);
}

static const struct ethtool_ops i40evf_ethtool_ops = {
+34 −3
Original line number Diff line number Diff line
@@ -1453,8 +1453,20 @@ static int i40evf_init_rss(struct i40evf_adapter *adapter)
	lut = kzalloc(I40EVF_HLUT_ARRAY_SIZE, GFP_KERNEL);
	if (!lut)
		return -ENOMEM;

	/* Use user configured lut if there is one, otherwise use default */
	if (vsi->rss_lut_user)
		memcpy(lut, vsi->rss_lut_user, I40EVF_HLUT_ARRAY_SIZE);
	else
		i40evf_fill_rss_lut(lut, I40EVF_HLUT_ARRAY_SIZE,
				    adapter->num_active_queues);

	/* Use user configured hash key if there is one, otherwise
	 * user default.
	 */
	if (vsi->rss_hkey_user)
		memcpy(seed, vsi->rss_hkey_user, I40EVF_HKEY_ARRAY_SIZE);
	else
		netdev_rss_key_fill((void *)seed, I40EVF_HKEY_ARRAY_SIZE);
	ret = i40evf_config_rss(vsi, seed, lut, I40EVF_HLUT_ARRAY_SIZE);
	kfree(lut);
@@ -1582,6 +1594,22 @@ int i40evf_init_interrupt_scheme(struct i40evf_adapter *adapter)
	return err;
}

/**
 * i40evf_clear_rss_config_user - Clear user configurations of RSS
 * @vsi: Pointer to VSI structure
 **/
static void i40evf_clear_rss_config_user(struct i40e_vsi *vsi)
{
	if (!vsi)
		return;

	kfree(vsi->rss_hkey_user);
	vsi->rss_hkey_user = NULL;

	kfree(vsi->rss_lut_user);
	vsi->rss_lut_user = NULL;
}

/**
 * i40evf_watchdog_timer - Periodic call-back timer
 * @data: pointer to adapter disguised as unsigned long
@@ -2770,6 +2798,9 @@ static void i40evf_remove(struct pci_dev *pdev)

	flush_scheduled_work();

	/* Clear user configurations for RSS */
	i40evf_clear_rss_config_user(&adapter->vsi);

	if (hw->aq.asq.count)
		i40evf_shutdown_adminq(hw);