usb: mtu3: fix the failure of qmu stop
authorChunfeng Yun <chunfeng.yun@mediatek.com>
Thu, 19 Jan 2023 03:33:22 +0000 (11:33 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 19 Jan 2023 13:12:08 +0000 (14:12 +0100)
commit5aba179c34291ef67206bce6fa0fe0873c8dfc4e
tree0d151b7957eb8882ad420281f62314e4c42aba5a
parent3e679bde529e892a59e89d3a0728cc153e8ecefe
usb: mtu3: fix the failure of qmu stop

This happens when do stress test of uvc stream on/off which will
enable/disable endpoints. uvc has four tx requests, and may disable
endpoint between queue tx requests as following:
    enable ep --> start qmu
    queue tx request0
    queue tx request1
    queue tx request2 --> resume qmu
    disable ep --> stop qmu may fail [1]
    queue tx request3 --> will resume qmu, may cause qmu can't work
                          when enable ep next time [2]

[1]: when the tx fifo has some data to transmit, and
    try to stop qmu (stop ep) meanwhile resume qmu (queue tx request),
    it may cause stop qmu timeout, then can be fixed by flushing fifo
    when stop qmu.
[2]: it resumes qmu again, shall stop qmu again.

Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
Reported-by: Min Guo <min.guo@mediatek.com>
Link: https://lore.kernel.org/r/20230119033322.21426-1-chunfeng.yun@mediatek.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/mtu3/mtu3_gadget.c
drivers/usb/mtu3/mtu3_hw_regs.h
drivers/usb/mtu3/mtu3_qmu.c