aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c
diff options
context:
space:
mode:
authorAlexander Duyck <alexander.h.duyck@intel.com>2014-09-20 19:50:42 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2014-09-23 06:59:19 -0400
commitaa3ac822689f5c4d8961a8707edba9b6bf4631a3 (patch)
tree49955a51b31bc37ba6bd6d6df9a94d88b627075c /drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c
parent19ae1b3fb99c2d5a5a7540c296c4cb4df3e7f552 (diff)
fm10k: Add support for multiple queues
This patch takes the driver from supporting a single queue to supporting multiple queues. The upper queue limit for the PF is 128 queues and the upper limit for the VF is (128 / num_vfs) rounded down to nearest power of 2. Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c')
-rw-r--r--drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c b/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c
index a88c75c70b91..54e8ebd9fbe4 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c
+++ b/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c
@@ -838,6 +838,61 @@ static int fm10k_set_rssh(struct net_device *netdev, const u32 *indir,
838 return 0; 838 return 0;
839} 839}
840 840
841static unsigned int fm10k_max_channels(struct net_device *dev)
842{
843 struct fm10k_intfc *interface = netdev_priv(dev);
844 unsigned int max_combined = interface->hw.mac.max_queues;
845 u8 tcs = netdev_get_num_tc(dev);
846
847 /* For QoS report channels per traffic class */
848 if (tcs > 1)
849 max_combined = 1 << (fls(max_combined / tcs) - 1);
850
851 return max_combined;
852}
853
854static void fm10k_get_channels(struct net_device *dev,
855 struct ethtool_channels *ch)
856{
857 struct fm10k_intfc *interface = netdev_priv(dev);
858 struct fm10k_hw *hw = &interface->hw;
859
860 /* report maximum channels */
861 ch->max_combined = fm10k_max_channels(dev);
862
863 /* report info for other vector */
864 ch->max_other = NON_Q_VECTORS(hw);
865 ch->other_count = ch->max_other;
866
867 /* record RSS queues */
868 ch->combined_count = interface->ring_feature[RING_F_RSS].indices;
869}
870
871static int fm10k_set_channels(struct net_device *dev,
872 struct ethtool_channels *ch)
873{
874 struct fm10k_intfc *interface = netdev_priv(dev);
875 unsigned int count = ch->combined_count;
876 struct fm10k_hw *hw = &interface->hw;
877
878 /* verify they are not requesting separate vectors */
879 if (!count || ch->rx_count || ch->tx_count)
880 return -EINVAL;
881
882 /* verify other_count has not changed */
883 if (ch->other_count != NON_Q_VECTORS(hw))
884 return -EINVAL;
885
886 /* verify the number of channels does not exceed hardware limits */
887 if (count > fm10k_max_channels(dev))
888 return -EINVAL;
889
890 interface->ring_feature[RING_F_RSS].limit = count;
891
892 /* use setup TC to update any traffic class queue mapping */
893 return fm10k_setup_tc(dev, netdev_get_num_tc(dev));
894}
895
841static const struct ethtool_ops fm10k_ethtool_ops = { 896static const struct ethtool_ops fm10k_ethtool_ops = {
842 .get_strings = fm10k_get_strings, 897 .get_strings = fm10k_get_strings,
843 .get_sset_count = fm10k_get_sset_count, 898 .get_sset_count = fm10k_get_sset_count,
@@ -860,6 +915,8 @@ static const struct ethtool_ops fm10k_ethtool_ops = {
860 .get_rxfh_key_size = fm10k_get_rssrk_size, 915 .get_rxfh_key_size = fm10k_get_rssrk_size,
861 .get_rxfh = fm10k_get_rssh, 916 .get_rxfh = fm10k_get_rssh,
862 .set_rxfh = fm10k_set_rssh, 917 .set_rxfh = fm10k_set_rssh,
918 .get_channels = fm10k_get_channels,
919 .set_channels = fm10k_set_channels,
863}; 920};
864 921
865void fm10k_set_ethtool_ops(struct net_device *dev) 922void fm10k_set_ethtool_ops(struct net_device *dev)