diff mbox

[U-Boot] drivers: net: cpsw: always flush cache with cache line aligned

Message ID 20160808062254.18261-1-lokeshvutla@ti.com
State Changes Requested
Delegated to: Joe Hershberger
Headers show

Commit Message

Lokesh Vutla Aug. 8, 2016, 6:22 a.m. UTC
cpsw tries to flush dcache which is not in the range of cache line size.
Because of this the following warning comes while flushing:

CACHE: Misaligned operation at range [dffecec0, dffed016]

Fix it by flushing cache range which is cache line size aligned.

Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
---
 drivers/net/cpsw.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

Comments

Joe Hershberger Aug. 8, 2016, 4:46 p.m. UTC | #1
Hi Lokesh,

On Mon, Aug 8, 2016 at 1:22 AM, Lokesh Vutla <lokeshvutla@ti.com> wrote:
> cpsw tries to flush dcache which is not in the range of cache line size.
> Because of this the following warning comes while flushing:
>
> CACHE: Misaligned operation at range [dffecec0, dffed016]
>
> Fix it by flushing cache range which is cache line size aligned.

This is the send case... the transmit packet buffer from the network
subsystem is already aligned. You only need to align the size of the
packet. Also, please use PKTALIGN.

Thanks,
-Joe
Lokesh Vutla Aug. 9, 2016, 5:48 a.m. UTC | #2
On Monday 08 August 2016 10:16 PM, Joe Hershberger wrote:
> Hi Lokesh,
> 
> On Mon, Aug 8, 2016 at 1:22 AM, Lokesh Vutla <lokeshvutla@ti.com> wrote:
>> cpsw tries to flush dcache which is not in the range of cache line size.
>> Because of this the following warning comes while flushing:
>>
>> CACHE: Misaligned operation at range [dffecec0, dffed016]
>>
>> Fix it by flushing cache range which is cache line size aligned.
> 
> This is the send case... the transmit packet buffer from the network
> subsystem is already aligned. You only need to align the size of the
> packet. Also, please use PKTALIGN.

You are right. Just posted a patch addressing your comments.

Thanks and regards,
Lokesh

> 
> Thanks,
> -Joe
>
diff mbox

Patch

diff --git a/drivers/net/cpsw.c b/drivers/net/cpsw.c
index 2ce4ec6..631544a 100644
--- a/drivers/net/cpsw.c
+++ b/drivers/net/cpsw.c
@@ -905,9 +905,14 @@  static int _cpsw_send(struct cpsw_priv *priv, void *packet, int length)
 	void *buffer;
 	int len;
 	int timeout = CPDMA_TIMEOUT;
+	unsigned long pstart, pend;
 
-	flush_dcache_range((unsigned long)packet,
-			   (unsigned long)packet + length);
+	/*
+	 *  Make sure range is cache line aligned.
+	 */
+	pstart = (unsigned long)packet & ~(CONFIG_SYS_CACHELINE_SIZE - 1);
+	pend = ALIGN((unsigned long)packet + length, CONFIG_SYS_CACHELINE_SIZE);
+	flush_dcache_range(pstart, pend);
 
 	/* first reap completed packets */
 	while (timeout-- &&