|
@@ -31,7 +31,6 @@
|
|
|
#include <linux/vmalloc.h>
|
|
|
#include <linux/pagemap.h>
|
|
|
#include <linux/netdevice.h>
|
|
|
-#include <linux/tcp.h>
|
|
|
#include <linux/ipv6.h>
|
|
|
#include <net/checksum.h>
|
|
|
#include <net/ip6_checksum.h>
|
|
@@ -2484,10 +2483,24 @@ static inline bool igb_tx_csum_adv(struct igb_adapter *adapter,
|
|
|
tu_cmd |= (E1000_TXD_CMD_DEXT | E1000_ADVTXD_DTYP_CTXT);
|
|
|
|
|
|
if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
|
|
- if (skb->protocol == htons(ETH_P_IP))
|
|
|
+ switch (skb->protocol) {
|
|
|
+ case __constant_htons(ETH_P_IP):
|
|
|
tu_cmd |= E1000_ADVTXD_TUCMD_IPV4;
|
|
|
- if (skb->sk && (skb->sk->sk_protocol == IPPROTO_TCP))
|
|
|
- tu_cmd |= E1000_ADVTXD_TUCMD_L4T_TCP;
|
|
|
+ if (ip_hdr(skb)->protocol == IPPROTO_TCP)
|
|
|
+ tu_cmd |= E1000_ADVTXD_TUCMD_L4T_TCP;
|
|
|
+ break;
|
|
|
+ case __constant_htons(ETH_P_IPV6):
|
|
|
+ /* XXX what about other V6 headers?? */
|
|
|
+ if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP)
|
|
|
+ tu_cmd |= E1000_ADVTXD_TUCMD_L4T_TCP;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ if (unlikely(net_ratelimit()))
|
|
|
+ dev_warn(&adapter->pdev->dev,
|
|
|
+ "partial checksum but proto=%x!\n",
|
|
|
+ skb->protocol);
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
context_desc->type_tucmd_mlhl = cpu_to_le32(tu_cmd);
|