diff options
| author | David S. Miller <davem@davemloft.net> | 2015-04-12 21:36:57 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2015-04-12 21:36:57 -0400 |
| commit | e60a9de49c3744aa44128eaaed3aca965911ca2e (patch) | |
| tree | c7b60221e87d0b9c7ce5036d3d7fa1376261dc24 | |
| parent | 1ceb0b8ca5be40d32b0fcf57b117cfb595c9bbfa (diff) | |
| parent | b641173915ae7b51c79abfde9580c3a381876bb1 (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.h | 11 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 42 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 152 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h | 5 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 90 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.h | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/ethtool.c | 69 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/ixgbevf.h | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 5 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/mbx.h | 5 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/vf.c | 124 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/vf.h | 2 | ||||
| -rw-r--r-- | include/linux/if_link.h | 1 | ||||
| -rw-r--r-- | include/linux/netdevice.h | 8 | ||||
| -rw-r--r-- | include/uapi/linux/if_link.h | 8 | ||||
| -rw-r--r-- | net/core/rtnetlink.c | 32 |
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 | ||
| 771 | static inline u8 ixgbe_max_rss_indices(struct ixgbe_adapter *adapter) | 781 | static inline u8 ixgbe_max_rss_indices(struct ixgbe_adapter *adapter) |
| @@ -955,4 +965,5 @@ void ixgbe_sriov_reinit(struct ixgbe_adapter *adapter); | |||
| 955 | netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb, | 965 | netdev_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); |
| 968 | u32 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 | ||
| 2856 | static 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 | |||
| 2863 | static 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 | |||
| 2870 | static 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 | |||
| 2878 | static 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 | |||
| 2856 | static int ixgbe_get_ts_info(struct net_device *dev, | 2895 | static 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 | ||
| 3231 | static 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 | */ | ||
| 3240 | u32 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 | */ | ||
| 3257 | static 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)) | ||
