On Mon, Mar 06, 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 | 4 +++ > drivers/usb/dwc3/gadget.c | 76 +++++++++++++++++++++++++++++++++++++++++++---- > 3 files changed, 76 insertions(+), 6 deletions(-) > > diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h > index 582ebd9..cc78236 100644 > --- a/drivers/usb/dwc3/core.h > +++ b/drivers/usb/dwc3/core.h > @@ -1110,6 +1110,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. > @@ -1327,6 +1328,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..f90fa55 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,7 @@ static int dwc3_ep0_handle_device(struct dwc3 *dwc, > > switch (wValue) { > case USB_DEVICE_REMOTE_WAKEUP: > + dwc->gadget->wakeup_armed = set; Check wakeup_configured here to decide whether it can be set. Thanks, Thinh