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