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]

 



Thanks for your review.

2010/8/27 Gadiyar, Anand <gadiyar@xxxxxx>:
> 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.

I see why enabling mode 1 may fix the TX transfer in double buffer case.

We only enable auto clear for dma mode 1 case and for dma mode 0,
so it should be a bug.

>
>>       -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.

I will submit two patches to fix the issue, one is to add  'auto clear'
for both dma 0 and dma 1, another fix the DMA length.  I will submit the
two patches later for your review.

>
> 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?

Yes, I test the g_ether just now and find it is broken with the previous 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
>>
>>



-- 
Lei Ming
--
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