summaryrefslogtreecommitdiff
path: root/drivers/usb/gadget/udc
diff options
context:
space:
mode:
authorAl Cooper <alcooperx@gmail.com>2020-07-22 20:07:43 +0300
committerFelipe Balbi <balbi@kernel.org>2020-07-24 16:45:14 +0300
commit33d1c71832b7b7e56ca82b2f19c5df31297657e6 (patch)
treec4c59283b06b98dcc79f5f0b0f17e1eea0524702 /drivers/usb/gadget/udc
parenta95bdfd22076497288868c028619bc5995f5cc7f (diff)
downloadlinux-33d1c71832b7b7e56ca82b2f19c5df31297657e6.tar.xz
usb: bdc: Adb shows offline after resuming from S2
On Android systems, After temporarily putting device to S2 by short pressing the power button on the remote, the display turns off. Then press the power button to turn the display back up. Adb devices would show the devices is offline. It needs a physical disconnect of the usb cable or power cycle to bring the device back online. The device is operational otherwise. The problem is that during S2 resume, the ADB gadget driver could not link back with the BDC driver because the endpoint flags were cleared. The fix is to clear the endpoint flags for the disconnect case only and not for S2 exit. Signed-off-by: Al Cooper <alcooperx@gmail.com> Acked-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: Felipe Balbi <balbi@kernel.org>
Diffstat (limited to 'drivers/usb/gadget/udc')
-rw-r--r--drivers/usb/gadget/udc/bdc/bdc_core.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/usb/gadget/udc/bdc/bdc_core.c b/drivers/usb/gadget/udc/bdc/bdc_core.c
index 28909d4b8190..d4ec1e37d50a 100644
--- a/drivers/usb/gadget/udc/bdc/bdc_core.c
+++ b/drivers/usb/gadget/udc/bdc/bdc_core.c
@@ -288,9 +288,13 @@ static void bdc_mem_init(struct bdc *bdc, bool reinit)
/* Initialize SRR to 0 */
memset(bdc->srr.sr_bds, 0,
NUM_SR_ENTRIES * sizeof(struct bdc_bd));
- /* clear ep flags to avoid post disconnect stops/deconfigs */
- for (i = 1; i < bdc->num_eps; ++i)
- bdc->bdc_ep_array[i]->flags = 0;
+ /*
+ * clear ep flags to avoid post disconnect stops/deconfigs but
+ * not during S2 exit
+ */
+ if (!bdc->gadget.speed)
+ for (i = 1; i < bdc->num_eps; ++i)
+ bdc->bdc_ep_array[i]->flags = 0;
} else {
/* One time initiaization only */
/* Enable status report function pointers */