usb: Keep async schedule running only across mass storage xfers
authorMarek Vasut <marek.vasut@gmail.com>
Mon, 6 Apr 2020 12:29:44 +0000 (14:29 +0200)
committerTom Rini <trini@konsulko.com>
Thu, 9 Apr 2020 19:26:59 +0000 (15:26 -0400)
commit31232de07ef2bd97ff67625976eecd97eeb1bd3d
treea2c2b13d0321e29a09435d664c8a8c960a935e62
parent0db0ba6141f402b1d496ef53d9fa69978f75ec61
usb: Keep async schedule running only across mass storage xfers

Rather than keeping the asynchronous schedule running always, keep it
running only across USB mass storage transfers for now, as it seems
that keeping it running all the time interferes with certain control
transfers during device enumeration.

Note that running the async schedule all the time should not be an
issue, especially on EHCI HCD, as that one implements most of the
transfers using async schedule.

Note that we have usb_disable_asynch(), which however is utterly broken.
The usb_disable_asynch() blocks the USB core from doing async transfers
by setting a global flag. The async schedule should however be disabled
per USB controller. Moreover, setting a global flag does not prevent the
controller from using the async schedule, which e.g. the EHCI HCD does.

This patch implements additional callback to the controller, which
permits it to lock the async schedule and keep it running across
multiple transfers. Once the schedule is unlocked, it must also be
disabled. This thus prevents the async schedule from running outside
of the USB mass storage transfers.

Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
Cc: Lukasz Majewski <lukma@denx.de>
Cc: Tom Rini <trini@konsulko.com>
Tested-by: Tom Rini <trini@konsulko.com> [omap3_beagle, previously failing]
common/usb.c
common/usb_storage.c
drivers/usb/host/ehci-hcd.c
drivers/usb/host/ehci.h
drivers/usb/host/usb-uclass.c
include/usb.h