diff mbox series

iio: imu: st_lsm6dsx: Fix selection of ST_LSM6DS3_ID

Message ID 20191209170541.198206-1-stephan@gerhold.net (mailing list archive)
State New, archived
Headers show
Series iio: imu: st_lsm6dsx: Fix selection of ST_LSM6DS3_ID | expand

Commit Message

Stephan Gerhold Dec. 9, 2019, 5:05 p.m. UTC
At the moment, attempting to probe a device with ST_LSM6DS3_ID
(e.g. using the st,lsm6ds3 compatible) fails with:

    st_lsm6dsx_i2c 1-006b: unsupported whoami [69]

... even though 0x69 is the whoami listed for ST_LSM6DS3_ID.

This happens because st_lsm6dsx_check_whoami() also attempts
to match unspecified (zero-initialized) entries in the "id" array.
ST_LSM6DS3_ID = 0 will therefore match any entry in
st_lsm6dsx_sensor_settings (here: the first), because none of them
actually have all 12 entries listed in the "id" array.

Avoid this by additionally checking if "name" is set,
which is only set for valid entries in the "id" array.

Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
---
 drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Lorenzo Bianconi Dec. 9, 2019, 9:48 p.m. UTC | #1
> At the moment, attempting to probe a device with ST_LSM6DS3_ID
> (e.g. using the st,lsm6ds3 compatible) fails with:
> 
>     st_lsm6dsx_i2c 1-006b: unsupported whoami [69]
> 
> ... even though 0x69 is the whoami listed for ST_LSM6DS3_ID.
> 

Hi Stephan,

thx for working on this. I guess we can skip 'void' iterations defining the
array real size, do you agree?

Regards,
Lorenzo

> This happens because st_lsm6dsx_check_whoami() also attempts
> to match unspecified (zero-initialized) entries in the "id" array.
> ST_LSM6DS3_ID = 0 will therefore match any entry in
> st_lsm6dsx_sensor_settings (here: the first), because none of them
> actually have all 12 entries listed in the "id" array.
> 
> Avoid this by additionally checking if "name" is set,
> which is only set for valid entries in the "id" array.
> 
> Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
> ---
>  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> index a7d40c02ce6b..b921dd9e108f 100644
> --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> @@ -1301,7 +1301,8 @@ static int st_lsm6dsx_check_whoami(struct st_lsm6dsx_hw *hw, int id,
>  
>  	for (i = 0; i < ARRAY_SIZE(st_lsm6dsx_sensor_settings); i++) {
>  		for (j = 0; j < ST_LSM6DSX_MAX_ID; j++) {
> -			if (id == st_lsm6dsx_sensor_settings[i].id[j].hw_id)
> +			if (st_lsm6dsx_sensor_settings[i].id[j].name &&
> +			    id == st_lsm6dsx_sensor_settings[i].id[j].hw_id)
>  				break;
>  		}
>  		if (j < ST_LSM6DSX_MAX_ID)
> -- 
> 2.24.0
>
Stephan Gerhold Dec. 10, 2019, 8:22 a.m. UTC | #2
On Mon, Dec 09, 2019 at 10:48:52PM +0100, Lorenzo Bianconi wrote:
> > At the moment, attempting to probe a device with ST_LSM6DS3_ID
> > (e.g. using the st,lsm6ds3 compatible) fails with:
> > 
> >     st_lsm6dsx_i2c 1-006b: unsupported whoami [69]
> > 
> > ... even though 0x69 is the whoami listed for ST_LSM6DS3_ID.
> > 
> 
> Hi Stephan,
> 
> thx for working on this. I guess we can skip 'void' iterations defining the
> array real size, do you agree?
> 

I'm not sure I understand you correctly.
Do you mean having something like:

struct st_lsm6dsx_settings {
	u8 wai;
	/* ... */
	struct {
		enum st_lsm6dsx_hw_id hw_id;
		const char *name;
	} id[ST_LSM6DSX_MAX_ID];
	int id_num; /* Add this field */
	/* ... */
};

And then change the loop to use .id_num instead?

I think it is pretty easy to forget to update "id_num"
when adding new entries. Right now there is no need to worry about that.

Thanks,
Stephan

> Regards,
> Lorenzo
> 
> > This happens because st_lsm6dsx_check_whoami() also attempts
> > to match unspecified (zero-initialized) entries in the "id" array.
> > ST_LSM6DS3_ID = 0 will therefore match any entry in
> > st_lsm6dsx_sensor_settings (here: the first), because none of them
> > actually have all 12 entries listed in the "id" array.
> > 
> > Avoid this by additionally checking if "name" is set,
> > which is only set for valid entries in the "id" array.
> > 
> > Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
> > ---
> >  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 3 ++-
> >  1 file changed, 2 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > index a7d40c02ce6b..b921dd9e108f 100644
> > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > @@ -1301,7 +1301,8 @@ static int st_lsm6dsx_check_whoami(struct st_lsm6dsx_hw *hw, int id,
> >  
> >  	for (i = 0; i < ARRAY_SIZE(st_lsm6dsx_sensor_settings); i++) {
> >  		for (j = 0; j < ST_LSM6DSX_MAX_ID; j++) {
> > -			if (id == st_lsm6dsx_sensor_settings[i].id[j].hw_id)
> > +			if (st_lsm6dsx_sensor_settings[i].id[j].name &&
> > +			    id == st_lsm6dsx_sensor_settings[i].id[j].hw_id)
> >  				break;
> >  		}
> >  		if (j < ST_LSM6DSX_MAX_ID)
> > -- 
> > 2.24.0
> >
Lorenzo Bianconi Dec. 11, 2019, 2:10 p.m. UTC | #3
> On Mon, Dec 09, 2019 at 10:48:52PM +0100, Lorenzo Bianconi wrote:
> > > At the moment, attempting to probe a device with ST_LSM6DS3_ID
> > > (e.g. using the st,lsm6ds3 compatible) fails with:
> > > 
> > >     st_lsm6dsx_i2c 1-006b: unsupported whoami [69]
> > > 
> > > ... even though 0x69 is the whoami listed for ST_LSM6DS3_ID.
> > > 
> > 
> > Hi Stephan,
> > 
> > thx for working on this. I guess we can skip 'void' iterations defining the
> > array real size, do you agree?
> > 
> 
> I'm not sure I understand you correctly.
> Do you mean having something like:
> 
> struct st_lsm6dsx_settings {
> 	u8 wai;
> 	/* ... */
> 	struct {
> 		enum st_lsm6dsx_hw_id hw_id;
> 		const char *name;
> 	} id[ST_LSM6DSX_MAX_ID];
> 	int id_num; /* Add this field */
> 	/* ... */
> };
> 
> And then change the loop to use .id_num instead?
> 
> I think it is pretty easy to forget to update "id_num"
> when adding new entries. Right now there is no need to worry about that.

Uhm..this approach is even more safe if someone forgets to set name for a given
device. So for the patch:

Acked-by: Lorenzo Bianconi <lorenzo@kernel.org>

Regards,
Lorenzo

> 
> Thanks,
> Stephan
> 
> > Regards,
> > Lorenzo
> > 
> > > This happens because st_lsm6dsx_check_whoami() also attempts
> > > to match unspecified (zero-initialized) entries in the "id" array.
> > > ST_LSM6DS3_ID = 0 will therefore match any entry in
> > > st_lsm6dsx_sensor_settings (here: the first), because none of them
> > > actually have all 12 entries listed in the "id" array.
> > > 
> > > Avoid this by additionally checking if "name" is set,
> > > which is only set for valid entries in the "id" array.
> > > 
> > > Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
> > > ---
> > >  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 3 ++-
> > >  1 file changed, 2 insertions(+), 1 deletion(-)
> > > 
> > > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > > index a7d40c02ce6b..b921dd9e108f 100644
> > > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > > @@ -1301,7 +1301,8 @@ static int st_lsm6dsx_check_whoami(struct st_lsm6dsx_hw *hw, int id,
> > >  
> > >  	for (i = 0; i < ARRAY_SIZE(st_lsm6dsx_sensor_settings); i++) {
> > >  		for (j = 0; j < ST_LSM6DSX_MAX_ID; j++) {
> > > -			if (id == st_lsm6dsx_sensor_settings[i].id[j].hw_id)
> > > +			if (st_lsm6dsx_sensor_settings[i].id[j].name &&
> > > +			    id == st_lsm6dsx_sensor_settings[i].id[j].hw_id)
> > >  				break;
> > >  		}
> > >  		if (j < ST_LSM6DSX_MAX_ID)
> > > -- 
> > > 2.24.0
> > > 
> 
>
Jonathan Cameron Dec. 15, 2019, 5:23 p.m. UTC | #4
On Mon,  9 Dec 2019 18:05:41 +0100
Stephan Gerhold <stephan@gerhold.net> wrote:

> At the moment, attempting to probe a device with ST_LSM6DS3_ID
> (e.g. using the st,lsm6ds3 compatible) fails with:
> 
>     st_lsm6dsx_i2c 1-006b: unsupported whoami [69]
> 
> ... even though 0x69 is the whoami listed for ST_LSM6DS3_ID.
> 
> This happens because st_lsm6dsx_check_whoami() also attempts
> to match unspecified (zero-initialized) entries in the "id" array.
> ST_LSM6DS3_ID = 0 will therefore match any entry in
> st_lsm6dsx_sensor_settings (here: the first), because none of them
> actually have all 12 entries listed in the "id" array.
> 
> Avoid this by additionally checking if "name" is set,
> which is only set for valid entries in the "id" array.
> 
> Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
Definitely sounds like this wants backporting. 

If you can figure out a fixes tag that would be great!

Thanks,

Jonathan

> ---
>  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> index a7d40c02ce6b..b921dd9e108f 100644
> --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> @@ -1301,7 +1301,8 @@ static int st_lsm6dsx_check_whoami(struct st_lsm6dsx_hw *hw, int id,
>  
>  	for (i = 0; i < ARRAY_SIZE(st_lsm6dsx_sensor_settings); i++) {
>  		for (j = 0; j < ST_LSM6DSX_MAX_ID; j++) {
> -			if (id == st_lsm6dsx_sensor_settings[i].id[j].hw_id)
> +			if (st_lsm6dsx_sensor_settings[i].id[j].name &&
> +			    id == st_lsm6dsx_sensor_settings[i].id[j].hw_id)
>  				break;
>  		}
>  		if (j < ST_LSM6DSX_MAX_ID)
Jonathan Cameron Jan. 13, 2020, 10:12 p.m. UTC | #5
On Sun, 15 Dec 2019 17:23:42 +0000
Jonathan Cameron <jic23@kernel.org> wrote:

> On Mon,  9 Dec 2019 18:05:41 +0100
> Stephan Gerhold <stephan@gerhold.net> wrote:
> 
> > At the moment, attempting to probe a device with ST_LSM6DS3_ID
> > (e.g. using the st,lsm6ds3 compatible) fails with:
> > 
> >     st_lsm6dsx_i2c 1-006b: unsupported whoami [69]
> > 
> > ... even though 0x69 is the whoami listed for ST_LSM6DS3_ID.
> > 
> > This happens because st_lsm6dsx_check_whoami() also attempts
> > to match unspecified (zero-initialized) entries in the "id" array.
> > ST_LSM6DS3_ID = 0 will therefore match any entry in
> > st_lsm6dsx_sensor_settings (here: the first), because none of them
> > actually have all 12 entries listed in the "id" array.
> > 
> > Avoid this by additionally checking if "name" is set,
> > which is only set for valid entries in the "id" array.
> > 
> > Signed-off-by: Stephan Gerhold <stephan@gerhold.net>  
> Definitely sounds like this wants backporting. 
> 
> If you can figure out a fixes tag that would be great!
I've taken a stab at working out when this got introduced and
came up with:

81956a93b522 "iio: imu: st_lsm6dsx: get device name from st_lsm6dsx_sensor_settings"

If that's wrong please let me know asap.

Applied to the togreg branch of iio.git as we are near the merge
window opening and marked for stable.

Thanks,

Jonathan
> 
> Thanks,
> 
> Jonathan
> 
> > ---
> >  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 3 ++-
> >  1 file changed, 2 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > index a7d40c02ce6b..b921dd9e108f 100644
> > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > @@ -1301,7 +1301,8 @@ static int st_lsm6dsx_check_whoami(struct st_lsm6dsx_hw *hw, int id,
> >  
> >  	for (i = 0; i < ARRAY_SIZE(st_lsm6dsx_sensor_settings); i++) {
> >  		for (j = 0; j < ST_LSM6DSX_MAX_ID; j++) {
> > -			if (id == st_lsm6dsx_sensor_settings[i].id[j].hw_id)
> > +			if (st_lsm6dsx_sensor_settings[i].id[j].name &&
> > +			    id == st_lsm6dsx_sensor_settings[i].id[j].hw_id)
> >  				break;
> >  		}
> >  		if (j < ST_LSM6DSX_MAX_ID)  
>
Stephan Gerhold Jan. 14, 2020, 9:06 a.m. UTC | #6
On Mon, Jan 13, 2020 at 10:12:11PM +0000, Jonathan Cameron wrote:
> On Sun, 15 Dec 2019 17:23:42 +0000
> Jonathan Cameron <jic23@kernel.org> wrote:
> 
> > On Mon,  9 Dec 2019 18:05:41 +0100
> > Stephan Gerhold <stephan@gerhold.net> wrote:
> > 
> > > At the moment, attempting to probe a device with ST_LSM6DS3_ID
> > > (e.g. using the st,lsm6ds3 compatible) fails with:
> > > 
> > >     st_lsm6dsx_i2c 1-006b: unsupported whoami [69]
> > > 
> > > ... even though 0x69 is the whoami listed for ST_LSM6DS3_ID.
> > > 
> > > This happens because st_lsm6dsx_check_whoami() also attempts
> > > to match unspecified (zero-initialized) entries in the "id" array.
> > > ST_LSM6DS3_ID = 0 will therefore match any entry in
> > > st_lsm6dsx_sensor_settings (here: the first), because none of them
> > > actually have all 12 entries listed in the "id" array.
> > > 
> > > Avoid this by additionally checking if "name" is set,
> > > which is only set for valid entries in the "id" array.
> > > 
> > > Signed-off-by: Stephan Gerhold <stephan@gerhold.net>  
> > Definitely sounds like this wants backporting. 
> > 
> > If you can figure out a fixes tag that would be great!
> I've taken a stab at working out when this got introduced and
> came up with:
> 
> 81956a93b522 "iio: imu: st_lsm6dsx: get device name from st_lsm6dsx_sensor_settings"
> 
> If that's wrong please let me know asap.
> 
> Applied to the togreg branch of iio.git as we are near the merge
> window opening and marked for stable.

You have already applied the v2 I sent with the fixes/cc stable tags :)
It's part of your "Second set of IIO fixes for the 5.5 cycle." pull request:
https://lore.kernel.org/linux-iio/20200105110051.445c9a95@archlinux/

> 
> Thanks,
> 
> Jonathan
> > 
> > Thanks,
> > 
> > Jonathan
> > 
> > > ---
> > >  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 3 ++-
> > >  1 file changed, 2 insertions(+), 1 deletion(-)
> > > 
> > > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > > index a7d40c02ce6b..b921dd9e108f 100644
> > > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > > @@ -1301,7 +1301,8 @@ static int st_lsm6dsx_check_whoami(struct st_lsm6dsx_hw *hw, int id,
> > >  
> > >  	for (i = 0; i < ARRAY_SIZE(st_lsm6dsx_sensor_settings); i++) {
> > >  		for (j = 0; j < ST_LSM6DSX_MAX_ID; j++) {
> > > -			if (id == st_lsm6dsx_sensor_settings[i].id[j].hw_id)
> > > +			if (st_lsm6dsx_sensor_settings[i].id[j].name &&
> > > +			    id == st_lsm6dsx_sensor_settings[i].id[j].hw_id)
> > >  				break;
> > >  		}
> > >  		if (j < ST_LSM6DSX_MAX_ID)  
> > 
>
Jonathan Cameron Jan. 14, 2020, 9:12 a.m. UTC | #7
On Tue, 14 Jan 2020 10:06:52 +0100
Stephan Gerhold <stephan@gerhold.net> wrote:

> On Mon, Jan 13, 2020 at 10:12:11PM +0000, Jonathan Cameron wrote:
> > On Sun, 15 Dec 2019 17:23:42 +0000
> > Jonathan Cameron <jic23@kernel.org> wrote:
> >   
> > > On Mon,  9 Dec 2019 18:05:41 +0100
> > > Stephan Gerhold <stephan@gerhold.net> wrote:
> > >   
> > > > At the moment, attempting to probe a device with ST_LSM6DS3_ID
> > > > (e.g. using the st,lsm6ds3 compatible) fails with:
> > > > 
> > > >     st_lsm6dsx_i2c 1-006b: unsupported whoami [69]
> > > > 
> > > > ... even though 0x69 is the whoami listed for ST_LSM6DS3_ID.
> > > > 
> > > > This happens because st_lsm6dsx_check_whoami() also attempts
> > > > to match unspecified (zero-initialized) entries in the "id" array.
> > > > ST_LSM6DS3_ID = 0 will therefore match any entry in
> > > > st_lsm6dsx_sensor_settings (here: the first), because none of them
> > > > actually have all 12 entries listed in the "id" array.
> > > > 
> > > > Avoid this by additionally checking if "name" is set,
> > > > which is only set for valid entries in the "id" array.
> > > > 
> > > > Signed-off-by: Stephan Gerhold <stephan@gerhold.net>    
> > > Definitely sounds like this wants backporting. 
> > > 
> > > If you can figure out a fixes tag that would be great!  
> > I've taken a stab at working out when this got introduced and
> > came up with:
> > 
> > 81956a93b522 "iio: imu: st_lsm6dsx: get device name from st_lsm6dsx_sensor_settings"
> > 
> > If that's wrong please let me know asap.
> > 
> > Applied to the togreg branch of iio.git as we are near the merge
> > window opening and marked for stable.  
> 
> You have already applied the v2 I sent with the fixes/cc stable tags :)
> It's part of your "Second set of IIO fixes for the 5.5 cycle." pull request:
> https://lore.kernel.org/linux-iio/20200105110051.445c9a95@archlinux/

Gah!  I clearly wasn't on top form last night.   Will drop this one again.

Thanks.

Jonathan

> 
> > 
> > Thanks,
> > 
> > Jonathan  
> > > 
> > > Thanks,
> > > 
> > > Jonathan
> > >   
> > > > ---
> > > >  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 3 ++-
> > > >  1 file changed, 2 insertions(+), 1 deletion(-)
> > > > 
> > > > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > > > index a7d40c02ce6b..b921dd9e108f 100644
> > > > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > > > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > > > @@ -1301,7 +1301,8 @@ static int st_lsm6dsx_check_whoami(struct st_lsm6dsx_hw *hw, int id,
> > > >  
> > > >  	for (i = 0; i < ARRAY_SIZE(st_lsm6dsx_sensor_settings); i++) {
> > > >  		for (j = 0; j < ST_LSM6DSX_MAX_ID; j++) {
> > > > -			if (id == st_lsm6dsx_sensor_settings[i].id[j].hw_id)
> > > > +			if (st_lsm6dsx_sensor_settings[i].id[j].name &&
> > > > +			    id == st_lsm6dsx_sensor_settings[i].id[j].hw_id)
> > > >  				break;
> > > >  		}
> > > >  		if (j < ST_LSM6DSX_MAX_ID)    
> > >   
> >   
>
diff mbox series

Patch

diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
index a7d40c02ce6b..b921dd9e108f 100644
--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
+++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
@@ -1301,7 +1301,8 @@  static int st_lsm6dsx_check_whoami(struct st_lsm6dsx_hw *hw, int id,
 
 	for (i = 0; i < ARRAY_SIZE(st_lsm6dsx_sensor_settings); i++) {
 		for (j = 0; j < ST_LSM6DSX_MAX_ID; j++) {
-			if (id == st_lsm6dsx_sensor_settings[i].id[j].hw_id)
+			if (st_lsm6dsx_sensor_settings[i].id[j].name &&
+			    id == st_lsm6dsx_sensor_settings[i].id[j].hw_id)
 				break;
 		}
 		if (j < ST_LSM6DSX_MAX_ID)