Re: [PATCH 1/4] usb/gadget: composite: redirect setup requests

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Nov 04 2013, Andrzej Pietrasiewicz wrote:
> If there are setup requests not directed to an endpont or an interface,
> current config's setup() has been attempted so far.
> This patch, in case the above fails, adds code which tries the setup() of
> configuration's function if there is only one function in the configuration.
>
> This behavior is required to provide equivalent of gadget zero with configfs.
>
> The gadget zero has a "config driver" for sourcesink, but all it does is
> delegating the request to the function proper. So when the equivalent gadget
> is set up with configfs it needs to handle requests directed to
> "config driver", but with configfs it is not possible to specify
> "config drivers".
>
> Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@xxxxxxxxxxx>
> Signed-off-by: Kyungmin Park <kyungmin.park@xxxxxxxxxxx>
> ---
>  drivers/usb/gadget/composite.c |   17 ++++++++++++++++-
>  1 files changed, 16 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
> index d4f0f33..287c63d 100644
> --- a/drivers/usb/gadget/composite.c
> +++ b/drivers/usb/gadget/composite.c
> @@ -1451,8 +1451,23 @@ unknown:
>  			struct usb_configuration	*c;
>  
>  			c = cdev->config;
> -			if (c && c->setup)
> +			if (!c)
> +				goto done;
> +
> +			/* try current config's setup */
> +			if (c->setup) {
>  				value = c->setup(c, ctrl);
> +				goto done;
> +			}
> +
> +			/* try the only function in the current config */
> +			if (!&c->functions || &c->functions == c->functions.next
> +			    || &c->functions.next != &c->functions.prev)

!&c->functions always yields true, and the rest can be replaced with
a single function call:

			if (!list_is_singular(&c->functions))
				goto done;

> +				goto done;
> +			f = list_entry(cdev->config->functions.next,
> +				       struct usb_function, list);

			f = list_first_entry(&c->functions,
					     struct usb_function, list);

> +			if (f && f->setup)
> +				value = f->setup(f, ctrl);


f always yields true, so this can be replaced by simple:

			if (f->setup)
				value = f->setup(f, ctrl);


>  		}
>  
>  		goto done;
> -- 
> 1.7.0.4
>

-- 
Best regards,                                         _     _
.o. | Liege of Serenely Enlightened Majesty of      o' \,=./ `o
..o | Computer Science,  Michał “mina86” Nazarewicz    (o o)
ooo +--<mpn@xxxxxxxxxx>--<xmpp:mina86@xxxxxxxxxx>--ooO--(_)--Ooo--

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux