summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPali Rohár <pali@kernel.org>2021-02-07 16:50:07 +0300
committerMarek Vasut <marex@denx.de>2021-03-03 06:12:46 +0300
commitea7125c4c6d25bbaf7927efc753357e64612bffb (patch)
tree01c5e66ea4afa119a43fbfd61e86fe6c956b8dbf
parent7d7ae28c8b568ff1db38f7520b8ae892b4d93eee (diff)
downloadu-boot-ea7125c4c6d25bbaf7927efc753357e64612bffb.tar.xz
usb: musb: Fix transmission of bigger buffers
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>>
-rw-r--r--drivers/usb/musb/musb_udc.c17
1 files 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)