ixgbe: update the rss key on h/w, when ethtool ask for it
Currently ixgbe_set_rxfh() updates the rss_key copy in the driver memory, but does not push the new value into the h/w. This commit add a new helper for the latter operation and call it in ixgbe_set_rxfh(), so that the h/w rss key value can be really updated via ethtool. Signed-off-by: Paolo Abeni <pabeni@redhat.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
9f674e48c1
commit
d3aa9c9f21
|
@ -929,6 +929,7 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
|
||||||
struct ixgbe_adapter *adapter,
|
struct ixgbe_adapter *adapter,
|
||||||
struct ixgbe_ring *tx_ring);
|
struct ixgbe_ring *tx_ring);
|
||||||
u32 ixgbe_rss_indir_tbl_entries(struct ixgbe_adapter *adapter);
|
u32 ixgbe_rss_indir_tbl_entries(struct ixgbe_adapter *adapter);
|
||||||
|
void ixgbe_store_key(struct ixgbe_adapter *adapter);
|
||||||
void ixgbe_store_reta(struct ixgbe_adapter *adapter);
|
void ixgbe_store_reta(struct ixgbe_adapter *adapter);
|
||||||
s32 ixgbe_negotiate_fc(struct ixgbe_hw *hw, u32 adv_reg, u32 lp_reg,
|
s32 ixgbe_negotiate_fc(struct ixgbe_hw *hw, u32 adv_reg, u32 lp_reg,
|
||||||
u32 adv_sym, u32 adv_asm, u32 lp_sym, u32 lp_asm);
|
u32 adv_sym, u32 adv_asm, u32 lp_sym, u32 lp_asm);
|
||||||
|
|
|
@ -2998,8 +2998,10 @@ static int ixgbe_set_rxfh(struct net_device *netdev, const u32 *indir,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fill out the rss hash key */
|
/* Fill out the rss hash key */
|
||||||
if (key)
|
if (key) {
|
||||||
memcpy(adapter->rss_key, key, ixgbe_get_rxfh_key_size(netdev));
|
memcpy(adapter->rss_key, key, ixgbe_get_rxfh_key_size(netdev));
|
||||||
|
ixgbe_store_key(adapter);
|
||||||
|
}
|
||||||
|
|
||||||
ixgbe_store_reta(adapter);
|
ixgbe_store_reta(adapter);
|
||||||
|
|
||||||
|
|
|
@ -3473,6 +3473,21 @@ u32 ixgbe_rss_indir_tbl_entries(struct ixgbe_adapter *adapter)
|
||||||
return 512;
|
return 512;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ixgbe_store_key - Write the RSS key to HW
|
||||||
|
* @adapter: device handle
|
||||||
|
*
|
||||||
|
* Write the RSS key stored in adapter.rss_key to HW.
|
||||||
|
*/
|
||||||
|
void ixgbe_store_key(struct ixgbe_adapter *adapter)
|
||||||
|
{
|
||||||
|
struct ixgbe_hw *hw = &adapter->hw;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 10; i++)
|
||||||
|
IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), adapter->rss_key[i]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ixgbe_store_reta - Write the RETA table to HW
|
* ixgbe_store_reta - Write the RETA table to HW
|
||||||
* @adapter: device handle
|
* @adapter: device handle
|
||||||
|
@ -3538,7 +3553,6 @@ static void ixgbe_store_vfreta(struct ixgbe_adapter *adapter)
|
||||||
|
|
||||||
static void ixgbe_setup_reta(struct ixgbe_adapter *adapter)
|
static void ixgbe_setup_reta(struct ixgbe_adapter *adapter)
|
||||||
{
|
{
|
||||||
struct ixgbe_hw *hw = &adapter->hw;
|
|
||||||
u32 i, j;
|
u32 i, j;
|
||||||
u32 reta_entries = ixgbe_rss_indir_tbl_entries(adapter);
|
u32 reta_entries = ixgbe_rss_indir_tbl_entries(adapter);
|
||||||
u16 rss_i = adapter->ring_feature[RING_F_RSS].indices;
|
u16 rss_i = adapter->ring_feature[RING_F_RSS].indices;
|
||||||
|
@ -3551,8 +3565,7 @@ static void ixgbe_setup_reta(struct ixgbe_adapter *adapter)
|
||||||
rss_i = 4;
|
rss_i = 4;
|
||||||
|
|
||||||
/* Fill out hash function seeds */
|
/* Fill out hash function seeds */
|
||||||
for (i = 0; i < 10; i++)
|
ixgbe_store_key(adapter);
|
||||||
IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), adapter->rss_key[i]);
|
|
||||||
|
|
||||||
/* Fill out redirection table */
|
/* Fill out redirection table */
|
||||||
memset(adapter->rss_indir_tbl, 0, sizeof(adapter->rss_indir_tbl));
|
memset(adapter->rss_indir_tbl, 0, sizeof(adapter->rss_indir_tbl));
|
||||||
|
|
Loading…
Reference in a new issue