Re: [PATCH 1/2] USB: musb-gadget: fix bulk IN infinite hangs in double buffer case

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Friday, August 27, 2010 07:37:20 tom.leiming@xxxxxxxxx wrote:
> From: Ming Lei <tom.leiming@xxxxxxxxx>
> 
> This patch fixes one infinite hang of bulk IN transfer in double buffer
> case, the hang can be observed easily by test #6 of usbtest if musb is
> configured as g_zero and fifo mode 3 is taken to enable double fifo.
> 
> In fact, the patch only removes the check for non-empty fifo before
> loading data from new request into fifo since the check is not correct:
> 
> 	-in double buffer case, fifo may accommodate more than one packet,
> 	even though it has contained one packet already and is non-empty
> 
> 	-since last DMA is completed before calling musb_g_tx, it is sure
> 	that fifo may accommodate at least one packet
> 
> Without applying the patch, new requst enqueued from .complte may not
> have a chance to be loaded into fifo, then will never be completed and
> cause infinite hangs.
> 
> With the patch, on my beagle B5, test#6(queued bulk in) can be passed and
> test result may go beyond 33Mbyte/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 6 -s 32768 -g 8   [1]
> 
> [1],
>     -source of testusb : tools/usb/testusb.c under linux kernel;
> 
> Signed-off-by: Ming Lei <tom.leiming@xxxxxxxxx>
> Cc: Anand Gadiyar <gadiyar@xxxxxx>
> Cc: Mike Frysinger <vapier@xxxxxxxxxx>
> Cc: Sergei Shtylyov <sshtylyov@xxxxxxxxxxxxx>
> 
> ---
>  drivers/usb/musb/musb_gadget.c |   12 ------------
>  1 files changed, 0 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/usb/musb/musb_gadget.c
> b/drivers/usb/musb/musb_gadget.c index 550b397..e0bd1c1 100644
> --- a/drivers/usb/musb/musb_gadget.c
> +++ b/drivers/usb/musb/musb_gadget.c
> @@ -506,18 +506,6 @@ void musb_g_tx(struct musb *musb, u8 epnum)
>  			/* ... or if not, then complete it. */
>  			musb_g_giveback(musb_ep, request, 0);
> 
> -			/*
> -			 * Kickstart next transfer if appropriate;
> -			 * the packet that just completed might not
> -			 * be transmitted for hours or days.
> -			 * REVISIT for double buffering...
> -			 * FIXME revisit for stalls too...
> -			 */
> -			musb_ep_select(mbase, epnum);
> -			csr = musb_readw(epio, MUSB_TXCSR);
> -			if (csr & MUSB_TXCSR_FIFONOTEMPTY)
> -				return;
> -
>  			request = musb_ep->desc ? next_request(musb_ep) : NULL;
>  			if (!request) {
>  				DBG(4, "%s idle now\n",

maybe this change will make a difference ?

From 13fa6c9cec387893e2b22db6c055028f96fea5b8 Mon Sep 17 00:00:00 2001
From: Cliff Cai <cliff.cai@xxxxxxxxxx>
Date: Fri, 3 Jul 2009 06:32:02 +0000
Subject: [PATCH] USB: musb: only complete the request when all data has been 
transfered [local/log]

bug[#5269],bug[#5268],bug[#5264]only complete the request when all data has 
been transfered

git-svn-id: svn://localhost/svn/linux-kernel/trunk@6915 526b6c2d-f592-4532-
a319-5dd88ccb003d
---
 drivers/usb/musb/musb_gadget.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
index 6fca870..f019843 100644
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
@@ -500,6 +500,8 @@ void musb_g_tx(struct musb *musb, u8 epnum)
 						| MUSB_TXCSR_TXPKTRDY);
 				request->zero = 0;
 			}
+			if (request->actual < request->length)
+				return;
 
 			/* ... or if not, then complete it. */
 			musb_g_giveback(musb_ep, request, 0);
-- 
1.7.2.2

Attachment: signature.asc
Description: This is a digitally signed message part.


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux