*     @rtnl_link_ops: Rtnl_link_ops
  *
  *     @gso_max_size:  Maximum size of generic segmentation offload
+ *     @tso_max_size:  Device (as in HW) limit on the max TSO request size
  *     @gso_max_segs:  Maximum number of segments that can be passed to the
  *                     NIC for GSO
+ *     @tso_max_segs:  Device (as in HW) limit on the max TSO segment count
  *
  *     @dcbnl_ops:     Data Center Bridging netlink ops
  *     @num_tc:        Number of traffic classes in the net device
        /* for setting kernel sock attribute on TCP connection setup */
 #define GSO_MAX_SIZE           65536
        unsigned int            gso_max_size;
+#define TSO_LEGACY_MAX_SIZE    65536
+#define TSO_MAX_SIZE           UINT_MAX
+       unsigned int            tso_max_size;
 #define GSO_MAX_SEGS           65535
        u16                     gso_max_segs;
+#define TSO_MAX_SEGS           U16_MAX
+       u16                     tso_max_segs;
 
 #ifdef CONFIG_DCB
        const struct dcbnl_rtnl_ops *dcbnl_ops;
        WRITE_ONCE(dev->gro_max_size, size);
 }
 
+void netif_set_tso_max_size(struct net_device *dev, unsigned int size);
+void netif_set_tso_max_segs(struct net_device *dev, unsigned int segs);
 void netif_inherit_tso_max(struct net_device *to,
                           const struct net_device *from);
 
 
 }
 EXPORT_SYMBOL(netif_set_real_num_queues);
 
+/**
+ * netif_set_tso_max_size() - set the max size of TSO frames supported
+ * @dev:       netdev to update
+ * @size:      max skb->len of a TSO frame
+ *
+ * Set the limit on the size of TSO super-frames the device can handle.
+ * Unless explicitly set the stack will assume the value of %GSO_MAX_SIZE.
+ */
+void netif_set_tso_max_size(struct net_device *dev, unsigned int size)
+{
+       dev->tso_max_size = size;
+       if (size < READ_ONCE(dev->gso_max_size))
+               netif_set_gso_max_size(dev, size);
+}
+EXPORT_SYMBOL(netif_set_tso_max_size);
+
+/**
+ * netif_set_tso_max_segs() - set the max number of segs supported for TSO
+ * @dev:       netdev to update
+ * @segs:      max number of TCP segments
+ *
+ * Set the limit on the number of TCP segments the device can generate from
+ * a single TSO super-frame.
+ * Unless explicitly set the stack will assume the value of %GSO_MAX_SEGS.
+ */
+void netif_set_tso_max_segs(struct net_device *dev, unsigned int segs)
+{
+       dev->tso_max_segs = segs;
+       if (segs < READ_ONCE(dev->gso_max_segs))
+               netif_set_gso_max_segs(dev, segs);
+}
+EXPORT_SYMBOL(netif_set_tso_max_segs);
+
 /**
  * netif_inherit_tso_max() - copy all TSO limits from a lower device to an upper
  * @to:                netdev to update
        dev->gso_max_size = GSO_MAX_SIZE;
        dev->gso_max_segs = GSO_MAX_SEGS;
        dev->gro_max_size = GRO_MAX_SIZE;
+       dev->tso_max_size = TSO_LEGACY_MAX_SIZE;
+       dev->tso_max_segs = TSO_MAX_SEGS;
        dev->upper_level = 1;
        dev->lower_level = 1;
 #ifdef CONFIG_LOCKDEP
 
        if (tb[IFLA_GSO_MAX_SIZE]) {
                u32 max_size = nla_get_u32(tb[IFLA_GSO_MAX_SIZE]);
 
-               if (max_size > GSO_MAX_SIZE) {
+               if (max_size > GSO_MAX_SIZE || max_size > dev->tso_max_size) {
                        err = -EINVAL;
                        goto errout;
                }
        if (tb[IFLA_GSO_MAX_SEGS]) {
                u32 max_segs = nla_get_u32(tb[IFLA_GSO_MAX_SEGS]);
 
-               if (max_segs > GSO_MAX_SEGS) {
+               if (max_segs > GSO_MAX_SEGS || max_segs > dev->tso_max_segs) {
                        err = -EINVAL;
                        goto errout;
                }