Skip to content

Commit

Permalink
mtd: nand: omap2: Start dma request before enabling prefetch
Browse files Browse the repository at this point in the history
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 a dma 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 <[email protected]>
Signed-off-by: Boris Brezillon <[email protected]>
  • Loading branch information
fcooperti authored and Boris Brezillon committed May 5, 2016
1 parent 7778478 commit 03d3a1d
Showing 1 changed file with 5 additions and 4 deletions.
9 changes: 5 additions & 4 deletions drivers/mtd/nand/omap2.c
Original file line number Diff line number Diff line change
Expand Up @@ -503,17 +503,18 @@ 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);
if (ret)
/* 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));
Expand Down

0 comments on commit 03d3a1d

Please sign in to comment.