usb: musb: host: don't program dma for zero byte tx
authorAjay Kumar Gupta <ajay.gupta@ti.com>
Fri, 20 Jul 2012 05:37:22 +0000 (11:07 +0530)
committerFelipe Balbi <balbi@ti.com>
Fri, 3 Aug 2012 06:34:39 +0000 (09:34 +0300)
This is to reduce the overhead of dma programming for zero byte
transmit as same can be done using pio mode.

Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/musb/musb_host.c

index 4bb717d0bd41b12a8b0f6fd879c987286a8059b5..29b5149f5756a5c20683067f897c96c8c766a994 100644 (file)
@@ -693,6 +693,8 @@ static void musb_ep_program(struct musb *musb, u8 epnum,
        void __iomem            *epio = hw_ep->regs;
        struct musb_qh          *qh = musb_ep_get_qh(hw_ep, !is_out);
        u16                     packet_sz = qh->maxpacket;
+       u8                      use_dma = 1;
+       u16                     csr;
 
        dev_dbg(musb->controller, "%s hw%d urb %p spd%d dev%d ep%d%s "
                                "h_addr%02x h_port%02x bytes %d\n",
@@ -704,9 +706,17 @@ static void musb_ep_program(struct musb *musb, u8 epnum,
 
        musb_ep_select(mbase, epnum);
 
+       if (is_out && !len) {
+               use_dma = 0;
+               csr = musb_readw(epio, MUSB_TXCSR);
+               csr &= ~MUSB_TXCSR_DMAENAB;
+               musb_writew(epio, MUSB_TXCSR, csr);
+               hw_ep->tx_channel = NULL;
+       }
+
        /* candidate for DMA? */
        dma_controller = musb->dma_controller;
-       if (is_dma_capable() && epnum && dma_controller) {
+       if (use_dma && is_dma_capable() && epnum && dma_controller) {
                dma_channel = is_out ? hw_ep->tx_channel : hw_ep->rx_channel;
                if (!dma_channel) {
                        dma_channel = dma_controller->channel_alloc(