aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2015-04-12 21:36:57 -0400
committerDavid S. Miller <davem@davemloft.net>2015-04-12 21:36:57 -0400
commite60a9de49c3744aa44128eaaed3aca965911ca2e (patch)
treec7b60221e87d0b9c7ce5036d3d7fa1376261dc24
parent1ceb0b8ca5be40d32b0fcf57b117cfb595c9bbfa (diff)
parentb641173915ae7b51c79abfde9580c3a381876bb1 (diff)
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/next-queue
Jeff Kirsher says: ==================== Intel Wired LAN Driver Updates 2015-04-11 This series contains updates to iflink, ixgbe and ixgbevf. The entire set of changes come from Vlad Zolotarov to ultimately add the ethtool ops to VF driver to allow querying the RSS indirection table and RSS random key. Currently we support only 82599 and x540 devices. On those devices, VFs share the RSS redirection table and hash key with a PF. Letting the VF query this information may introduce some security risks, therefore this feature will be disabled by default. The new netdev op allows a system administrator to change the default behaviour with "ip link set" command. The relevant iproute2 patch has already been sent and awaits for this series upstream. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe.h11
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c42
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_main.c152
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h5
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c90
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.h2
-rw-r--r--drivers/net/ethernet/intel/ixgbevf/ethtool.c69
-rw-r--r--drivers/net/ethernet/intel/ixgbevf/ixgbevf.h2
-rw-r--r--drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c5
-rw-r--r--drivers/net/ethernet/intel/ixgbevf/mbx.h5
-rw-r--r--drivers/net/ethernet/intel/ixgbevf/vf.c124
-rw-r--r--drivers/net/ethernet/intel/ixgbevf/vf.h2
-rw-r--r--include/linux/if_link.h1
-rw-r--r--include/linux/netdevice.h8
-rw-r--r--include/uapi/linux/if_link.h8
-rw-r--r--net/core/rtnetlink.c32
16 files changed, 505 insertions, 53 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
index ae5b8b22e7e0..636f9e350162 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
@@ -151,6 +151,7 @@ struct vf_data_storage {
151 u16 tx_rate; 151 u16 tx_rate;
152 u16 vlan_count; 152 u16 vlan_count;
153 u8 spoofchk_enabled; 153 u8 spoofchk_enabled;
154 bool rss_query_enabled;
154 unsigned int vf_api; 155 unsigned int vf_api;
155}; 156};
156 157
@@ -766,6 +767,15 @@ struct ixgbe_adapter {
766 767
767 u8 default_up; 768 u8 default_up;
768 unsigned long fwd_bitmask; /* Bitmask indicating in use pools */ 769 unsigned long fwd_bitmask; /* Bitmask indicating in use pools */
770
771/* maximum number of RETA entries among all devices supported by ixgbe
772 * driver: currently it's x550 device in non-SRIOV mode
773 */
774#define IXGBE_MAX_RETA_ENTRIES 512
775 u8 rss_indir_tbl[IXGBE_MAX_RETA_ENTRIES];
776
777#define IXGBE_RSS_KEY_SIZE 40 /* size of RSS Hash Key in bytes */
778 u32 rss_key[IXGBE_RSS_KEY_SIZE / sizeof(u32)];
769}; 779};
770 780
771static inline u8 ixgbe_max_rss_indices(struct ixgbe_adapter *adapter) 781static inline u8 ixgbe_max_rss_indices(struct ixgbe_adapter *adapter)
@@ -955,4 +965,5 @@ void ixgbe_sriov_reinit(struct ixgbe_adapter *adapter);
955netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb, 965netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
956 struct ixgbe_adapter *adapter, 966 struct ixgbe_adapter *adapter,
957 struct ixgbe_ring *tx_ring); 967 struct ixgbe_ring *tx_ring);
968u32 ixgbe_rss_indir_tbl_entries(struct ixgbe_adapter *adapter);
958#endif /* _IXGBE_H_ */ 969#endif /* _IXGBE_H_ */
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
index ccaecb1b8619..eafa9ec802ba 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
@@ -2853,6 +2853,45 @@ static int ixgbe_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd)
2853 return ret; 2853 return ret;
2854} 2854}
2855 2855
2856static u32 ixgbe_get_rxfh_key_size(struct net_device *netdev)
2857{
2858 struct ixgbe_adapter *adapter = netdev_priv(netdev);
2859
2860 return sizeof(adapter->rss_key);
2861}
2862
2863static u32 ixgbe_rss_indir_size(struct net_device *netdev)
2864{
2865 struct ixgbe_adapter *adapter = netdev_priv(netdev);
2866
2867 return ixgbe_rss_indir_tbl_entries(adapter);
2868}
2869
2870static void ixgbe_get_reta(struct ixgbe_adapter *adapter, u32 *indir)
2871{
2872 int i, reta_size = ixgbe_rss_indir_tbl_entries(adapter);
2873
2874 for (i = 0; i < reta_size; i++)
2875 indir[i] = adapter->rss_indir_tbl[i];
2876}
2877
2878static int ixgbe_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,
2879 u8 *hfunc)
2880{
2881 struct ixgbe_adapter *adapter = netdev_priv(netdev);
2882
2883 if (hfunc)
2884 *hfunc = ETH_RSS_HASH_TOP;
2885
2886 if (indir)
2887 ixgbe_get_reta(adapter, indir);
2888
2889 if (key)
2890 memcpy(key, adapter->rss_key, ixgbe_get_rxfh_key_size(netdev));
2891
2892 return 0;
2893}
2894
2856static int ixgbe_get_ts_info(struct net_device *dev, 2895static int ixgbe_get_ts_info(struct net_device *dev,
2857 struct ethtool_ts_info *info) 2896 struct ethtool_ts_info *info)
2858{ 2897{
@@ -3110,6 +3149,9 @@ static const struct ethtool_ops ixgbe_ethtool_ops = {
3110 .set_coalesce = ixgbe_set_coalesce, 3149 .set_coalesce = ixgbe_set_coalesce,
3111 .get_rxnfc = ixgbe_get_rxnfc, 3150 .get_rxnfc = ixgbe_get_rxnfc,
3112 .set_rxnfc = ixgbe_set_rxnfc, 3151 .set_rxnfc = ixgbe_set_rxnfc,
3152 .get_rxfh_indir_size = ixgbe_rss_indir_size,
3153 .get_rxfh_key_size = ixgbe_get_rxfh_key_size,
3154 .get_rxfh = ixgbe_get_rxfh,
3113 .get_channels = ixgbe_get_channels, 3155 .get_channels = ixgbe_get_channels,
3114 .set_channels = ixgbe_set_channels, 3156 .set_channels = ixgbe_set_channels,
3115 .get_ts_info = ixgbe_get_ts_info, 3157 .get_ts_info = ixgbe_get_ts_info,
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index a7acb2dee009..d3f4b0ceb3f7 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -3228,89 +3228,148 @@ static void ixgbe_configure_srrctl(struct ixgbe_adapter *adapter,
3228 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(reg_idx), srrctl); 3228 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(reg_idx), srrctl);
3229} 3229}
3230 3230
3231static void ixgbe_setup_reta(struct ixgbe_adapter *adapter, const u32 *seed) 3231/**
3232 * Return a number of entries in the RSS indirection table
3233 *
3234 * @adapter: device handle
3235 *
3236 * - 82598/82599/X540: 128
3237 * - X550(non-SRIOV mode): 512
3238 * - X550(SRIOV mode): 64
3239 */
3240u32 ixgbe_rss_indir_tbl_entries(struct ixgbe_adapter *adapter)
3241{
3242 if (adapter->hw.mac.type < ixgbe_mac_X550)
3243 return 128;
3244 else if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)
3245 return 64;
3246 else
3247 return 512;
3248}
3249
3250/**
3251 * Write the RETA table to HW
3252 *
3253 * @adapter: device handle
3254 *
3255 * Write the RSS redirection table stored in adapter.rss_indir_tbl[] to HW.
3256 */
3257static void ixgbe_store_reta(struct ixgbe_adapter *adapter)
3232{ 3258{
3259 u32 i, reta_entries = ixgbe_rss_indir_tbl_entries(adapter);
3233 struct ixgbe_hw *hw = &adapter->hw; 3260 struct ixgbe_hw *hw = &adapter->hw;
3234 u32 reta = 0; 3261 u32 reta = 0;
3235 int i, j; 3262 u32 indices_multi;
3236 int reta_entries = 128; 3263 u8 *indir_tbl = adapter->rss_indir_tbl;
3237 u16 rss_i = adapter->ring_feature[RING_F_RSS].indices;
3238 int indices_multi;
3239
3240 /*
3241 * Program table for at least 2 queues w/ SR-IOV so that VFs can
3242 * make full use of any rings they may have. We will use the
3243 * PSRTYPE register to control how many rings we use within the PF.
3244 */
3245 if ((adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) && (rss_i < 2))