]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
nvmem: imx-ocotp: fix MAC address byte length
authorSteffen Bätz <steffen@innosonix.de>
Sat, 12 Jul 2025 18:17:27 +0000 (19:17 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 13 Jul 2025 15:43:13 +0000 (17:43 +0200)
The commit "13bcd440f2ff nvmem: core: verify cell's raw_len" caused an
extension of the "mac-address" cell from 6 to 8 bytes due to word_size
of 4 bytes. This led to a required byte swap of the full buffer length,
which caused truncation of the mac-address when read.

Previously, the mac-address was incorrectly truncated from
70:B3:D5:14:E9:0E to 00:00:70:B3:D5:14.

Fix the issue by swapping only the first 6 bytes to correctly pass the
mac-address to the upper layers.

Fixes: 13bcd440f2ff ("nvmem: core: verify cell's raw_len")
Cc: stable@vger.kernel.org
Signed-off-by: Steffen Bätz <steffen@innosonix.de>
Tested-by: Alexander Stein <alexander.stein@ew.tq-group.com>
Signed-off-by: Srinivas Kandagatla <srini@kernel.org>
Link: https://lore.kernel.org/r/20250712181729.6495-3-srini@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/nvmem/imx-ocotp-ele.c
drivers/nvmem/imx-ocotp.c

index ca6dd71d8a2e29888c6e556aaea116c1a967cb5f..7807ec0e2d18dcec257a739378768683c0cb6c38 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/of.h>
 #include <linux/platform_device.h>
 #include <linux/slab.h>
+#include <linux/if_ether.h>    /* ETH_ALEN */
 
 enum fuse_type {
        FUSE_FSB = BIT(0),
@@ -118,9 +119,11 @@ static int imx_ocotp_cell_pp(void *context, const char *id, int index,
        int i;
 
        /* Deal with some post processing of nvmem cell data */
-       if (id && !strcmp(id, "mac-address"))
+       if (id && !strcmp(id, "mac-address")) {
+               bytes = min(bytes, ETH_ALEN);
                for (i = 0; i < bytes / 2; i++)
                        swap(buf[i], buf[bytes - i - 1]);
+       }
 
        return 0;
 }
index 79dd4fda03295ac3e2574480c595e6c5d370ba50..7bf7656d4f96318864fe12c21dbf60ead34fd55c 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/platform_device.h>
 #include <linux/slab.h>
 #include <linux/delay.h>
+#include <linux/if_ether.h>    /* ETH_ALEN */
 
 #define IMX_OCOTP_OFFSET_B0W0          0x400 /* Offset from base address of the
                                               * OTP Bank0 Word0
@@ -227,9 +228,11 @@ static int imx_ocotp_cell_pp(void *context, const char *id, int index,
        int i;
 
        /* Deal with some post processing of nvmem cell data */
-       if (id && !strcmp(id, "mac-address"))
+       if (id && !strcmp(id, "mac-address")) {
+               bytes = min(bytes, ETH_ALEN);
                for (i = 0; i < bytes / 2; i++)
                        swap(buf[i], buf[bytes - i - 1]);
+       }
 
        return 0;
 }