Skip to contentSkip to conversation

eeprom: at24: correctly set the size for at24mac402

PATCH In review Bartosz Golaszewski 4 participants 6 messages Nov 27, 2017 – Dec 4, 2017

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

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.

Fixes 0b813658c115 ("eeprom: at24: add support for at24mac series")
---
 drivers/misc/eeprom/at24.c | 10 ++++++++++
 1 file changed, 10 insertions(+)
drivers/misc/eeprom/at24.c +10 -0
index e0b4b36ef010..783244b485cc 100644
@@ -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
#1 lore raw
Quoted 10 lines · Bartosz Golaszewski

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 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
#2 lore raw

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 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 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

#3 lore raw
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 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 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 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.
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

Reviewed-by on v1 1/1
#4 lore raw
In reply to Bartosz Golaszewski
Quoted 10 lines · Bartosz Golaszewski

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.

Quoted 31 lines
Fixes 0b813658c115 ("eeprom: at24: add support for at24mac series")
---
 drivers/misc/eeprom/at24.c | 10 ++++++++++
 1 file changed, 10 insertions(+)
drivers/misc/eeprom/at24.c +10 -1
index e0b4b36ef010..783244b485cc 100644
@@ -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
#5 lore raw

Am 28.11.2017 um 13:09 schrieb Andy Shevchenko:

Quoted 5 lines · Bartosz Golaszewski
Quoted 4 lines

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.

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.

Looks good also to me.

Quoted 34 lines
Quoted 31 lines
Fixes 0b813658c115 ("eeprom: at24: add support for at24mac series")
---
 drivers/misc/eeprom/at24.c | 10 ++++++++++
 1 file changed, 10 insertions(+)
drivers/misc/eeprom/at24.c +10 -1
index e0b4b36ef010..783244b485cc 100644
@@ -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