[PATCHv2 6/6] net: fec: fix regression on i.MX28 introduced by rx_copybreak support
From: David Laight <hidden>
Date: 2014-10-28 11:16:37
Also in:
lkml, netdev
From: Lothar Wa?mann
quoted hunk ↗ jump to hunk
commit 1b7bde6d659d ("net: fec: implement rx_copybreak to improve rx performance") introduced a regression for i.MX28. The swap_buffer() function doing the endian conversion of the received data on i.MX28 may access memory beyond the actual packet size in the DMA buffer. fec_enet_copybreak() does not copy those bytes, so that the last bytes of a packet may be filled with invalid data after swapping. This will likely lead to checksum errors on received packets. E.g. when trying to mount an NFS rootfs: UDP: bad checksum. From 192.168.1.225:111 to 192.168.100.73:44662 ulen 36 Do the byte swapping and copying to the new skb in one go if necessary. Signed-off-by: Lothar Wamann <redacted> --- drivers/net/ethernet/freescale/fec_main.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-)diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 404fb9d..b92324c 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c@@ -339,6 +339,18 @@ static void *swap_buffer(void *bufaddr, int len) return bufaddr; } +static void *swap_buffer2(void *dst_buf, void *src_buf, int len) +{ + int i; + unsigned int *src = src_buf; + unsigned int *dst = dst_buf; + + for (i = 0; i < len; i += 4, src++, dst++) + swab32s(src); + + return dst_buf; +} +
Actually that is completely f*cked.... David