diff options
author | Helin Zhang <helin.zhang@intel.com> | 2015-10-21 19:56:23 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2015-11-25 13:05:58 -0500 |
commit | 043dd650efde3dfc65a6461e1cdc51cc87cb76f7 (patch) | |
tree | f91cbda02097dbf9f0eac4f040e64fbfdc317144 | |
parent | e69ff813af354ae445518d44e299eeb85d5037e2 (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.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 72 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_main.c | 85 |
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[]; | |||
670 | extern const char i40e_driver_version_str[]; | 670 | extern const char i40e_driver_version_str[]; |
671 | void i40e_do_reset_safe(struct i40e_pf *pf, u32 reset_flags); | 671 | void i40e_do_reset_safe(struct i40e_pf *pf, u32 reset_flags); |
672 | void i40e_do_reset(struct i40e_pf *pf, u32 reset_flags); | 672 | void i40e_do_reset(struct i40e_pf *pf, u32 reset_flags); |
673 | int i40e_config_rss(struct i40e_vsi *vsi, u8 *seed, u8 *lut, u16 lut_size); | ||
674 | int i40e_get_rss(struct i40e_vsi *vsi, u8 *seed, u8 *lut, u16 lut_size); | ||
673 | struct i40e_vsi *i40e_find_vsi_from_id(struct i40e_pf *pf, u16 id); | 675 | struct i40e_vsi *i40e_find_vsi_from_id(struct i40e_pf *pf, u16 id); |
674 | void i40e_update_stats(struct i40e_vsi *vsi); | 676 | void i40e_update_stats(struct i40e_vsi *vsi); |
675 | void i40e_update_eth_stats(struct i40e_vsi *vsi); | 677 | void 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) { | 2634 | out: |
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 | */ | ||
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); |