diff options
Diffstat (limited to 'board/variscite/common/eth.c')
-rw-r--r-- | board/variscite/common/eth.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/board/variscite/common/eth.c b/board/variscite/common/eth.c new file mode 100644 index 0000000000..a794533774 --- /dev/null +++ b/board/variscite/common/eth.c @@ -0,0 +1,58 @@ +// 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; +} |