From 33790253da63facab20f5ae664debba0627344df Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Wed, 11 Dec 2013 10:58:00 +0100 Subject: [PATCH] net: phy: track registered state of a phy device With this phy_device_connect only registers a phy device if it wasn't registered already. This allows us to register phy devices outside of ethernet drivers. phy_device_connect will now pick up an already registered phy given that it's not attached to another ethernet device. Signed-off-by: Sascha Hauer --- drivers/net/phy/phy.c | 21 +++++++++++++++++---- include/linux/phy.h | 2 ++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 37f664702..74ef3d962 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -236,17 +236,28 @@ static int phy_register_device(struct phy_device* dev) { int ret; + if (dev->registered) + return -EBUSY; + dev->dev.parent = &dev->bus->dev; ret = register_device(&dev->dev); if (ret) return ret; + dev->registered = 1; + if (dev->dev.driver) return 0; dev->dev.driver = &genphy_driver.drv; - return device_probe(&dev->dev); + ret = device_probe(&dev->dev); + if (ret) { + unregister_device(&dev->dev); + dev->registered = 0; + } + + return ret; } /* Automatically gets and returns the PHY device */ @@ -287,9 +298,11 @@ int phy_device_connect(struct eth_device *edev, struct mii_bus *bus, int addr, dev->interface = interface; dev->dev_flags = flags; - ret = phy_register_device(dev); - if (ret) - goto fail; + if (!dev->registered) { + ret = phy_register_device(dev); + if (ret) + goto fail; + } edev->phydev = dev; dev->attached_dev = edev; diff --git a/include/linux/phy.h b/include/linux/phy.h index a1c629e9d..19e4d2066 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -161,6 +161,8 @@ struct phy_device { int autoneg; int force; + int registered; + /* private data pointer */ /* For use by PHYs to maintain extra state */ void *priv;