| // SPDX-License-Identifier: GPL-2.0+ | |
| /* | |
| * Copyright 2023 Variscite Ltd. | |
| */ | |
| #include <net.h> | |
| #include <miiphy.h> | |
| #include <env.h> | |
| #include "../common/imx9_eeprom.h" | |
| #define CHAR_BIT 8 | |
| static u64 mac2int(const u8 hwaddr[]) | |
| { | |
| u8 i; | |
| u64 ret = 0; | |
| const u8 *p = hwaddr; | |
| for (i = 6; i > 0; i--) | |
| ret |= (u64)*p++ << (CHAR_BIT * (i - 1)); | |
| return ret; | |
| } | |
| static void int2mac(const u64 mac, u8 *hwaddr) | |
| { | |
| u8 i; | |
| u8 *p = hwaddr; | |
| for (i = 6; i > 0; i--) | |
| *p++ = mac >> (CHAR_BIT * (i - 1)); | |
| } | |
| int var_setup_mac(struct var_eeprom *eeprom) | |
| { | |
| int ret; | |
| unsigned char enetaddr[6]; | |
| u64 addr; | |
| unsigned char enet1addr[6]; | |
| ret = eth_env_get_enetaddr("ethaddr", enetaddr); | |
| if (ret) | |
| return 0; | |
| ret = var_eeprom_get_mac(eeprom, enetaddr); | |
| if (ret) | |
| return ret; | |
| if (!is_valid_ethaddr(enetaddr)) | |
| return -EINVAL; | |
| eth_env_set_enetaddr("ethaddr", enetaddr); | |
| addr = mac2int(enetaddr); | |
| int2mac(addr + 1, enet1addr); | |
| eth_env_set_enetaddr("eth1addr", enet1addr); | |
| return 0; | |
| } |