[U-Boot] [PATCH v2] drivers: net: cpsw: always flush cache of size PKTSIZE_ALIGN

Joe Hershberger joe.hershberger at gmail.com
Wed Aug 10 23:41:08 CEST 2016


Hi Lokesh,

On Wed, Aug 10, 2016 at 7:02 AM, Lokesh Vutla <lokeshvutla at ti.com> wrote:
>
>
> On Wednesday 10 August 2016 08:43 AM, Joe Hershberger wrote:
>> Hi Lokesh
>>
>> On Tue, Aug 9, 2016 at 12:47 AM, Lokesh Vutla <lokeshvutla at ti.com> wrote:
>>> cpsw tries to flush dcache which is not in the range of PKTSIZE.
>>> Because of this the following warning comes while flushing:
>>>
>>> CACHE: Misaligned operation at range [dffecec0, dffed016]
>>>
>>> Fix it by flushing cache of size PKTSIZE_ALIGN as similar to what is
>>> being done in _cpsw_recv.
>>>
>>> Signed-off-by: Lokesh Vutla <lokeshvutla at ti.com>
>>> ---
>>> Changes since v1:
>>> - Use PKTALIGN instead of cache line size
>>> - Need not align start of packet buffer from the network subsystem.
>>>
>>>  drivers/net/cpsw.c | 2 +-
>>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/net/cpsw.c b/drivers/net/cpsw.c
>>> index 2ce4ec6..8ce5716 100644
>>> --- a/drivers/net/cpsw.c
>>> +++ b/drivers/net/cpsw.c
>>> @@ -907,7 +907,7 @@ static int _cpsw_send(struct cpsw_priv *priv, void *packet, int length)
>>>         int timeout = CPDMA_TIMEOUT;
>>>
>>>         flush_dcache_range((unsigned long)packet,
>>> -                          (unsigned long)packet + length);
>>> +                          (unsigned long)packet + PKTSIZE_ALIGN);
>>
>> Technically you are flushing more than needed since you just need to
>> be aligned to the cacheline beyond the size being sent, but you are
>> flushing the maximum packet size every time. That said, it's still
>> going to work and the code is readable. I'm fine with this, but wanted
>> to make sure you knew this is more flushing than needed.
>
> Initially that was my idea as well and aligned length to cache line
> size. As you suggested to use PKTSIZE_ALIGN and also _cpsw_recv uses the
> same. So, I used PKTSIZE_ALIGN.

I actually recommended PKTALIGN, not PKTSIZE_ALIGN. For recv, the size
for invalidate is unknown until it's received (unless you can check a
descriptor after it's received but before you read it), so it's more
appropriate to use PKTSIZE_ALIGN. For send, you certainly know the
size before flushing.

Cheers,
-Joe


More information about the U-Boot mailing list