net: phy: Add phy_standalone sysfs entry
authorIoana Ciornei <ioana.ciornei@nxp.com>
Tue, 28 May 2019 17:38:10 +0000 (20:38 +0300)
committerDavid S. Miller <davem@davemloft.net>
Thu, 30 May 2019 04:48:53 +0000 (21:48 -0700)
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>
Documentation/ABI/testing/sysfs-class-net-phydev
drivers/net/phy/phy_device.c

index 6ebabfb..b7c46c2 100644 (file)
@@ -34,3 +34,11 @@ Description:
                xgmii, moca, qsgmii, trgmii, 1000base-x, 2500base-x, rxaui,
                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.
index 1b540ed..8b4fc3b 100644 (file)
@@ -1164,6 +1164,16 @@ static void phy_sysfs_create_links(struct phy_device *phydev)
        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
  * @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);
 
+       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->interface = interface;
@@ -1380,6 +1397,11 @@ void phy_detach(struct phy_device *phydev)
                        sysfs_remove_link(&dev->dev.kobj, "phydev");
                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);
        if (dev) {
                phydev->attached_dev->phydev = NULL;