diff options
author | Eyal Perry <eyalpe@mellanox.com> | 2014-12-02 11:12:10 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-12-08 21:07:10 -0500 |
commit | 892311f66f2411b813ca631009356891a0c2b0a1 (patch) | |
tree | 42267098964290cf349abd6733267c24867f2318 /drivers/net/ethernet/broadcom/tg3.c | |
parent | 18b5427ae1654803930b97590ac5a85245861646 (diff) |
ethtool: Support for configurable RSS hash function
This patch extends the set/get_rxfh ethtool-options for getting or
setting the RSS hash function.
It modifies drivers implementation of set/get_rxfh accordingly.
This change also delegates the responsibility of checking whether a
modification to a certain RX flow hash parameter is supported to the
driver implementation of set_rxfh.
User-kernel API is done through the new hfunc bitmask field in the
ethtool_rxfh struct. A bit set in the hfunc field is corresponding to an
index in the new string-set ETH_SS_RSS_HASH_FUNCS.
Got approval from most of the relevant driver maintainers that their
driver is using Toeplitz, and for the few that didn't answered, also
assumed it is Toeplitz.
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Ariel Elior <ariel.elior@qlogic.com>
Cc: Prashant Sreedharan <prashant@broadcom.com>
Cc: Michael Chan <mchan@broadcom.com>
Cc: Hariprasad S <hariprasad@chelsio.com>
Cc: Sathya Perla <sathya.perla@emulex.com>
Cc: Subbu Seetharaman <subbu.seetharaman@emulex.com>
Cc: Ajit Khaparde <ajit.khaparde@emulex.com>
Cc: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Cc: Jesse Brandeburg <jesse.brandeburg@intel.com>
Cc: Bruce Allan <bruce.w.allan@intel.com>
Cc: Carolyn Wyborny <carolyn.wyborny@intel.com>
Cc: Don Skidmore <donald.c.skidmore@intel.com>
Cc: Greg Rose <gregory.v.rose@intel.com>
Cc: Matthew Vick <matthew.vick@intel.com>
Cc: John Ronciak <john.ronciak@intel.com>
Cc: Mitch Williams <mitch.a.williams@intel.com>
Cc: Amir Vadai <amirv@mellanox.com>
Cc: Solarflare linux maintainers <linux-net-drivers@solarflare.com>
Cc: Shradha Shah <sshah@solarflare.com>
Cc: Shreyas Bhatewara <sbhatewara@vmware.com>
Cc: "VMware, Inc." <pv-drivers@vmware.com>
Cc: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: Eyal Perry <eyalpe@mellanox.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom/tg3.c')
-rw-r--r-- | drivers/net/ethernet/broadcom/tg3.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index 43fd1b72c1ea..bb48a610b72a 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c | |||
@@ -12561,22 +12561,38 @@ static u32 tg3_get_rxfh_indir_size(struct net_device *dev) | |||
12561 | return size; | 12561 | return size; |
12562 | } | 12562 | } |
12563 | 12563 | ||
12564 | static int tg3_get_rxfh(struct net_device *dev, u32 *indir, u8 *key) | 12564 | static int tg3_get_rxfh(struct net_device *dev, u32 *indir, u8 *key, u8 *hfunc) |
12565 | { | 12565 | { |
12566 | struct tg3 *tp = netdev_priv(dev); | 12566 | struct tg3 *tp = netdev_priv(dev); |
12567 | int i; | 12567 | int i; |
12568 | 12568 | ||
12569 | if (hfunc) | ||
12570 | *hfunc = ETH_RSS_HASH_TOP; | ||
12571 | if (!indir) | ||
12572 | return 0; | ||
12573 | |||
12569 | for (i = 0; i < TG3_RSS_INDIR_TBL_SIZE; i++) | 12574 | for (i = 0; i < TG3_RSS_INDIR_TBL_SIZE; i++) |
12570 | indir[i] = tp->rss_ind_tbl[i]; | 12575 | indir[i] = tp->rss_ind_tbl[i]; |
12571 | 12576 | ||
12572 | return 0; | 12577 | return 0; |
12573 | } | 12578 | } |
12574 | 12579 | ||
12575 | static int tg3_set_rxfh(struct net_device *dev, const u32 *indir, const u8 *key) | 12580 | static int tg3_set_rxfh(struct net_device *dev, const u32 *indir, const u8 *key, |
12581 | const u8 hfunc) | ||
12576 | { | 12582 | { |
12577 | struct tg3 *tp = netdev_priv(dev); | 12583 | struct tg3 *tp = netdev_priv(dev); |
12578 | size_t i; | 12584 | size_t i; |
12579 | 12585 | ||
12586 | /* We require at least one supported parameter to be changed and no | ||
12587 | * change in any of the unsupported parameters | ||
12588 | */ | ||
12589 | if (key || | ||
12590 | (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP)) | ||
12591 | return -EOPNOTSUPP; | ||
12592 | |||
12593 | if (!indir) | ||
12594 | return 0; | ||
12595 | |||
12580 | for (i = 0; i < TG3_RSS_INDIR_TBL_SIZE; i++) | 12596 | for (i = 0; i < TG3_RSS_INDIR_TBL_SIZE; i++) |
12581 | tp->rss_ind_tbl[i] = indir[i]; | 12597 | tp->rss_ind_tbl[i] = indir[i]; |
12582 | 12598 | ||