eeprom: at24: correctly set the size for at24mac402
Subsystems (3)
PATCH 1/1 eeprom: at24: correctly set the size for at24mac402
There's an ilog2() expansion in AT24_DEVICE_MAGIC() which rounds down the actual size of EUI-48 byte array in at24mac402 eeproms to 4 from 6, making it impossible to read it all.
Fix it by manually adjusting the value in probe().
This patch contains a temporary fix that is suitable for stable branches. Eventually we'll probably remove the call to ilog2() while converting the magic values to actual structs.
--- drivers/misc/eeprom/at24.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/misc/eeprom/at24.c +10 -0
@@ -730,6 +730,16 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)dev_warn (&client->dev,"page_size looks suspicious (no power of 2)!\n" ); +/* +* REVISIT: the size of the EUI-48 byte array is 6 in at24mac402, while +* the call to ilog2() in AT24_DEVICE_MAGIC() rounds it down to 4. +* +* Eventually we'll get rid of the magic values altoghether in favor of +* real structs, but for now just manually set the right size. +*/ +if (chip.flags &AT24_FLAG_MAC && chip.byte_len ==4 ) + chip.byte_len =6 ; +/* Use I2C operations unless we're stuck with SMBus extensions. */ if (!i2c_check_functionality (client->adapter,I2C_FUNC_I2C )) {if (chip.flags &AT24_FLAG_ADDR16 )
Signature · 1 line
2.15.0
Quoted 10 lines · Bartosz Golaszewski
There's an
ilog2()expansion inAT24_DEVICE_MAGIC()which rounds down the actual size of EUI-48 byte array in at24mac402 eeproms to 4 from 6, making it impossible to read it all.Fix it by manually adjusting the value in
probe().This patch contains a temporary fix that is suitable for stable branches. Eventually we'll probably remove the call to
ilog2()while converting the magic values to actual structs.
drivers/misc/eeprom/at24.c static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) · line 740
Quoted 8 lines
drivers/misc/eeprom/at24.c +8
-0+/* +* REVISIT: the size of the EUI-48 byte array is 6 in at24mac402, while +* the call to ilog2() in AT24_DEVICE_MAGIC() rounds it down to 4. +* +* Eventually we'll get rid of the magic values altoghether in favor of +* real structs, but for now just manually set the right size. +*/ +if (chip.flags &AT24_FLAG_MAC && chip.byte_len ==4 )
I didn't check, but do we need to test for len == 4 at all?
Quoted 1 line
+ chip.byte_len = 6;
Signature · 2 lines
With Best Regards, Andy Shevchenko
2017-11-28 11:25 GMT+01:00 Andy Shevchenko <[email protected]>:
Quoted 20 lines · Bartosz Golaszewski
Quoted 10 lines
There's an
ilog2()expansion inAT24_DEVICE_MAGIC()which rounds down the actual size of EUI-48 byte array in at24mac402 eeproms to 4 from 6, making it impossible to read it all.Fix it by manually adjusting the value in
probe().This patch contains a temporary fix that is suitable for stable branches. Eventually we'll probably remove the call to
ilog2()while converting the magic values to actual structs.drivers/misc/eeprom/at24.c static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) · line 740
Quoted 8 lines
drivers/misc/eeprom/at24.c +8
-0+/* +* REVISIT: the size of the EUI-48 byte array is 6 in at24mac402, while +* the call to ilog2() in AT24_DEVICE_MAGIC() rounds it down to 4. +* +* Eventually we'll get rid of the magic values altoghether in favor of +* real structs, but for now just manually set the right size. +*/ +if (chip.flags &AT24_FLAG_MAC && chip.byte_len ==4 )
Quoted 7 lines
I didn't check, but do we need to test for len == 4 at all?
Quoted 1 line
+ chip.byte_len = 6;
--
With Best Regards,
Andy Shevchenko
Yes, because the fix is only relevant for at24mac402 whose MAC byte array is 6 bytes long, while the one in at24mac602 is 8 bytes and the driver doesn't truncate the byte_len for it.
Thanks,
Bartosz
Quoted 25 lines · Bartosz Golaszewski
2017-11-28 11:25 GMT+01:00 Andy Shevchenko <[email protected]>:
Quoted 24 lines · Bartosz Golaszewski
Quoted 10 lines
There's an
ilog2()expansion inAT24_DEVICE_MAGIC()which rounds down the actual size of EUI-48 byte array in at24mac402 eeproms to 4 from 6, making it impossible to read it all.Fix it by manually adjusting the value in
probe().This patch contains a temporary fix that is suitable for stable branches. Eventually we'll probably remove the call to
ilog2()while converting the magic values to actual structs.drivers/misc/eeprom/at24.c static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) · line 740
Quoted 8 lines
drivers/misc/eeprom/at24.c +8
-0+/* +* REVISIT: the size of the EUI-48 byte array is 6 in at24mac402, while +* the call to ilog2() in AT24_DEVICE_MAGIC() rounds it down to 4. +* +* Eventually we'll get rid of the magic values altoghether in favor of +* real structs, but for now just manually set the right size. +*/ +if (chip.flags &AT24_FLAG_MAC && chip.byte_len ==4 )I didn't check, but do we need to test for len == 4 at all?
Quoted 1 line
+ chip.byte_len = 6;
Quoted 8 lines
Quoted 3 lines
--
With Best Regards,
Andy ShevchenkoYes, because the fix is only relevant for at24mac402 whose MAC byte array is 6 bytes long, while the one in at24mac602 is 8 bytes and the driver doesn't truncate the
byte_lenfor it.
From my point of view, I think all chips in at24_ids[] array should be checked
about restrictions regarding the size truncation (especially the ones from the initial commit: "2b7a5056a0a7ff17d5d2 i2c: New-style EEPROM driver using device IDs" which introduces AT24_DEVICE_MAGIC() macro) and if none of them has such restrictions we should get rid of the ilog2() restrictions.
Just my 2 cents...
Claudiu
Quoted 4 lines
Thanks,
Bartosz
Quoted 10 lines · Bartosz Golaszewski
There's an
ilog2()expansion inAT24_DEVICE_MAGIC()which rounds down the actual size of EUI-48 byte array in at24mac402 eeproms to 4 from 6, making it impossible to read it all.Fix it by manually adjusting the value in
probe().This patch contains a temporary fix that is suitable for stable branches. Eventually we'll probably remove the call to
ilog2()while converting the magic values to actual structs.
Quoted 31 lines
Fixes 0b813658c115 ("eeprom: at24: add support for at24mac series")Signed-off-by Bartosz Golaszewski <[email protected]>--- drivers/misc/eeprom/at24.c | 10 ++++++++++ 1 file changed, 10 insertions(+)drivers/misc/eeprom/at24.c +10
-1@@ -730,6 +730,16 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)dev_warn (&client->dev,"page_size looks suspicious (no power of 2)!\n" ); +/* +* REVISIT: the size of the EUI-48 byte array is 6 in at24mac402, while +* the call to ilog2() in AT24_DEVICE_MAGIC() rounds it down to 4. +* +* Eventually we'll get rid of the magic values altoghether in favor of +* real structs, but for now just manually set the right size. +*/ +if (chip.flags &AT24_FLAG_MAC && chip.byte_len ==4 ) + chip.byte_len =6 ; +/* Use I2C operations unless we're stuck with SMBus extensions. */ if (!i2c_check_functionality (client->adapter,I2C_FUNC_I2C )) {if (chip.flags &AT24_FLAG_ADDR16 ) --2.15.0
Signature · 2 lines
With Best Regards, Andy Shevchenko
Am 28.11.2017 um 13:09 schrieb Andy Shevchenko:
Quoted 5 lines · Bartosz Golaszewski
Quoted 4 lines
There's an
ilog2()expansion inAT24_DEVICE_MAGIC()which rounds down the actual size of EUI-48 byte array in at24mac402 eeproms to 4 from 6, making it impossible to read it all.
Quoted 9 lines
Quoted 6 lines
Fix it by manually adjusting the value in
probe().This patch contains a temporary fix that is suitable for stable branches. Eventually we'll probably remove the call to
ilog2()while converting the magic values to actual structs.Reviewed-by Andy Shevchenko <[email protected]>
Looks good also to me.
Quoted 34 lines
Quoted 31 lines
Fixes 0b813658c115 ("eeprom: at24: add support for at24mac series")Signed-off-by Bartosz Golaszewski <[email protected]>--- drivers/misc/eeprom/at24.c | 10 ++++++++++ 1 file changed, 10 insertions(+)drivers/misc/eeprom/at24.c +10
-1@@ -730,6 +730,16 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)dev_warn (&client->dev,"page_size looks suspicious (no power of 2)!\n" ); +/* +* REVISIT: the size of the EUI-48 byte array is 6 in at24mac402, while +* the call to ilog2() in AT24_DEVICE_MAGIC() rounds it down to 4. +* +* Eventually we'll get rid of the magic values altoghether in favor of +* real structs, but for now just manually set the right size. +*/ +if (chip.flags &AT24_FLAG_MAC && chip.byte_len ==4 ) + chip.byte_len =6 ; +/* Use I2C operations unless we're stuck with SMBus extensions. */ if (!i2c_check_functionality (client->adapter,I2C_FUNC_I2C )) {if (chip.flags &AT24_FLAG_ADDR16 ) --2.15.0