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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux