ibmvnic: Handle TSO backing device errata
authorThomas Falcon <tlfalcon@linux.vnet.ibm.com>
Mon, 12 Mar 2018 16:51:05 +0000 (11:51 -0500)
committerDavid S. Miller <davem@davemloft.net>
Tue, 13 Mar 2018 14:09:28 +0000 (10:09 -0400)
TSO packets with one segment or with an MSS less than 224 can
cause errors on some backing devices, so disable GSO in those cases.

Signed-off-by: Thomas Falcon <tlfalcon@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/ibm/ibmvnic.c

index 7ed87fbb156b66d17ee9243a1e502a0a2c6e4be6..e02d3b9aaf152c9893368b39be4d5d3e0338b632 100644 (file)
@@ -2049,6 +2049,23 @@ static int ibmvnic_change_mtu(struct net_device *netdev, int new_mtu)
        return wait_for_reset(adapter);
 }
 
+static netdev_features_t ibmvnic_features_check(struct sk_buff *skb,
+                                               struct net_device *dev,
+                                               netdev_features_t features)
+{
+       /* Some backing hardware adapters can not
+        * handle packets with a MSS less than 224
+        * or with only one segment.
+        */
+       if (skb_is_gso(skb)) {
+               if (skb_shinfo(skb)->gso_size < 224 ||
+                   skb_shinfo(skb)->gso_segs == 1)
+                       features &= ~NETIF_F_GSO_MASK;
+       }
+
+       return features;
+}
+
 static const struct net_device_ops ibmvnic_netdev_ops = {
        .ndo_open               = ibmvnic_open,
        .ndo_stop               = ibmvnic_close,
@@ -2061,6 +2078,7 @@ static const struct net_device_ops ibmvnic_netdev_ops = {
        .ndo_poll_controller    = ibmvnic_netpoll_controller,
 #endif
        .ndo_change_mtu         = ibmvnic_change_mtu,
+       .ndo_features_check     = ibmvnic_features_check,
 };
 
 /* ethtool functions */