vmxnet3: disable overlay offloads if UPT device does not support
authorRonak Doshi <doshir@vmware.com>
Mon, 20 Jun 2022 00:10:13 +0000 (17:10 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 20 Jun 2022 08:12:46 +0000 (09:12 +0100)
'Commit 6f91f4ba046e ("vmxnet3: add support for capability registers")'
added support for capability registers. These registers are used
to advertize capabilities of the device.

The patch updated the dev_caps to disable outer checksum offload if
PTCR register does not support it. However, it missed to update
other overlay offloads. This patch fixes this issue.

Fixes: 6f91f4ba046e ("vmxnet3: add support for capability registers")
Signed-off-by: Ronak Doshi <doshir@vmware.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/vmxnet3/vmxnet3_drv.c
drivers/net/vmxnet3/vmxnet3_ethtool.c

index 1565e1808a1925faea9ed12d1d0d762470c365fc..19c4147337477af32d13c9cd67e831baa0daa350 100644 (file)
@@ -3365,10 +3365,17 @@ vmxnet3_declare_features(struct vmxnet3_adapter *adapter)
                adapter->dev_caps[0] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);
                spin_unlock_irqrestore(&adapter->cmd_lock, flags);
 
+               if (!(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_GENEVE_CHECKSUM_OFFLOAD)) &&
+                   !(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_VXLAN_CHECKSUM_OFFLOAD)) &&
+                   !(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_GENEVE_TSO)) &&
+                   !(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_VXLAN_TSO))) {
+                       netdev->hw_enc_features &= ~NETIF_F_GSO_UDP_TUNNEL;
+                       netdev->hw_features &= ~NETIF_F_GSO_UDP_TUNNEL;
+               }
                if (!(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_GENEVE_OUTER_CHECKSUM_OFFLOAD)) &&
                    !(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_VXLAN_OUTER_CHECKSUM_OFFLOAD))) {
                        netdev->hw_enc_features &= ~NETIF_F_GSO_UDP_TUNNEL_CSUM;
-                       netdev->features &= ~NETIF_F_GSO_UDP_TUNNEL_CSUM;
+                       netdev->hw_features &= ~NETIF_F_GSO_UDP_TUNNEL_CSUM;
                }
        }
 
index ce3993282c0f5ce013a16d66f5f54c188be2dfe0..c3eaf1b864eda8ab27ead57f47ba3f1c2c7c9d73 100644 (file)
@@ -346,6 +346,12 @@ static void vmxnet3_enable_encap_offloads(struct net_device *netdev, netdev_feat
                adapter->dev_caps[0] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);
                spin_unlock_irqrestore(&adapter->cmd_lock, flags);
 
+               if (!(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_GENEVE_CHECKSUM_OFFLOAD)) &&
+                   !(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_VXLAN_CHECKSUM_OFFLOAD)) &&
+                   !(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_GENEVE_TSO)) &&
+                   !(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_VXLAN_TSO))) {
+                       netdev->hw_enc_features &= ~NETIF_F_GSO_UDP_TUNNEL;
+               }
                if (!(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_GENEVE_OUTER_CHECKSUM_OFFLOAD)) &&
                    !(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_VXLAN_OUTER_CHECKSUM_OFFLOAD))) {
                        netdev->hw_enc_features &= ~NETIF_F_GSO_UDP_TUNNEL_CSUM;