From patchwork Thu Mar 10 04:07:39 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Franklin Cooper X-Patchwork-Id: 8553711 Return-Path: X-Original-To: patchwork-linux-omap@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id B3CE29F38C for ; Thu, 10 Mar 2016 04:08:48 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id DDED3202DD for ; Thu, 10 Mar 2016 04:08:47 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id E0C98202E9 for ; Thu, 10 Mar 2016 04:08:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965356AbcCJEH5 (ORCPT ); Wed, 9 Mar 2016 23:07:57 -0500 Received: from mail-oi0-f67.google.com ([209.85.218.67]:36383 "EHLO mail-oi0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965314AbcCJEH4 (ORCPT ); Wed, 9 Mar 2016 23:07:56 -0500 Received: by mail-oi0-f67.google.com with SMTP id c129so4059839oif.3; Wed, 09 Mar 2016 20:07:55 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=8Di15ssyxtRfduJK2pQ48oWtHJMSDx5J696E+LeDc+4=; b=OLKkddw/Z5KWk91B4z2ntADTHGbBToVtwwmMB8bppsjESHWBkUMjP1idb+5AvwbVTJ VVg5QJnB2wRd6Llwc9pDBJ2fF/ho+JeVFIWrDDnP87eY0SGM38D9XWUtjdrKuXzyGdOS /7JQVQRgh/lcfEQWpQM0esY02zF1YokEG6wxEqeSus7mZz/VMxZ0oT39olbV9jWjXk2f XlIjMQtlJvPsaRg+3+BcWoqETGIMTJoJTsj6rmZ8pIDghAMEBXDP+BHUPljt4pOm0zCf QR5+PywCde4M1YFFt7kIw2ybaEPPHZv9l2s6j5c3eEsQj9rm5HX0e77itbsT5D9fZq1p zvow== X-Gm-Message-State: AD7BkJKZYm5/f5AEvgyz49GNpggic9SmYp27qe+2nXzmrpBjXTlgHHZ6XXsvde6pH8/BGg== X-Received: by 10.202.206.205 with SMTP id e196mr753886oig.88.1457582875509; Wed, 09 Mar 2016 20:07:55 -0800 (PST) Received: from beast-server.fios-router.home (pool-173-57-21-86.dllstx.fios.verizon.net. [173.57.21.86]) by smtp.gmail.com with ESMTPSA id u8sm1043390obf.5.2016.03.09.20.07.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 09 Mar 2016 20:07:54 -0800 (PST) From: Franklin S Cooper Jr 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 Subject: [PATCH v3 4/6] mtd: nand: omap2: Start dma request before enabling prefetch Date: Wed, 9 Mar 2016 22:07:39 -0600 Message-Id: <1457582861-20619-5-git-send-email-fcooper@ti.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457582861-20619-1-git-send-email-fcooper@ti.com> References: <1457582861-20619-1-git-send-email-fcooper@ti.com> Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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 --- 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));