diff options
Diffstat (limited to 'drivers/net/ethernet/intel/i40e/i40e_main.c')
-rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_main.c | 85 |
1 files changed, 74 insertions, 11 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 9fe68024d971..84b196238b92 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c | |||
@@ -7873,7 +7873,7 @@ static int i40e_vsi_config_rss(struct i40e_vsi *vsi) | |||
7873 | } | 7873 | } |
7874 | 7874 | ||
7875 | /** | 7875 | /** |
7876 | * i40e_config_rss_reg - Prepare for RSS if used | 7876 | * i40e_config_rss_reg - Configure RSS keys and lut by writing registers |
7877 | * @vsi: Pointer to vsi structure | 7877 | * @vsi: Pointer to vsi structure |
7878 | * @seed: RSS hash seed | 7878 | * @seed: RSS hash seed |
7879 | * @lut: Lookup table | 7879 | * @lut: Lookup table |
@@ -7911,6 +7911,73 @@ static int i40e_config_rss_reg(struct i40e_vsi *vsi, const u8 *seed, | |||
7911 | } | 7911 | } |
7912 | 7912 | ||
7913 | /** | 7913 | /** |
7914 | * i40e_get_rss_reg - Get the RSS keys and lut by reading registers | ||
7915 | * @vsi: Pointer to VSI structure | ||
7916 | * @seed: Buffer to store the keys | ||
7917 | * @lut: Buffer to store the lookup table entries | ||
7918 | * @lut_size: Size of buffer to store the lookup table entries | ||
7919 | * | ||
7920 | * Returns 0 on success, negative on failure | ||
7921 | */ | ||
7922 | static int i40e_get_rss_reg(struct i40e_vsi *vsi, u8 *seed, | ||
7923 | u8 *lut, u16 lut_size) | ||
7924 | { | ||
7925 | struct i40e_pf *pf = vsi->back; | ||
7926 | struct i40e_hw *hw = &pf->hw; | ||
7927 | u16 i; | ||
7928 | |||
7929 | if (seed) { | ||
7930 | u32 *seed_dw = (u32 *)seed; | ||
7931 | |||
7932 | for (i = 0; i <= I40E_PFQF_HKEY_MAX_INDEX; i++) | ||
7933 | seed_dw[i] = rd32(hw, I40E_PFQF_HKEY(i)); | ||
7934 | } | ||
7935 | if (lut) { | ||
7936 | u32 *lut_dw = (u32 *)lut; | ||
7937 | |||
7938 | if (lut_size != I40E_HLUT_ARRAY_SIZE) | ||
7939 | return -EINVAL; | ||
7940 | for (i = 0; i <= I40E_PFQF_HLUT_MAX_INDEX; i++) | ||
7941 | lut_dw[i] = rd32(hw, I40E_PFQF_HLUT(i)); | ||
7942 | } | ||
7943 | |||
7944 | return 0; | ||
7945 | } | ||
7946 | |||
7947 | /** | ||
7948 | * i40e_config_rss - Configure RSS keys and lut | ||
7949 | * @vsi: Pointer to VSI structure | ||
7950 | * @seed: RSS hash seed | ||
7951 | * @lut: Lookup table | ||
7952 | * @lut_size: Lookup table size | ||
7953 | * | ||
7954 | * Returns 0 on success, negative on failure | ||
7955 | */ | ||
7956 | int i40e_config_rss(struct i40e_vsi *vsi, u8 *seed, u8 *lut, u16 lut_size) | ||
7957 | { | ||
7958 | struct i40e_pf *pf = vsi->back; | ||
7959 | |||
7960 | if (pf->flags & I40E_FLAG_RSS_AQ_CAPABLE) | ||
7961 | return i40e_config_rss_aq(vsi, seed, lut, lut_size); | ||
7962 | else | ||
7963 | return i40e_config_rss_reg(vsi, seed, lut, lut_size); | ||
7964 | } | ||
7965 | |||
7966 | /** | ||
7967 | * i40e_get_rss - Get RSS keys and lut | ||
7968 | * @vsi: Pointer to VSI structure | ||
7969 | * @seed: Buffer to store the keys | ||
7970 | * @lut: Buffer to store the lookup table entries | ||
7971 | * lut_size: Size of buffer to store the lookup table entries | ||
7972 | * | ||
7973 | * Returns 0 on success, negative on failure | ||
7974 | */ | ||
7975 | int i40e_get_rss(struct i40e_vsi *vsi, u8 *seed, u8 *lut, u16 lut_size) | ||
7976 | { | ||
7977 | return i40e_get_rss_reg(vsi, seed, lut, lut_size); | ||
7978 | } | ||
7979 | |||
7980 | /** | ||
7914 | * i40e_fill_rss_lut - Fill the RSS lookup table with default values | 7981 | * i40e_fill_rss_lut - Fill the RSS lookup table with default values |
7915 | * @pf: Pointer to board private structure | 7982 | * @pf: Pointer to board private structure |
7916 | * @lut: Lookup table | 7983 | * @lut: Lookup table |
@@ -7927,10 +7994,10 @@ static void i40e_fill_rss_lut(struct i40e_pf *pf, u8 *lut, | |||
7927 | } | 7994 | } |
7928 | 7995 | ||
7929 | /** | 7996 | /** |
7930 | * i40e_config_rss - Prepare for RSS if used | 7997 | * i40e_pf_config_rss - Prepare for RSS if used |
7931 | * @pf: board private structure | 7998 | * @pf: board private structure |
7932 | **/ | 7999 | **/ |
7933 | static int i40e_config_rss(struct i40e_pf *pf) | 8000 | static int i40e_pf_config_rss(struct i40e_pf *pf) |
7934 | { | 8001 | { |
7935 | struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; | 8002 | struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; |
7936 | u8 seed[I40E_HKEY_ARRAY_SIZE]; | 8003 | u8 seed[I40E_HKEY_ARRAY_SIZE]; |
@@ -7940,8 +8007,6 @@ static int i40e_config_rss(struct i40e_pf *pf) | |||
7940 | u64 hena; | 8007 | u64 hena; |
7941 | int ret; | 8008 | int ret; |
7942 | 8009 | ||
7943 | netdev_rss_key_fill((void *)seed, I40E_HKEY_ARRAY_SIZE); | ||
7944 | |||
7945 | /* By default we enable TCP/UDP with IPv4/IPv6 ptypes */ | 8010 | /* By default we enable TCP/UDP with IPv4/IPv6 ptypes */ |
7946 | hena = (u64)rd32(hw, I40E_PFQF_HENA(0)) | | 8011 | hena = (u64)rd32(hw, I40E_PFQF_HENA(0)) | |
7947 | ((u64)rd32(hw, I40E_PFQF_HENA(1)) << 32); | 8012 | ((u64)rd32(hw, I40E_PFQF_HENA(1)) << 32); |
@@ -7965,10 +8030,8 @@ static int i40e_config_rss(struct i40e_pf *pf) | |||
7965 | 8030 | ||
7966 | i40e_fill_rss_lut(pf, lut, vsi->rss_table_size, vsi->rss_size); | 8031 | i40e_fill_rss_lut(pf, lut, vsi->rss_table_size, vsi->rss_size); |
7967 | 8032 | ||
7968 | if (pf->flags & I40E_FLAG_RSS_AQ_CAPABLE) | 8033 | netdev_rss_key_fill((void *)seed, I40E_HKEY_ARRAY_SIZE); |
7969 | ret = i40e_config_rss_aq(vsi, seed, lut, vsi->rss_table_size); | 8034 | ret = i40e_config_rss(vsi, seed, lut, vsi->rss_table_size); |
7970 | else | ||
7971 | ret = i40e_config_rss_reg(vsi, seed, lut, vsi->rss_table_size); | ||
7972 | 8035 | ||
7973 | kfree(lut); | 8036 | kfree(lut); |
7974 | 8037 | ||
@@ -8000,7 +8063,7 @@ int i40e_reconfig_rss_queues(struct i40e_pf *pf, int queue_count) | |||
8000 | pf->rss_size = new_rss_size; | 8063 | pf->rss_size = new_rss_size; |
8001 | 8064 | ||
8002 | i40e_reset_and_rebuild(pf, true); | 8065 | i40e_reset_and_rebuild(pf, true); |
8003 | i40e_config_rss(pf); | 8066 | i40e_pf_config_rss(pf); |
8004 | } | 8067 | } |
8005 | dev_info(&pf->pdev->dev, "RSS count: %d\n", pf->rss_size); | 8068 | dev_info(&pf->pdev->dev, "RSS count: %d\n", pf->rss_size); |
8006 | return pf->rss_size; | 8069 | return pf->rss_size; |
@@ -10009,7 +10072,7 @@ static int i40e_setup_pf_switch(struct i40e_pf *pf, bool reinit) | |||
10009 | * the hash | 10072 | * the hash |
10010 | */ | 10073 | */ |
10011 | if ((pf->flags & I40E_FLAG_RSS_ENABLED)) | 10074 | if ((pf->flags & I40E_FLAG_RSS_ENABLED)) |
10012 | i40e_config_rss(pf); | 10075 | i40e_pf_config_rss(pf); |
10013 | 10076 | ||
10014 | /* fill in link information and enable LSE reporting */ | 10077 | /* fill in link information and enable LSE reporting */ |
10015 | i40e_update_link_info(&pf->hw); | 10078 | i40e_update_link_info(&pf->hw); |