[U-Boot] [PATCH 2/2] net: ping,arp: Fix cache alignment issues
Stefan Roese
sr at denx.de
Tue May 29 06:18:58 UTC 2018
On 28.05.2018 08:33, Baruch Siach wrote:
> From: Jon Nettleton <jon at solid-run.com>
>
> Both ping_receive and arp_receive would transmit a received packet
> back out using its original point. This causes problems with
> certain network cards that add a custom header to the packet.
> Specifically the mvneta driver for the Armada series boards has
> a 2 byte Marvell header that is bypassed and passed along to
> the system, but that 2 byte offset now causes a misalignment if
> it is attempted to be sent back out.
>
> Rather than changing the driver to memcpy all the received packets
> to cache aligned buffers we instead change the two offending
> network commands to copy the packet into a cache aligned net_tx_packet
> before sending it back out.
>
> This fixes occasional messages like:
>
> CACHE: Misaligned operation at range [3fc01082, 3fc010c2]
>
> Signed-off-by: Jon Nettleton <jon at solid-run.com>
> Signed-off-by: Baruch Siach <baruch at tkos.co.il>
> ---
> net/arp.c | 3 ++-
> net/ping.c | 3 ++-
> 2 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/net/arp.c b/net/arp.c
> index 990b771c9211..b8a71684cd76 100644
> --- a/net/arp.c
> +++ b/net/arp.c
> @@ -182,7 +182,8 @@ void arp_receive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len)
> (net_read_ip(&arp->ar_spa).s_addr & net_netmask.s_addr))
> udelay(5000);
> #endif
> - net_send_packet((uchar *)et, eth_hdr_size + ARP_HDR_SIZE);
> + memcpy(net_tx_packet, et, eth_hdr_size + ARP_HDR_SIZE);
> + net_send_packet(net_tx_packet, eth_hdr_size + ARP_HDR_SIZE);
> return;
>
> case ARPOP_REPLY: /* arp reply */
> diff --git a/net/ping.c b/net/ping.c
> index 5464f2f785fe..3e5461a36a02 100644
> --- a/net/ping.c
> +++ b/net/ping.c
> @@ -107,7 +107,8 @@ void ping_receive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len)
> icmph->type = ICMP_ECHO_REPLY;
> icmph->checksum = 0;
> icmph->checksum = compute_ip_checksum(icmph, len - IP_HDR_SIZE);
> - net_send_packet((uchar *)et, eth_hdr_size + len);
> + memcpy(net_tx_packet, et, eth_hdr_size + len);
> + net_send_packet(net_tx_packet, eth_hdr_size + len);
> return;
> /* default:
> return;*/
>
Reviewed-by: Stefan Roese <sr at denx.de>
Thanks,
Stefan
More information about the U-Boot
mailing list