net: phy: Add phy_standalone sysfs entry

Export a phy_standalone device attribute that is meant to give the
indication that this PHY lacks an attached_dev and its corresponding
sysfs link. The attribute will be created only when the
phy_attach_direct() function will be called with a NULL net_device.

Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Ioana Ciornei 2019-05-28 20:38:10 +03:00 committed by David S. Miller
parent 82c76aca81
commit c920f745f4
2 changed files with 30 additions and 0 deletions

View File

@ -34,3 +34,11 @@ Description:
xgmii, moca, qsgmii, trgmii, 1000base-x, 2500base-x, rxaui, xgmii, moca, qsgmii, trgmii, 1000base-x, 2500base-x, rxaui,
xaui, 10gbase-kr, unknown xaui, 10gbase-kr, unknown
What: /sys/class/mdio_bus/<bus>/<device>/phy_standalone
Date: May 2019
KernelVersion: 5.3
Contact: netdev@vger.kernel.org
Description:
Boolean value indicating whether the PHY device is used in
standalone mode, without a net_device associated, by PHYLINK.
Attribute created only when this is the case.

View File

@ -1164,6 +1164,16 @@ static void phy_sysfs_create_links(struct phy_device *phydev)
phydev->sysfs_links = true; phydev->sysfs_links = true;
} }
static ssize_t
phy_standalone_show(struct device *dev, struct device_attribute *attr,
char *buf)
{
struct phy_device *phydev = to_phy_device(dev);
return sprintf(buf, "%d\n", !phydev->attached_dev);
}
static DEVICE_ATTR_RO(phy_standalone);
/** /**
* phy_attach_direct - attach a network device to a given PHY device pointer * phy_attach_direct - attach a network device to a given PHY device pointer
* @dev: network device to attach * @dev: network device to attach
@ -1253,6 +1263,13 @@ int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
phy_sysfs_create_links(phydev); phy_sysfs_create_links(phydev);
if (!phydev->attached_dev) {
err = sysfs_create_file(&phydev->mdio.dev.kobj,
&dev_attr_phy_standalone.attr);
if (err)
phydev_err(phydev, "error creating 'phy_standalone' sysfs entry\n");
}
phydev->dev_flags = flags; phydev->dev_flags = flags;
phydev->interface = interface; phydev->interface = interface;
@ -1380,6 +1397,11 @@ void phy_detach(struct phy_device *phydev)
sysfs_remove_link(&dev->dev.kobj, "phydev"); sysfs_remove_link(&dev->dev.kobj, "phydev");
sysfs_remove_link(&phydev->mdio.dev.kobj, "attached_dev"); sysfs_remove_link(&phydev->mdio.dev.kobj, "attached_dev");
} }
if (!phydev->attached_dev)
sysfs_remove_file(&phydev->mdio.dev.kobj,
&dev_attr_phy_standalone.attr);
phy_suspend(phydev); phy_suspend(phydev);
if (dev) { if (dev) {
phydev->attached_dev->phydev = NULL; phydev->attached_dev->phydev = NULL;