mirror of
https://xff.cz/git/u-boot/
synced 2025-10-18 08:23:24 +02:00
net: eth-uclass: Support device tree MAC addresses
Add the standard Ethernet device tree bindings (imported from v5.0 of the Linux kernel) and implement support for reading the MAC address for Ethernet devices in the Ethernet uclass. If the "mac-address" property exists, the MAC address will be parsed from that. If that property does not exist, the "local-mac-address" property will be tried as fallback. MAC addresses from device tree take precedence over the ones stored in a network interface card's ROM. Acked-by: Joe Hershberger <joe.hershberger@ni.com> Reviewed-by: Grygorii Strashko <grygorii.strashko@ti.com> Signed-off-by: Thierry Reding <treding@nvidia.com>
This commit is contained in:
committed by
Joe Hershberger
parent
b743bbd2eb
commit
379af67ab3
@@ -455,6 +455,26 @@ static int eth_pre_unbind(struct udevice *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool eth_dev_get_mac_address(struct udevice *dev, u8 mac[ARP_HLEN])
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_OF_CONTROL)
|
||||
const uint8_t *p;
|
||||
|
||||
p = dev_read_u8_array_ptr(dev, "mac-address", ARP_HLEN);
|
||||
if (!p)
|
||||
p = dev_read_u8_array_ptr(dev, "local-mac-address", ARP_HLEN);
|
||||
|
||||
if (!p)
|
||||
return false;
|
||||
|
||||
memcpy(mac, p, ARP_HLEN);
|
||||
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
static int eth_post_probe(struct udevice *dev)
|
||||
{
|
||||
struct eth_device_priv *priv = dev->uclass_priv;
|
||||
@@ -489,9 +509,13 @@ static int eth_post_probe(struct udevice *dev)
|
||||
|
||||
priv->state = ETH_STATE_INIT;
|
||||
|
||||
/* Check if the device has a MAC address in ROM */
|
||||
if (eth_get_ops(dev)->read_rom_hwaddr)
|
||||
eth_get_ops(dev)->read_rom_hwaddr(dev);
|
||||
/* Check if the device has a valid MAC address in device tree */
|
||||
if (!eth_dev_get_mac_address(dev, pdata->enetaddr) ||
|
||||
!is_valid_ethaddr(pdata->enetaddr)) {
|
||||
/* Check if the device has a MAC address in ROM */
|
||||
if (eth_get_ops(dev)->read_rom_hwaddr)
|
||||
eth_get_ops(dev)->read_rom_hwaddr(dev);
|
||||
}
|
||||
|
||||
eth_env_get_enetaddr_by_index("eth", dev->seq, env_enetaddr);
|
||||
if (!is_zero_ethaddr(env_enetaddr)) {
|
||||
|
Reference in New Issue
Block a user