diff options
author | Paolo Abeni <pabeni@redhat.com> | 2016-12-15 09:20:34 -0500 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2017-03-02 20:19:17 -0500 |
commit | d3aa9c9f212a729e46653d4c1eb6a9ab190efe3a (patch) | |
tree | 6991157aa60459950f49f089f0659142b01fd8fc | |
parent | 9f674e48c13dcbc31ac903433727837795b81efe (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.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 19 |
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); |
931 | u32 ixgbe_rss_indir_tbl_entries(struct ixgbe_adapter *adapter); | 931 | u32 ixgbe_rss_indir_tbl_entries(struct ixgbe_adapter *adapter); |
932 | void ixgbe_store_key(struct ixgbe_adapter *adapter); | ||
932 | void ixgbe_store_reta(struct ixgbe_adapter *adapter); | 933 | void ixgbe_store_reta(struct ixgbe_adapter *adapter); |
933 | s32 ixgbe_negotiate_fc(struct ixgbe_hw *hw, u32 adv_reg, u32 lp_reg, | 934 | s32 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 | */ | ||
3482 | void 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 | ||
3539 | static void ixgbe_setup_reta(struct ixgbe_adapter *adapter) | 3554 | static 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)); |