++ if (priv->soc->tso)
++ fe_start_tso(skb, dev, nr_frags, tx);
++
++ if (skb_shinfo(skb)->gso_segs > 1) {
++ struct iphdr *iph = NULL;
++ struct tcphdr *th = NULL;
++ struct ipv6hdr *ip6h = NULL;
++
++ ip6h = (struct ipv6hdr *) skb_network_header(skb);
++ iph = (struct iphdr *) skb_network_header(skb);
++ if ((iph->version == 4) && (iph->protocol == IPPROTO_TCP)) {
++ th = (struct tcphdr *)skb_transport_header(skb);
++ priv->tx_dma[tx].txd4 |= BIT(28);
++ th->check = htons(skb_shinfo(skb)->gso_size);
++ dma_cache_sync(NULL, th, sizeof(struct tcphdr), DMA_TO_DEVICE);
++ } else if ((ip6h->version == 6) && (ip6h->nexthdr == NEXTHDR_TCP)) {
++ th = (struct tcphdr *)skb_transport_header(skb);
++ priv->tx_dma[tx].txd4 |= BIT(28);
++ th->check = htons(skb_shinfo(skb)->gso_size);
++ dma_cache_sync(NULL, th, sizeof(struct tcphdr), DMA_TO_DEVICE);
++ }
++ }
++
++ for (i = 0; i < tx_num; i++)
++ dma_cache_sync(NULL, &priv->tx_dma[tx + i], sizeof(struct fe_tx_dma), DMA_TO_DEVICE);
++