aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHelin Zhang <helin.zhang@intel.com>2015-10-21 19:56:23 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2015-11-25 13:05:58 -0500
commit043dd650efde3dfc65a6461e1cdc51cc87cb76f7 (patch)
treef91cbda02097dbf9f0eac4f040e64fbfdc317144
parente69ff813af354ae445518d44e299eeb85d5037e2 (diff)
i40e: create a generic configure rss function
This patch renames the old pf-specific function in order to clarify its scope. This patch also creates a more generic configure RSS function with the old name. This patch also creates a new more generic function to get RSS configuration, using the appropriate method. Change-ID: Ieddca2707b708ef19f1ebccdfd03a0a0cd63d3af Signed-off-by: Helin Zhang <helin.zhang@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e.h2
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_ethtool.c72
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_main.c85
3 files changed, 107 insertions, 52 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h
index f6b747cf94d6..89f5323362ed 100644
--- a/drivers/net/ethernet/intel/i40e/i40e.h
+++ b/drivers/net/ethernet/intel/i40e/i40e.h
@@ -670,6 +670,8 @@ extern const char i40e_driver_name[];
670extern const char i40e_driver_version_str[]; 670extern const char i40e_driver_version_str[];
671void i40e_do_reset_safe(struct i40e_pf *pf, u32 reset_flags); 671void i40e_do_reset_safe(struct i40e_pf *pf, u32 reset_flags);
672void i40e_do_reset(struct i40e_pf *pf, u32 reset_flags); 672void i40e_do_reset(struct i40e_pf *pf, u32 reset_flags);
673int i40e_config_rss(struct i40e_vsi *vsi, u8 *seed, u8 *lut, u16 lut_size);
674int i40e_get_rss(struct i40e_vsi *vsi, u8 *seed, u8 *lut, u16 lut_size);
673struct i40e_vsi *i40e_find_vsi_from_id(struct i40e_pf *pf, u16 id); 675struct i40e_vsi *i40e_find_vsi_from_id(struct i40e_pf *pf, u16 id);
674void i40e_update_stats(struct i40e_vsi *vsi); 676void i40e_update_stats(struct i40e_vsi *vsi);
675void i40e_update_eth_stats(struct i40e_vsi *vsi); 677void i40e_update_eth_stats(struct i40e_vsi *vsi);
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index f26c0d16e43e..6cb2b340cdc2 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -2611,10 +2611,9 @@ static int i40e_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,
2611{ 2611{
2612 struct i40e_netdev_priv *np = netdev_priv(netdev); 2612 struct i40e_netdev_priv *np = netdev_priv(netdev);
2613 struct i40e_vsi *vsi = np->vsi; 2613 struct i40e_vsi *vsi = np->vsi;
2614 struct i40e_pf *pf = vsi->back; 2614 u8 *lut, *seed = NULL;
2615 struct i40e_hw *hw = &pf->hw; 2615 int ret;
2616 u32 reg_val; 2616 u16 i;
2617 int i, j;
2618 2617
2619 if (hfunc) 2618 if (hfunc)
2620 *hfunc = ETH_RSS_HASH_TOP; 2619 *hfunc = ETH_RSS_HASH_TOP;
@@ -2622,24 +2621,20 @@ static int i40e_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,
2622 if (!indir) 2621 if (!indir)
2623 return 0; 2622 return 0;
2624 2623
2625 for (i = 0, j = 0; i <= I40E_PFQF_HLUT_MAX_INDEX; i++) { 2624 seed = key;
2626 reg_val = rd32(hw, I40E_PFQF_HLUT(i)); 2625 lut = kzalloc(I40E_HLUT_ARRAY_SIZE, GFP_KERNEL);
2627 indir[j++] = reg_val & 0xff; 2626 if (!lut)
2628 indir[j++] = (reg_val >> 8) & 0xff; 2627 return -ENOMEM;
2629 indir[j++] = (reg_val >> 16) & 0xff; 2628 ret = i40e_get_rss(vsi, seed, lut, I40E_HLUT_ARRAY_SIZE);
2630 indir[j++] = (reg_val >> 24) & 0xff; 2629 if (ret)
2631 } 2630 goto out;
2631 for (i = 0; i < I40E_HLUT_ARRAY_SIZE; i++)
2632 indir[i] = (u32)(lut[i]);
2632 2633
2633 if (key) { 2634out:
2634 for (i = 0, j = 0; i <= I40E_PFQF_HKEY_MAX_INDEX; i++) { 2635 kfree(lut);
2635 reg_val = rd32(hw, I40E_PFQF_HKEY(i)); 2636
2636 key[j++] = (u8)(reg_val & 0xff); 2637 return ret;
2637 key[j++] = (u8)((reg_val >> 8) & 0xff);
2638 key[j++] = (u8)((reg_val >> 16) & 0xff);
2639 key[j++] = (u8)((reg_val >> 24) & 0xff);
2640 }
2641 }
2642 return 0;
2643} 2638}
2644 2639
2645/** 2640/**
@@ -2656,10 +2651,10 @@ static int i40e_set_rxfh(struct net_device *netdev, const u32 *indir,
2656{ 2651{
2657 struct i40e_netdev_priv *np = netdev_priv(netdev); 2652 struct i40e_netdev_priv *np = netdev_priv(netdev);
2658 struct i40e_vsi *vsi = np->vsi; 2653 struct i40e_vsi *vsi = np->vsi;
2659 struct i40e_pf *pf = vsi->back; 2654 u8 seed_def[I40E_HKEY_ARRAY_SIZE];
2660 struct i40e_hw *hw = &pf->hw; 2655 u8 *lut, *seed = NULL;
2661 u32 reg_val; 2656 u16 i;
2662 int i, j; 2657 int ret;
2663 2658
2664 if (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP) 2659 if (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP)
2665 return -EOPNOTSUPP; 2660 return -EOPNOTSUPP;
@@ -2667,24 +2662,19 @@ static int i40e_set_rxfh(struct net_device *netdev, const u32 *indir,
2667 if (!indir) 2662 if (!indir)
2668 return 0; 2663 return 0;
2669 2664
2670 for (i = 0, j = 0; i <= I40E_PFQF_HLUT_MAX_INDEX; i++) {
2671 reg_val = indir[j++];
2672 reg_val |= indir[j++] << 8;
2673 reg_val |= indir[j++] << 16;
2674 reg_val |= indir[j++] << 24;
2675 wr32(hw, I40E_PFQF_HLUT(i), reg_val);
2676 }
2677
2678 if (key) { 2665 if (key) {
2679 for (i = 0, j = 0; i <= I40E_PFQF_HKEY_MAX_INDEX; i++) { 2666 memcpy(seed_def, key, I40E_HKEY_ARRAY_SIZE);
2680 reg_val = key[j++]; 2667 seed = seed_def;
2681 reg_val |= key[j++] << 8;
2682 reg_val |= key[j++] << 16;
2683 reg_val |= key[j++] << 24;
2684 wr32(hw, I40E_PFQF_HKEY(i), reg_val);
2685 }
2686 } 2668 }
2687 return 0; 2669 lut = kzalloc(I40E_HLUT_ARRAY_SIZE, GFP_KERNEL);
2670 if (!lut)
2671 return -ENOMEM;
2672 for (i = 0; i < I40E_HLUT_ARRAY_SIZE; i++)
2673 lut[i] = (u8)(indir[i]);
2674 ret = i40e_config_rss(vsi, seed, lut, I40E_HLUT_ARRAY_SIZE);
2675 kfree(lut);
2676
2677 return ret;
2688} 2678}
2689 2679
2690/** 2680/**
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 */
7922static 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 */
7956int 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 */
7975int 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 **/
7933static int i40e_config_rss(struct i40e_pf *pf) 8000static 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);