usb: gadget: f_fs: expose ready state in configfs
authorPeter Korsgaard <peter@korsgaard.com>
Fri, 26 Jan 2024 20:32:08 +0000 (21:32 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 28 Jan 2024 01:39:21 +0000 (17:39 -0800)
When a USB gadget is configured through configfs with 1 or more f_fs
functions, then the logic setting up the gadget configuration has to wait
until the user space code (typically separate applications) responsible for
those functions have written their descriptors before the gadget can be
activated.

The f_fs instance already knows if this has been done, so expose it through
a "ready" attribute in configfs for easier synchronization.

Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
Link: https://lore.kernel.org/r/20240126203208.2482573-1-peter@korsgaard.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Documentation/ABI/testing/configfs-usb-gadget-ffs
Documentation/usb/gadget-testing.rst
drivers/usb/gadget/function/f_fs.c

index e39b27653c65c15f4911db846c7ca98859bf0463..bf8936ff6d38c3b27ef055af4cf4bbe0838fb31c 100644 (file)
@@ -4,6 +4,14 @@ KernelVersion: 3.13
 Description:   The purpose of this directory is to create and remove it.
 
                A corresponding USB function instance is created/removed.
-               There are no attributes here.
 
-               All parameters are set through FunctionFS.
+               All attributes are read only:
+
+               =============   ============================================
+               ready           1 if the function is ready to be used, E.G.
+                               if userspace has written descriptors and
+                               strings to ep0, so the gadget can be
+                               enabled - 0 otherwise.
+               =============   ============================================
+
+               All other parameters are set through FunctionFS.
index 8cd62c466d20aac597fa5aa15ecfb2930c15c252..4ec6b775ebbab13935be14d251daae82fb92dc7f 100644 (file)
@@ -206,6 +206,14 @@ the standard procedure for using FunctionFS (mount it, run the userspace
 process which implements the function proper). The gadget should be enabled
 by writing a suitable string to usb_gadget/<gadget>/UDC.
 
+The FFS function provides just one attribute in its function directory:
+
+       ready
+
+The attribute is read-only and signals if the function is ready (1) to be
+used, E.G. if userspace has written descriptors and strings to ep0, so
+the gadget can be enabled.
+
 Testing the FFS function
 ------------------------
 
index 6bff6cb93789167b7de9d2b939d5e4e6255078db..be3851cffb73d2fc3c7684399e3d6cc92090b2b4 100644 (file)
@@ -3445,6 +3445,25 @@ static inline struct f_fs_opts *to_ffs_opts(struct config_item *item)
                            func_inst.group);
 }
 
+static ssize_t f_fs_opts_ready_show(struct config_item *item, char *page)
+{
+       struct f_fs_opts *opts = to_ffs_opts(item);
+       int ready;
+
+       ffs_dev_lock();
+       ready = opts->dev->desc_ready;
+       ffs_dev_unlock();
+
+       return sprintf(page, "%d\n", ready);
+}
+
+CONFIGFS_ATTR_RO(f_fs_opts_, ready);
+
+static struct configfs_attribute *ffs_attrs[] = {
+       &f_fs_opts_attr_ready,
+       NULL,
+};
+
 static void ffs_attr_release(struct config_item *item)
 {
        struct f_fs_opts *opts = to_ffs_opts(item);
@@ -3458,6 +3477,7 @@ static struct configfs_item_operations ffs_item_ops = {
 
 static const struct config_item_type ffs_func_type = {
        .ct_item_ops    = &ffs_item_ops,
+       .ct_attrs       = ffs_attrs,
        .ct_owner       = THIS_MODULE,
 };