diff options
| author | Marek Vasut <marex@denx.de> | 2012-08-26 10:19:21 +0000 | 
|---|---|---|
| committer | Joe Hershberger <joe.hershberger@ni.com> | 2012-09-27 12:22:09 -0500 | 
| commit | efe24d2e17996f00b8803623c53cfe4baede9349 (patch) | |
| tree | 4919bd04d9eb46e27ce49b7f2faa23d4a16f5fe8 /drivers/net/fec_mxc.c | |
| parent | e2a66e609745470b1157fe6b6663c804ee44b0b9 (diff) | |
| download | olio-uboot-2014.01-efe24d2e17996f00b8803623c53cfe4baede9349.tar.xz olio-uboot-2014.01-efe24d2e17996f00b8803623c53cfe4baede9349.zip | |
FEC: Properly align address over the buffers for cache ops
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>
Diffstat (limited to 'drivers/net/fec_mxc.c')
| -rw-r--r-- | drivers/net/fec_mxc.c | 14 | 
1 files changed, 8 insertions, 6 deletions
| diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c index 7b6a997cd..bc44d38b4 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 |