f262734286
[ Upstream commit d28f4091ea7ec3510fd6a3c6d433234e7a2bef14 ]
When handle qmu transfer irq, it will unlock @mtu->lock before give back
request, if another thread handle disconnect event at the same time, and
try to disable ep, it may lock @mtu->lock and free qmu ring, then qmu
irq hanlder may get a NULL gpd, avoid the KE by checking gpd's value before
handling it.
e.g.
qmu done irq on cpu0 thread running on cpu1
qmu_done_tx()
handle gpd [0]
mtu3_requ_complete() mtu3_gadget_ep_disable()
unlock @mtu->lock
give back request lock @mtu->lock
mtu3_ep_disable()
mtu3_gpd_ring_free()
unlock @mtu->lock
lock @mtu->lock
get next gpd [1]
[1]: goto [0] to handle next gpd, and next gpd may be NULL.
Fixes:
|
||
---|---|---|
.. | ||
Kconfig | ||
Makefile | ||
mtu3_core.c | ||
mtu3_debug.h | ||
mtu3_debugfs.c | ||
mtu3_dr.c | ||
mtu3_dr.h | ||
mtu3_gadget_ep0.c | ||
mtu3_gadget.c | ||
mtu3_host.c | ||
mtu3_hw_regs.h | ||
mtu3_plat.c | ||
mtu3_qmu.c | ||
mtu3_qmu.h | ||
mtu3_trace.c | ||
mtu3_trace.h | ||
mtu3.h |