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

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

 



Hello.

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

From: Vikram Pandita <vikram.pandita@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.

Based on Original work by
Anand Gadiyar<gadiyar@xxxxxx>  on 2.6.35 kernel

Tested on OMAP4460 Blaze board.

Signed-off-by: Moiz Sonasath <m-sonasath@xxxxxx>
Signed-off-by: Vikram Pandita <vikram.pandita@xxxxxx>
---
  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
--
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