OpenWrt – Rev 1

Subversion Repositories:
Rev:
--- a/drivers/net/phy/mdio-boardinfo.c
+++ b/drivers/net/phy/mdio-boardinfo.c
@@ -15,8 +15,11 @@
 
 #include "mdio-boardinfo.h"
 
-static LIST_HEAD(mdio_board_list);
-static DEFINE_MUTEX(mdio_board_lock);
+LIST_HEAD(mdio_board_list);
+EXPORT_SYMBOL_GPL(mdio_board_list);
+
+DEFINE_MUTEX(mdio_board_lock);
+EXPORT_SYMBOL_GPL(mdio_board_lock);
 
 /**
  * mdiobus_setup_mdiodev_from_board_info - create and setup MDIO devices
--- a/drivers/net/phy/mdio-boardinfo.h
+++ b/drivers/net/phy/mdio-boardinfo.h
@@ -20,4 +20,7 @@ void mdiobus_setup_mdiodev_from_board_in
                                           (struct mii_bus *bus,
                                            struct mdio_board_info *bi));
 
+extern struct mutex mdio_board_lock;
+extern struct list_head mdio_board_list;
+
 #endif /* __MDIO_BOARD_INFO_H */
--- a/drivers/net/phy/mdio_bus.c
+++ b/drivers/net/phy/mdio_bus.c
@@ -456,6 +456,17 @@ void mdiobus_free(struct mii_bus *bus)
 }
 EXPORT_SYMBOL(mdiobus_free);
 
+static void mdiobus_setup_phydev_from_boardinfo(struct mii_bus *bus,
+                                                struct phy_device *phydev,
+                                                struct mdio_board_info *bi)
+{
+        if (strcmp(bus->id, bi->bus_id) ||
+            bi->mdio_addr != phydev->mdio.addr)
+            return;
+
+        phydev->mdio.dev.platform_data = (void *) bi->platform_data;
+}
+
 /**
  * mdiobus_scan - scan a bus for MDIO devices.
  * @bus: mii_bus to scan
@@ -471,6 +482,7 @@ EXPORT_SYMBOL(mdiobus_free);
 struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr)
 {
        struct phy_device *phydev;
+       struct mdio_board_entry *be;
        int err;
 
        phydev = get_phy_device(bus, addr, false);
@@ -483,6 +495,12 @@ struct phy_device *mdiobus_scan(struct m
         */
        of_mdiobus_link_mdiodev(bus, &phydev->mdio);
 
+       mutex_lock(&mdio_board_lock);
+        list_for_each_entry(be, &mdio_board_list, list)
+                mdiobus_setup_phydev_from_boardinfo(bus, phydev,
+                                                    &be->board_info);
+       mutex_unlock(&mdio_board_lock);
+
        err = phy_device_register(phydev);
        if (err) {
                phy_device_free(phydev);