idpf: fix offloads support for encapsulated packets
authorMadhu Chittim <madhu.chittim@intel.com>
Fri, 25 Apr 2025 22:26:33 +0000 (15:26 -0700)
committerJakub Kicinski <kuba@kernel.org>
Mon, 28 Apr 2025 22:59:13 +0000 (15:59 -0700)
Split offloads into csum, tso and other offloads so that tunneled
packets do not by default have all the offloads enabled.

Stateless offloads for encapsulated packets are not yet supported in
firmware/software but in the driver we were setting the features same as
non encapsulated features.

Fixed naming to clarify CSUM bits are being checked for Tx.

Inherit netdev features to VLAN interfaces as well.

Fixes: 0fe45467a104 ("idpf: add create vport and netdev configuration")
Reviewed-by: Sridhar Samudrala <sridhar.samudrala@intel.com>
Signed-off-by: Madhu Chittim <madhu.chittim@intel.com>
Tested-by: Zachary Goldstein <zachmgoldstein@google.com>
Tested-by: Samuel Salin <Samuel.salin@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Link: https://patch.msgid.link/20250425222636.3188441-4-anthony.l.nguyen@intel.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/intel/idpf/idpf.h
drivers/net/ethernet/intel/idpf/idpf_lib.c

index 66544faab710aa9ebc7e9cca48702fedd699cfe8..aef0e9775a33058f22049dd21470639b034f991f 100644 (file)
@@ -629,13 +629,13 @@ bool idpf_is_capability_ena(struct idpf_adapter *adapter, bool all,
        VIRTCHNL2_CAP_RX_HSPLIT_AT_L4V4 |\
        VIRTCHNL2_CAP_RX_HSPLIT_AT_L4V6)
 
-#define IDPF_CAP_RX_CSUM_L4V4 (\
-       VIRTCHNL2_CAP_RX_CSUM_L4_IPV4_TCP       |\
-       VIRTCHNL2_CAP_RX_CSUM_L4_IPV4_UDP)
+#define IDPF_CAP_TX_CSUM_L4V4 (\
+       VIRTCHNL2_CAP_TX_CSUM_L4_IPV4_TCP       |\
+       VIRTCHNL2_CAP_TX_CSUM_L4_IPV4_UDP)
 
-#define IDPF_CAP_RX_CSUM_L4V6 (\
-       VIRTCHNL2_CAP_RX_CSUM_L4_IPV6_TCP       |\
-       VIRTCHNL2_CAP_RX_CSUM_L4_IPV6_UDP)
+#define IDPF_CAP_TX_CSUM_L4V6 (\
+       VIRTCHNL2_CAP_TX_CSUM_L4_IPV6_TCP       |\
+       VIRTCHNL2_CAP_TX_CSUM_L4_IPV6_UDP)
 
 #define IDPF_CAP_RX_CSUM (\
        VIRTCHNL2_CAP_RX_CSUM_L3_IPV4           |\
@@ -644,11 +644,9 @@ bool idpf_is_capability_ena(struct idpf_adapter *adapter, bool all,
        VIRTCHNL2_CAP_RX_CSUM_L4_IPV6_TCP       |\
        VIRTCHNL2_CAP_RX_CSUM_L4_IPV6_UDP)
 
-#define IDPF_CAP_SCTP_CSUM (\
+#define IDPF_CAP_TX_SCTP_CSUM (\
        VIRTCHNL2_CAP_TX_CSUM_L4_IPV4_SCTP      |\
-       VIRTCHNL2_CAP_TX_CSUM_L4_IPV6_SCTP      |\
-       VIRTCHNL2_CAP_RX_CSUM_L4_IPV4_SCTP      |\
-       VIRTCHNL2_CAP_RX_CSUM_L4_IPV6_SCTP)
+       VIRTCHNL2_CAP_TX_CSUM_L4_IPV6_SCTP)
 
 #define IDPF_CAP_TUNNEL_TX_CSUM (\
        VIRTCHNL2_CAP_TX_CSUM_L3_SINGLE_TUNNEL  |\
index aa755dedb41d983978719fe9195b1c31cc71f510..730a9c7a59f2b0b2ab03e2a2db0e3bd234f68b47 100644 (file)
@@ -703,8 +703,10 @@ static int idpf_cfg_netdev(struct idpf_vport *vport)
 {
        struct idpf_adapter *adapter = vport->adapter;
        struct idpf_vport_config *vport_config;
+       netdev_features_t other_offloads = 0;
+       netdev_features_t csum_offloads = 0;
+       netdev_features_t tso_offloads = 0;
        netdev_features_t dflt_features;
-       netdev_features_t offloads = 0;
        struct idpf_netdev_priv *np;
        struct net_device *netdev;
        u16 idx = vport->idx;
@@ -766,53 +768,32 @@ static int idpf_cfg_netdev(struct idpf_vport *vport)
 
        if (idpf_is_cap_ena_all(adapter, IDPF_RSS_CAPS, IDPF_CAP_RSS))
                dflt_features |= NETIF_F_RXHASH;
-       if (idpf_is_cap_ena_all(adapter, IDPF_CSUM_CAPS, IDPF_CAP_RX_CSUM_L4V4))
-               dflt_features |= NETIF_F_IP_CSUM;
-       if (idpf_is_cap_ena_all(adapter, IDPF_CSUM_CAPS, IDPF_CAP_RX_CSUM_L4V6))
-               dflt_features |= NETIF_F_IPV6_CSUM;
+       if (idpf_is_cap_ena_all(adapter, IDPF_CSUM_CAPS, IDPF_CAP_TX_CSUM_L4V4))
+               csum_offloads |= NETIF_F_IP_CSUM;
+       if (idpf_is_cap_ena_all(adapter, IDPF_CSUM_CAPS, IDPF_CAP_TX_CSUM_L4V6))
+               csum_offloads |= NETIF_F_IPV6_CSUM;
        if (idpf_is_cap_ena(adapter, IDPF_CSUM_CAPS, IDPF_CAP_RX_CSUM))
-               dflt_features |= NETIF_F_RXCSUM;
-       if (idpf_is_cap_ena_all(adapter, IDPF_CSUM_CAPS, IDPF_CAP_SCTP_CSUM))
-               dflt_features |= NETIF_F_SCTP_CRC;
+               csum_offloads |= NETIF_F_RXCSUM;
+       if (idpf_is_cap_ena_all(adapter, IDPF_CSUM_CAPS, IDPF_CAP_TX_SCTP_CSUM))
+               csum_offloads |= NETIF_F_SCTP_CRC;
 
        if (idpf_is_cap_ena(adapter, IDPF_SEG_CAPS, VIRTCHNL2_CAP_SEG_IPV4_TCP))
-               dflt_features |= NETIF_F_TSO;
+               tso_offloads |= NETIF_F_TSO;
        if (idpf_is_cap_ena(adapter, IDPF_SEG_CAPS, VIRTCHNL2_CAP_SEG_IPV6_TCP))
-               dflt_features |= NETIF_F_TSO6;
+               tso_offloads |= NETIF_F_TSO6;
        if (idpf_is_cap_ena_all(adapter, IDPF_SEG_CAPS,
                                VIRTCHNL2_CAP_SEG_IPV4_UDP |
                                VIRTCHNL2_CAP_SEG_IPV6_UDP))
-               dflt_features |= NETIF_F_GSO_UDP_L4;
+               tso_offloads |= NETIF_F_GSO_UDP_L4;
        if (idpf_is_cap_ena_all(adapter, IDPF_RSC_CAPS, IDPF_CAP_RSC))
-               offloads |= NETIF_F_GRO_HW;
-       /* advertise to stack only if offloads for encapsulated packets is
-        * supported
-        */
-       if (idpf_is_cap_ena(vport->adapter, IDPF_SEG_CAPS,
-                           VIRTCHNL2_CAP_SEG_TX_SINGLE_TUNNEL)) {
-               offloads |= NETIF_F_GSO_UDP_TUNNEL      |
-                           NETIF_F_GSO_GRE             |
-                           NETIF_F_GSO_GRE_CSUM        |
-                           NETIF_F_GSO_PARTIAL         |
-                           NETIF_F_GSO_UDP_TUNNEL_CSUM |
-                           NETIF_F_GSO_IPXIP4          |
-                           NETIF_F_GSO_IPXIP6          |
-                           0;
-
-               if (!idpf_is_cap_ena_all(vport->adapter, IDPF_CSUM_CAPS,
-                                        IDPF_CAP_TUNNEL_TX_CSUM))
-                       netdev->gso_partial_features |=
-                               NETIF_F_GSO_UDP_TUNNEL_CSUM;
-
-               netdev->gso_partial_features |= NETIF_F_GSO_GRE_CSUM;
-               offloads |= NETIF_F_TSO_MANGLEID;
-       }
+               other_offloads |= NETIF_F_GRO_HW;
        if (idpf_is_cap_ena(adapter, IDPF_OTHER_CAPS, VIRTCHNL2_CAP_LOOPBACK))
-               offloads |= NETIF_F_LOOPBACK;
+               other_offloads |= NETIF_F_LOOPBACK;
 
-       netdev->features |= dflt_features;
-       netdev->hw_features |= dflt_features | offloads;
-       netdev->hw_enc_features |= dflt_features | offloads;
+       netdev->features |= dflt_features | csum_offloads | tso_offloads;
+       netdev->hw_features |=  netdev->features | other_offloads;
+       netdev->vlan_features |= netdev->features | other_offloads;
+       netdev->hw_enc_features |= dflt_features | other_offloads;
        idpf_set_ethtool_ops(netdev);
        netif_set_affinity_auto(netdev);
        SET_NETDEV_DEV(netdev, &adapter->pdev->dev);