diff options
author | Alexander Duyck <alexander.h.duyck@intel.com> | 2014-09-20 19:50:42 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2014-09-23 06:59:19 -0400 |
commit | aa3ac822689f5c4d8961a8707edba9b6bf4631a3 (patch) | |
tree | 49955a51b31bc37ba6bd6d6df9a94d88b627075c /drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c | |
parent | 19ae1b3fb99c2d5a5a7540c296c4cb4df3e7f552 (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.c | 57 |
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 | ||
841 | static 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 | |||
854 | static 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 | |||
871 | static 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 | |||
841 | static const struct ethtool_ops fm10k_ethtool_ops = { | 896 | static 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 | ||
865 | void fm10k_set_ethtool_ops(struct net_device *dev) | 922 | void fm10k_set_ethtool_ops(struct net_device *dev) |