diff mbox

[v4] usb: musb: Enable DMA mode1 RX for USB-Mass-Storage

Message ID 20110729044508.GY9069@legolas.emea.dhcp.ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Felipe Balbi July 29, 2011, 4:45 a.m. UTC
Hi,

On Tue, Jul 19, 2011 at 10:11:58PM -0700, Vikram Pandita wrote:
> From: Anand Gadiyar <gadiyar@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.
> 
> Signed-off-by: Anand Gadiyar <gadiyar@ti.com>
> Signed-off-by: Moiz Sonasath <m-sonasath@ti.com>
> Signed-off-by: Vikram Pandita <vikram.pandita@ti.com>
> Tested-by: Vikram Pandita <vikram.pandita@ti.com>

applied this one, but I changed commit log and code comment a little
bit. Here's updated commit:

commit e9c281b174f188adb7950ea8f6a55ca07be69914
Author: Anand Gadiyar <gadiyar@ti.com>
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@ti.com : updated commit log and code comments slightly ]
    
    Signed-off-by: Anand Gadiyar <gadiyar@ti.com>
    Signed-off-by: Moiz Sonasath <m-sonasath@ti.com>
    Signed-off-by: Vikram Pandita <vikram.pandita@ti.com>
    Tested-by: Vikram Pandita <vikram.pandita@ti.com>
    Signed-off-by: Felipe Balbi <balbi@ti.com>

Comments

vikram pandita July 29, 2011, 4:50 a.m. UTC | #1
On Thu, Jul 28, 2011 at 9:45 PM, Felipe Balbi <balbi@ti.com> wrote:
> Hi,
>
> On Tue, Jul 19, 2011 at 10:11:58PM -0700, Vikram Pandita wrote:
>> From: Anand Gadiyar <gadiyar@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.
>>
>> Signed-off-by: Anand Gadiyar <gadiyar@ti.com>
>> Signed-off-by: Moiz Sonasath <m-sonasath@ti.com>
>> Signed-off-by: Vikram Pandita <vikram.pandita@ti.com>
>> Tested-by: Vikram Pandita <vikram.pandita@ti.com>
>
> applied this one, but I changed commit log and code comment a little
> bit. Here's updated commit:
>
> commit e9c281b174f188adb7950ea8f6a55ca07be69914
> Author: Anand Gadiyar <gadiyar@ti.com>
> 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@ti.com : updated commit log and code comments slightly ]

Ack

>
>    Signed-off-by: Anand Gadiyar <gadiyar@ti.com>
>    Signed-off-by: Moiz Sonasath <m-sonasath@ti.com>
>    Signed-off-by: Vikram Pandita <vikram.pandita@ti.com>
>    Tested-by: Vikram Pandita <vikram.pandita@ti.com>
>    Signed-off-by: Felipe Balbi <balbi@ti.com>
>
> 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@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

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,