mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-09-02 16:44:59 +00:00
net: mv643xx_eth: Avoid setting the initial TCP checksum
As specified in the datasheet, the driver can set the "L4Chk_Mode" flag (bit 10) in the Tx descriptor command/status to specify that a frame is not IP fragmented and that the controller is in charge of generating the TCP/IP checksum. This must be used together with the "GL4chk" flag (bit 17). These two flags allow to avoid setting the initial TCP checksum in the l4i_chk field of the Tx descriptor, which is needed to support software TSO. Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
0a8fa93310
commit
84411f73b8
@ -250,6 +250,7 @@ struct tx_desc {
|
|||||||
#define GEN_TCP_UDP_CHECKSUM 0x00020000
|
#define GEN_TCP_UDP_CHECKSUM 0x00020000
|
||||||
#define UDP_FRAME 0x00010000
|
#define UDP_FRAME 0x00010000
|
||||||
#define MAC_HDR_EXTRA_4_BYTES 0x00008000
|
#define MAC_HDR_EXTRA_4_BYTES 0x00008000
|
||||||
|
#define GEN_TCP_UDP_CHK_FULL 0x00000400
|
||||||
#define MAC_HDR_EXTRA_8_BYTES 0x00000200
|
#define MAC_HDR_EXTRA_8_BYTES 0x00000200
|
||||||
|
|
||||||
#define TX_IHL_SHIFT 11
|
#define TX_IHL_SHIFT 11
|
||||||
@ -695,17 +696,19 @@ static int skb_tx_csum(struct mv643xx_eth_private *mp, struct sk_buff *skb,
|
|||||||
if (tag_bytes & 8)
|
if (tag_bytes & 8)
|
||||||
cmd |= MAC_HDR_EXTRA_8_BYTES;
|
cmd |= MAC_HDR_EXTRA_8_BYTES;
|
||||||
|
|
||||||
cmd |= GEN_TCP_UDP_CHECKSUM |
|
cmd |= GEN_TCP_UDP_CHECKSUM | GEN_TCP_UDP_CHK_FULL |
|
||||||
GEN_IP_V4_CHECKSUM |
|
GEN_IP_V4_CHECKSUM |
|
||||||
ip_hdr(skb)->ihl << TX_IHL_SHIFT;
|
ip_hdr(skb)->ihl << TX_IHL_SHIFT;
|
||||||
|
|
||||||
|
/* TODO: Revisit this. With the usage of GEN_TCP_UDP_CHK_FULL
|
||||||
|
* it seems we don't need to pass the initial checksum. */
|
||||||
switch (ip_hdr(skb)->protocol) {
|
switch (ip_hdr(skb)->protocol) {
|
||||||
case IPPROTO_UDP:
|
case IPPROTO_UDP:
|
||||||
cmd |= UDP_FRAME;
|
cmd |= UDP_FRAME;
|
||||||
*l4i_chk = ntohs(sum16_as_be(udp_hdr(skb)->check));
|
*l4i_chk = 0;
|
||||||
break;
|
break;
|
||||||
case IPPROTO_TCP:
|
case IPPROTO_TCP:
|
||||||
*l4i_chk = ntohs(sum16_as_be(tcp_hdr(skb)->check));
|
*l4i_chk = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
WARN(1, "protocol not supported");
|
WARN(1, "protocol not supported");
|
||||||
|
Loading…
Reference in New Issue
Block a user