RE: [PATCH 2/2] USB: musb-gadget: fix OUT transfer in double buffer case

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

 



tom.leiming@xxxxxxxxx wrote:
> From: Ming Lei <tom.leiming@xxxxxxxxx>
> 
> 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
> 

Double buffering should still work with or without mode1 DMA.
I'm not sure using Mode1 DMA is the fix for enabling double buffering.

> 	-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.leiming@xxxxxxxxx>
> Cc: Anand Gadiyar <gadiyar@xxxxxx>
> Cc: Mike Frysinger <vapier@xxxxxxxxxx>
> Cc: Sergei Shtylyov <sshtylyov@xxxxxxxxxxxxx>

The DMA length part is a good fix. However, I'm not so sure I like the
combining of the MODE1 RX change here.

With current code, only g_zero and g_file_storage work well with
Mode1 DMA RX. g_ether used to break (have not tested recently with mode1).
Did you test g_ether with your patch?

We know that at least on OMAPs, MODE1 DMA RX works reliably with patches
Felipe submitted last December. These have not been resubmitted and we're
waiting on that.

- Anand


> 
> ---
>  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-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


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

  Powered by Linux