On Mon, Feb 13, 2023, Elson Roy Serrao wrote: > A function which is in function suspend state has to send a > function wake notification to the host in case it needs to > exit from this state and resume data transfer. Add support to > handle such requests by exposing a new gadget op. > > Signed-off-by: Elson Roy Serrao <quic_eserrao@xxxxxxxxxxx> > --- > drivers/usb/gadget/composite.c | 24 ++++++++++++++++++++++++ > drivers/usb/gadget/udc/core.c | 21 +++++++++++++++++++++ > include/linux/usb/composite.h | 6 ++++++ > include/linux/usb/gadget.h | 4 ++++ > 4 files changed, 55 insertions(+) > > diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c > index a37a8f4..51d6ee9 100644 > --- a/drivers/usb/gadget/composite.c > +++ b/drivers/usb/gadget/composite.c > @@ -492,6 +492,30 @@ int usb_interface_id(struct usb_configuration *config, > } > EXPORT_SYMBOL_GPL(usb_interface_id); > > +int usb_func_wakeup(struct usb_function *func) > +{ > + int ret, id; > + > + if (!func->func_wakeup_armed) { > + ERROR(func->config->cdev, "not armed for func remote wakeup\n"); > + return -EINVAL; > + } > + > + for (id = 0; id < MAX_CONFIG_INTERFACES; id++) > + if (func->config->interface[id] == func) > + break; > + > + if (id == MAX_CONFIG_INTERFACES) { > + ERROR(func->config->cdev, "Invalid function id:%d\n", id); The print of id here is always MAX_CONFIG_INTERFACES right? Thanks, Thinh > + return -EINVAL; > + } > + > + ret = usb_gadget_func_wakeup(func->config->cdev->gadget, id); > + > + return ret; > +} > +EXPORT_SYMBOL_GPL(usb_func_wakeup); > +