From patchwork Thu Mar 10 23:56:41 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Franklin Cooper X-Patchwork-Id: 8560761 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 448D49F2B4 for ; Thu, 10 Mar 2016 23:58:09 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 6EE4120381 for ; Thu, 10 Mar 2016 23:58:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id E16E020380 for ; Thu, 10 Mar 2016 23:58:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933178AbcCJX6B (ORCPT ); Thu, 10 Mar 2016 18:58:01 -0500 Received: from mail-ob0-f194.google.com ([209.85.214.194]:34223 "EHLO mail-ob0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933231AbcCJX4z (ORCPT ); Thu, 10 Mar 2016 18:56:55 -0500 Received: by mail-ob0-f194.google.com with SMTP id wz1so7587639obc.1; Thu, 10 Mar 2016 15:56: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=2yTnoYFFh4wXHw+FK9eO6EXtkFyVb48BeRFFm0vdnrw=; b=hKcxMu+rZEnLpSq1l27Y9XLX/4vsV+baPEratRnTPMfwAlmAJESo/23mEbA/y62SVV 9X9ahzD6T/SJlihtpYDlFHAXwpTlLkellTTfRwc1znDnFfkqJ444XQzjuL7rY/Lq2hqW 044DXxvZ1NcS7V0C4CuKtJopcaEVcZrvdD/vDULkzhp2GSSU/PdZHc9mool3+xFoObbC XPvJFCcjcf2Qpt44Yhup5ovzC4YZTw91PG3DwI2GGGFaw/O57amjrxCcMpg7oS+F+DDP KBBvBHiOJCDiAnRsbWQzlx1Sq1sslQExdQbcYVojrcxzJ7BM+bBOflwd5djhEyogle96 VuIQ== X-Gm-Message-State: AD7BkJIbwwSAig2HNWW3s2pbvKAWBWmG4QFYQxXdu99Xds+ifQqAOk011EvejrTmA7QTXg== X-Received: by 10.60.70.1 with SMTP id i1mr4024060oeu.13.1457654214487; Thu, 10 Mar 2016 15:56:54 -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 d1sm2907073oby.16.2016.03.10.15.56.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 10 Mar 2016 15:56:53 -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 v4 5/7] mtd: nand: omap2: Start dma request before enabling prefetch Date: Thu, 10 Mar 2016 17:56:41 -0600 Message-Id: <1457654203-20856-6-git-send-email-fcooper@ti.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1457654203-20856-1-git-send-email-fcooper@ti.com> References: <1457654203-20856-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 95bc636..0863a83 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));