aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom/tg3.c
diff options
context:
space:
mode:
authorEyal Perry <eyalpe@mellanox.com>2014-12-02 11:12:10 -0500
committerDavid S. Miller <davem@davemloft.net>2014-12-08 21:07:10 -0500
commit892311f66f2411b813ca631009356891a0c2b0a1 (patch)
tree42267098964290cf349abd6733267c24867f2318 /drivers/net/ethernet/broadcom/tg3.c
parent18b5427ae1654803930b97590ac5a85245861646 (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.c20
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
12564static int tg3_get_rxfh(struct net_device *dev, u32 *indir, u8 *key) 12564static 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
12575static int tg3_set_rxfh(struct net_device *dev, const u32 *indir, const u8 *key) 12580static 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