From 3d2c84e2f1c0694ac6e50f7a901caf365edf1681 Mon Sep 17 00:00:00 2001 From: Manu Gautam Date: Tue, 29 Dec 2015 22:25:36 +0530 Subject: [PATCH] USB: f_fs: Disable USB LPM on bus_suspend with ADB ADB function is mainly used for debugging, hence it is not expected to allow USB LPM followed by system suspend in device bus suspend. Driver also doesn't handle usb_ep_dequeue failure in LPM when adbd is interrupted by signal as buffer is left queued to the hardware after usb_ep_dequeue failure and can cause memory corruption. Change-Id: Ib89c80318dcdd0dbb35d122a2ab77fb61f83518e Signed-off-by: Manu Gautam --- drivers/usb/gadget/function/f_fs.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index cdcb3dcf5b95..1d96cca2ab56 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c @@ -3073,14 +3073,23 @@ static int ffs_func_set_alt(struct usb_function *f, ffs->func = func; ret = ffs_func_eps_enable(func); - if (likely(ret >= 0)) + if (likely(ret >= 0)) { ffs_event_add(ffs, FUNCTIONFS_ENABLE); + /* Disable USB LPM later on bus_suspend */ + usb_gadget_autopm_get_async(ffs->gadget); + } + return ret; } static void ffs_func_disable(struct usb_function *f) { + struct ffs_function *func = ffs_func_from_usb(f); + struct ffs_data *ffs = func->ffs; + ffs_func_set_alt(f, 0, (unsigned)-1); + /* matching put to allow LPM on disconnect */ + usb_gadget_autopm_put_async(ffs->gadget); } static int ffs_func_setup(struct usb_function *f,