aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFugang Duan <b38611@freescale.com>2014-06-05 03:23:07 -0400
committerFugang Duan <b38611@freescale.com>2014-06-13 02:00:42 -0400
commitf9f9dd934002f5637f7d2c6120004092a3841fc2 (patch)
tree5801b5c4f19a7699fb6c0b60d54878d029807341
parentf976fe5dfbc3d9985d3425c7307ade3e2bb1e6b1 (diff)
net: fec: Enable IP header hardware checksum
IP header checksum is calcalated by network layer in default. To support software TSO, it is better to use HW calculate the IP header checksum. FEC hw checksum feature request the checksum field in frame is zero, otherwise the calculative CRC is not correct. For segmentated TCP packet, HW calculate the IP header checksum again, it doesn't bring any impact. For SW TSO, HW calculated checksum bring better performance. Signed-off-by: Fugang Duan <B38611@freescale.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/freescale/fec_main.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 67ea0034f4aa..591913dde10a 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -315,6 +315,7 @@ fec_enet_clear_csum(struct sk_buff *skb, struct net_device *ndev)
315 if (unlikely(skb_cow_head(skb, 0))) 315 if (unlikely(skb_cow_head(skb, 0)))
316 return -1; 316 return -1;
317 317
318 ip_hdr(skb)->check = 0;
318 *(__sum16 *)(skb->head + skb->csum_start + skb->csum_offset) = 0; 319 *(__sum16 *)(skb->head + skb->csum_start + skb->csum_offset) = 0;
319 320
320 return 0; 321 return 0;
@@ -402,7 +403,7 @@ static int fec_enet_txq_submit_skb(struct fec_enet_priv_tx_q *txq,
402 * are done by the kernel 403 * are done by the kernel
403 */ 404 */
404 if (skb->ip_summed == CHECKSUM_PARTIAL) 405 if (skb->ip_summed == CHECKSUM_PARTIAL)
405 status_esc |= BD_ENET_TX_PINS; 406 status_esc |= BD_ENET_TX_PINS | BD_ENET_TX_IINS;
406 } 407 }
407 408
408 if (id_entry->driver_data & FEC_QUIRK_HAS_AVB) 409 if (id_entry->driver_data & FEC_QUIRK_HAS_AVB)