i40e/i40evf: Add capability exchange for outer checksum
authorPreethi Banala <preethi.banala@intel.com>
Mon, 27 Mar 2017 21:43:18 +0000 (14:43 -0700)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Fri, 7 Apr 2017 03:14:51 +0000 (20:14 -0700)
This patch adds a capability negotiation between VF and PF using ENCAP/
ENCAP_CSUM offload flags in order for the VF to support outer checksum
and TSO offloads for encapsulated packets. These capabilities were assumed
by default and enabled in current hardware. Going forward, these features
needs to be negotiated with PF before advertising to the stack.
Additionally, strip out the mac.type checks for X722 since outer checksums
are enabled based on the ENCAP_CSUM offload negotiation flag and maintain
consistency between drivers in how the features are configured.

Change-ID: Ie380a6f57eca557a2bb575b66b12fae36d308920
Signed-off-by: Preethi Banala <preethi.banala@intel.com>
Signed-off-by: Alan Brady <alan.brady@intel.com>
Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40e/i40e_main.c
drivers/net/ethernet/intel/i40e/i40e_virtchnl.h
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
drivers/net/ethernet/intel/i40evf/i40e_virtchnl.h
drivers/net/ethernet/intel/i40evf/i40evf_main.c
drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c

index 703444e92964c6ce4f45dead76dc07f2185cf7af..7147c67a939de4e7146410f76439e4287311a972 100644 (file)
@@ -9253,6 +9253,8 @@ static int i40e_config_netdev(struct i40e_vsi *vsi)
        u8 broadcast[ETH_ALEN];
        u8 mac_addr[ETH_ALEN];
        int etherdev_size;
+       netdev_features_t hw_enc_features;
+       netdev_features_t hw_features;
 
        etherdev_size = sizeof(struct i40e_netdev_priv);
        netdev = alloc_etherdev_mq(etherdev_size, vsi->alloc_queue_pairs);
@@ -9263,43 +9265,43 @@ static int i40e_config_netdev(struct i40e_vsi *vsi)
        np = netdev_priv(netdev);
        np->vsi = vsi;
 
-       netdev->hw_enc_features |= NETIF_F_SG                   |
-                                  NETIF_F_IP_CSUM              |
-                                  NETIF_F_IPV6_CSUM            |
-                                  NETIF_F_HIGHDMA              |
-                                  NETIF_F_SOFT_FEATURES        |
-                                  NETIF_F_TSO                  |
-                                  NETIF_F_TSO_ECN              |
-                                  NETIF_F_TSO6                 |
-                                  NETIF_F_GSO_GRE              |
-                                  NETIF_F_GSO_GRE_CSUM         |
-                                  NETIF_F_GSO_IPXIP4           |
-                                  NETIF_F_GSO_IPXIP6           |
-                                  NETIF_F_GSO_UDP_TUNNEL       |
-                                  NETIF_F_GSO_UDP_TUNNEL_CSUM  |
-                                  NETIF_F_GSO_PARTIAL          |
-                                  NETIF_F_SCTP_CRC             |
-                                  NETIF_F_RXHASH               |
-                                  NETIF_F_RXCSUM               |
-                                  0;
+       hw_enc_features = NETIF_F_SG                    |
+                         NETIF_F_IP_CSUM               |
+                         NETIF_F_IPV6_CSUM             |
+                         NETIF_F_HIGHDMA               |
+                         NETIF_F_SOFT_FEATURES         |
+                         NETIF_F_TSO                   |
+                         NETIF_F_TSO_ECN               |
+                         NETIF_F_TSO6                  |
+                         NETIF_F_GSO_GRE               |
+                         NETIF_F_GSO_GRE_CSUM          |
+                         NETIF_F_GSO_PARTIAL           |
+                         NETIF_F_GSO_UDP_TUNNEL        |
+                         NETIF_F_GSO_UDP_TUNNEL_CSUM   |
+                         NETIF_F_SCTP_CRC              |
+                         NETIF_F_RXHASH                |
+                         NETIF_F_RXCSUM                |
+                         0;
 
        if (!(pf->flags & I40E_FLAG_OUTER_UDP_CSUM_CAPABLE))
                netdev->gso_partial_features |= NETIF_F_GSO_UDP_TUNNEL_CSUM;
 
        netdev->gso_partial_features |= NETIF_F_GSO_GRE_CSUM;
 
+       netdev->hw_enc_features |= hw_enc_features;
+
        /* record features VLANs can make use of */
-       netdev->vlan_features |= netdev->hw_enc_features |
-                                NETIF_F_TSO_MANGLEID;
+       netdev->vlan_features |= hw_enc_features | NETIF_F_TSO_MANGLEID;
 
        if (!(pf->flags & I40E_FLAG_MFP_ENABLED))
                netdev->hw_features |= NETIF_F_NTUPLE;
+       hw_features = hw_enc_features           |
+                     NETIF_F_HW_VLAN_CTAG_TX   |
+                     NETIF_F_HW_VLAN_CTAG_RX;
 
-       netdev->hw_features |= netdev->hw_enc_features  |
-                              NETIF_F_HW_VLAN_CTAG_TX  |
-                              NETIF_F_HW_VLAN_CTAG_RX;
+       netdev->hw_features |= hw_features;
 
-       netdev->features |= netdev->hw_features | NETIF_F_HW_VLAN_CTAG_FILTER;
+       netdev->features |= hw_features | NETIF_F_HW_VLAN_CTAG_FILTER;
        netdev->hw_enc_features |= NETIF_F_TSO_MANGLEID;
 
        if (vsi->type == I40E_VSI_MAIN) {
index 974ba2baf6ea006d2f3dae4e7aa841e7bffb96d3..8552192a5bde7b804bb7f38c9142ac36f9031926 100644 (file)
@@ -163,7 +163,8 @@ struct i40e_virtchnl_vsi_resource {
 #define I40E_VIRTCHNL_VF_OFFLOAD_RX_POLLING    0x00020000
 #define I40E_VIRTCHNL_VF_OFFLOAD_RSS_PCTYPE_V2 0x00040000
 #define I40E_VIRTCHNL_VF_OFFLOAD_RSS_PF                0X00080000
-#define I40E_VIRTCHNL_VF_OFFLOAD_ENCAP_CSUM    0X00100000
+#define I40E_VIRTCHNL_VF_OFFLOAD_ENCAP         0X00100000
+#define I40E_VIRTCHNL_VF_OFFLOAD_ENCAP_CSUM    0X00200000
 
 #define I40E_VF_BASE_MODE_OFFLOADS (I40E_VIRTCHNL_VF_OFFLOAD_L2 | \
                                    I40E_VIRTCHNL_VF_OFFLOAD_VLAN | \
index d526940ff951c8d036c5e8021e3adee95e2921b0..65c95ffc15ec9c1e97ed3a0ffbc5dc9d15f3f1ef 100644 (file)
@@ -1408,6 +1408,13 @@ static int i40e_vc_get_vf_resources_msg(struct i40e_vf *vf, u8 *msg)
                                I40E_VIRTCHNL_VF_OFFLOAD_RSS_PCTYPE_V2;
        }
 
+       if (vf->driver_caps & I40E_VIRTCHNL_VF_OFFLOAD_ENCAP)
+               vfres->vf_offload_flags |= I40E_VIRTCHNL_VF_OFFLOAD_ENCAP;
+
+       if ((pf->flags & I40E_FLAG_OUTER_UDP_CSUM_CAPABLE) &&
+           (vf->driver_caps & I40E_VIRTCHNL_VF_OFFLOAD_ENCAP_CSUM))
+               vfres->vf_offload_flags |= I40E_VIRTCHNL_VF_OFFLOAD_ENCAP_CSUM;
+
        if (vf->driver_caps & I40E_VIRTCHNL_VF_OFFLOAD_RX_POLLING) {
                if (pf->flags & I40E_FLAG_MFP_ENABLED) {
                        dev_err(&pf->pdev->dev,
index f431fbc4a3e789af4d121575fb1faa8f63e817ab..c5ad0388c3d577be4991ff0b36283151f0be3824 100644 (file)
@@ -163,7 +163,8 @@ struct i40e_virtchnl_vsi_resource {
 #define I40E_VIRTCHNL_VF_OFFLOAD_RX_POLLING    0x00020000
 #define I40E_VIRTCHNL_VF_OFFLOAD_RSS_PCTYPE_V2 0x00040000
 #define I40E_VIRTCHNL_VF_OFFLOAD_RSS_PF                0X00080000
-#define I40E_VIRTCHNL_VF_OFFLOAD_ENCAP_CSUM    0X00100000
+#define I40E_VIRTCHNL_VF_OFFLOAD_ENCAP         0X00100000
+#define I40E_VIRTCHNL_VF_OFFLOAD_ENCAP_CSUM    0X00200000
 
 #define I40E_VF_BASE_MODE_OFFLOADS (I40E_VIRTCHNL_VF_OFFLOAD_L2 | \
                                    I40E_VIRTCHNL_VF_OFFLOAD_VLAN | \
index fb2811c23024dbdd94848575a77737c8f16d4c0d..c690aba8e8d1ab47d8f67b5205c94a16b13da08a 100644 (file)
@@ -2401,6 +2401,8 @@ int i40evf_process_config(struct i40evf_adapter *adapter)
        struct net_device *netdev = adapter->netdev;
        struct i40e_vsi *vsi = &adapter->vsi;
        int i;
+       netdev_features_t hw_enc_features;
+       netdev_features_t hw_features;
 
        /* got VF config message back from PF, now we can parse it */
        for (i = 0; i < vfres->num_vsis; i++) {
@@ -2412,46 +2414,52 @@ int i40evf_process_config(struct i40evf_adapter *adapter)
                return -ENODEV;
        }
 
-       netdev->hw_enc_features |= NETIF_F_SG                   |
-                                  NETIF_F_IP_CSUM              |
-                                  NETIF_F_IPV6_CSUM            |
-                                  NETIF_F_HIGHDMA              |
-                                  NETIF_F_SOFT_FEATURES        |
-                                  NETIF_F_TSO                  |
-                                  NETIF_F_TSO_ECN              |
-                                  NETIF_F_TSO6                 |
+       hw_enc_features = NETIF_F_SG                    |
+                         NETIF_F_IP_CSUM               |
+                         NETIF_F_IPV6_CSUM             |
+                         NETIF_F_HIGHDMA               |
+                         NETIF_F_SOFT_FEATURES |
+                         NETIF_F_TSO                   |
+                         NETIF_F_TSO_ECN               |
+                         NETIF_F_TSO6                  |
+                         NETIF_F_SCTP_CRC              |
+                         NETIF_F_RXHASH                |
+                         NETIF_F_RXCSUM                |
+                         0;
+
+       /* advertise to stack only if offloads for encapsulated packets is
+        * supported
+        */
+       if (vfres->vf_offload_flags & I40E_VIRTCHNL_VF_OFFLOAD_ENCAP) {
+               hw_enc_features |= NETIF_F_GSO_UDP_TUNNEL       |
                                   NETIF_F_GSO_GRE              |
                                   NETIF_F_GSO_GRE_CSUM         |
                                   NETIF_F_GSO_IPXIP4           |
                                   NETIF_F_GSO_IPXIP6           |
-                                  NETIF_F_GSO_UDP_TUNNEL       |
                                   NETIF_F_GSO_UDP_TUNNEL_CSUM  |
                                   NETIF_F_GSO_PARTIAL          |
-                                  NETIF_F_SCTP_CRC             |
-                                  NETIF_F_RXHASH               |
-                                  NETIF_F_RXCSUM               |
                                   0;
 
-       if (!(adapter->flags & I40EVF_FLAG_OUTER_UDP_CSUM_CAPABLE))
-               netdev->gso_partial_features |= NETIF_F_GSO_UDP_TUNNEL_CSUM;
-
-       netdev->gso_partial_features |= NETIF_F_GSO_GRE_CSUM;
+               if (!(vfres->vf_offload_flags &
+                     I40E_VIRTCHNL_VF_OFFLOAD_ENCAP_CSUM))
+                       netdev->gso_partial_features |=
+                               NETIF_F_GSO_UDP_TUNNEL_CSUM;
 
+               netdev->gso_partial_features |= NETIF_F_GSO_GRE_CSUM;
+               netdev->hw_enc_features |= NETIF_F_TSO_MANGLEID;
+               netdev->hw_enc_features |= hw_enc_features;
+       }
        /* record features VLANs can make use of */
-       netdev->vlan_features |= netdev->hw_enc_features |
-                                NETIF_F_TSO_MANGLEID;
+       netdev->vlan_features |= hw_enc_features | NETIF_F_TSO_MANGLEID;
 
        /* Write features and hw_features separately to avoid polluting
-        * with, or dropping, features that are set when we registgered.
+        * with, or dropping, features that are set when we registered.
         */
-       netdev->hw_features |= netdev->hw_enc_features;
+       hw_features = hw_enc_features;
 
-       netdev->features |= netdev->hw_enc_features | I40EVF_VLAN_FEATURES;
-       netdev->hw_enc_features |= NETIF_F_TSO_MANGLEID;
+       netdev->hw_features |= hw_features;
 
-       /* disable VLAN features if not supported */
-       if (!(vfres->vf_offload_flags & I40E_VIRTCHNL_VF_OFFLOAD_VLAN))
-               netdev->features ^= I40EVF_VLAN_FEATURES;
+       netdev->features |= hw_features | I40EVF_VLAN_FEATURES;
 
        adapter->vsi.id = adapter->vsi_res->vsi_id;
 
@@ -2592,9 +2600,6 @@ static void i40evf_init_task(struct work_struct *work)
                goto err_alloc;
        }
 
-       if (hw->mac.type == I40E_MAC_X722_VF)
-               adapter->flags |= I40EVF_FLAG_OUTER_UDP_CSUM_CAPABLE;
-
        if (i40evf_process_config(adapter))
                goto err_alloc;
        adapter->current_op = I40E_VIRTCHNL_OP_UNKNOWN;
index 032be8d3928a7469cbf101f7081148b0790a3ab8..3bccfbb1db14b4f2d03e49a2a0d17032892d15bb 100644 (file)
@@ -159,7 +159,9 @@ int i40evf_send_vf_config_msg(struct i40evf_adapter *adapter)
               I40E_VIRTCHNL_VF_OFFLOAD_RSS_REG |
               I40E_VIRTCHNL_VF_OFFLOAD_VLAN |
               I40E_VIRTCHNL_VF_OFFLOAD_WB_ON_ITR |
-              I40E_VIRTCHNL_VF_OFFLOAD_RSS_PCTYPE_V2;
+              I40E_VIRTCHNL_VF_OFFLOAD_RSS_PCTYPE_V2 |
+              I40E_VIRTCHNL_VF_OFFLOAD_ENCAP |
+              I40E_VIRTCHNL_VF_OFFLOAD_ENCAP_CSUM;
 
        adapter->current_op = I40E_VIRTCHNL_OP_GET_VF_RESOURCES;
        adapter->aq_required &= ~I40EVF_FLAG_AQ_GET_CONFIG;