summaryrefslogtreecommitdiffstats
path: root/drivers/net/phy
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/phy')
-rw-r--r--drivers/net/phy/phy.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index 35a9ce7ea8..42dcad9069 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -309,8 +309,13 @@ static struct phy_device *of_phy_register_fixed_link(struct device_node *np,
phydev->dev.parent = &edev->dev;
phydev->registered = 1;
- phydev->speed = 1000;
- phydev->duplex = 1;
+ phydev->link = 1;
+
+ if (of_property_read_u32(np, "speed", &phydev->speed))
+ return NULL;
+ phydev->duplex = of_property_read_bool(np,"full-duplex");
+ phydev->pause = of_property_read_bool(np, "pause");
+ phydev->asym_pause = of_property_read_bool(np, "asym-pause");
return phydev;
}
@@ -319,6 +324,8 @@ static struct phy_device *of_mdio_find_phy(struct eth_device *edev)
{
struct device_d *dev;
struct device_node *phy_node;
+ struct mii_bus *bus;
+ int addr;
if (!IS_ENABLED(CONFIG_OFDEVICE))
return NULL;
@@ -340,6 +347,16 @@ static struct phy_device *of_mdio_find_phy(struct eth_device *edev)
if (!phy_node)
return NULL;
+ if (!of_property_read_u32(phy_node, "reg", &addr)) {
+ for_each_mii_bus(bus) {
+ if (bus->parent->device_node == phy_node->parent) {
+ struct phy_device *phy = mdiobus_scan(bus, addr);
+ if (!IS_ERR(phy))
+ return phy;
+ }
+ }
+ }
+
bus_for_each_device(&mdio_bus_type, dev) {
if (dev->device_node == phy_node)
return container_of(dev, struct phy_device, dev);