BUG: USB Reset-Resume Mechanism does not work for runtime resume

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

I think there is an issue with the reset-resume mechanism during USB runtime resume, leaving the interfaces suspended forever.

- Context:

Android platform, running a 3.13 + Google AOSP patches kernel.
I'm facing a USB issue with the bsusb driver. btusb driver has the USB runtime suspend enabled + remote wakeup.
However sometimes the USB runtime resume does not work as expected (we admit here that this can happen).

[ 3066.408413] usb 2-3: usb auto-resume
[ 3066.408433] hub 2-0:1.0: state 7 ports 9 chg 0000 evt 0008
[ 3066.445465] usb 2-3: finish resume
[ 3071.447591] usb 2-3: bt_hc_worker timed out on ep0in len=0/2
[ 3071.447598] usb 2-3: retry with reset-resume

Then the usbcore tries a reset-resume, but btusb driver does not implement this callback.

[ 3071.619408] btusb 2-3:1.0: no reset_resume for driver btusb?
[ 3071.619413] btusb 2-3:1.1: no reset_resume for driver btusb?

However for driver which doesn't implement 'reset_resume' callback, usbcore plans to unbind/rebind it.
Here is the problem, because this never happens.


- What happens (in core/driver.c):

0. Need to wake-up the usb device for data transfer
1. 'usb_runtime_resume' is called  and calls 'usb_resume_both'
2.' usb_resume_both' calls 'usb_resume_device' then calls 'usb_resume_interface' for each interface with the 'reset_resume' flag set (since resume failed).
3. 'usb_resume_interface' enters in the 'reset_resume' condition and sets the 'needs_binding' interface flag.
4. At the end of this runtime resume, the interfaces stay suspended FOREVER.


- Why:

+ function 'do_rebind_interface' is in charge of unbind and rebind the interfaces with the 'need_binfind' flag set.
+ However this method is only called in 'usb_resume_complete'.
+ Problem is that 'usb_resume_complete' is a dev_pm_ops callback (core/usb.h) used by the System PM core which is never called in a runtime PM scenario.
+ So interfaces remain suspended forever (or until the next PM system suspend/resume), device is unusable.
(unbinding/rebinding manually the interface via sysfs recovers the device)

Could you please let me know if it's the expected behavior or a real issue. Should we not call 'do_rebind_interface' in the runtime resume sequence?

Thanks & Regards,
Loic Poulain
---------------------------------------------------------------------
Intel Corporation SAS (French simplified joint stock company)
Registered headquarters: "Les Montalets"- 2, rue de Paris, 
92196 Meudon Cedex, France
Registration Number:  302 456 199 R.C.S. NANTERRE
Capital: 4,572,000 Euros

This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux