cdx: add sysfs for bus reset
authorAbhijit Gangurde <abhijit.gangurde@amd.com>
Tue, 17 Oct 2023 16:05:04 +0000 (21:35 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 27 Oct 2023 11:23:24 +0000 (13:23 +0200)
Add sysfs interface reset to reset all the devices on the CDX bus.

Signed-off-by: Abhijit Gangurde <abhijit.gangurde@amd.com>
Link: https://lore.kernel.org/r/20231017160505.10640-7-abhijit.gangurde@amd.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Documentation/ABI/testing/sysfs-bus-cdx
drivers/cdx/cdx.c

index c12bdaa4152a73e9babb5b6bb02900c61b46fa88..c2c54abffed58cca4b63079620a01f2677c22f3e 100644 (file)
@@ -45,10 +45,10 @@ What:               /sys/bus/cdx/devices/.../reset
 Date:          March 2023
 Contact:       nipun.gupta@amd.com
 Description:
-               Writing y/1/on to this file resets the CDX device.
-               On resetting the device, the corresponding driver is notified
-               twice, once before the device is being reset, and again after
-               the reset has been complete.
+               Writing y/1/on to this file resets the CDX device or all devices
+               on the bus. On resetting the device, the corresponding driver is
+               notified twice, once before the device is being reset, and again
+               after the reset has been complete.
 
                For example::
 
index 8eb484c37e975ab13390b4e4f04cee0282f7093e..e22a7138292ebbf988c456fcc3ada9a17f83e230 100644 (file)
@@ -110,6 +110,20 @@ int cdx_dev_reset(struct device *dev)
 }
 EXPORT_SYMBOL_GPL(cdx_dev_reset);
 
+/**
+ * reset_cdx_device - Reset a CDX device
+ * @dev: CDX device
+ * @data: This is always passed as NULL, and is not used in this API,
+ *    but is required here as the device_for_each_child() API expects
+ *    the passed function to have this as an argument.
+ *
+ * Return: -errno on failure, 0 on success.
+ */
+static int reset_cdx_device(struct device *dev, void *data)
+{
+       return cdx_dev_reset(dev);
+}
+
 /**
  * cdx_unregister_device - Unregister a CDX device
  * @dev: CDX device
@@ -343,6 +357,7 @@ static DEVICE_ATTR_WO(remove);
 static ssize_t reset_store(struct device *dev, struct device_attribute *attr,
                           const char *buf, size_t count)
 {
+       struct cdx_device *cdx_dev = to_cdx_device(dev);
        bool val;
        int ret;
 
@@ -352,11 +367,13 @@ static ssize_t reset_store(struct device *dev, struct device_attribute *attr,
        if (!val)
                return -EINVAL;
 
-       ret = cdx_dev_reset(dev);
-       if (ret)
-               return ret;
+       if (cdx_dev->is_bus)
+               /* Reset all the devices attached to cdx bus */
+               ret = device_for_each_child(dev, NULL, reset_cdx_device);
+       else
+               ret = cdx_dev_reset(dev);
 
-       return count;
+       return ret < 0 ? ret : count;
 }
 static DEVICE_ATTR_WO(reset);
 
@@ -461,6 +478,7 @@ static const struct attribute_group cdx_dev_group = {
 
 static struct attribute *cdx_bus_dev_attrs[] = {
        &dev_attr_enable.attr,
+       &dev_attr_reset.attr,
        NULL,
 };