static void ipgre_link_update(struct net_device *dev, bool set_mtu)
 {
        struct ip_tunnel *tunnel = netdev_priv(dev);
+       __be16 flags;
        int len;
 
        len = tunnel->tun_hlen;
        if (set_mtu)
                dev->mtu = max_t(int, dev->mtu - len, 68);
 
-       if (!(tunnel->parms.o_flags & TUNNEL_SEQ)) {
-               if (!(tunnel->parms.o_flags & TUNNEL_CSUM) ||
-                   tunnel->encap.type == TUNNEL_ENCAP_NONE) {
-                       dev->features |= NETIF_F_GSO_SOFTWARE;
-                       dev->hw_features |= NETIF_F_GSO_SOFTWARE;
-               } else {
-                       dev->features &= ~NETIF_F_GSO_SOFTWARE;
-                       dev->hw_features &= ~NETIF_F_GSO_SOFTWARE;
-               }
-               dev->features |= NETIF_F_LLTX;
-       } else {
+       flags = tunnel->parms.o_flags;
+
+       if (flags & TUNNEL_SEQ ||
+           (flags & TUNNEL_CSUM && tunnel->encap.type != TUNNEL_ENCAP_NONE)) {
+               dev->features &= ~NETIF_F_GSO_SOFTWARE;
                dev->hw_features &= ~NETIF_F_GSO_SOFTWARE;
-               dev->features &= ~(NETIF_F_LLTX | NETIF_F_GSO_SOFTWARE);
+       } else {
+               dev->features |= NETIF_F_GSO_SOFTWARE;
+               dev->hw_features |= NETIF_F_GSO_SOFTWARE;
        }
 }
 
 static void __gre_tunnel_init(struct net_device *dev)
 {
        struct ip_tunnel *tunnel;
+       __be16 flags;
 
        tunnel = netdev_priv(dev);
        tunnel->tun_hlen = gre_calc_hlen(tunnel->parms.o_flags);
        tunnel->hlen = tunnel->tun_hlen + tunnel->encap_hlen;
        dev->needed_headroom = tunnel->hlen + sizeof(tunnel->parms.iph);
 
-       dev->features           |= GRE_FEATURES;
+       dev->features           |= GRE_FEATURES | NETIF_F_LLTX;
        dev->hw_features        |= GRE_FEATURES;
 
-       if (!(tunnel->parms.o_flags & TUNNEL_SEQ)) {
-               /* TCP offload with GRE SEQ is not supported, nor
-                * can we support 2 levels of outer headers requiring
-                * an update.
-                */
-               if (!(tunnel->parms.o_flags & TUNNEL_CSUM) ||
-                   (tunnel->encap.type == TUNNEL_ENCAP_NONE)) {
-                       dev->features    |= NETIF_F_GSO_SOFTWARE;
-                       dev->hw_features |= NETIF_F_GSO_SOFTWARE;
-               }
+       flags = tunnel->parms.o_flags;
 
-               /* Can use a lockless transmit, unless we generate
-                * output sequences
-                */
-               dev->features |= NETIF_F_LLTX;
-       }
+       /* TCP offload with GRE SEQ is not supported, nor can we support 2
+        * levels of outer headers requiring an update.
+        */
+       if (flags & TUNNEL_SEQ)
+               return;
+       if (flags & TUNNEL_CSUM && tunnel->encap.type != TUNNEL_ENCAP_NONE)
+               return;
+
+       dev->features |= NETIF_F_GSO_SOFTWARE;
+       dev->hw_features |= NETIF_F_GSO_SOFTWARE;
 }
 
 static int ipgre_tunnel_init(struct net_device *dev)