aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaolo Abeni <pabeni@redhat.com>2016-12-15 09:20:34 -0500
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2017-03-02 20:19:17 -0500
commitd3aa9c9f212a729e46653d4c1eb6a9ab190efe3a (patch)
tree6991157aa60459950f49f089f0659142b01fd8fc
parent9f674e48c13dcbc31ac903433727837795b81efe (diff)
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>
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe.h1
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c4
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_main.c19
3 files changed, 20 insertions, 4 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
index a2cc43d28888..7a951b116821 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
@@ -929,6 +929,7 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
929 struct ixgbe_adapter *adapter, 929 struct ixgbe_adapter *adapter,
930 struct ixgbe_ring *tx_ring); 930 struct ixgbe_ring *tx_ring);
931u32 ixgbe_rss_indir_tbl_entries(struct ixgbe_adapter *adapter); 931u32 ixgbe_rss_indir_tbl_entries(struct ixgbe_adapter *adapter);
932void ixgbe_store_key(struct ixgbe_adapter *adapter);
932void ixgbe_store_reta(struct ixgbe_adapter *adapter); 933void ixgbe_store_reta(struct ixgbe_adapter *adapter);
933s32 ixgbe_negotiate_fc(struct ixgbe_hw *hw, u32 adv_reg, u32 lp_reg, 934s32 ixgbe_negotiate_fc(struct ixgbe_hw *hw, u32 adv_reg, u32 lp_reg,
934 u32 adv_sym, u32 adv_asm, u32 lp_sym, u32 lp_asm); 935 u32 adv_sym, u32 adv_asm, u32 lp_sym, u32 lp_asm);
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
index a7574c7b12af..90fa5bf23d1b 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
@@ -2998,8 +2998,10 @@ static int ixgbe_set_rxfh(struct net_device *netdev, const u32 *indir,
2998 } 2998 }
2999 2999
3000 /* Fill out the rss hash key */ 3000 /* Fill out the rss hash key */
3001 if (key) 3001 if (key) {
3002 memcpy(adapter->rss_key, key, ixgbe_get_rxfh_key_size(netdev)); 3002 memcpy(adapter->rss_key, key, ixgbe_get_rxfh_key_size(netdev));
3003 ixgbe_store_key(adapter);
3004 }
3003 3005
3004 ixgbe_store_reta(adapter); 3006 ixgbe_store_reta(adapter);
3005 3007
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index 060cdce8058f..67ab13fd163c 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -3474,6 +3474,21 @@ u32 ixgbe_rss_indir_tbl_entries(struct ixgbe_adapter *adapter)
3474} 3474}
3475 3475
3476/** 3476/**
3477 * ixgbe_store_key - Write the RSS key to HW
3478 * @adapter: device handle
3479 *
3480 * Write the RSS key stored in adapter.rss_key to HW.
3481 */
3482void ixgbe_store_key(struct ixgbe_adapter *adapter)
3483{
3484 struct ixgbe_hw *hw = &adapter->hw;
3485 int i;
3486
3487 for (i = 0; i < 10; i++)
3488 IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), adapter->rss_key[i]);
3489}
3490
3491/**
3477 * ixgbe_store_reta - Write the RETA table to HW 3492 * ixgbe_store_reta - Write the RETA table to HW
3478 * @adapter: device handle 3493 * @adapter: device handle
3479 * 3494 *
@@ -3538,7 +3553,6 @@ static void ixgbe_store_vfreta(struct ixgbe_adapter *adapter)
3538 3553
3539static void ixgbe_setup_reta(struct ixgbe_adapter *adapter) 3554static void ixgbe_setup_reta(struct ixgbe_adapter *adapter)
3540{ 3555{
3541 struct ixgbe_hw *hw = &adapter->hw;
3542 u32 i, j; 3556 u32 i, j;
3543 u32 reta_entries = ixgbe_rss_indir_tbl_entries(adapter); 3557 u32 reta_entries = ixgbe_rss_indir_tbl_entries(adapter);
3544 u16 rss_i = adapter->ring_feature[RING_F_RSS].indices; 3558 u16 rss_i = adapter->ring_feature[RING_F_RSS].indices;
@@ -3551,8 +3565,7 @@ static void ixgbe_setup_reta(struct ixgbe_adapter *adapter)
3551 rss_i = 4; 3565 rss_i = 4;
3552 3566
3553 /* Fill out hash function seeds */ 3567 /* Fill out hash function seeds */
3554 for (i = 0; i < 10; i++) 3568 ixgbe_store_key(adapter);
3555 IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), adapter->rss_key[i]);
3556 3569
3557 /* Fill out redirection table */ 3570 /* Fill out redirection table */
3558 memset(adapter->rss_indir_tbl, 0, sizeof(adapter->rss_indir_tbl)); 3571 memset(adapter->rss_indir_tbl, 0, sizeof(adapter->rss_indir_tbl));