diff options
Diffstat (limited to 'drivers/net/igb/igb_main.c')
-rw-r--r-- | drivers/net/igb/igb_main.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index 7c4481b994a..39ac375487d 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c | |||
@@ -3008,7 +3008,18 @@ static inline bool igb_tx_csum_adv(struct igb_adapter *adapter, | |||
3008 | tu_cmd |= (E1000_TXD_CMD_DEXT | E1000_ADVTXD_DTYP_CTXT); | 3008 | tu_cmd |= (E1000_TXD_CMD_DEXT | E1000_ADVTXD_DTYP_CTXT); |
3009 | 3009 | ||
3010 | if (skb->ip_summed == CHECKSUM_PARTIAL) { | 3010 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
3011 | switch (skb->protocol) { | 3011 | __be16 protocol; |
3012 | |||
3013 | if (skb->protocol == cpu_to_be16(ETH_P_8021Q)) { | ||
3014 | const struct vlan_ethhdr *vhdr = | ||
3015 | (const struct vlan_ethhdr*)skb->data; | ||
3016 | |||
3017 | protocol = vhdr->h_vlan_encapsulated_proto; | ||
3018 | } else { | ||
3019 | protocol = skb->protocol; | ||
3020 | } | ||
3021 | |||
3022 | switch (protocol) { | ||
3012 | case cpu_to_be16(ETH_P_IP): | 3023 | case cpu_to_be16(ETH_P_IP): |
3013 | tu_cmd |= E1000_ADVTXD_TUCMD_IPV4; | 3024 | tu_cmd |= E1000_ADVTXD_TUCMD_IPV4; |
3014 | if (ip_hdr(skb)->protocol == IPPROTO_TCP) | 3025 | if (ip_hdr(skb)->protocol == IPPROTO_TCP) |