u-boot/drivers/usb/musb
Pali Rohár ff77bb301e usb: musb: Fix receiving of bigger buffers
If musb_peri_rx_ep() was called to process received HW buffer but U-Boot
cannot read it yet (e.g. because U-Boot SW buffer is full) then interrupt
was marked as processed also when HW buffer stayed unprocessed.

U-Boot tried to process this buffer again when it received interrupt again,
but it can receive it only when sender (host) sends a new data. As sender
(host) is not going to send a new data until U-Boot process current data
this issue caused a deadlock in case sender (host) is emitting data faster
than U-Boot can process it.

Reading musb intrrx register automatically clears this register and marks
interrupt as processed. So to prevent marking interrupt in U-Boot as
processed, adds a new variable pending_intrrx which would contain
unprocessed bits of intrrx register.

For a second step, every time when musb_peri_rx_ep() is called and there
are waiting data to be processed (signaled by MUSB_RXCSR_RXPKTRDY) either
acknowledge sender (via musb_peri_rx_ack()) that whole HW buffer was
processed or set corresponding bit in pending_intrrx that HW buffer was not
fully processed yet and next iteration is required after U-Boot allocates
space for reading HW buffer.

This patch fixes receiving large usb buffers, e.g. file transfer via Kermit
protocol implemented by 'loadb' U-Boot command over usbtty serial console.

Signed-off-by: Pali Rohár <pali@kernel.org>
Reviewed-by: Lukasz Majewski <lukma@denx.de>
Acked-by: Pavel Machek <pavel@ucw.cz>
2021-03-03 04:12:46 +01:00
..
am35x.c common: Drop linux/delay.h from common header 2020-05-18 21:19:23 -04:00
am35x.h SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
Kconfig usb: musb: Remove legacy CONFIG_USB_DA8XX 2018-12-14 17:59:09 +01:00
Makefile usb: musb: Remove legacy CONFIG_USB_DA8XX 2018-12-14 17:59:09 +01:00
musb_core.c usb: musb: Fix configuring FIFO for endpoints 2021-03-03 04:12:46 +01:00
musb_core.h SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
musb_debug.h SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
musb_hcd.c common: Drop linux/delay.h from common header 2020-05-18 21:19:23 -04:00
musb_hcd.h SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
musb_udc.c usb: musb: Fix receiving of bigger buffers 2021-03-03 04:12:46 +01:00
omap3.c common: Move serial_printf() to the serial header 2019-12-02 18:23:10 -05:00
omap3.h SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00