i40e/i40evf: Update RSS configuration
authorCarolyn Wyborny <carolyn.wyborny@intel.com>
Tue, 3 Jun 2014 23:50:22 +0000 (23:50 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Fri, 20 Jun 2014 07:46:19 +0000 (00:46 -0700)
This patch changes the RSS configuration to set table size
and write to hardware to confirm RSS table size being used.

Change-ID: I455a4c09c9dd479f5791ee1f09fdc83ff9908df5
Signed-off-by: Carolyn Wyborny <carolyn.wyborny@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40e/i40e.h
drivers/net/ethernet/intel/i40e/i40e_common.c
drivers/net/ethernet/intel/i40e/i40e_main.c
drivers/net/ethernet/intel/i40e/i40e_type.h
drivers/net/ethernet/intel/i40evf/i40e_type.h

index 60f9a73303baf9685998477a7f52215dd2f2a6fc..817e179dc3f9ca39fd446537da7550a47282cb47 100644 (file)
@@ -350,6 +350,7 @@ struct i40e_pf {
        u32 rx_hwtstamp_cleared;
        bool ptp_tx;
        bool ptp_rx;
+       u16 rss_table_size;
 };
 
 struct i40e_mac_filter {
index 6e65f19dd6e58aadf1fc7df3df41ce8a617be959..a51bba6347182639d890288286ede561a83dcb50 100644 (file)
@@ -1839,7 +1839,6 @@ static void i40e_parse_discover_capabilities(struct i40e_hw *hw, void *buff,
        struct i40e_aqc_list_capabilities_element_resp *cap;
        u32 number, logical_id, phys_id;
        struct i40e_hw_capabilities *p;
-       u32 reg_val;
        u32 i = 0;
        u16 id;
 
@@ -1910,11 +1909,7 @@ static void i40e_parse_discover_capabilities(struct i40e_hw *hw, void *buff,
                        break;
                case I40E_DEV_FUNC_CAP_RSS:
                        p->rss = true;
-                       reg_val = rd32(hw, I40E_PFQF_CTL_0);
-                       if (reg_val & I40E_PFQF_CTL_0_HASHLUTSIZE_MASK)
-                               p->rss_table_size = number;
-                       else
-                               p->rss_table_size = 128;
+                       p->rss_table_size = number;
                        p->rss_table_entry_width = logical_id;
                        break;
                case I40E_DEV_FUNC_CAP_RX_QUEUES:
index ebbf37bc367e008b950a157aa609ca2b058ad5e1..34310bd116b2a318aa9fb4017af72d2cd18a289e 100644 (file)
@@ -6599,6 +6599,7 @@ static int i40e_config_rss(struct i40e_pf *pf)
        u32 lut = 0;
        int i, j;
        u64 hena;
+       u32 reg_val;
 
        /* Fill out hash function seed */
        for (i = 0; i <= I40E_PFQF_HKEY_MAX_INDEX; i++)
@@ -6611,8 +6612,19 @@ static int i40e_config_rss(struct i40e_pf *pf)
        wr32(hw, I40E_PFQF_HENA(0), (u32)hena);
        wr32(hw, I40E_PFQF_HENA(1), (u32)(hena >> 32));
 
+       /* Check capability and Set table size and register per hw expectation*/
+       reg_val = rd32(hw, I40E_PFQF_CTL_0);
+       if (hw->func_caps.rss_table_size == 512) {
+               reg_val |= I40E_PFQF_CTL_0_HASHLUTSIZE_512;
+               pf->rss_table_size = 512;
+       } else {
+               pf->rss_table_size = 128;
+               reg_val &= ~I40E_PFQF_CTL_0_HASHLUTSIZE_512;
+       }
+       wr32(hw, I40E_PFQF_CTL_0, reg_val);
+
        /* Populate the LUT with max no. of queues in round robin fashion */
-       for (i = 0, j = 0; i < pf->hw.func_caps.rss_table_size; i++, j++) {
+       for (i = 0, j = 0; i < pf->rss_table_size; i++, j++) {
 
                /* The assumption is that lan qp count will be the highest
                 * qp count for any PF VSI that needs RSS.
index a688ab86f650d9e1abeb1d597dcba95c57aa88d0..1c0d5a70b8925892cda0d57255fc6f0087ddc252 100644 (file)
@@ -1165,4 +1165,7 @@ enum i40e_reset_type {
        I40E_RESET_GLOBR        = 2,
        I40E_RESET_EMPR         = 3,
 };
+
+/* RSS Hash Table Size */
+#define I40E_PFQF_CTL_0_HASHLUTSIZE_512        0x00010000
 #endif /* _I40E_TYPE_H_ */
index 4a2e48af2887bbe359349468a066a729e972086e..9c835786e8a1abe6c06d4c2ff32da7d00fdf62d2 100644 (file)
@@ -1165,4 +1165,7 @@ enum i40e_reset_type {
        I40E_RESET_GLOBR        = 2,
        I40E_RESET_EMPR         = 3,
 };
+
+/* RSS Hash Table Size */
+#define I40E_PFQF_CTL_0_HASHLUTSIZE_512        0x00010000
 #endif /* _I40E_TYPE_H_ */