diff mbox series

[U-Boot,2/2] net: ping,arp: Fix cache alignment issues

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

Commit Message

Baruch Siach May 28, 2018, 6:33 a.m. UTC
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(-)

Comments

Stefan Roese May 29, 2018, 6:18 a.m. UTC | #1
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 mbox series

Patch

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;*/