On Thu, Jul 28, 2011 at 9:45 PM, Felipe Balbi <balbi@xxxxxx> wrote: > Hi, > > On Tue, Jul 19, 2011 at 10:11:58PM -0700, Vikram Pandita wrote: >> From: Anand Gadiyar <gadiyar@xxxxxx> >> >> This patch enables the DMA mode1 RX support. >> This feature is enabled based on the short_not_ok flag passed from >> gadget drivers. >> >> This will result in a thruput performance gain of around >> 40% for USB mass-storage/mtp use cases. >> >> Signed-off-by: Anand Gadiyar <gadiyar@xxxxxx> >> Signed-off-by: Moiz Sonasath <m-sonasath@xxxxxx> >> Signed-off-by: Vikram Pandita <vikram.pandita@xxxxxx> >> Tested-by: Vikram Pandita <vikram.pandita@xxxxxx> > > applied this one, but I changed commit log and code comment a little > bit. Here's updated commit: > > commit e9c281b174f188adb7950ea8f6a55ca07be69914 > Author: Anand Gadiyar <gadiyar@xxxxxx> > Date: Tue Jul 19 22:11:58 2011 -0700 > > usb: musb: Enable DMA mode1 RX for transfers without short packets > > This patch enables DMA mode1 for the RX patch when we know > there won't be any short packets. We check that by looking > into the short_no_ok flag, if it's true we enable mode1, otherwise > we use mode0 to transfer the data. > > This will result in a throughput performance gain of around > 40% for USB mass-storage/mtp use cases. > > [ balbi@xxxxxx : updated commit log and code comments slightly ] Ack > > Signed-off-by: Anand Gadiyar <gadiyar@xxxxxx> > Signed-off-by: Moiz Sonasath <m-sonasath@xxxxxx> > Signed-off-by: Vikram Pandita <vikram.pandita@xxxxxx> > Tested-by: Vikram Pandita <vikram.pandita@xxxxxx> > Signed-off-by: Felipe Balbi <balbi@xxxxxx> > > diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c > index b67a062..d314f58 100644 > --- a/drivers/usb/musb/musb_gadget.c > +++ b/drivers/usb/musb/musb_gadget.c > @@ -634,6 +634,7 @@ static void rxstate(struct musb *musb, struct musb_request *req) > u16 len; > u16 csr = musb_readw(epio, MUSB_RXCSR); > struct musb_hw_ep *hw_ep = &musb->endpoints[epnum]; > + u8 use_mode_1; > > if (hw_ep->is_shared_fifo) > musb_ep = &hw_ep->ep_in; > @@ -683,6 +684,18 @@ static void rxstate(struct musb *musb, struct musb_request *req) > > if (csr & MUSB_RXCSR_RXPKTRDY) { > len = musb_readw(epio, MUSB_RXCOUNT); > + > + /* > + * Enable Mode 1 on RX transfers only when short_not_ok flag > + * is set. Currently short_not_ok flag is set only from > + * file_storage and f_mass_storage drivers > + */ > + > + if (request->short_not_ok && len == musb_ep->packet_sz) > + use_mode_1 = 1; > + else > + use_mode_1 = 0; > + > if (request->actual < request->length) { > #ifdef CONFIG_USB_INVENTRA_DMA > if (is_buffer_mapped(req)) { > @@ -714,37 +727,41 @@ static void rxstate(struct musb *musb, struct musb_request *req) > * then becomes usable as a runtime "use mode 1" hint... > */ > > - csr |= MUSB_RXCSR_DMAENAB; > -#ifdef USE_MODE1 > - csr |= MUSB_RXCSR_AUTOCLEAR; > - /* csr |= MUSB_RXCSR_DMAMODE; */ > - > - /* this special sequence (enabling and then > - * disabling MUSB_RXCSR_DMAMODE) is required > - * to get DMAReq to activate > - */ > - musb_writew(epio, MUSB_RXCSR, > - csr | MUSB_RXCSR_DMAMODE); > -#else > - if (!musb_ep->hb_mult && > - musb_ep->hw_ep->rx_double_buffered) > + /* Experimental: Mode1 works with mass storage use cases */ > + if (use_mode_1) { > csr |= MUSB_RXCSR_AUTOCLEAR; > -#endif > - musb_writew(epio, MUSB_RXCSR, csr); > + musb_writew(epio, MUSB_RXCSR, csr); > + csr |= MUSB_RXCSR_DMAENAB; > + musb_writew(epio, MUSB_RXCSR, csr); > + > + /* > + * this special sequence (enabling and then > + * disabling MUSB_RXCSR_DMAMODE) is required > + * to get DMAReq to activate > + */ > + musb_writew(epio, MUSB_RXCSR, > + csr | MUSB_RXCSR_DMAMODE); > + musb_writew(epio, MUSB_RXCSR, csr); > + > + } else { > + if (!musb_ep->hb_mult && > + musb_ep->hw_ep->rx_double_buffered) > + csr |= MUSB_RXCSR_AUTOCLEAR; > + csr |= MUSB_RXCSR_DMAENAB; > + musb_writew(epio, MUSB_RXCSR, csr); > + } > > if (request->actual < request->length) { > int transfer_size = 0; > -#ifdef USE_MODE1 > - transfer_size = min(request->length - request->actual, > - channel->max_len); > -#else > - transfer_size = min(request->length - request->actual, > - (unsigned)len); > -#endif > - if (transfer_size <= musb_ep->packet_sz) > - musb_ep->dma->desired_mode = 0; > - else > + if (use_mode_1) { > + transfer_size = min(request->length - request->actual, > + channel->max_len); > musb_ep->dma->desired_mode = 1; > + } else { > + transfer_size = min(request->length - request->actual, > + (unsigned)len); > + musb_ep->dma->desired_mode = 0; > + } > > use_dma = c->channel_program( > channel, > > -- > balbi > -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html