ARM: rmobile: Merge prior-stage firmware DT fragment into U-Boot DT on Gen3
[oweals/u-boot.git] / net / eth-uclass.c
index ed81cbd53746527cb60e24370cb5e3837703bb69..7f89f65c92a3ad4ac1bcc61b23044c050631b205 100644 (file)
@@ -6,13 +6,16 @@
  */
 
 #include <common.h>
+#include <bootstage.h>
 #include <dm.h>
 #include <env.h>
+#include <log.h>
 #include <net.h>
 #include <dm/device-internal.h>
 #include <dm/uclass-internal.h>
 #include <net/pcap.h>
 #include "eth_internal.h"
+#include <eth_phy.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -40,8 +43,12 @@ static int eth_errno;
 static struct eth_uclass_priv *eth_get_uclass_priv(void)
 {
        struct uclass *uc;
+       int ret;
+
+       ret = uclass_get(UCLASS_ETH, &uc);
+       if (ret)
+               return NULL;
 
-       uclass_get(UCLASS_ETH, &uc);
        assert(uc);
        return uc->priv;
 }
@@ -102,6 +109,7 @@ struct udevice *eth_get_dev_by_name(const char *devname)
        struct udevice *it;
        struct uclass *uc;
        int len = strlen("eth");
+       int ret;
 
        /* Must be longer than 3 to be an alias */
        if (!strncmp(devname, "eth", len) && strlen(devname) > len) {
@@ -109,7 +117,10 @@ struct udevice *eth_get_dev_by_name(const char *devname)
                seq = simple_strtoul(startp, &endp, 10);
        }
 
-       uclass_get(UCLASS_ETH, &uc);
+       ret = uclass_get(UCLASS_ETH, &uc);
+       if (ret)
+               return NULL;
+
        uclass_foreach_dev(it, uc) {
                /*
                 * We need the seq to be valid, so try to probe it.
@@ -453,6 +464,10 @@ static int eth_post_bind(struct udevice *dev)
                return -EINVAL;
        }
 
+#ifdef CONFIG_DM_ETH_PHY
+       eth_phy_binds_nodes(dev);
+#endif
+
        return 0;
 }
 
@@ -490,6 +505,7 @@ static int eth_post_probe(struct udevice *dev)
        struct eth_device_priv *priv = dev->uclass_priv;
        struct eth_pdata *pdata = dev->platdata;
        unsigned char env_enetaddr[ARP_HLEN];
+       char *source = "DT";
 
 #if defined(CONFIG_NEEDS_MANUAL_RELOC)
        struct eth_ops *ops = eth_get_ops(dev);
@@ -522,6 +538,7 @@ static int eth_post_probe(struct udevice *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)) {
+               source = "ROM";
                /* 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);
@@ -533,9 +550,9 @@ static int eth_post_probe(struct udevice *dev)
                    memcmp(pdata->enetaddr, env_enetaddr, ARP_HLEN)) {
                        printf("\nWarning: %s MAC addresses don't match:\n",
                               dev->name);
-                       printf("Address in ROM is          %pM\n",
-                              pdata->enetaddr);
-                       printf("Address in environment is  %pM\n",
+                       printf("Address in %s is\t\t%pM\n",
+                              source, pdata->enetaddr);
+                       printf("Address in environment is\t%pM\n",
                               env_enetaddr);
                }
 
@@ -543,8 +560,8 @@ static int eth_post_probe(struct udevice *dev)
                memcpy(pdata->enetaddr, env_enetaddr, ARP_HLEN);
        } else if (is_valid_ethaddr(pdata->enetaddr)) {
                eth_env_set_enetaddr_by_index("eth", dev->seq, pdata->enetaddr);
-               printf("\nWarning: %s using MAC address from ROM\n",
-                      dev->name);
+               printf("\nWarning: %s using MAC address from %s\n",
+                      dev->name, source);
        } else if (is_zero_ethaddr(pdata->enetaddr) ||
                   !is_valid_ethaddr(pdata->enetaddr)) {
 #ifdef CONFIG_NET_RANDOM_ETHADDR