mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-18 11:56:14 +07:00
smsc95xx: Fix tx checksum offload for small packets
TX checksum offload does not work properly when transmitting UDP packets with 0, 1 or 2 bytes of data. This patch works around the problem by calculating checksums for these packets in the driver. Signed-off-by: Steve Glendinning <steve.glendinning@smsc.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
0ecad5a262
commit
11bc308837
@ -1189,9 +1189,21 @@ static struct sk_buff *smsc95xx_tx_fixup(struct usbnet *dev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (csum) {
|
if (csum) {
|
||||||
u32 csum_preamble = smsc95xx_calc_csum_preamble(skb);
|
if (skb->len <= 45) {
|
||||||
skb_push(skb, 4);
|
/* workaround - hardware tx checksum does not work
|
||||||
memcpy(skb->data, &csum_preamble, 4);
|
* properly with extremely small packets */
|
||||||
|
long csstart = skb->csum_start - skb_headroom(skb);
|
||||||
|
__wsum calc = csum_partial(skb->data + csstart,
|
||||||
|
skb->len - csstart, 0);
|
||||||
|
*((__sum16 *)(skb->data + csstart
|
||||||
|
+ skb->csum_offset)) = csum_fold(calc);
|
||||||
|
|
||||||
|
csum = false;
|
||||||
|
} else {
|
||||||
|
u32 csum_preamble = smsc95xx_calc_csum_preamble(skb);
|
||||||
|
skb_push(skb, 4);
|
||||||
|
memcpy(skb->data, &csum_preamble, 4);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
skb_push(skb, 4);
|
skb_push(skb, 4);
|
||||||
|
Loading…
Reference in New Issue
Block a user