|
@@ -5779,7 +5779,7 @@ static netdev_tx_t tg3_start_xmit_dma_bug(struct sk_buff *skb,
|
|
|
|
|
|
if ((mss = skb_shinfo(skb)->gso_size) != 0) {
|
|
|
struct iphdr *iph;
|
|
|
- u32 tcp_opt_len, ip_tcp_len, hdr_len;
|
|
|
+ u32 tcp_opt_len, hdr_len;
|
|
|
|
|
|
if (skb_header_cloned(skb) &&
|
|
|
pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
|
|
@@ -5787,10 +5787,21 @@ static netdev_tx_t tg3_start_xmit_dma_bug(struct sk_buff *skb,
|
|
|
goto out_unlock;
|
|
|
}
|
|
|
|
|
|
+ iph = ip_hdr(skb);
|
|
|
tcp_opt_len = tcp_optlen(skb);
|
|
|
- ip_tcp_len = ip_hdrlen(skb) + sizeof(struct tcphdr);
|
|
|
|
|
|
- hdr_len = ip_tcp_len + tcp_opt_len;
|
|
|
+ if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) {
|
|
|
+ hdr_len = skb_headlen(skb) - ETH_HLEN;
|
|
|
+ } else {
|
|
|
+ u32 ip_tcp_len;
|
|
|
+
|
|
|
+ ip_tcp_len = ip_hdrlen(skb) + sizeof(struct tcphdr);
|
|
|
+ hdr_len = ip_tcp_len + tcp_opt_len;
|
|
|
+
|
|
|
+ iph->check = 0;
|
|
|
+ iph->tot_len = htons(mss + hdr_len);
|
|
|
+ }
|
|
|
+
|
|
|
if (unlikely((ETH_HLEN + hdr_len) > 80) &&
|
|
|
(tp->tg3_flags2 & TG3_FLG2_TSO_BUG))
|
|
|
return tg3_tso_bug(tp, skb);
|
|
@@ -5798,9 +5809,6 @@ static netdev_tx_t tg3_start_xmit_dma_bug(struct sk_buff *skb,
|
|
|
base_flags |= (TXD_FLAG_CPU_PRE_DMA |
|
|
|
TXD_FLAG_CPU_POST_DMA);
|
|
|
|
|
|
- iph = ip_hdr(skb);
|
|
|
- iph->check = 0;
|
|
|
- iph->tot_len = htons(mss + hdr_len);
|
|
|
if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
|
|
|
tcp_hdr(skb)->check = 0;
|
|
|
base_flags &= ~TXD_FLAG_TCPUDP_CSUM;
|