aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel
diff options
context:
space:
mode:
authorAnjali Singhai Jain <anjali.singhai@intel.com>2015-06-23 19:00:04 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2015-08-05 19:53:45 -0400
commite25d00b87b26f96f91434e6608dc4b05f5ef5498 (patch)
treec22424a45c587ad58e8dc2b750a3e5212f2a2a4b /drivers/net/ethernet/intel
parentda48c9a2aa3a93b4f19e3a37b8fa1cd7fe7005bb (diff)
i40e/i40evf: RSS changes for X722
X722 uses the admin queue to configure RSS. This patch adds the necessary flow changes to configure RSS through AQ. It also adds the separate VMDQ2 lookup tables and hash key programming for X722. X722 also exposes a different set of PCTYPES for RSS, this patch accommodates those changes. Signed-off-by: Anjali Singhai Jain <anjali.singhai@intel.com> Signed-off-by: Catherine Sullivan <catherine.sullivan@intel.com> Signed-off-by: Mitch Williams <mitch.a.williams@intel.com> Tested-by: Jim Young <james.m.young@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel')
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e.h7
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_main.c156
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_txrx.h12
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_type.h15
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c11
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40e_txrx.h12
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40e_type.h15
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40evf.h2
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40evf_main.c166
9 files changed, 307 insertions, 89 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h
index 99148861b1c0..66d0780f1297 100644
--- a/drivers/net/ethernet/intel/i40e/i40e.h
+++ b/drivers/net/ethernet/intel/i40e/i40e.h
@@ -79,10 +79,13 @@
79#define I40E_MIN_MSIX 2 79#define I40E_MIN_MSIX 2
80#define I40E_DEFAULT_NUM_VMDQ_VSI 8 /* max 256 VSIs */ 80#define I40E_DEFAULT_NUM_VMDQ_VSI 8 /* max 256 VSIs */
81#define I40E_MIN_VSI_ALLOC 51 /* LAN, ATR, FCOE, 32 VF, 16 VMDQ */ 81#define I40E_MIN_VSI_ALLOC 51 /* LAN, ATR, FCOE, 32 VF, 16 VMDQ */
82#define I40E_DEFAULT_QUEUES_PER_VMDQ 2 /* max 16 qps */ 82/* max 16 qps */
83#define i40e_default_queues_per_vmdq(pf) \
84 (((pf)->flags & I40E_FLAG_RSS_AQ_CAPABLE) ? 4 : 1)
83#define I40E_DEFAULT_QUEUES_PER_VF 4 85#define I40E_DEFAULT_QUEUES_PER_VF 4
84#define I40E_DEFAULT_QUEUES_PER_TC 1 /* should be a power of 2 */ 86#define I40E_DEFAULT_QUEUES_PER_TC 1 /* should be a power of 2 */
85#define I40E_MAX_QUEUES_PER_TC 64 /* should be a power of 2 */ 87#define i40e_pf_get_max_q_per_tc(pf) \
88 (((pf)->flags & I40E_FLAG_128_QP_RSS_CAPABLE) ? 128 : 64)
86#define I40E_FDIR_RING 0 89#define I40E_FDIR_RING 0
87#define I40E_FDIR_RING_COUNT 32 90#define I40E_FDIR_RING_COUNT 32
88#ifdef I40E_FCOE 91#ifdef I40E_FCOE
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 3269b059762e..2e8416560632 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -1550,7 +1550,7 @@ static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi,
1550 */ 1550 */
1551 qcount = min_t(int, vsi->alloc_queue_pairs, pf->num_lan_msix); 1551 qcount = min_t(int, vsi->alloc_queue_pairs, pf->num_lan_msix);
1552 num_tc_qps = qcount / numtc; 1552 num_tc_qps = qcount / numtc;
1553 num_tc_qps = min_t(int, num_tc_qps, I40E_MAX_QUEUES_PER_TC); 1553 num_tc_qps = min_t(int, num_tc_qps, i40e_pf_get_max_q_per_tc(pf));
1554 1554
1555 /* Setup queue offset/count for all TCs for given VSI */ 1555 /* Setup queue offset/count for all TCs for given VSI */
1556 for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) { 1556 for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
@@ -7469,62 +7469,139 @@ static int i40e_setup_misc_vector(struct i40e_pf *pf)
7469} 7469}
7470 7470
7471/** 7471/**
7472 * i40e_config_rss - Prepare for RSS if used 7472 * i40e_config_rss_aq - Prepare for RSS using AQ commands
7473 * @vsi: vsi structure
7474 * @seed: RSS hash seed
7475 **/
7476static int i40e_config_rss_aq(struct i40e_vsi *vsi, const u8 *seed)
7477{
7478 struct i40e_aqc_get_set_rss_key_data rss_key;
7479 struct i40e_pf *pf = vsi->back;
7480 struct i40e_hw *hw = &pf->hw;
7481 bool pf_lut = false;
7482 u8 *rss_lut;
7483 int ret, i;
7484
7485 memset(&rss_key, 0, sizeof(rss_key));
7486 memcpy(&rss_key, seed, sizeof(rss_key));
7487
7488 rss_lut = kzalloc(pf->rss_table_size, GFP_KERNEL);
7489 if (!rss_lut)
7490 return -ENOMEM;
7491
7492 /* Populate the LUT with max no. of queues in round robin fashion */
7493 for (i = 0; i < vsi->rss_table_size; i++)
7494 rss_lut[i] = i % vsi->rss_size;
7495
7496 ret = i40e_aq_set_rss_key(hw, vsi->id, &rss_key);
7497 if (ret) {
7498 dev_info(&pf->pdev->dev,
7499 "Cannot set RSS key, err %s aq_err %s\n",
7500 i40e_stat_str(&pf->hw, ret),
7501 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status));
7502 return ret;
7503 }
7504
7505 if (vsi->type == I40E_VSI_MAIN)
7506 pf_lut = true;
7507
7508 ret = i40e_aq_set_rss_lut(hw, vsi->id, pf_lut, rss_lut,
7509 vsi->rss_table_size);
7510 if (ret)
7511 dev_info(&pf->pdev->dev,
7512 "Cannot set RSS lut, err %s aq_err %s\n",
7513 i40e_stat_str(&pf->hw, ret),
7514 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status));
7515
7516 return ret;
7517}
7518
7519/**
7520 * i40e_vsi_config_rss - Prepare for VSI(VMDq) RSS if used
7521 * @vsi: VSI structure
7522 **/
7523static int i40e_vsi_config_rss(struct i40e_vsi *vsi)
7524{
7525 u8 seed[I40E_HKEY_ARRAY_SIZE];
7526 struct i40e_pf *pf = vsi->back;
7527
7528 netdev_rss_key_fill((void *)seed, I40E_HKEY_ARRAY_SIZE);
7529 vsi->rss_size = min_t(int, pf->rss_size, vsi->num_queue_pairs);
7530
7531 if (pf->flags & I40E_FLAG_RSS_AQ_CAPABLE)
7532 return i40e_config_rss_aq(vsi, seed);
7533
7534 return 0;
7535}
7536
7537/**
7538 * i40e_config_rss_reg - Prepare for RSS if used
7473 * @pf: board private structure 7539 * @pf: board private structure
7540 * @seed: RSS hash seed
7474 **/ 7541 **/
7475static int i40e_config_rss(struct i40e_pf *pf) 7542static int i40e_config_rss_reg(struct i40e_pf *pf, const u8 *seed)
7476{ 7543{
7477 u32 rss_key[I40E_PFQF_HKEY_MAX_INDEX + 1];
7478 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; 7544 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
7479 struct i40e_hw *hw = &pf->hw; 7545 struct i40e_hw *hw = &pf->hw;
7546 u32 *seed_dw = (u32 *)seed;
7547 u32 current_queue = 0;
7480 u32 lut = 0; 7548 u32 lut = 0;
7481 int i, j; 7549 int i, j;
7482 u64 hena;
7483 u32 reg_val;
7484 7550
7485 netdev_rss_key_fill(rss_key, sizeof(rss_key)); 7551 /* Fill out hash function seed */
7486 for (i = 0; i <= I40E_PFQF_HKEY_MAX_INDEX; i++) 7552 for (i = 0; i <= I40E_PFQF_HKEY_MAX_INDEX; i++)
7487 wr32(hw, I40E_PFQF_HKEY(i), rss_key[i]); 7553 wr32(hw, I40E_PFQF_HKEY(i), seed_dw[i]);
7554
7555 for (i = 0; i <= I40E_PFQF_HLUT_MAX_INDEX; i++) {
7556 lut = 0;
7557 for (j = 0; j < 4; j++) {
7558 if (current_queue == vsi->rss_size)
7559 current_queue = 0;
7560 lut |= ((current_queue) << (8 * j));
7561 current_queue++;
7562 }
7563 wr32(&pf->hw, I40E_PFQF_HLUT(i), lut);
7564 }
7565 i40e_flush(hw);
7566
7567 return 0;
7568}
7569
7570/**
7571 * i40e_config_rss - Prepare for RSS if used
7572 * @pf: board private structure
7573 **/
7574static int i40e_config_rss(struct i40e_pf *pf)
7575{
7576 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
7577 u8 seed[I40E_HKEY_ARRAY_SIZE];
7578 struct i40e_hw *hw = &pf->hw;
7579 u32 reg_val;
7580 u64 hena;
7581
7582 netdev_rss_key_fill((void *)seed, I40E_HKEY_ARRAY_SIZE);
7488 7583
7489 /* By default we enable TCP/UDP with IPv4/IPv6 ptypes */ 7584 /* By default we enable TCP/UDP with IPv4/IPv6 ptypes */
7490 hena = (u64)rd32(hw, I40E_PFQF_HENA(0)) | 7585 hena = (u64)rd32(hw, I40E_PFQF_HENA(0)) |
7491 ((u64)rd32(hw, I40E_PFQF_HENA(1)) << 32); 7586 ((u64)rd32(hw, I40E_PFQF_HENA(1)) << 32);
7492 hena |= I40E_DEFAULT_RSS_HENA; 7587 hena |= i40e_pf_get_default_rss_hena(pf);
7588
7493 wr32(hw, I40E_PFQF_HENA(0), (u32)hena); 7589 wr32(hw, I40E_PFQF_HENA(0), (u32)hena);
7494 wr32(hw, I40E_PFQF_HENA(1), (u32)(hena >> 32)); 7590 wr32(hw, I40E_PFQF_HENA(1), (u32)(hena >> 32));
7495 7591
7496 vsi->rss_size = min_t(int, pf->rss_size, vsi->num_queue_pairs); 7592 vsi->rss_size = min_t(int, pf->rss_size, vsi->num_queue_pairs);
7497 7593
7498 /* Check capability and Set table size and register per hw expectation*/ 7594 /* Determine the RSS table size based on the hardware capabilities */
7499 reg_val = rd32(hw, I40E_PFQF_CTL_0); 7595 reg_val = rd32(hw, I40E_PFQF_CTL_0);
7500 if (pf->rss_table_size == 512) 7596 reg_val = (pf->rss_table_size == 512) ?
7501 reg_val |= I40E_PFQF_CTL_0_HASHLUTSIZE_512; 7597 (reg_val | I40E_PFQF_CTL_0_HASHLUTSIZE_512) :
7502 else 7598 (reg_val & ~I40E_PFQF_CTL_0_HASHLUTSIZE_512);
7503 reg_val &= ~I40E_PFQF_CTL_0_HASHLUTSIZE_512;
7504 wr32(hw, I40E_PFQF_CTL_0, reg_val); 7599 wr32(hw, I40E_PFQF_CTL_0, reg_val);
7505 7600
7506 /* Populate the LUT with max no. of queues in round robin fashion */ 7601 if (pf->flags & I40E_FLAG_RSS_AQ_CAPABLE)
7507 for (i = 0, j = 0; i < pf->rss_table_size; i++, j++) { 7602 return i40e_config_rss_aq(pf->vsi[pf->lan_vsi], seed);
7508 7603 else
7509 /* The assumption is that lan qp count will be the highest 7604 return i40e_config_rss_reg(pf, seed);
7510 * qp count for any PF VSI that needs RSS.
7511 * If multiple VSIs need RSS support, all the qp counts
7512 * for those VSIs should be a power of 2 for RSS to work.
7513 * If LAN VSI is the only consumer for RSS then this requirement
7514 * is not necessary.
7515 */
7516 if (j == vsi->rss_size)
7517 j = 0;
7518 /* lut = 4-byte sliding window of 4 lut entries */
7519 lut = (lut << 8) | (j &
7520 (BIT(pf->hw.func_caps.rss_table_entry_width) - 1));
7521 /* On i = 3, we have 4 entries in lut; write to the register */
7522 if ((i & 3) == 3)
7523 wr32(hw, I40E_PFQF_HLUT(i >> 2), lut);
7524 }
7525 i40e_flush(hw);
7526
7527 return 0;
7528} 7605}
7529 7606
7530/** 7607/**
@@ -7765,9 +7842,8 @@ static int i40e_sw_init(struct i40e_pf *pf)
7765 } 7842 }
7766 7843
7767 if (pf->hw.func_caps.vmdq) { 7844 if (pf->hw.func_caps.vmdq) {
7768 pf->flags |= I40E_FLAG_VMDQ_ENABLED;
7769 pf->num_vmdq_vsis = I40E_DEFAULT_NUM_VMDQ_VSI; 7845 pf->num_vmdq_vsis = I40E_DEFAULT_NUM_VMDQ_VSI;
7770 pf->num_vmdq_qps = I40E_DEFAULT_QUEUES_PER_VMDQ; 7846 pf->flags |= I40E_FLAG_VMDQ_ENABLED;
7771 } 7847 }
7772 7848
7773#ifdef I40E_FCOE 7849#ifdef I40E_FCOE
@@ -8948,6 +9024,10 @@ struct i40e_vsi *i40e_vsi_setup(struct i40e_pf *pf, u8 type,
8948 break; 9024 break;
8949 } 9025 }
8950 9026
9027 if ((pf->flags & I40E_FLAG_RSS_AQ_CAPABLE) &&
9028 (vsi->type == I40E_VSI_VMDQ2)) {
9029 ret = i40e_vsi_config_rss(vsi);
9030 }
8951 return vsi; 9031 return vsi;
8952 9032
8953err_rings: 9033err_rings:
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.h b/drivers/net/ethernet/intel/i40e/i40e_txrx.h
index 429833c47245..8b618d0151cd 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.h
+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.h
@@ -78,6 +78,18 @@ enum i40e_dyn_idx_t {
78 BIT_ULL(I40E_FILTER_PCTYPE_FRAG_IPV6) | \ 78 BIT_ULL(I40E_FILTER_PCTYPE_FRAG_IPV6) | \
79 BIT_ULL(I40E_FILTER_PCTYPE_L2_PAYLOAD)) 79 BIT_ULL(I40E_FILTER_PCTYPE_L2_PAYLOAD))
80 80
81#define I40E_DEFAULT_RSS_HENA_EXPANDED (I40E_DEFAULT_RSS_HENA | \
82 BIT(I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK) | \
83 BIT(I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP) | \
84 BIT(I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP) | \
85 BIT(I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK) | \
86 BIT(I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP) | \
87 BIT(I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP))
88
89#define i40e_pf_get_default_rss_hena(pf) \
90 (((pf)->flags & I40E_FLAG_MULTIPLE_TCP_UDP_RSS_PCTYPE) ? \
91 I40E_DEFAULT_RSS_HENA_EXPANDED : I40E_DEFAULT_RSS_HENA)
92
81/* Supported Rx Buffer Sizes */ 93/* Supported Rx Buffer Sizes */
82#define I40E_RXBUFFER_512 512 /* Used for packet split */ 94#define I40E_RXBUFFER_512 512 /* Used for packet split */
83#define I40E_RXBUFFER_2048 2048 95#define I40E_RXBUFFER_2048 2048
diff --git a/drivers/net/ethernet/intel/i40e/i40e_type.h b/drivers/net/ethernet/intel/i40e/i40e_type.h
index 778266fa4104..1ffd27143a3c 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_type.h
+++ b/drivers/net/ethernet/intel/i40e/i40e_type.h
@@ -973,15 +973,24 @@ struct i40e_filter_program_desc {
973 973
974/* Packet Classifier Types for filters */ 974/* Packet Classifier Types for filters */
975enum i40e_filter_pctype { 975enum i40e_filter_pctype {
976 /* Note: Values 0-30 are reserved for future use */ 976 /* Note: Values 0-28 are reserved for future use.
977 * Value 29, 30, 32 are not supported on XL710 and X710.
978 */
979 I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP = 29,
980 I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP = 30,
977 I40E_FILTER_PCTYPE_NONF_IPV4_UDP = 31, 981 I40E_FILTER_PCTYPE_NONF_IPV4_UDP = 31,
978 /* Note: Value 32 is reserved for future use */ 982 I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK = 32,
979 I40E_FILTER_PCTYPE_NONF_IPV4_TCP = 33, 983 I40E_FILTER_PCTYPE_NONF_IPV4_TCP = 33,
980 I40E_FILTER_PCTYPE_NONF_IPV4_SCTP = 34, 984 I40E_FILTER_PCTYPE_NONF_IPV4_SCTP = 34,
981 I40E_FILTER_PCTYPE_NONF_IPV4_OTHER = 35, 985 I40E_FILTER_PCTYPE_NONF_IPV4_OTHER = 35,
982 I40E_FILTER_PCTYPE_FRAG_IPV4 = 36, 986 I40E_FILTER_PCTYPE_FRAG_IPV4 = 36,
983 /* Note: Values 37-40 are reserved for future use */ 987 /* Note: Values 37-38 are reserved for future use.
988 * Value 39, 40, 42 are not supported on XL710 and X710.
989 */
990 I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP = 39,
991 I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP = 40,
984 I40E_FILTER_PCTYPE_NONF_IPV6_UDP = 41, 992 I40E_FILTER_PCTYPE_NONF_IPV6_UDP = 41,
993 I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK = 42,
985 I40E_FILTER_PCTYPE_NONF_IPV6_TCP = 43, 994 I40E_FILTER_PCTYPE_NONF_IPV6_TCP = 43,
986 I40E_FILTER_PCTYPE_NONF_IPV6_SCTP = 44, 995 I40E_FILTER_PCTYPE_NONF_IPV6_SCTP = 44,
987 I40E_FILTER_PCTYPE_NONF_IPV6_OTHER = 45, 996 I40E_FILTER_PCTYPE_NONF_IPV6_OTHER = 45,
diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
index d29d4062addf..8a7607c6e142 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
@@ -1177,9 +1177,14 @@ static int i40e_vc_get_vf_resources_msg(struct i40e_vf *vf, u8 *msg)
1177 vfres->vf_offload_flags = I40E_VIRTCHNL_VF_OFFLOAD_L2; 1177 vfres->vf_offload_flags = I40E_VIRTCHNL_VF_OFFLOAD_L2;
1178 vsi = pf->vsi[vf->lan_vsi_idx]; 1178 vsi = pf->vsi[vf->lan_vsi_idx];
1179 if (!vsi->info.pvid) 1179 if (!vsi->info.pvid)
1180 vfres->vf_offload_flags |= I40E_VIRTCHNL_VF_OFFLOAD_VLAN | 1180 vfres->vf_offload_flags |= I40E_VIRTCHNL_VF_OFFLOAD_VLAN;
1181 I40E_VIRTCHNL_VF_OFFLOAD_RSS_REG; 1181 if (pf->flags & I40E_FLAG_RSS_AQ_CAPABLE) {
1182 1182 if (vf->driver_caps & I40E_VIRTCHNL_VF_OFFLOAD_RSS_AQ)
1183 vfres->vf_offload_flags |=
1184 I40E_VIRTCHNL_VF_OFFLOAD_RSS_AQ;
1185 } else {
1186 vfres->vf_offload_flags |= I40E_VIRTCHNL_VF_OFFLOAD_RSS_REG;
1187 }
1183 vfres->num_vsis = num_vsis; 1188 vfres->num_vsis = num_vsis;
1184 vfres->num_queue_pairs = vf->num_queue_pairs; 1189 vfres->num_queue_pairs = vf->num_queue_pairs;
1185 vfres->max_vectors = pf->hw.func_caps.num_msix_vectors_vf; 1190 vfres->max_vectors = pf->hw.func_caps.num_msix_vectors_vf;
diff --git a/drivers/net/ethernet/intel/i40evf/i40e_txrx.h b/drivers/net/ethernet/intel/i40evf/i40e_txrx.h
index 6b47c818d1f0..b2f9b8203c67 100644
--- a/drivers/net/ethernet/intel/i40evf/i40e_txrx.h
+++ b/drivers/net/ethernet/intel/i40evf/i40e_txrx.h
@@ -78,6 +78,18 @@ enum i40e_dyn_idx_t {
78 BIT_ULL(I40E_FILTER_PCTYPE_FRAG_IPV6) | \ 78 BIT_ULL(I40E_FILTER_PCTYPE_FRAG_IPV6) | \
79 BIT_ULL(I40E_FILTER_PCTYPE_L2_PAYLOAD)) 79 BIT_ULL(I40E_FILTER_PCTYPE_L2_PAYLOAD))
80 80
81#define I40E_DEFAULT_RSS_HENA_EXPANDED (I40E_DEFAULT_RSS_HENA | \
82 BIT(I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK) | \
83 BIT(I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP) | \
84 BIT(I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP) | \
85 BIT(I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK) | \
86 BIT(I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP) | \
87 BIT(I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP))
88
89#define i40e_pf_get_default_rss_hena(pf) \
90 (((pf)->flags & I40E_FLAG_MULTIPLE_TCP_UDP_RSS_PCTYPE) ? \
91 I40E_DEFAULT_RSS_HENA_EXPANDED : I40E_DEFAULT_RSS_HENA)
92
81/* Supported Rx Buffer Sizes */ 93/* Supported Rx Buffer Sizes */
82#define I40E_RXBUFFER_512 512 /* Used for packet split */ 94#define I40E_RXBUFFER_512 512 /* Used for packet split */
83#define I40E_RXBUFFER_2048 2048 95#define I40E_RXBUFFER_2048 2048
diff --git a/drivers/net/ethernet/intel/i40evf/i40e_type.h b/drivers/net/ethernet/intel/i40evf/i40e_type.h
index c50536b0e15c..627bf7689bbc 100644
--- a/drivers/net/ethernet/intel/i40evf/i40e_type.h
+++ b/drivers/net/ethernet/intel/i40evf/i40e_type.h
@@ -967,15 +967,24 @@ struct i40e_filter_program_desc {
967 967
968/* Packet Classifier Types for filters */ 968/* Packet Classifier Types for filters */
969enum i40e_filter_pctype { 969enum i40e_filter_pctype {
970 /* Note: Values 0-30 are reserved for future use */ 970 /* Note: Values 0-28 are reserved for future use.
971 * Value 29, 30, 32 are not supported on XL710 and X710.
972 */
973 I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP = 29,
974 I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP = 30,
971 I40E_FILTER_PCTYPE_NONF_IPV4_UDP = 31, 975 I40E_FILTER_PCTYPE_NONF_IPV4_UDP = 31,
972 /* Note: Value 32 is reserved for future use */ 976 I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK = 32,
973 I40E_FILTER_PCTYPE_NONF_IPV4_TCP = 33, 977 I40E_FILTER_PCTYPE_NONF_IPV4_TCP = 33,
974 I40E_FILTER_PCTYPE_NONF_IPV4_SCTP = 34, 978 I40E_FILTER_PCTYPE_NONF_IPV4_SCTP = 34,
975 I40E_FILTER_PCTYPE_NONF_IPV4_OTHER = 35, 979 I40E_FILTER_PCTYPE_NONF_IPV4_OTHER = 35,
976 I40E_FILTER_PCTYPE_FRAG_IPV4 = 36, 980 I40E_FILTER_PCTYPE_FRAG_IPV4 = 36,
977 /* Note: Values 37-40 are reserved for future use */ 981 /* Note: Values 37-38 are reserved for future use.
982 * Value 39, 40, 42 are not supported on XL710 and X710.
983 */
984 I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP = 39,
985 I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP = 40,
978 I40E_FILTER_PCTYPE_NONF_IPV6_UDP = 41, 986 I40E_FILTER_PCTYPE_NONF_IPV6_UDP = 41,
987 I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK = 42,
979 I40E_FILTER_PCTYPE_NONF_IPV6_TCP = 43, 988 I40E_FILTER_PCTYPE_NONF_IPV6_TCP = 43,
980 I40E_FILTER_PCTYPE_NONF_IPV6_SCTP = 44, 989 I40E_FILTER_PCTYPE_NONF_IPV6_SCTP = 44,
981 I40E_FILTER_PCTYPE_NONF_IPV6_OTHER = 45, 990 I40E_FILTER_PCTYPE_NONF_IPV6_OTHER = 45,
diff --git a/drivers/net/ethernet/intel/i40evf/i40evf.h b/drivers/net/ethernet/intel/i40evf/i40evf.h
index bd227b39ac55..fa421d6020be 100644
--- a/drivers/net/ethernet/intel/i40evf/i40evf.h
+++ b/drivers/net/ethernet/intel/i40evf/i40evf.h
@@ -101,6 +101,8 @@ struct i40e_vsi {
101#define MAX_RX_QUEUES 8 101#define MAX_RX_QUEUES 8
102#define MAX_TX_QUEUES MAX_RX_QUEUES 102#define MAX_TX_QUEUES MAX_RX_QUEUES
103 103
104#define I40EVF_HKEY_ARRAY_SIZE ((I40E_VFQF_HKEY_MAX_INDEX + 1) * 4)
105
104/* MAX_MSIX_Q_VECTORS of these are allocated, 106/* MAX_MSIX_Q_VECTORS of these are allocated,
105 * but we only use one per queue-specific vector. 107 * but we only use one per queue-specific vector.
106 */ 108 */
diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_main.c b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
index 642944e622af..2a6063a3a14d 100644
--- a/drivers/net/ethernet/intel/i40evf/i40evf_main.c
+++ b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
@@ -1173,6 +1173,113 @@ out:
1173} 1173}
1174 1174
1175/** 1175/**
1176 * i40e_configure_rss_aq - Prepare for RSS using AQ commands
1177 * @vsi: vsi structure
1178 * @seed: RSS hash seed
1179 **/
1180static void i40evf_configure_rss_aq(struct i40e_vsi *vsi, const u8 *seed)
1181{
1182 struct i40e_aqc_get_set_rss_key_data rss_key;
1183 struct i40evf_adapter *adapter = vsi->back;
1184 struct i40e_hw *hw = &adapter->hw;
1185 int ret = 0, i;
1186 u8 *rss_lut;
1187
1188 if (!vsi->id)
1189 return;
1190
1191 if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
1192 /* bail because we already have a command pending */
1193 dev_err(&adapter->pdev->dev, "Cannot confiure RSS, command %d pending\n",
1194 adapter->current_op);
1195 return;
1196 }
1197
1198 memset(&rss_key, 0, sizeof(rss_key));
1199 memcpy(&rss_key, seed, sizeof(rss_key));
1200
1201 rss_lut = kzalloc(((I40E_VFQF_HLUT_MAX_INDEX + 1) * 4), GFP_KERNEL);
1202 if (!rss_lut)
1203 return;
1204
1205 /* Populate the LUT with max no. PF queues in round robin fashion */
1206 for (i = 0; i <= (I40E_VFQF_HLUT_MAX_INDEX * 4); i++)
1207 rss_lut[i] = i % adapter->num_active_queues;
1208
1209 ret = i40evf_aq_set_rss_key(hw, vsi->id, &rss_key);
1210 if (ret) {
1211 dev_err(&adapter->pdev->dev,
1212 "Cannot set RSS key, err %s aq_err %s\n",
1213 i40evf_stat_str(hw, ret),
1214 i40evf_aq_str(hw, hw->aq.asq_last_status));
1215 return;
1216 }
1217
1218 ret = i40evf_aq_set_rss_lut(hw, vsi->id, false, rss_lut,
1219 (I40E_VFQF_HLUT_MAX_INDEX + 1) * 4);
1220 if (ret)
1221 dev_err(&adapter->pdev->dev,
1222 "Cannot set RSS lut, err %s aq_err %s\n",
1223 i40evf_stat_str(hw, ret),
1224 i40evf_aq_str(hw, hw->aq.asq_last_status));
1225}
1226
1227/**
1228 * i40e_configure_rss_reg - Prepare for RSS if used
1229 * @adapter: board private structure
1230 * @seed: RSS hash seed
1231 **/
1232static void i40evf_configure_rss_reg(struct i40evf_adapter *adapter,
1233 const u8 *seed)
1234{
1235 struct i40e_hw *hw = &adapter->hw;
1236 u32 *seed_dw = (u32 *)seed;
1237 u32 cqueue = 0;
1238 u32 lut = 0;
1239 int i, j;
1240
1241 /* Fill out hash function seed */
1242 for (i = 0; i <= I40E_VFQF_HKEY_MAX_INDEX; i++)
1243 wr32(hw, I40E_VFQF_HKEY(i), seed_dw[i]);
1244
1245 /* Populate the LUT with max no. PF queues in round robin fashion */
1246 for (i = 0; i <= I40E_VFQF_HLUT_MAX_INDEX; i++) {
1247 lut = 0;
1248 for (j = 0; j < 4; j++) {
1249 if (cqueue == adapter->num_active_queues)
1250 cqueue = 0;
1251 lut |= ((cqueue) << (8 * j));
1252 cqueue++;
1253 }
1254 wr32(hw, I40E_VFQF_HLUT(i), lut);
1255 }
1256 i40e_flush(hw);
1257}
1258
1259/**
1260 * i40evf_configure_rss - Prepare for RSS
1261 * @adapter: board private structure
1262 **/
1263static void i40evf_configure_rss(struct i40evf_adapter *adapter)
1264{
1265 struct i40e_hw *hw = &adapter->hw;
1266 u8 seed[I40EVF_HKEY_ARRAY_SIZE];
1267 u64 hena;
1268
1269 netdev_rss_key_fill((void *)seed, I40EVF_HKEY_ARRAY_SIZE);
1270
1271 /* Enable PCTYPES for RSS, TCP/UDP with IPv4/IPv6 */
1272 hena = I40E_DEFAULT_RSS_HENA;
1273 wr32(hw, I40E_VFQF_HENA(0), (u32)hena);
1274 wr32(hw, I40E_VFQF_HENA(1), (u32)(hena >> 32));
1275
1276 if (RSS_AQ(adapter))
1277 i40evf_configure_rss_aq(&adapter->vsi, seed);
1278 else
1279 i40evf_configure_rss_reg(adapter, seed);
1280}
1281
1282/**
1176 * i40evf_alloc_q_vectors - Allocate memory for interrupt vectors 1283 * i40evf_alloc_q_vectors - Allocate memory for interrupt vectors
1177 * @adapter: board private structure to initialize 1284 * @adapter: board private structure to initialize
1178 * 1285 *
@@ -1417,6 +1524,16 @@ static void i40evf_watchdog_task(struct work_struct *work)
1417 goto watchdog_done; 1524 goto watchdog_done;
1418 } 1525 }
1419 1526
1527 if (adapter->aq_required & I40EVF_FLAG_AQ_CONFIGURE_RSS) {
1528 /* This message goes straight to the firmware, not the
1529 * PF, so we don't have to set current_op as we will
1530 * not get a response through the ARQ.
1531 */
1532 i40evf_configure_rss(adapter);
1533 adapter->aq_required &= ~I40EVF_FLAG_AQ_CONFIGURE_RSS;
1534 goto watchdog_done;
1535 }
1536
1420 if (adapter->state == __I40EVF_RUNNING) 1537 if (adapter->state == __I40EVF_RUNNING)
1421 i40evf_request_stats(adapter); 1538 i40evf_request_stats(adapter);
1422watchdog_done: 1539watchdog_done:
@@ -1439,45 +1556,6 @@ restart_watchdog:
1439 schedule_work(&adapter->adminq_task); 1556 schedule_work(&adapter->adminq_task);
1440} 1557}
1441 1558
1442/**
1443 * i40evf_configure_rss - Prepare for RSS
1444 * @adapter: board private structure
1445 **/
1446static void i40evf_configure_rss(struct i40evf_adapter *adapter)
1447{
1448 u32 rss_key[I40E_VFQF_HKEY_MAX_INDEX + 1];
1449 struct i40e_hw *hw = &adapter->hw;
1450 u32 cqueue = 0;
1451 u32 lut = 0;
1452 int i, j;
1453 u64 hena;
1454
1455 /* Hash type is configured by the PF - we just supply the key */
1456 netdev_rss_key_fill(rss_key, sizeof(rss_key));
1457
1458 /* Fill out hash function seed */
1459 for (i = 0; i <= I40E_VFQF_HKEY_MAX_INDEX; i++)
1460 wr32(hw, I40E_VFQF_HKEY(i), rss_key[i]);
1461
1462 /* Enable PCTYPES for RSS, TCP/UDP with IPv4/IPv6 */
1463 hena = I40E_DEFAULT_RSS_HENA;
1464 wr32(hw, I40E_VFQF_HENA(0), (u32)hena);
1465 wr32(hw, I40E_VFQF_HENA(1), (u32)(hena >> 32));
1466
1467 /* Populate the LUT with max no. of queues in round robin fashion */
1468 for (i = 0; i <= I40E_VFQF_HLUT_MAX_INDEX; i++) {
1469 lut = 0;
1470 for (j = 0; j < 4; j++) {
1471 if (cqueue == adapter->num_active_queues)
1472 cqueue = 0;
1473 lut |= ((cqueue) << (8 * j));
1474 cqueue++;
1475 }
1476 wr32(hw, I40E_VFQF_HLUT(i), lut);
1477 }
1478 i40e_flush(hw);
1479}
1480
1481#define I40EVF_RESET_WAIT_MS 10 1559#define I40EVF_RESET_WAIT_MS 10
1482#define I40EVF_RESET_WAIT_COUNT 500 1560#define I40EVF_RESET_WAIT_COUNT 500
1483/** 1561/**
@@ -2187,7 +2265,8 @@ static void i40evf_init_task(struct work_struct *work)
2187 if (err) 2265 if (err)
2188 goto err_sw_init; 2266 goto err_sw_init;
2189 i40evf_map_rings_to_vectors(adapter); 2267 i40evf_map_rings_to_vectors(adapter);
2190 i40evf_configure_rss(adapter); 2268 if (!RSS_AQ(adapter))
2269 i40evf_configure_rss(adapter);
2191 err = i40evf_request_misc_irq(adapter); 2270 err = i40evf_request_misc_irq(adapter);
2192 if (err) 2271 if (err)
2193 goto err_sw_init; 2272 goto err_sw_init;
@@ -2212,6 +2291,13 @@ static void i40evf_init_task(struct work_struct *work)
2212 adapter->state = __I40EVF_DOWN; 2291 adapter->state = __I40EVF_DOWN;
2213 set_bit(__I40E_DOWN, &adapter->vsi.state); 2292 set_bit(__I40E_DOWN, &adapter->vsi.state);
2214 i40evf_misc_irq_enable(adapter); 2293 i40evf_misc_irq_enable(adapter);
2294
2295 if (RSS_AQ(adapter)) {
2296 adapter->aq_required |= I40EVF_FLAG_AQ_CONFIGURE_RSS;
2297 mod_timer_pending(&adapter->watchdog_timer, jiffies + 1);
2298 } else {
2299 i40evf_configure_rss(adapter);
2300 }
2215 return; 2301 return;
2216restart: 2302restart:
2217 schedule_delayed_work(&adapter->init_task, 2303 schedule_delayed_work(&adapter->init_task,