On 2/14/2023 4:55 PM, Thinh Nguyen wrote:
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
Thanks for catching this. Will rectify this in v5
+ return -EINVAL;
+ }
+
+ ret = usb_gadget_func_wakeup(func->config->cdev->gadget, id);
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(usb_func_wakeup);
+