Message ID | 2c410458fbdf31bbec87a254029b7bde8b029c98.1527489235.git.baruch@tkos.co.il |
---|---|
State | Superseded |
Delegated to: | Stefan Roese |
Headers | show |
Series | [U-Boot,1/2] mvebu: neta: align DMA buffers | expand |
On 28.05.2018 08:33, Baruch Siach 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. > > This fixes occasional messages like: > > CACHE: Misaligned operation at range [3fc01082, 3fc010c2] > > Signed-off-by: Jon Nettleton <jon@solid-run.com> > Signed-off-by: Baruch Siach <baruch@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@denx.de> Thanks, Stefan
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;*/