]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
MUSB: Additional checks for TUSB DMA
authorTony Lindgren <tony@atomide.com>
Fri, 8 Sep 2006 10:43:38 +0000 (13:43 +0300)
committerTony Lindgren <tony@atomide.com>
Fri, 8 Sep 2006 10:43:38 +0000 (13:43 +0300)
Additional checks for TUSB DMA. Fixes MSC ErrorRecoveryTest.

Signed-off-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
drivers/usb/musb/tusb6010_omap.c

index fd0e472ed5f2f05f9c8de19a5b9a0b3c461049b4..f64646df00fa655fe3db7fc5fafbbb093a1efa04 100644 (file)
@@ -99,6 +99,7 @@ static int tusb_omap_dma_stop(struct dma_controller *c)
 static inline int tusb_omap_use_shared_dmareq(struct tusb_omap_dma_ch *chdat)
 {
        u32             reg = musb_readl(chdat->tusb_base, TUSB_DMA_EP_MAP);
+
        if (reg != 0) {
                DBG(3, "ep%i dmareq0 is busy for ep%i\n",
                        chdat->epnum, reg & 0xf);
@@ -232,6 +233,9 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
        else
                transfer_len = len;
 
+       if (len < packet_sz)
+               packet_sz = transfer_len;
+
        if (dmareq_works()) {
                ch = chdat->ch;
                dmareq = chdat->dmareq;
@@ -241,6 +245,14 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
                        DBG(3, "could not get dma for ep%i\n", chdat->epnum);
                        return FALSE;
                }
+               if (tusb_dma->ch < 0) {
+                       /* REVISIT: This should get blocked earlier, happens
+                        * with MSC ErrorRecoveryTest
+                        */
+                       WARN_ON(1);
+                       return FALSE;
+               }
+
                ch = tusb_dma->ch;
                dmareq = tusb_dma->dmareq;
                sync_dev = tusb_dma->sync_dev;