summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorQuinn Jensen <quinn.jensen@freescale.com>2007-05-24 18:02:07 -0600
committerQuinn Jensen <quinn.jensen@freescale.com>2007-05-24 18:02:07 -0600
commit6d144b08568cc93e51dd9ce4020572d063a82376 (patch)
tree3e060649eb7ba5b19e2da6ecfb211f489017ce8d /drivers
parent18eaabcd41c62f2f9258c80503a0900d552b8f95 (diff)
CR TLSbo86683: Fix fec_dcache_range args
fec_dcache_flush_range() and fec_dcache_inv_range() are being passed start and end addresses, but the arm calls expect address and length. The patch TLSbo86683 that this fix is based on called fec_dcache_inv_range with a start address and an end address -4, but a similar change was not made for fec_dcache_flush_range. It is not clear whether the end address should be inclusive or exclusive of the last word of data. For now, the end address points just past the end of the data. http://www.bitshrine.org/gpp/linux-2.6.19.2-mx-fix_fec_dcache_range_args.patch
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/fec.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/net/fec.c b/drivers/net/fec.c
index 6dc079be49db..772b4cabb67a 100644
--- a/drivers/net/fec.c
+++ b/drivers/net/fec.c
@@ -676,7 +676,7 @@ while (!((status = bdp->cbd_sc) & BD_ENET_RX_EMPTY)) {
pkt_len = bdp->cbd_datlen;
fep->stats.rx_bytes += pkt_len;
data = (__u8*)__va(bdp->cbd_bufaddr);
- fec_dcache_inv_range(data, data+pkt_len);
+ fec_dcache_inv_range(data, data + pkt_len - 4);
/* This does 16 byte alignment, exactly what we need.
* The packet length includes FCS, but we don't want to
@@ -1614,7 +1614,7 @@ static void __inline__ fec_localhw_setup(void)
*/
static void __inline__ fec_dcache_inv_range(void * start, void * end)
{
- return ;
+ return ;
}
/*
@@ -2126,18 +2126,20 @@ static void __inline__ fec_localhw_setup(void)
/*
* invalidate dcache related with the virtual memory range(start, end)
*/
-static void __inline__ fec_dcache_inv_range(void * start, void * end)
+static void __inline__ fec_dcache_inv_range(void *start, void *end)
{
- dma_sync_single(NULL, (unsigned long)start, (unsigned long) end, DMA_FROM_DEVICE);
+ dma_sync_single(NULL, (unsigned long)__pa(start),
+ (unsigned long)(end - start), DMA_FROM_DEVICE);
return ;
}
/*
* flush dcache related with the virtual memory range(start, end)
*/
-static void __inline__ fec_dcache_flush_range(void * start, void * end)
+static void __inline__ fec_dcache_flush_range(void *start, void *end)
{
- dma_sync_single(NULL, (unsigned long)start, (unsigned long)end, DMA_BIDIRECTIONAL);
+ dma_sync_single(NULL, (unsigned long)__pa(start),
+ (unsigned long)(end - start), DMA_BIDIRECTIONAL);
return ;
}