summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlice Guo <alice.guo@nxp.com>2026-06-18 09:17:49 +0800
committerFabio Estevam <festevam@gmail.com>2026-06-26 16:50:55 -0300
commit8c051851a5770a3e09e2e7815d963b4a6078407e (patch)
tree374f1aed260f2b435db001ead27624153bcc812c
parent3232cd38b4f6700b8512d1115da0135cae466fbc (diff)
downloadu-boot-8c051851a5770a3e09e2e7815d963b4a6078407e.tar.gz
u-boot-8c051851a5770a3e09e2e7815d963b4a6078407e.zip
imx9: scmi: use 48-bit MAC add instead of incrementing mac[5]
Replace mac[5] += offset with a proper 48-bit MAC address add to avoid overflow issues when mac[5] was close to 255. Example: i.MX95 MAC2: 00:11:22:33:44:FE + 6 Old: 00:11:22:33:44:04 (overflow, wraps to 0) New: 00:11:22:33:45:04 (correct carry from mac[5] to mac[4]) Signed-off-by: Alice Guo <alice.guo@nxp.com> Signed-off-by: Ye Li <ye.li@nxp.com> Reviewed-by: Peng Fan <peng.fan@nxp.com>
-rw-r--r--arch/arm/mach-imx/imx9/scmi/soc.c39
1 files changed, 34 insertions, 5 deletions
diff --git a/arch/arm/mach-imx/imx9/scmi/soc.c b/arch/arm/mach-imx/imx9/scmi/soc.c
index f195e60fc7c..e73f8c29d57 100644
--- a/arch/arm/mach-imx/imx9/scmi/soc.c
+++ b/arch/arm/mach-imx/imx9/scmi/soc.c
@@ -507,6 +507,35 @@ phys_size_t get_effective_memsize(void)
}
}
+static inline u64 ether_addr_to_u64(const u8 *addr)
+{
+ u64 u = 0;
+ int i;
+
+ for (i = 0; i < 6; i++)
+ u = u << 8 | addr[i];
+
+ return u;
+}
+
+static inline void u64_to_ether_addr(u64 u, u8 *addr)
+{
+ int i;
+
+ for (i = 6 - 1; i >= 0; i--) {
+ addr[i] = u & 0xff;
+ u = u >> 8;
+ }
+}
+
+static inline void eth_addr_add(u8 *addr, long offset)
+{
+ u64 u = ether_addr_to_u64(addr);
+
+ u += offset;
+ u64_to_ether_addr(u, addr);
+}
+
void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
{
u32 val[2] = {};
@@ -551,16 +580,16 @@ void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
* | 10 | netc switch | swp2 |
*/
if (dev_id == 0)
- mac[5] = mac[5] + 2; /* enetc3 mac/swp0 */
+ eth_addr_add(mac, 2); /* enetc3 mac/swp0 */
if (dev_id == 1)
- mac[5] = mac[5] + 8; /* enetc1 */
+ eth_addr_add(mac, 8); /* enetc1 */
if (dev_id == 2)
- mac[5] = mac[5] + 9; /* enetc2 */
+ eth_addr_add(mac, 9); /* enetc2 */
} else {
if (dev_id == 1)
- mac[5] = mac[5] + 3;
+ eth_addr_add(mac, 3);
if (dev_id == 2)
- mac[5] = mac[5] + 6;
+ eth_addr_add(mac, 6);
}
debug("%s: MAC%d: %pM\n", __func__, dev_id, mac);