devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Franklin S Cooper Jr <fcooper@ti.com>
To: nsekhar@ti.com, dwmw2@infradead.org, computersforpeace@gmail.com,
	rogerq@ti.com, tony@atomide.com, devicetree@vger.kernel.org,
	linux-omap@vger.kernel.org, linux-mtd@lists.infradead.org,
	linux-kernel@vger.kernel.org
Cc: Franklin S Cooper Jr <fcooper@ti.com>
Subject: [PATCH v3 4/6] mtd: nand: omap2: Start dma request before enabling prefetch
Date: Wed,  9 Mar 2016 22:07:39 -0600	[thread overview]
Message-ID: <1457582861-20619-5-git-send-email-fcooper@ti.com> (raw)
In-Reply-To: <1457582861-20619-1-git-send-email-fcooper@ti.com>

The prefetch engine sends a dma request once a FIFO threshold has
been met. No other requests are received until the previous request
is handled.

Starting an edma transfer (dma_async_issue_pending) results in any
previous event for the dma channel to be cleared. Therefore, starting
the prefetch engine before initiating the dma transfer may result in
the prefetch triggering a dma request but instead of it being handled
it can end up being cleared. This will result in a hang since the code
will continue to wait for the dma request to complete.

By initiating the dma request before enabling the prefetch engine this
race condition is avoided and no dma request are missed/cleared.

Signed-off-by: Franklin S Cooper Jr <fcooper@ti.com>
---
 drivers/mtd/nand/omap2.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c
index 1e5c803..f7110d1 100644
--- a/drivers/mtd/nand/omap2.c
+++ b/drivers/mtd/nand/omap2.c
@@ -497,6 +497,11 @@ static inline int omap_nand_dma_transfer(struct mtd_info *mtd, void *addr,
 	tx->callback_param = &info->comp;
 	dmaengine_submit(tx);
 
+	init_completion(&info->comp);
+
+	/* setup and start DMA using dma_addr */
+	dma_async_issue_pending(info->dma);
+
 	/*  configure and start prefetch transfer */
 	ret = omap_prefetch_enable(info->gpmc_cs,
 		PREFETCH_FIFOTHRESHOLD_MAX, 0x1, len, is_write, info);
@@ -504,10 +509,6 @@ static inline int omap_nand_dma_transfer(struct mtd_info *mtd, void *addr,
 		/* PFPW engine is busy, use cpu copy method */
 		goto out_copy_unmap;
 
-	init_completion(&info->comp);
-	dma_async_issue_pending(info->dma);
-
-	/* setup and start DMA using dma_addr */
 	wait_for_completion(&info->comp);
 	tim = 0;
 	limit = (loops_per_jiffy * msecs_to_jiffies(OMAP_NAND_TIMEOUT_MS));
-- 
2.7.0

  parent reply	other threads:[~2016-03-10  4:07 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-10  4:07 [PATCH v3 0/6] mtd: nand: Fix support for NAND DMA prefetch Franklin S Cooper Jr
2016-03-10  4:07 ` [PATCH v3 1/6] memory: omap-gpmc: Store handle to GPMC dev Franklin S Cooper Jr
     [not found]   ` <1457582861-20619-2-git-send-email-fcooper-l0cyMroinI0@public.gmane.org>
2016-03-10 12:40     ` Roger Quadros
     [not found]       ` <56E16B20.5070001-l0cyMroinI0@public.gmane.org>
2016-03-10 13:18         ` Franklin S Cooper Jr.
2016-03-10 13:40       ` Franklin S Cooper Jr.
     [not found]         ` <56E17932.6090304-l0cyMroinI0@public.gmane.org>
2016-03-10 15:22           ` Roger Quadros
2016-03-10 15:24             ` Franklin S Cooper Jr.
2016-03-10  4:07 ` [PATCH v3 2/6] ARM: dts: am437x/am33xx: Fix GPMC dma properties Franklin S Cooper Jr
2016-03-10 12:51   ` Roger Quadros
     [not found]     ` <56E16DBF.40409-l0cyMroinI0@public.gmane.org>
2016-03-10 13:21       ` Franklin S Cooper Jr.
     [not found] ` <1457582861-20619-1-git-send-email-fcooper-l0cyMroinI0@public.gmane.org>
2016-03-10  4:07   ` [PATCH v3 3/6] mtd: nand: omap2: Support parsing dma channel information from DT Franklin S Cooper Jr
2016-03-10  4:07 ` Franklin S Cooper Jr [this message]
2016-03-10  4:07 ` [PATCH v3 5/6] mtd: nand: omap2: Fix high memory dma prefetch transfer Franklin S Cooper Jr
2016-03-10  4:07 ` [PATCH v3 6/6] ARM: OMAP2+: Update GPMC and NAND DT binding documentation Franklin S Cooper Jr

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1457582861-20619-5-git-send-email-fcooper@ti.com \
    --to=fcooper@ti.com \
    --cc=computersforpeace@gmail.com \
    --cc=devicetree@vger.kernel.org \
    --cc=dwmw2@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=nsekhar@ti.com \
    --cc=rogerq@ti.com \
    --cc=tony@atomide.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).