ti: common: board_detect: commodify ethaddr environment setting code

Keystone and OMAP platforms will need this to set ethernet
MAC addresses from board EEPROM.

Signed-off-by: Roger Quadros <rogerq@ti.com>
Reviewed-by: Lokesh Vutla <lokeshvutla@ti.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
This commit is contained in:
Roger Quadros 2017-03-14 15:04:19 +02:00 committed by Tom Rini
parent a4562d0640
commit 38f719ea5e
2 changed files with 74 additions and 0 deletions

View File

@ -314,3 +314,65 @@ void __maybe_unused set_board_info_env(char *name)
else
setenv("board_serial", unknown);
}
static u64 mac_to_u64(u8 mac[6])
{
int i;
u64 addr = 0;
for (i = 0; i < 6; i++) {
addr <<= 8;
addr |= mac[i];
}
return addr;
}
static void u64_to_mac(u64 addr, u8 mac[6])
{
mac[5] = addr;
mac[4] = addr >> 8;
mac[3] = addr >> 16;
mac[2] = addr >> 24;
mac[1] = addr >> 32;
mac[0] = addr >> 40;
}
void board_ti_set_ethaddr(int index)
{
uint8_t mac_addr[6];
int i;
u64 mac1, mac2;
u8 mac_addr1[6], mac_addr2[6];
int num_macs;
/*
* Export any Ethernet MAC addresses from EEPROM.
* The 2 MAC addresses in EEPROM define the address range.
*/
board_ti_get_eth_mac_addr(0, mac_addr1);
board_ti_get_eth_mac_addr(1, mac_addr2);
if (is_valid_ethaddr(mac_addr1) && is_valid_ethaddr(mac_addr2)) {
mac1 = mac_to_u64(mac_addr1);
mac2 = mac_to_u64(mac_addr2);
/* must contain an address range */
num_macs = mac2 - mac1 + 1;
if (num_macs <= 0)
return;
if (num_macs > 50) {
printf("%s: Too many MAC addresses: %d. Limiting to 50\n",
__func__, num_macs);
num_macs = 50;
}
for (i = 0; i < num_macs; i++) {
u64_to_mac(mac1 + i, mac_addr);
if (is_valid_ethaddr(mac_addr)) {
eth_setenv_enetaddr_by_index("eth", i + index,
mac_addr);
}
}
}
}

View File

@ -193,4 +193,16 @@ u64 board_ti_get_emif2_size(void);
*/
void set_board_info_env(char *name);
/**
* board_ti_set_ethaddr- Sets the ethaddr environment from EEPROM
* @index: The first eth<index>addr environment variable to set
*
* EEPROM should be already read before calling this function.
* The EEPROM contains 2 MAC addresses which define the MAC address
* range (i.e. first and last MAC address).
* This function sets the ethaddr environment variable for all
* the available MAC addresses starting from eth<index>addr.
*/
void board_ti_set_ethaddr(int index);
#endif /* __BOARD_DETECT_H */