[PATCH] iio: proximity: aw96103: fix firmware read on big-endian

David Lechner posted 1 patch 3 weeks, 2 days ago
drivers/iio/proximity/aw96103.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
[PATCH] iio: proximity: aw96103: fix firmware read on big-endian
Posted by David Lechner 3 weeks, 2 days ago
Use get_unaligned_le32() instead of casting to int * to make sure that
reading a 32-bit int value from the firmware binary works correctly on
big-endian architectures.

Fixes: 07b241262dca ("iio: proximity: aw96103: Add support for aw96103/aw96105 proximity sensor")
Signed-off-by: David Lechner <dlechner@baylibre.com>
---
 drivers/iio/proximity/aw96103.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/iio/proximity/aw96103.c b/drivers/iio/proximity/aw96103.c
index 3472a2c36e44..8263411c06df 100644
--- a/drivers/iio/proximity/aw96103.c
+++ b/drivers/iio/proximity/aw96103.c
@@ -233,7 +233,7 @@ static void aw96103_parsing_bin_file(struct aw_bin *bin)
 {
 	bin->valid_data_addr = AW96103_BIN_VALID_DATA_OFFSET;
 	bin->valid_data_len =
-		*(unsigned int *)(bin->data + AW96103_BIN_DATA_LEN_OFFSET) -
+		get_unaligned_le32(bin->data + AW96103_BIN_DATA_LEN_OFFSET) -
 		AW96103_BIN_DATA_REG_NUM_SIZE;
 	memcpy(bin->chip_type, bin->data + AW96103_BIN_CHIP_TYPE_OFFSET,
 	       AW96103_BIN_CHIP_TYPE_SIZE);

---
base-commit: ff0843ceb1fb11a6b73e0e77b932ef7967aecd4b
change-id: 20260314-iio-proximity-aw96103-fix-firmware-read-c9378ce60830

Best regards,
--  
David Lechner <dlechner@baylibre.com>
Re: [PATCH] iio: proximity: aw96103: fix firmware read on big-endian
Posted by Andy Shevchenko 3 weeks ago
On Sat, Mar 14, 2026 at 06:20:12PM -0500, David Lechner wrote:
> Use get_unaligned_le32() instead of casting to int * to make sure that
> reading a 32-bit int value from the firmware binary works correctly on
> big-endian architectures.

...

>  	bin->valid_data_addr = AW96103_BIN_VALID_DATA_OFFSET;
>  	bin->valid_data_len =
> -		*(unsigned int *)(bin->data + AW96103_BIN_DATA_LEN_OFFSET) -
> +		get_unaligned_le32(bin->data + AW96103_BIN_DATA_LEN_OFFSET) -
>  		AW96103_BIN_DATA_REG_NUM_SIZE;
>  	memcpy(bin->chip_type, bin->data + AW96103_BIN_CHIP_TYPE_OFFSET,
>  	       AW96103_BIN_CHIP_TYPE_SIZE);

I gave you a tag, but I have a question here:
Hmm... memcpy() happens to work probably due to keeping LE as LE and chip_type
being a byte stream itself, if AW96103_BIN_CHIP_TYPE_SIZE is bigger than a
byte. Otherwise it may suffer from the same issue, no?

-- 
With Best Regards,
Andy Shevchenko
Re: [PATCH] iio: proximity: aw96103: fix firmware read on big-endian
Posted by David Lechner 3 weeks ago
On 3/16/26 5:22 AM, Andy Shevchenko wrote:
> On Sat, Mar 14, 2026 at 06:20:12PM -0500, David Lechner wrote:
>> Use get_unaligned_le32() instead of casting to int * to make sure that
>> reading a 32-bit int value from the firmware binary works correctly on
>> big-endian architectures.
> 
> ...
> 
>>  	bin->valid_data_addr = AW96103_BIN_VALID_DATA_OFFSET;
>>  	bin->valid_data_len =
>> -		*(unsigned int *)(bin->data + AW96103_BIN_DATA_LEN_OFFSET) -
>> +		get_unaligned_le32(bin->data + AW96103_BIN_DATA_LEN_OFFSET) -
>>  		AW96103_BIN_DATA_REG_NUM_SIZE;
>>  	memcpy(bin->chip_type, bin->data + AW96103_BIN_CHIP_TYPE_OFFSET,
>>  	       AW96103_BIN_CHIP_TYPE_SIZE);
> 
> I gave you a tag, but I have a question here:
> Hmm... memcpy() happens to work probably due to keeping LE as LE and chip_type
> being a byte stream itself, if AW96103_BIN_CHIP_TYPE_SIZE is bigger than a
> byte. Otherwise it may suffer from the same issue, no?
> 

I checked how bin->chip_type is used and it is a string, so not affected.
Re: [PATCH] iio: proximity: aw96103: fix firmware read on big-endian
Posted by Jonathan Cameron 2 weeks, 2 days ago
On Mon, 16 Mar 2026 09:36:33 -0500
David Lechner <dlechner@baylibre.com> wrote:

> On 3/16/26 5:22 AM, Andy Shevchenko wrote:
> > On Sat, Mar 14, 2026 at 06:20:12PM -0500, David Lechner wrote:  
> >> Use get_unaligned_le32() instead of casting to int * to make sure that
> >> reading a 32-bit int value from the firmware binary works correctly on
> >> big-endian architectures.  
> > 
> > ...
> >   
> >>  	bin->valid_data_addr = AW96103_BIN_VALID_DATA_OFFSET;
> >>  	bin->valid_data_len =
> >> -		*(unsigned int *)(bin->data + AW96103_BIN_DATA_LEN_OFFSET) -
> >> +		get_unaligned_le32(bin->data + AW96103_BIN_DATA_LEN_OFFSET) -
> >>  		AW96103_BIN_DATA_REG_NUM_SIZE;
> >>  	memcpy(bin->chip_type, bin->data + AW96103_BIN_CHIP_TYPE_OFFSET,
> >>  	       AW96103_BIN_CHIP_TYPE_SIZE);  
> > 
> > I gave you a tag, but I have a question here:
> > Hmm... memcpy() happens to work probably due to keeping LE as LE and chip_type
> > being a byte stream itself, if AW96103_BIN_CHIP_TYPE_SIZE is bigger than a
> > byte. Otherwise it may suffer from the same issue, no?
> >   
> 
> I checked how bin->chip_type is used and it is a string, so not affected. 

I'll give this one a bit longer so Shuaijie can hopefully take a look.
Re: [PATCH] iio: proximity: aw96103: fix firmware read on big-endian
Posted by Andy Shevchenko 3 weeks ago
On Sat, Mar 14, 2026 at 06:20:12PM -0500, David Lechner wrote:
> Use get_unaligned_le32() instead of casting to int * to make sure that
> reading a 32-bit int value from the firmware binary works correctly on
> big-endian architectures.

Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>

-- 
With Best Regards,
Andy Shevchenko