diff options
| author | Alice Guo <alice.guo@nxp.com> | 2026-06-18 09:17:49 +0800 |
|---|---|---|
| committer | Fabio Estevam <festevam@gmail.com> | 2026-06-26 16:50:55 -0300 |
| commit | 8c051851a5770a3e09e2e7815d963b4a6078407e (patch) | |
| tree | 374f1aed260f2b435db001ead27624153bcc812c | |
| parent | 3232cd38b4f6700b8512d1115da0135cae466fbc (diff) | |
| download | u-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.c | 39 |
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); |
