usb: musb: set AUTOSET for full speed bulk DMA transfer in host mode
authorsupriya karanth <supriya.karanth@stericsson.com>
Thu, 6 Dec 2012 05:46:23 +0000 (11:16 +0530)
committerFelipe Balbi <balbi@ti.com>
Thu, 10 Jan 2013 12:16:47 +0000 (14:16 +0200)
The "mult" factor is not updated properly for the can_bulk_split()
case.

The AUTOSET bit in the TXCSR is not being set if the "mult"
factor is greater than 1 for the High Bandwidth ISO case.
But the "mult" factor is also greater than 1 in case of Full speed
bulk transfers with the packet splitting in TXMAXP register
enabled with can_bulk_split().

Without the AUTOSET the DMA transfers will not progress in mode1

[ balbi@ti.com : fix braces placement ]

Signed-off-by: supriya karanth <supriya.karanth@stericsson.com>
Signed-off-by: Praveena NADAHALLY <praveen.nadahally@stericsson.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/musb/musb_host.c

index e9f0fd9..cf3705f 100644 (file)
@@ -634,7 +634,17 @@ static bool musb_tx_dma_program(struct dma_controller *dma,
                mode = 1;
                csr |= MUSB_TXCSR_DMAMODE | MUSB_TXCSR_DMAENAB;
                /* autoset shouldn't be set in high bandwidth */
-               if (qh->hb_mult == 1)
+               /*
+                * Enable Autoset according to table
+                * below
+                * bulk_split hb_mult   Autoset_Enable
+                *      0       1       Yes(Normal)
+                *      0       >1      No(High BW ISO)
+                *      1       1       Yes(HS bulk)
+                *      1       >1      Yes(FS bulk)
+                */
+               if (qh->hb_mult == 1 || (qh->hb_mult > 1 &&
+                                       can_bulk_split(hw_ep->musb, qh->type)))
                        csr |= MUSB_TXCSR_AUTOSET;
        } else {
                mode = 0;
@@ -791,17 +801,19 @@ static void musb_ep_program(struct musb *musb, u8 epnum,
                /* protocol/endpoint/interval/NAKlimit */
                if (epnum) {
                        musb_writeb(epio, MUSB_TXTYPE, qh->type_reg);
-                       if (musb->double_buffer_not_ok)
+                       if (musb->double_buffer_not_ok) {
                                musb_writew(epio, MUSB_TXMAXP,
                                                hw_ep->max_packet_sz_tx);
-                       else if (can_bulk_split(musb, qh->type))
+                       } else if (can_bulk_split(musb, qh->type)) {
+                               qh->hb_mult = hw_ep->max_packet_sz_tx
+                                               / packet_sz;
                                musb_writew(epio, MUSB_TXMAXP, packet_sz
-                                       | ((hw_ep->max_packet_sz_tx /
-                                               packet_sz) - 1) << 11);
-                       else
+                                       | ((qh->hb_mult) - 1) << 11);
+                       } else {
                                musb_writew(epio, MUSB_TXMAXP,
                                                qh->maxpacket |
                                                ((qh->hb_mult - 1) << 11));
+                       }
                        musb_writeb(epio, MUSB_TXINTERVAL, qh->intv_reg);
                } else {
                        musb_writeb(epio, MUSB_NAKLIMIT0, qh->intv_reg);