]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
usb: musb: musb_cppi41: recognize HS devices in hostmode
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Thu, 13 Nov 2014 17:28:47 +0000 (18:28 +0100)
committerJiri Slaby <jslaby@suse.cz>
Mon, 28 Nov 2016 21:22:49 +0000 (22:22 +0100)
commit 1eec34e9f25664cf71e05321329d128e0565beae upstream.

There is a poll loop for max 25us for HS devices. Now guess what, I
tested it in gadget mode and forgot about the little detail. Nobody seem
to have it noticed…
This patch adds the missing logic for hostmode so it is recognized in
host and device mode properly.

Fixes: 50aea6fca771 ("usb: musb: cppi41: fire hrtimer according to
programmed channel length")
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
drivers/usb/musb/musb_cppi41.c

index cce32e91fd9e2826e688423206f6b391b161b24a..83bee312df8d00fe4aa6bc54299d9f402cc506cf 100644 (file)
@@ -234,6 +234,7 @@ static void cppi41_dma_callback(void *private_data)
                cppi41_trans_done(cppi41_channel);
        } else {
                struct cppi41_dma_controller *controller;
+               int is_hs = 0;
                /*
                 * On AM335x it has been observed that the TX interrupt fires
                 * too early that means the TXFIFO is not yet empty but the DMA
@@ -246,7 +247,14 @@ static void cppi41_dma_callback(void *private_data)
                 */
                controller = cppi41_channel->controller;
 
-               if (musb->g.speed == USB_SPEED_HIGH) {
+               if (is_host_active(musb)) {
+                       if (musb->port1_status & USB_PORT_STAT_HIGH_SPEED)
+                               is_hs = 1;
+               } else {
+                       if (musb->g.speed == USB_SPEED_HIGH)
+                               is_hs = 1;
+               }
+               if (is_hs) {
                        unsigned wait = 25;
 
                        do {