Re: [PATCH] Staging: vt6655: Fix sparse warning. Restricted cast.

From: Dan Carpenter
Date: Wed Jan 10 2024 - 02:25:42 EST


Hm... This stuff is more broken than I realized when I first looked at
it. And the truth is that I don't know the hardware so I can't say
exactly what the fix is. Probably best to just leave it alone for now...

On Wed, Jan 10, 2024 at 08:25:33AM +0200, Ariel Silver wrote:
> >> Hello Dan and thank you for the quick response. Much appreciated!
> >> 1) I am probably wrong, but as I see it, the current code assumes that
> >> 'CARDqGetTSFOffset' returns a little endian value.
> >> So it calls 'qwTSFOffset = le64_to_cpu(qwTSFOffset)'. However digging in
> >> the code of 'CARDqGetTSFOffset' I don't see a reason to assume that.
> >> Which in my opinion can cuase a bad endianness cast on big endianness
> >> systems.

You're actually correct.

But the thing is that le64_to_cpu() and cpu_to_le64() do the exactly the
same thing. If the hardware is little endian they do nothing, but if
the hardware is big endian they call bswap_64(). The only difference is
how a human reader understands it and for git annotations.

What I suspect is that we should be passing little endian data to
iowrite32(). In other words we should change the le64_to_cpu() to
cpu_to_le64(). This wouldn't change how the code works, it would just
change how it is annotated. However, on the other hand, I see plenty of
examples where it's passing CPU endian data to iowrite32() so maybe we
should get rid of the conversion instead. Who knows?

I suspect is that this driver has never worked on big endian CPUs...

I would say let's not change this until we're more sure what's going on.
And probably if we make changes that affect runtime as opposed to just
modifying endian annotations, then that needs to be tested.

regards,
dan carpenter