On Thu, Mar 09, 2023, Elson Roy Serrao wrote: > An usb device can initate a remote wakeup and bring the link out of > suspend as dictated by the DEVICE_REMOTE_WAKEUP feature selector. > Add support to handle this packet and set the remote wakeup capability. > > Some hosts may take longer time to initiate the resume signaling after > device triggers a remote wakeup. So add async support to the wakeup API > by enabling link status change events. > > Signed-off-by: Elson Roy Serrao <quic_eserrao@xxxxxxxxxxx> > --- > drivers/usb/dwc3/core.h | 2 ++ > drivers/usb/dwc3/ep0.c | 5 ++++ > drivers/usb/dwc3/gadget.c | 76 +++++++++++++++++++++++++++++++++++++++++++---- > 3 files changed, 77 insertions(+), 6 deletions(-) > > diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h > index b1bd631..416e0ef 100644 > --- a/drivers/usb/dwc3/core.h > +++ b/drivers/usb/dwc3/core.h > @@ -1113,6 +1113,7 @@ struct dwc3_scratchpad_array { > * 3 - Reserved > * @dis_metastability_quirk: set to disable metastability quirk. > * @dis_split_quirk: set to disable split boundary. > + * @wakeup_configured: set if the device is configured for remote wakeup. > * @imod_interval: set the interrupt moderation interval in 250ns > * increments or 0 to disable. > * @max_cfg_eps: current max number of IN eps used across all USB configs. > @@ -1331,6 +1332,7 @@ struct dwc3 { > > unsigned dis_split_quirk:1; > unsigned async_callbacks:1; > + unsigned wakeup_configured:1; > > u16 imod_interval; > > diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c > index 61de693..442d8fe 100644 > --- a/drivers/usb/dwc3/ep0.c > +++ b/drivers/usb/dwc3/ep0.c > @@ -356,6 +356,9 @@ static int dwc3_ep0_handle_status(struct dwc3 *dwc, > usb_status |= 1 << USB_DEV_STAT_U1_ENABLED; > if (reg & DWC3_DCTL_INITU2ENA) > usb_status |= 1 << USB_DEV_STAT_U2_ENABLED; > + } else { > + usb_status |= dwc->gadget->wakeup_armed << > + USB_DEVICE_REMOTE_WAKEUP; > } > > break; > @@ -476,6 +479,8 @@ static int dwc3_ep0_handle_device(struct dwc3 *dwc, > > switch (wValue) { > case USB_DEVICE_REMOTE_WAKEUP: > + if (dwc->wakeup_configured) > + dwc->gadget->wakeup_armed = set; We should set ret = -EINVAL in the else case so the device will respond with a protocol STALL rejecting the request rather than silently accepting it. Thanks, Thinh