1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright 2023 Variscite Ltd. 4 */ 5 #include <net.h> 6 #include <miiphy.h> 7 #include <env.h> 8 #include "../common/imx9_eeprom.h" 9 10 #define CHAR_BIT 8 11 mac2int(const u8 hwaddr[])12static u64 mac2int(const u8 hwaddr[]) 13 { 14 u8 i; 15 u64 ret = 0; 16 const u8 *p = hwaddr; 17 18 for (i = 6; i > 0; i--) 19 ret |= (u64)*p++ << (CHAR_BIT * (i - 1)); 20 21 return ret; 22 } 23 int2mac(const u64 mac,u8 * hwaddr)24static void int2mac(const u64 mac, u8 *hwaddr) 25 { 26 u8 i; 27 u8 *p = hwaddr; 28 29 for (i = 6; i > 0; i--) 30 *p++ = mac >> (CHAR_BIT * (i - 1)); 31 } 32 var_setup_mac(struct var_eeprom * eeprom)33int var_setup_mac(struct var_eeprom *eeprom) 34 { 35 int ret; 36 unsigned char enetaddr[6]; 37 u64 addr; 38 unsigned char enet1addr[6]; 39 40 ret = eth_env_get_enetaddr("ethaddr", enetaddr); 41 if (ret) 42 return 0; 43 44 ret = var_eeprom_get_mac(eeprom, enetaddr); 45 if (ret) 46 return ret; 47 48 if (!is_valid_ethaddr(enetaddr)) 49 return -EINVAL; 50 51 eth_env_set_enetaddr("ethaddr", enetaddr); 52 53 addr = mac2int(enetaddr); 54 int2mac(addr + 1, enet1addr); 55 eth_env_set_enetaddr("eth1addr", enet1addr); 56 57 return 0; 58 } 59