[PATCH 06/13] usb: musb: Fix transmission of bigger buffers

Pali Rohár
2020-11-29T16:46:11Z

If udc_endpoint_write() was called with bigger payload which does not fit
into one USB packet it needs to be transmitted in more USB packets. First
packet is transmitted by udc_endpoint_write() call itself and other packets
are put into waiting queue.

Implement function musb_peri_tx() which transmit checks when endpoints are
ready and continue transmitting of waiting queue.

This patch fixes sending e.g. output of printenv command over usbtty serial
console.

Signed-off-by: Pali Roh?r <pali@kernel.org>
---
drivers/usb/musb/musb_udc.c | 17 ++++++-----------
1 file changed, 6 insertions(+), 11 deletions(-)

diff --git a/drivers/usb/musb/musb_udc.c b/drivers/usb/musb/musb_udc.c
index 67d1c56f9a..28719cc3f6 100644
--- a/drivers/usb/musb/musb_udc.c
+++ b/drivers/usb/musb/musb_udc.c
@@ -708,21 +708,16 @@ static void musb_peri_rx(u16 intr)

static void musb_peri_tx(u16 intr)
{
+ unsigned int ep;
+
/* Check for EP0 */
if (0x01 & intr)
musb_peri_ep0_tx();

- /*
- * Use this in the future when handling epN tx
- *
- * u8 ep;
- *
- * for (ep = 1; ep < 16; ep++) {
- * if ((1 << ep) & intr) {
- * / * handle tx for this endpoint * /
- * }
- * }
- */
+ for (ep = 1; ep < 16; ep++) {
+ if ((1 << ep) & intr)
+ udc_endpoint_write(GET_ENDPOINT(udc_device, ep));
+ }
}

void udc_irq(void)
--
2.20.1