PHY converter and external PHY drivers depend on MDIO functions of Eth driver and such MDIO read/write completion may fire IRQ. The ISR for MDIO completion IRQ is done in the open() function of driver.
For PHY converter mdio driver that registers ISR event that uses MDIO read/write function during its probe() function, the MDIO ISR should have been performed a head of time before mdio driver probe() is called. It is for reason as such, the mdio device creation and registration will need to be callable from Eth driver open() function. Why existing way to register mdio_device for PHY converter that is done via mdiobus_register_board_info() is not feasible is the mdio device creation and registration happens inside Eth driver probe() function, specifically in mdiobus_setup_mdiodevfrom_board_info() that is called by mdiobus_register(). Therefore, to fulfill the need mentioned above, we make mdiobus_create_ device() to be callable from Eth driver open(). Signed-off-by: Ong Boon Leong <boon.leong....@intel.com> --- drivers/net/phy/mdio_bus.c | 5 +++-- include/linux/phy.h | 7 +++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index bd04fe762056..06658d9197a1 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c @@ -338,8 +338,8 @@ static inline void of_mdiobus_link_mdiodev(struct mii_bus *mdio, * * Returns 0 on success or < 0 on error. */ -static int mdiobus_create_device(struct mii_bus *bus, - struct mdio_board_info *bi) +int mdiobus_create_device(struct mii_bus *bus, + struct mdio_board_info *bi) { struct mdio_device *mdiodev; int ret = 0; @@ -359,6 +359,7 @@ static int mdiobus_create_device(struct mii_bus *bus, return ret; } +EXPORT_SYMBOL(mdiobus_create_device); /** * __mdiobus_register - bring up all the PHYs on a given bus and attach them to bus diff --git a/include/linux/phy.h b/include/linux/phy.h index d26779f1fb6b..4524db57fe0b 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -1249,12 +1249,19 @@ struct mdio_board_info { #if IS_ENABLED(CONFIG_MDIO_DEVICE) int mdiobus_register_board_info(const struct mdio_board_info *info, unsigned int n); +int mdiobus_create_device(struct mii_bus *bus, struct mdio_board_info *bi); #else static inline int mdiobus_register_board_info(const struct mdio_board_info *i, unsigned int n) { return 0; } + +static inline int mdiobus_create_device(struct mii_bus *bus, + struct mdio_board_info *bi) +{ + return 0; +} #endif -- 2.17.0