From: Alexander Duyck <alexander.h.du...@intel.com>

This patch adds a common method for finding a VSI by type.  The main
motivation for doing this is that the Flow Director path actually had two
ways of handling this, one stopped on first match and one did not.  This
patch makes it so that all callers of this function will get the same
approach for finding a VSI.

Change-ID: Ibf25de8acd8466582520694424aa87da66965fbd
Signed-off-by: Alexander Duyck <alexander.h.du...@intel.com>
Signed-off-by: Bimmy Pujari <bimmy.puj...@intel.com>
Tested-by: Andrew Bowers <andrewx.bow...@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirs...@intel.com>
---
 drivers/net/ethernet/intel/i40e/i40e.h         | 19 +++++++++++++++++++
 drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 12 +-----------
 drivers/net/ethernet/intel/i40e/i40e_main.c    | 21 ++++++---------------
 drivers/net/ethernet/intel/i40e/i40e_txrx.c    |  5 +----
 4 files changed, 27 insertions(+), 30 deletions(-)

diff --git a/drivers/net/ethernet/intel/i40e/i40e.h 
b/drivers/net/ethernet/intel/i40e/i40e.h
index 9121e46..bb02280 100644
--- a/drivers/net/ethernet/intel/i40e/i40e.h
+++ b/drivers/net/ethernet/intel/i40e/i40e.h
@@ -723,6 +723,25 @@ int i40e_get_rss(struct i40e_vsi *vsi, u8 *seed, u8 *lut, 
u16 lut_size);
 void i40e_fill_rss_lut(struct i40e_pf *pf, u8 *lut,
                       u16 rss_table_size, u16 rss_size);
 struct i40e_vsi *i40e_find_vsi_from_id(struct i40e_pf *pf, u16 id);
+/**
+ * i40e_find_vsi_by_type - Find and return Flow Director VSI
+ * @pf: PF to search for VSI
+ * @type: Value indicating type of VSI we are looking for
+ **/
+static inline struct i40e_vsi *
+i40e_find_vsi_by_type(struct i40e_pf *pf, u16 type)
+{
+       int i;
+
+       for (i = 0; i < pf->num_alloc_vsi; i++) {
+               struct i40e_vsi *vsi = pf->vsi[i];
+
+               if (vsi && vsi->type == type)
+                       return vsi;
+       }
+
+       return NULL;
+}
 void i40e_update_stats(struct i40e_vsi *vsi);
 void i40e_update_eth_stats(struct i40e_vsi *vsi);
 struct rtnl_link_stats64 *i40e_get_vsi_stats_struct(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 fb4fb52..962a9bb 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -1768,17 +1768,7 @@ static inline bool i40e_active_vfs(struct i40e_pf *pf)
 
 static inline bool i40e_active_vmdqs(struct i40e_pf *pf)
 {
-       struct i40e_vsi **vsi = pf->vsi;
-       int i;
-
-       for (i = 0; i < pf->num_alloc_vsi; i++) {
-               if (!vsi[i])
-                       continue;
-               if (vsi[i]->type == I40E_VSI_VMDQ2)
-                       return true;
-       }
-
-       return false;
+       return !!i40e_find_vsi_by_type(pf, I40E_VSI_VMDQ2);
 }
 
 static void i40e_diag_test(struct net_device *netdev,
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c 
b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 5fe54e5..9ec977a 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -6718,7 +6718,6 @@ static int i40e_vsi_clear(struct i40e_vsi *vsi);
 static void i40e_fdir_sb_setup(struct i40e_pf *pf)
 {
        struct i40e_vsi *vsi;
-       int i;
 
        /* quick workaround for an NVM issue that leaves a critical register
         * uninitialized
@@ -6729,6 +6728,7 @@ static void i40e_fdir_sb_setup(struct i40e_pf *pf)
                        0xeacb7d61, 0xaa4f05b6, 0x9c5c89ed, 0xfc425ddb,
                        0xa4654832, 0xfc7461d4, 0x8f827619, 0xf5c63c21,
                        0x95b3a76d};
+               int i;
 
                for (i = 0; i <= I40E_GLQF_HKEY_MAX_INDEX; i++)
                        wr32(&pf->hw, I40E_GLQF_HKEY(i), hkey[i]);
@@ -6738,13 +6738,7 @@ static void i40e_fdir_sb_setup(struct i40e_pf *pf)
                return;
 
        /* find existing VSI and see if it needs configuring */
-       vsi = NULL;
-       for (i = 0; i < pf->num_alloc_vsi; i++) {
-               if (pf->vsi[i] && pf->vsi[i]->type == I40E_VSI_FDIR) {
-                       vsi = pf->vsi[i];
-                       break;
-               }
-       }
+       vsi = i40e_find_vsi_by_type(pf, I40E_VSI_FDIR);
 
        /* create a new VSI if none exists */
        if (!vsi) {
@@ -6766,15 +6760,12 @@ static void i40e_fdir_sb_setup(struct i40e_pf *pf)
  **/
 static void i40e_fdir_teardown(struct i40e_pf *pf)
 {
-       int i;
+       struct i40e_vsi *vsi;
 
        i40e_fdir_filter_exit(pf);
-       for (i = 0; i < pf->num_alloc_vsi; i++) {
-               if (pf->vsi[i] && pf->vsi[i]->type == I40E_VSI_FDIR) {
-                       i40e_vsi_release(pf->vsi[i]);
-                       break;
-               }
-       }
+       vsi = i40e_find_vsi_by_type(pf, I40E_VSI_FDIR);
+       if (vsi)
+               i40e_vsi_release(vsi);
 }
 
 /**
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c 
b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
index 783ac4e..75b8f5b 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
@@ -125,10 +125,7 @@ static int i40e_program_fdir_filter(struct 
i40e_fdir_filter *fdir_data,
        u16 i;
 
        /* find existing FDIR VSI */
-       vsi = NULL;
-       for (i = 0; i < pf->num_alloc_vsi; i++)
-               if (pf->vsi[i] && pf->vsi[i]->type == I40E_VSI_FDIR)
-                       vsi = pf->vsi[i];
+       vsi = i40e_find_vsi_by_type(pf, I40E_VSI_FDIR);
        if (!vsi)
                return -ENOENT;
 
-- 
2.7.4

Reply via email to