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>
This commit is contained in:
Marek Vasut 2012-08-26 10:19:21 +00:00 committed by Joe Hershberger
parent e2a66e6097
commit efe24d2e17

View File

@ -695,7 +695,7 @@ static void fec_halt(struct eth_device *dev)
static int fec_send(struct eth_device *dev, void *packet, int length) static int fec_send(struct eth_device *dev, void *packet, int length)
{ {
unsigned int status; unsigned int status;
uint32_t size; uint32_t size, end;
uint32_t addr; uint32_t addr;
/* /*
@ -722,8 +722,9 @@ static int fec_send(struct eth_device *dev, void *packet, int length)
#endif #endif
addr = (uint32_t)packet; addr = (uint32_t)packet;
size = roundup(length, ARCH_DMA_MINALIGN); end = roundup(addr + length, ARCH_DMA_MINALIGN);
flush_dcache_range(addr, addr + size); addr &= ~(ARCH_DMA_MINALIGN - 1);
flush_dcache_range(addr, end);
writew(length, &fec->tbd_base[fec->tbd_index].data_length); writew(length, &fec->tbd_base[fec->tbd_index].data_length);
writel(addr, &fec->tbd_base[fec->tbd_index].data_pointer); 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; int frame_length, len = 0;
struct nbuf *frame; struct nbuf *frame;
uint16_t bd_status; uint16_t bd_status;
uint32_t addr, size; uint32_t addr, size, end;
int i; int i;
uchar buff[FEC_MAX_PKT_SIZE] __aligned(ARCH_DMA_MINALIGN); 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 * Invalidate data cache over the buffer
*/ */
addr = (uint32_t)frame; addr = (uint32_t)frame;
size = roundup(frame_length, ARCH_DMA_MINALIGN); end = roundup(addr + frame_length, ARCH_DMA_MINALIGN);
invalidate_dcache_range(addr, addr + size); addr &= ~(ARCH_DMA_MINALIGN - 1);
invalidate_dcache_range(addr, end);
/* /*
* Fill the buffer and pass it to upper layers * Fill the buffer and pass it to upper layers