usb: musb: Fix transmission of bigger buffers
authorPali Rohár <pali@kernel.org>
Sun, 7 Feb 2021 13:50:07 +0000 (14:50 +0100)
committerMarek Vasut <marex@denx.de>
Wed, 3 Mar 2021 03:12:46 +0000 (04:12 +0100)
If udc_endpoint_write() was called with bigger payload which does not fit
into one USB packet it is needed to transmit payload 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 checks if endpoints are ready for
transmit and continue transmission of waiting queue.

This patch fixes sending big output from printenv 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>>
drivers/usb/musb/musb_udc.c

index 67d1c56..28719cc 100644 (file)
@@ -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)