Skip to content

Commit e7e5ae7

Browse files
hormskuba-moo
authored andcommitted
net: dlink: Correct endianness handling of led_mode
As it's name suggests, parse_eeprom() parses EEPROM data. This is done by reading data, 16 bits at a time as follows: for (i = 0; i < 128; i++) ((__le16 *) sromdata)[i] = cpu_to_le16(read_eeprom(np, i)); sromdata is at the same memory location as psrom. And the type of psrom is a pointer to struct t_SROM. As can be seen in the loop above, data is stored in sromdata, and thus psrom, as 16-bit little-endian values. However, the integer fields of t_SROM are host byte order integers. And in the case of led_mode this leads to a little endian value being incorrectly treated as host byte order. Looking at rio_set_led_mode, this does appear to be a bug as that code masks led_mode with 0x1, 0x2 and 0x8. Logic that would be effected by a reversed byte order. This problem would only manifest on big endian hosts. Found by inspection while investigating a sparse warning regarding the crc field of t_SROM. I believe that warning is a false positive. And although I plan to send a follow-up to use little-endian types for other the integer fields of PSROM_t I do not believe that will involve any bug fixes. Compile tested only. Fixes: c3f45d3 ("dl2k: Add support for IP1000A-based cards") Signed-off-by: Simon Horman <horms@kernel.org> Link: https://patch.msgid.link/20250425-dlink-led-mode-v1-1-6bae3c36e736@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent d4cb1ec commit e7e5ae7

File tree

2 files changed

+2
-2
lines changed

2 files changed

+2
-2
lines changed

drivers/net/ethernet/dlink/dl2k.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ parse_eeprom (struct net_device *dev)
352352
eth_hw_addr_set(dev, psrom->mac_addr);
353353

354354
if (np->chip_id == CHIP_IP1000A) {
355-
np->led_mode = psrom->led_mode;
355+
np->led_mode = le16_to_cpu(psrom->led_mode);
356356
return 0;
357357
}
358358

drivers/net/ethernet/dlink/dl2k.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ typedef struct t_SROM {
335335
u16 sub_system_id; /* 0x06 */
336336
u16 pci_base_1; /* 0x08 (IP1000A only) */
337337
u16 pci_base_2; /* 0x0a (IP1000A only) */
338-
u16 led_mode; /* 0x0c (IP1000A only) */
338+
__le16 led_mode; /* 0x0c (IP1000A only) */
339339
u16 reserved1[9]; /* 0x0e-0x1f */
340340
u8 mac_addr[6]; /* 0x20-0x25 */
341341
u8 reserved2[10]; /* 0x26-0x2f */

0 commit comments

Comments
 (0)