9
0
Fork 0

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 <s.hauer@pengutronix.de>
This commit is contained in:
Sascha Hauer 2013-12-11 10:58:00 +01:00
parent d023d690fc
commit 33790253da
2 changed files with 19 additions and 4 deletions

View File

@ -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;

View File

@ -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;