/* max # of tx descs for a non-tso pkt */
 #define VMXNET3_MAX_TXD_PER_PKT 16
+/* max # of tx descs for a tso pkt */
+#define VMXNET3_MAX_TSO_TXD_PER_PKT 24
 
 /* Max size of a single rx buffer */
 #define VMXNET3_MAX_RX_BUF_SIZE  ((1 << 14) - 1)
 
                        }
                        tq->stats.copy_skb_header++;
                }
+               if (unlikely(count > VMXNET3_MAX_TSO_TXD_PER_PKT)) {
+                       /* tso pkts must not use more than
+                        * VMXNET3_MAX_TSO_TXD_PER_PKT entries
+                        */
+                       if (skb_linearize(skb) != 0) {
+                               tq->stats.drop_too_many_frags++;
+                               goto drop_pkt;
+                       }
+                       tq->stats.linearized++;
+
+                       /* recalculate the # of descriptors to use */
+                       count = VMXNET3_TXD_NEEDED(skb_headlen(skb)) + 1;
+                       if (unlikely(count > VMXNET3_MAX_TSO_TXD_PER_PKT)) {
+                               tq->stats.drop_too_many_frags++;
+                               goto drop_pkt;
+                       }
+               }
                if (skb->encapsulation) {
                        vmxnet3_prepare_inner_tso(skb, &ctx);
                } else {