From: Ming Lei <tom.leim...@gmail.com>

This patch fixes two bugs of OUT transfer in double buffer case:

        -USE_MODE1 should be enabled except for ANOMALY_05000456 case, or
        else may cause infinite hang and data error bug in double buffer

        -DMA length should not go beyond the availabe space of request buffer

Without this patch, test #5 of usbtest can't be passed if we configure musb as
g_zero and use fifo mode 3 to enable double buffer mode.

With this patch, on my beagle B5, test#5(queued bulk out) may go beyond 
14Mbyte/s
if musb is configured as g_zero and fifo mode 3 is taken, follows the test 
command:

        #./testusb -D DEV_NAME -c 1024 -t 5 -s 32768 -g 8   [1]

[1],
    -source of testusb : tools/usb/testusb.c under linux kernel;

Signed-off-by: Ming Lei <tom.leim...@gmail.com>
Cc: Anand Gadiyar <gadi...@ti.com>
Cc: Mike Frysinger <vap...@gentoo.org>
Cc: Sergei Shtylyov <sshtyl...@ru.mvista.com>

---
 drivers/usb/musb/musb_dma.h    |    2 ++
 drivers/usb/musb/musb_gadget.c |    5 +++--
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/musb/musb_dma.h b/drivers/usb/musb/musb_dma.h
index 916065b..dff91ce 100644
--- a/drivers/usb/musb/musb_dma.h
+++ b/drivers/usb/musb/musb_dma.h
@@ -89,6 +89,8 @@ struct musb_hw_ep;
 # if !ANOMALY_05000456
 #  define USE_MODE1
 # endif
+#else
+#  define USE_MODE1
 #endif
 
 /*
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
index e0bd1c1..f1c44b9 100644
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
@@ -662,10 +662,11 @@ static void rxstate(struct musb *musb, struct 
musb_request *req)
                                if (request->actual < request->length) {
                                        int transfer_size = 0;
 #ifdef USE_MODE1
-                                       transfer_size = min(request->length,
+                                       transfer_size = min(request->length - 
request->actual,
                                                        channel->max_len);
 #else
-                                       transfer_size = len;
+                                       transfer_size = min(request->length - 
request->actual,
+                                                       len);
 #endif
                                        if (transfer_size <= musb_ep->packet_sz)
                                                musb_ep->dma->desired_mode = 0;
-- 
1.6.2.5

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to