Message ID | 1c55b2ef764fd213e69367c79ead7b5294dbd13a.1527659550.git.baruch@tkos.co.il |
---|---|
State | Superseded |
Delegated to: | Joe Hershberger |
Headers | show |
Series | [U-Boot,v2,1/2] mvebu: neta: align DMA buffers | expand |
On Wed, May 30, 2018 at 12:52 AM, Baruch Siach <baruch@tkos.co.il> wrote: > From: Jon Nettleton <jon@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. It seems reasonable to make these match the rest of the network commands. > This fixes occasional messages like: > > CACHE: Misaligned operation at range [3fc01082, 3fc010c2] > > Reviewed-by: Stefan Roese <sr@denx.de> > Signed-off-by: Jon Nettleton <jon@solid-run.com> > Signed-off-by: Baruch Siach <baruch@tkos.co.il> > --- Acked-by: Joe Hershberger <joe.hershberger@ni.com>
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;*/