f_gsi: Make usb ipa wq as freezable workqueue
USB function driver uses usb_gadget_autopm_get() API to increments
USB controller device's PM runtime usage and child count, and also
expects that USB controller is resumed. Late suspend disables USB
controller device's PM runtime functionality by incrementing
disable_depth count and early resume enables it back once system is
resumed. This results into pm_runtime_get_sync() returning -EACCESS
when APPS is power collapsed and it is resuming due to USB bus resume
case. usb_gadget_autopm_get() API is decrementing device's PM runtime
usage count if it receives error value from pm_runtime_get_sync() API.
USB function driver doesn't check return value which results into
continuing USB operation. On next bus suspend, it decrements usage count
although it was not incremented in previous resume case which makes PM
runtime usage count negative. This can cause multiple issues as below:
1. USB bus resume may take more time causing host re-enumerating USB
gadget device
2. Unclock register access on remote wakeup case
3. USB host mode enumeration may fail due to dwc3 device usage count
is negative.
Fix this issue by making usb ipa wq as freezable workqueue which will
make sure that ipa_work_handler() work is executed only after system is
resumed and USB controller device's PM runtime is enabled.
CRs-Fixed: 1075002, 1074383
Change-Id: I300d1a0081fafcbef3c00c63cddd49be54a651e5
Signed-off-by:
Mayank Rana <mrana@codeaurora.org>
Loading
Please register or sign in to comment