diff mbox

[U-Boot,2/2] FEC: Properly align address over the buffers for cache ops

Message ID 1346012361-8417-2-git-send-email-marex@denx.de
State Accepted
Delegated to: Joe Hershberger
Headers show

Commit Message

Marek Vasut Aug. 26, 2012, 8:19 p.m. UTC
Align the address that's to be invalidated/flushed properly.

Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Benoit Thebaudeau <benoit.thebaudeau@advans>
Cc: Eric Nelson <eric.nelson@boundarydevices.com>
Cc: Fabio Estevam <festevam@gmail.com>
Cc: Joe Hershberger <joe.hershberger@ni.com>
---
 drivers/net/fec_mxc.c |   14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

Comments

Joe Hershberger Sept. 28, 2012, 4:07 p.m. UTC | #1
Hi Marek,

On Sun, Aug 26, 2012 at 3:19 PM, Marek Vasut <marex@denx.de> wrote:
> Align the address that's to be invalidated/flushed properly.
>
> Signed-off-by: Marek Vasut <marex@denx.de>
> Cc: Benoit Thebaudeau <benoit.thebaudeau@advans>
> Cc: Eric Nelson <eric.nelson@boundarydevices.com>
> Cc: Fabio Estevam <festevam@gmail.com>
> Cc: Joe Hershberger <joe.hershberger@ni.com>
> ---

Applied, thanks.

-Joe
diff mbox

Patch

diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c
index 7b6a997..bc44d38 100644
--- a/drivers/net/fec_mxc.c
+++ b/drivers/net/fec_mxc.c
@@ -695,7 +695,7 @@  static void fec_halt(struct eth_device *dev)
 static int fec_send(struct eth_device *dev, void *packet, int length)
 {
 	unsigned int status;
-	uint32_t size;
+	uint32_t size, end;
 	uint32_t addr;
 
 	/*
@@ -722,8 +722,9 @@  static int fec_send(struct eth_device *dev, void *packet, int length)
 #endif
 
 	addr = (uint32_t)packet;
-	size = roundup(length, ARCH_DMA_MINALIGN);
-	flush_dcache_range(addr, addr + size);
+	end = roundup(addr + length, ARCH_DMA_MINALIGN);
+	addr &= ~(ARCH_DMA_MINALIGN - 1);
+	flush_dcache_range(addr, end);
 
 	writew(length, &fec->tbd_base[fec->tbd_index].data_length);
 	writel(addr, &fec->tbd_base[fec->tbd_index].data_pointer);
@@ -790,7 +791,7 @@  static int fec_recv(struct eth_device *dev)
 	int frame_length, len = 0;
 	struct nbuf *frame;
 	uint16_t bd_status;
-	uint32_t addr, size;
+	uint32_t addr, size, end;
 	int i;
 	uchar buff[FEC_MAX_PKT_SIZE] __aligned(ARCH_DMA_MINALIGN);
 
@@ -854,8 +855,9 @@  static int fec_recv(struct eth_device *dev)
 			 * Invalidate data cache over the buffer
 			 */
 			addr = (uint32_t)frame;
-			size = roundup(frame_length, ARCH_DMA_MINALIGN);
-			invalidate_dcache_range(addr, addr + size);
+			end = roundup(addr + frame_length, ARCH_DMA_MINALIGN);
+			addr &= ~(ARCH_DMA_MINALIGN - 1);
+			invalidate_dcache_range(addr, end);
 
 			/*
 			 *  Fill the buffer and pass it to upper layers