linux/drivers/usb/musb
Johan Hovold 0c3aae9bd5 USB: musb: fix late external abort on suspend
The musb delayed irq work was never flushed on suspend, something which
since 4.9 can lead to an external abort if the work is scheduled after
the grandparent's clock has been disabled:

PM: Suspending system (mem)
PM: suspend of devices complete after 125.224 msecs
PM: suspend devices took 0.132 seconds
PM: late suspend of devices complete after 7.423 msecs
PM: noirq suspend of devices complete after 7.083 msecs
suspend debug: Waiting for 5 second(s).
Unhandled fault: external abort on non-linefetch (0x1008) at 0xd0262c60
...
[<c054880c>] (musb_default_readb) from [<c0547b5c>] (musb_irq_work+0x48/0x220)
[<c0547b5c>] (musb_irq_work) from [<c014f8a4>] (process_one_work+0x1f4/0x758)
[<c014f8a4>] (process_one_work) from [<c014fe5c>] (worker_thread+0x54/0x514)
[<c014fe5c>] (worker_thread) from [<c015704c>] (kthread+0x128/0x158)
[<c015704c>] (kthread) from [<c0109330>] (ret_from_fork+0x14/0x24)

Commit 2bff3916fd ("usb: musb: Fix PM for hub disconnect") started
scheduling musb_irq_work with a delay of up to a second and with
retries thereby making this easy to trigger, for example, by suspending
shortly after a disconnect.

Note that we set a flag to prevent the irq work from rescheduling itself
during suspend and instead process a disconnect immediately. This takes
care of the case where we are disconnected shortly before suspending.

However, when in host mode, a disconnect while suspended will still
go unnoticed and thus prevent the controller from runtime suspending
upon resume as the session bit is always set. This will need to be
addressed separately.

Fixes: 550a7375fe ("USB: Add MUSB and TUSB support")
Fixes: 467d5c9807 ("usb: musb: Implement session bit based runtime PM for musb-core")
Fixes: 2bff3916fd ("usb: musb: Fix PM for hub disconnect")
Cc: stable <stable@vger.kernel.org>     # 4.9
Cc: Felipe Balbi <felipe.balbi@linux.intel.com>
Cc: Tony Lindgren <tony@atomide.com>
Signed-off-by: Johan Hovold <johan@kernel.org>
Tested-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Bin Liu <b-liu@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2017-10-17 11:42:51 +02:00
..
am35x.c usb: musb: am35x: remove redundant code 2017-02-03 10:05:10 +01:00
blackfin.c usb: musb: blackfin: fix unused warnings on suspend/resume 2017-02-03 10:05:11 +01:00
blackfin.h
cppi_dma.c usb: musb: cppi_dma.c: use DIV_ROUND_UP macro in cppi_next_(r|t)x_segment() 2017-04-18 16:48:26 +02:00
cppi_dma.h usb: musb: cppi_dma: Clean up cppi structure 2017-02-09 13:35:05 +01:00
da8xx.c usb: musb: don't mark of_dev_auxdata as initdata 2017-04-26 11:30:02 +02:00
davinci.c usb: musb: davinci: remove redundant code 2017-02-03 10:05:10 +01:00
davinci.h
jz4740.c usb: musb: constify musb_hdrc_config structures 2017-01-25 10:52:43 +01:00
Kconfig usb: musb: Add support of CPPI 4.1 DMA controller to DA8xx 2017-04-18 16:48:26 +02:00
Makefile usb: musb: add tracepoints support for debugging 2016-07-17 08:23:57 +09:00
musb_am335x.c
musb_core.c USB: musb: fix late external abort on suspend 2017-10-17 11:42:51 +02:00
musb_core.h USB: musb: fix late external abort on suspend 2017-10-17 11:42:51 +02:00
musb_cppi41.c usb: musb: musb_cppi41: Defer probe only if DMA is not ready 2017-06-20 11:45:01 +08:00
musb_debug.h usb: musb: add tracepoints support for debugging 2016-07-17 08:23:57 +09:00
musb_debugfs.c usb: musb: debugfs: allow forcing host mode together with speed in testmode 2017-02-03 10:05:11 +01:00
musb_dma.h usb: musb: dma: Add a DMA completion platform callback 2017-02-09 13:35:05 +01:00
musb_dsps.c USB: musb: dsps: add explicit runtime resume at suspend 2017-08-28 10:51:56 +02:00
musb_gadget_ep0.c usb: musb: switch dev_dbg to tracepoints 2016-07-17 08:23:57 +09:00
musb_gadget.c usb: musb: add helper function musb_ep_xfertype_string 2017-08-28 10:51:55 +02:00
musb_gadget.h
musb_host.c usb: musb: print an error message when high bandwidth is unsupported 2017-08-28 10:51:55 +02:00
musb_host.h
musb_io.h usb: musb: Make busctl_offset an io-op rather then a define 2015-05-26 10:46:54 -05:00
musb_regs.h usb: musb: Make busctl_offset an io-op rather then a define 2015-05-26 10:46:54 -05:00
musb_trace.c usb: musb: add tracepoints support for debugging 2016-07-17 08:23:57 +09:00
musb_trace.h usb: musb: cppi41: add dma channel tracepoints 2016-07-17 08:23:57 +09:00
musb_virthub.c USB: musb: remove obsolete resume-signalling comments 2016-11-21 17:35:36 +01:00
musbhsdma.c usb: musb: switch dev_dbg to tracepoints 2016-07-17 08:23:57 +09:00
musbhsdma.h usb: musb: Fix trying to free already-free IRQ 4 2017-01-05 19:18:05 +01:00
omap2430.c usb: musb: omap2430: constify dev_pm_ops structures 2017-02-03 10:05:11 +01:00
omap2430.h
sunxi.c usb: musb: sunxi: add support for the variant in H3/V3s SoC 2017-02-03 10:05:11 +01:00
tusb6010_omap.c usb: musb: tusb6010_omap: Convert to DMAengine API 2017-06-20 11:45:01 +08:00
tusb6010.c usb: musb: tusb6010: Handle DMA TX completion in DMA callback as well 2017-06-20 11:45:01 +08:00
tusb6010.h usb: musb: Fix up DMA related macros 2015-05-07 13:35:46 -05:00
ux500_dma.c usb: musb/ux500: remove duplicate check for dma_is_compatible 2016-03-04 15:14:30 +02:00
ux500.c usb: musb: constify musb_hdrc_config structures 2017-01-25 10:52:43 +01:00