|
@@ -1060,10 +1060,14 @@ static void enic_rq_indicate_buf(struct vnic_rq *rq,
|
|
|
PKT_HASH_TYPE_L4 : PKT_HASH_TYPE_L3);
|
|
|
}
|
|
|
|
|
|
- if ((netdev->features & NETIF_F_RXCSUM) && !csum_not_calc) {
|
|
|
- skb->csum = htons(checksum);
|
|
|
- skb->ip_summed = CHECKSUM_COMPLETE;
|
|
|
- }
|
|
|
+ /* Hardware does not provide whole packet checksum. It only
|
|
|
+ * provides pseudo checksum. Since hw validates the packet
|
|
|
+ * checksum but not provide us the checksum value. use
|
|
|
+ * CHECSUM_UNNECESSARY.
|
|
|
+ */
|
|
|
+ if ((netdev->features & NETIF_F_RXCSUM) && tcp_udp_csum_ok &&
|
|
|
+ ipv4_csum_ok)
|
|
|
+ skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
|
|
|
|
if (vlan_stripped)
|
|
|
__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vlan_tci);
|