All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] usb: musb: Enable DMA mode1 RX for USB-Mass-Storage
@ 2011-07-15 23:44 Vikram Pandita
  2011-07-16 11:22 ` Sergei Shtylyov
  0 siblings, 1 reply; 3+ messages in thread
From: Vikram Pandita @ 2011-07-15 23:44 UTC (permalink / raw)
  To: balbi-l0cyMroinI0, linux-usb-u79uwXL29TY76Z2rM5mHXA, gadiyar-l0cyMroinI0
  Cc: linux-omap-u79uwXL29TY76Z2rM5mHXA, Vikram Pandita, Moiz Sonasath

From: Vikram Pandita <vikram.pandita-l0cyMroinI0@public.gmane.org>

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.

Based on Original work by
Anand Gadiyar <gadiyar-l0cyMroinI0@public.gmane.org> on 2.6.35 kernel

Tested on OMAP4460 Blaze board.

Signed-off-by: Moiz Sonasath <m-sonasath-l0cyMroinI0@public.gmane.org>
Signed-off-by: Vikram Pandita <vikram.pandita-l0cyMroinI0@public.gmane.org>
---
 drivers/usb/musb/musb_gadget.c |   42 ++++++++++++++++++++++++++++-----------
 1 files changed, 30 insertions(+), 12 deletions(-)

diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
index 9412410..e643ec2 100644
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
@@ -624,6 +624,7 @@ void musb_g_tx(struct musb *musb, u8 epnum)
 /*
  * Context: controller locked, IRQs blocked, endpoint selected
  */
+
 static void rxstate(struct musb *musb, struct musb_request *req)
 {
 	const u8		epnum = req->epnum;
@@ -634,6 +635,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 +685,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 for RX transfers only for mass-storage
+		 * use-case, based on short_not_ok flag which 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,10 +728,13 @@ 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
+	/* Experimental: Mode1 works with mass storage use cases
+	 */
+		if (use_mode_1) {
 				csr |= MUSB_RXCSR_AUTOCLEAR;
-				/* csr |= MUSB_RXCSR_DMAMODE; */
+				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
@@ -725,26 +742,27 @@ static void rxstate(struct musb *musb, struct musb_request *req)
 				 */
 				musb_writew(epio, MUSB_RXCSR,
 					csr | MUSB_RXCSR_DMAMODE);
-#else
+				musb_writew(epio, MUSB_RXCSR, csr);
+
+		} else {
 				if (!musb_ep->hb_mult &&
 					musb_ep->hw_ep->rx_double_buffered)
 					csr |= MUSB_RXCSR_AUTOCLEAR;
-#endif
+				csr |= MUSB_RXCSR_DMAENAB;
 				musb_writew(epio, MUSB_RXCSR, csr);
+		}
 
 				if (request->actual < request->length) {
 					int transfer_size = 0;
-#ifdef USE_MODE1
+		if (use_mode_1) {
 					transfer_size = min(request->length - request->actual,
 							channel->max_len);
-#else
+					musb_ep->dma->desired_mode = 1;
+		} 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
-						musb_ep->dma->desired_mode = 1;
+					musb_ep->dma->desired_mode = 0;
+		}
 
 					use_dma = c->channel_program(
 							channel,
-- 
1.7.4.1

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] usb: musb: Enable DMA mode1 RX for USB-Mass-Storage
  2011-07-15 23:44 [PATCH] usb: musb: Enable DMA mode1 RX for USB-Mass-Storage Vikram Pandita
@ 2011-07-16 11:22 ` Sergei Shtylyov
  2011-07-18 23:38   ` Pandita, Vikram
  0 siblings, 1 reply; 3+ messages in thread
From: Sergei Shtylyov @ 2011-07-16 11:22 UTC (permalink / raw)
  To: Vikram Pandita; +Cc: balbi, linux-usb, gadiyar, linux-omap, Moiz Sonasath

Hello.

On 16-07-2011 3:44, Vikram Pandita wrote:

> From: Vikram Pandita <vikram.pandita@ti.com>

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

> Based on Original work by
> Anand Gadiyar<gadiyar@ti.com>  on 2.6.35 kernel

> Tested on OMAP4460 Blaze board.

> Signed-off-by: Moiz Sonasath <m-sonasath@ti.com>
> Signed-off-by: Vikram Pandita <vikram.pandita@ti.com>
> ---
>   drivers/usb/musb/musb_gadget.c |   42 ++++++++++++++++++++++++++++-----------
>   1 files changed, 30 insertions(+), 12 deletions(-)

> diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
> index 9412410..e643ec2 100644
> --- a/drivers/usb/musb/musb_gadget.c
> +++ b/drivers/usb/musb/musb_gadget.c
> @@ -624,6 +624,7 @@ void musb_g_tx(struct musb *musb, u8 epnum)
>   /*
>    * Context: controller locked, IRQs blocked, endpoint selected
>    */
> +

    Why?

>   static void rxstate(struct musb *musb, struct musb_request *req)
>   {
>   	const u8		epnum = req->epnum;
> @@ -714,10 +728,13 @@ 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
> +	/* Experimental: Mode1 works with mass storage use cases
> +	 */
> +		if (use_mode_1) {

    No, you can't put the code at the arbitrary indentation levels. Please 
indent properly.

>   				csr |= MUSB_RXCSR_AUTOCLEAR;
> -				/* csr |= MUSB_RXCSR_DMAMODE; */
> +				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
> @@ -725,26 +742,27 @@ static void rxstate(struct musb *musb, struct musb_request *req)
>   				 */
>   				musb_writew(epio, MUSB_RXCSR,
>   					csr | MUSB_RXCSR_DMAMODE);
> -#else
> +				musb_writew(epio, MUSB_RXCSR, csr);
> +
> +		} else {
>   				if (!musb_ep->hb_mult &&
>   					musb_ep->hw_ep->rx_double_buffered)
>   					csr |= MUSB_RXCSR_AUTOCLEAR;
> -#endif
> +				csr |= MUSB_RXCSR_DMAENAB;
>   				musb_writew(epio, MUSB_RXCSR, csr);
> +		}
>
>   				if (request->actual<  request->length) {
>   					int transfer_size = 0;
> -#ifdef USE_MODE1
> +		if (use_mode_1) {

    Same here.

>   					transfer_size = min(request->length - request->actual,
>   							channel->max_len);
> -#else
> +					musb_ep->dma->desired_mode = 1;
> +		} 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
> -						musb_ep->dma->desired_mode = 1;
> +					musb_ep->dma->desired_mode = 0;
> +		}
>
>   					use_dma = c->channel_program(
>   							channel,

WBR, Sergei

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] usb: musb: Enable DMA mode1 RX for USB-Mass-Storage
  2011-07-16 11:22 ` Sergei Shtylyov
@ 2011-07-18 23:38   ` Pandita, Vikram
  0 siblings, 0 replies; 3+ messages in thread
From: Pandita, Vikram @ 2011-07-18 23:38 UTC (permalink / raw)
  To: Sergei Shtylyov; +Cc: balbi, linux-usb, gadiyar, linux-omap, Moiz Sonasath

On Sat, Jul 16, 2011 at 4:22 AM, Sergei Shtylyov <sshtylyov@mvista.com> wrote:
>
> Hello.
>
> On 16-07-2011 3:44, Vikram Pandita wrote:
>
>> From: Vikram Pandita <vikram.pandita@ti.com>
>
>> 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.
>
>> Based on Original work by
>> Anand Gadiyar<gadiyar@ti.com>  on 2.6.35 kernel
>
>> Tested on OMAP4460 Blaze board.
>
>> Signed-off-by: Moiz Sonasath <m-sonasath@ti.com>
>> Signed-off-by: Vikram Pandita <vikram.pandita@ti.com>
>> ---
>>  drivers/usb/musb/musb_gadget.c |   42 ++++++++++++++++++++++++++++-----------
>>  1 files changed, 30 insertions(+), 12 deletions(-)
>
>> diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
>> index 9412410..e643ec2 100644
>> --- a/drivers/usb/musb/musb_gadget.c
>> +++ b/drivers/usb/musb/musb_gadget.c
>> @@ -624,6 +624,7 @@ void musb_g_tx(struct musb *musb, u8 epnum)
>>  /*
>>   * Context: controller locked, IRQs blocked, endpoint selected
>>   */
>> +
>
>   Why?

typo - will fix in v2

>
>>  static void rxstate(struct musb *musb, struct musb_request *req)
>>  {
>>        const u8                epnum = req->epnum;
>> @@ -714,10 +728,13 @@ 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
>> +       /* Experimental: Mode1 works with mass storage use cases
>> +        */
>> +               if (use_mode_1) {
>
>   No, you can't put the code at the arbitrary indentation levels. Please indent properly.

agree. v2 will address.

>
>>                                csr |= MUSB_RXCSR_AUTOCLEAR;
>> -                               /* csr |= MUSB_RXCSR_DMAMODE; */
>> +                               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
>> @@ -725,26 +742,27 @@ static void rxstate(struct musb *musb, struct musb_request *req)
>>                                 */
>>                                musb_writew(epio, MUSB_RXCSR,
>>                                        csr | MUSB_RXCSR_DMAMODE);
>> -#else
>> +                               musb_writew(epio, MUSB_RXCSR, csr);
>> +
>> +               } else {
>>                                if (!musb_ep->hb_mult &&
>>                                        musb_ep->hw_ep->rx_double_buffered)
>>                                        csr |= MUSB_RXCSR_AUTOCLEAR;
>> -#endif
>> +                               csr |= MUSB_RXCSR_DMAENAB;
>>                                musb_writew(epio, MUSB_RXCSR, csr);
>> +               }
>>
>>                                if (request->actual<  request->length) {
>>                                        int transfer_size = 0;
>> -#ifdef USE_MODE1
>> +               if (use_mode_1) {
>
>   Same here.

agree. v2 will address.


>
>>                                        transfer_size = min(request->length - request->actual,
>>                                                        channel->max_len);
>> -#else
>> +                                       musb_ep->dma->desired_mode = 1;
>> +               } 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
>> -                                               musb_ep->dma->desired_mode = 1;
>> +                                       musb_ep->dma->desired_mode = 0;
>> +               }
>>
>>                                        use_dma = c->channel_program(
>>                                                        channel,
>
> WBR, Sergei
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2011-07-18 23:39 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-07-15 23:44 [PATCH] usb: musb: Enable DMA mode1 RX for USB-Mass-Storage Vikram Pandita
2011-07-16 11:22 ` Sergei Shtylyov
2011-07-18 23:38   ` Pandita, Vikram

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.