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 66544fa..aef0e97 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 aa755de..730a9c7 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);