Commit 43a02972 authored by Peter Korsgaard's avatar Peter Korsgaard Committed by Greg Kroah-Hartman
Browse files

usb: gadget: f_fs: expose ready state in configfs



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: default avatarPeter Korsgaard <peter@korsgaard.com>
Link: https://lore.kernel.org/r/20240126203208.2482573-1-peter@korsgaard.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 2d2a3349
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -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.
+8 −0
Original line number Diff line number Diff line
@@ -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
------------------------

+20 −0
Original line number Diff line number Diff line
@@ -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,
};