- snps,burst_len: The AXI burst lenth value of the AXI BUS MODE register.
 - tx-fifo-depth: See ethernet.txt file in the same directory
 - rx-fifo-depth: See ethernet.txt file in the same directory
+- mdio: with compatible = "snps,dwmac-mdio", create and register mdio bus.
 
 Examples:
 
                tx-fifo-depth = <16384>;
                clocks = <&clock>;
                clock-names = "stmmaceth";
+               mdio0 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "snps,dwmac-mdio";
+                       phy1: ethernet-phy@0 {
+                       };
+               };
        };
 
 #include <linux/slab.h>
 #include <linux/of.h>
 #include <linux/of_gpio.h>
-
+#include <linux/of_mdio.h>
 #include <asm/io.h>
 
 #include "stmmac.h"
        struct stmmac_priv *priv = netdev_priv(ndev);
        struct stmmac_mdio_bus_data *mdio_bus_data = priv->plat->mdio_bus_data;
        int addr, found;
+       struct device_node *mdio_node = NULL;
+       struct device_node *child_node = NULL;
 
        if (!mdio_bus_data)
                return 0;
 
+       if (IS_ENABLED(CONFIG_OF)) {
+               for_each_child_of_node(priv->device->of_node, child_node) {
+                       if (of_device_is_compatible(child_node,
+                                                   "snps,dwmac-mdio")) {
+                               mdio_node = child_node;
+                               break;
+                       }
+               }
+
+               if (mdio_node) {
+                       netdev_dbg(ndev, "FOUND MDIO subnode\n");
+               } else {
+                       netdev_err(ndev, "NO MDIO subnode\n");
+                       return 0;
+               }
+       }
+
        new_bus = mdiobus_alloc();
        if (new_bus == NULL)
                return -ENOMEM;
        new_bus->irq = irqlist;
        new_bus->phy_mask = mdio_bus_data->phy_mask;
        new_bus->parent = priv->device;
-       err = mdiobus_register(new_bus);
+
+       err = of_mdiobus_register(new_bus, mdio_node);
        if (err != 0) {
                pr_err("%s: Cannot register as MDIO bus\n", new_bus->name);
                goto bus_register_fail;
                }
        }
 
-       if (!found) {
+       if (!found && !mdio_node) {
                pr_warn("%s: No PHY found\n", ndev->name);
                mdiobus_unregister(new_bus);
                mdiobus_free(new_bus);
 
        if (of_property_read_u32(np, "snps,phy-addr", &plat->phy_addr) == 0)
                dev_warn(&pdev->dev, "snps,phy-addr property is deprecated\n");
 
-       if (plat->phy_node || plat->phy_bus_name)
+       if ((plat->phy_node && !of_phy_is_fixed_link(np)) || plat->phy_bus_name)
                plat->mdio_bus_data = NULL;
        else
                plat->mdio_bus_data =