| From ce5bf9a50daf2d9078b505aca1cea22e88ecb94a Mon Sep 17 00:00:00 2001 |
| From: Hemant Kumar <hemantk@codeaurora.org> |
| Date: Tue, 9 Jan 2018 12:30:53 +0530 |
| Subject: usb: f_fs: Prevent gadget unbind if it is already unbound |
| |
| From: Hemant Kumar <hemantk@codeaurora.org> |
| |
| commit ce5bf9a50daf2d9078b505aca1cea22e88ecb94a upstream. |
| |
| Upon usb composition switch there is possibility of ep0 file |
| release happening after gadget driver bind. In case of composition |
| switch from adb to a non-adb composition gadget will never gets |
| bound again resulting into failure of usb device enumeration. Fix |
| this issue by checking FFS_FL_BOUND flag and avoid extra |
| gadget driver unbind if it is already done as part of composition |
| switch. |
| |
| This fixes adb reconnection error reported on Android running |
| v4.4 and above kernel versions. Verified on Hikey running vanilla |
| v4.15-rc7 + few out of tree Mali patches. |
| |
| Reviewed-at: https://android-review.googlesource.com/#/c/582632/ |
| |
| Cc: Felipe Balbi <balbi@kernel.org> |
| Cc: Greg KH <gregkh@linux-foundation.org> |
| Cc: Michal Nazarewicz <mina86@mina86.com> |
| Cc: John Stultz <john.stultz@linaro.org> |
| Cc: Dmitry Shmidt <dimitrysh@google.com> |
| Cc: Badhri <badhri@google.com> |
| Cc: Android Kernel Team <kernel-team@android.com> |
| Signed-off-by: Hemant Kumar <hemantk@codeaurora.org> |
| [AmitP: Cherry-picked it from android-4.14 and updated the commit log] |
| Signed-off-by: Amit Pundir <amit.pundir@linaro.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/gadget/function/f_fs.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/usb/gadget/function/f_fs.c |
| +++ b/drivers/usb/gadget/function/f_fs.c |
| @@ -3725,7 +3725,8 @@ static void ffs_closed(struct ffs_data * |
| ci = opts->func_inst.group.cg_item.ci_parent->ci_parent; |
| ffs_dev_unlock(); |
| |
| - unregister_gadget_item(ci); |
| + if (test_bit(FFS_FL_BOUND, &ffs->flags)) |
| + unregister_gadget_item(ci); |
| return; |
| done: |
| ffs_dev_unlock(); |