• Sebastian Andrzej Siewior's avatar
    usb: musb: core: make sure musb is in RPM_ACTIVE on resume · a1fc1920
    Sebastian Andrzej Siewior authored
    On am335x-evm with musb in host mode and using it as a wakeup source the
    following happens once the CPU comes out of suspend to ram:
    |PM: Wakeup source MPU_WAKE
    |PM: noirq resume of devices complete after 15.453 msecs
    |PM: early resume of devices complete after 2.222 msecs
    |PM: resume of devices complete after 507.351 msecs
    |Restarting tasks ...
    |------------[ cut here ]------------
    |WARNING: CPU: 0 PID: 322 at drivers/usb/core/urb.c:339 usb_submit_urb+0x494/0x4c8()
    |URB cc0db380 submitted while active
    |[<c0348e64>] (usb_submit_urb) from [<c0340f94>] (hub_activate+0x2b8/0x49c)
    |[<c0340f94>] (hub_activate) from [<c03411dc>] (hub_resume+0x14/0x1c)
    |[<c03411dc>] (hub_resume) from [<c034be10>] (usb_resume_interface.isra.4+0xdc/0x110)
    |[<c034be10>] (usb_resume_interface.isra.4) from [<c034beb0>] (usb_resume_both+0x6c/0x13c)
    |[<c034beb0>] (usb_resume_both) from [<c034cca4>] (usb_runtime_resume+0x10/0x14)
    |[<c034cca4>] (usb_runtime_resume) from [<c02bbd80>] (__rpm_callback+0x2c/0x60)
    |[<c02bbd80>] (__rpm_callback) from [<c02bbdd4>] (rpm_callback+0x20/0x74)
    |[<c02bbdd4>] (rpm_callback) from [<c02bcc48>] (rpm_resume+0x380/0x548)
    |[<c02bcc48>] (rpm_resume) from [<c02bcb00>] (rpm_resume+0x238/0x548)
    |[<c02bcb00>] (rpm_resume) from [<c02bd08c>] (__pm_runtime_resume+0x64/0x94)
    |[<c02bd08c>] (__pm_runtime_resume) from [<c034b5a4>] (usb_autopm_get_interface+0x18/0x5c)
    |[<c034b5a4>] (usb_autopm_get_interface) from [<c03438b8>] (hub_thread+0x10c/0x115c)
    |[<c03438b8>] (hub_thread) from [<c005a70c>] (kthread+0xbc/0xd8)
    |---[ end trace 036aa5fe78203142 ]---
    |hub 1-0:1.0: activate --> -16
    |hub 2-0:1.0: activate --> -16
    
    The reason for this backtrace is the attempt of the USB code to resume
    the HUB twice and thus enqueue the status URB twice.
    Alan Stern was a great help by explaining how the USB code supposed to
    work and what is most likely the problem. The root problem is that after
    resume the musb runtime-suspend state remains RPM_SUSPENDED.
    According to git log it RPM was added for the omap2430 platform. If I
    understand it correct the omap2430 invokes a get on musb once a cable is
    connected and a put once the cable is gone. In between the device could
    go auto-idle/off. Not sure what happens when the device goes into suspend
    but then I guess it was gadget only.
    On DSPS I see only a get in probe and put in remove function. This would
    forbid RPM from working but then the devices enterns suspended state
    anyway :)
    
    To get rid of this warning, I set the device state to RPM_ACTIVE which
    the expected state.
    
    Cc: Alan Stern <stern@rowland.harvard.edu>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
    a1fc1920
musb_core.c 66 KB