From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from hofr.at ([212.69.189.236] helo=mail.hofr.at) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1YoRFC-0004Jw-8x for linux-mtd@lists.infradead.org; Sat, 02 May 2015 06:49:47 +0000 Date: Sat, 2 May 2015 08:49:18 +0200 From: Nicholas Mc Guire To: Laurent Pinchart Subject: Re: [PATCH 1/3] mtd: sh_flctl: fixup wait_for_completion_timeout return handling Message-ID: <20150502064917.GA17454@opentech.at> References: <1430489763-18417-1-git-send-email-hofrat@osadl.org> <1840948.DRGdB3Gx66@avalon> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1840948.DRGdB3Gx66@avalon> Cc: Laurent Pinchart , Arnd Bergmann , Kuninori Morimoto , Wolfram Sang , Vinod Koul , linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org, Nicholas Mc Guire , Brian Norris , David Woodhouse List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , On Sat, 02 May 2015, Laurent Pinchart wrote: > Hi Nicholas, > > Thank you for the patch. > > On Friday 01 May 2015 16:16:01 Nicholas Mc Guire wrote: > > wait_for_completion_timeout() returns unsigned long not int so the check > > for <= should be == and the type unsigned long. This fixes up the return > > value handling and returns -ETIMEDOUT on timeout rather than 0 and 1 on > > on success rather than a more or less random remaining number of jiffies. > > > > Signed-off-by: Nicholas Mc Guire > > --- > > > > call sites: > > read_fiforeg,write_ec_fiforeg assume > 0 == success > > and the comment in flctl_dma_fifo0_transfe states > > /* ret > 0 is success */ > > return ret; > > since it is only checking for > 0 in the call-sites > > returning -ETIMEDOUT should be fine. > > > > Patch was compile tested with ap325rxa_defconfig (implies > > CONFIG_MTD_NAND_SH_FLCTL=y) > > > > Patch is against 4.1-rc1 (localversion-next is -next-20150501) > > > > drivers/mtd/nand/sh_flctl.c | 9 ++++++--- > > 1 file changed, 6 insertions(+), 3 deletions(-) > > > > diff --git a/drivers/mtd/nand/sh_flctl.c b/drivers/mtd/nand/sh_flctl.c > > index c3ce81c..4450864 100644 > > --- a/drivers/mtd/nand/sh_flctl.c > > +++ b/drivers/mtd/nand/sh_flctl.c > > @@ -354,6 +354,7 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl > > *flctl, unsigned long *buf, dma_cookie_t cookie = -EINVAL; > > uint32_t reg; > > int ret; > > + unsigned long time_left; > > > > if (dir == DMA_FROM_DEVICE) { > > chan = flctl->chan_fifo0_rx; > > @@ -388,14 +389,16 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl > > *flctl, unsigned long *buf, goto out; > > } > > > > - ret = > > + time_left = > > wait_for_completion_timeout(&flctl->dma_complete, > > msecs_to_jiffies(3000)); > > > > - if (ret <= 0) { > > + if (time_left == 0) { > > dmaengine_terminate_all(chan); > > dev_err(&flctl->pdev->dev, "wait_for_completion_timeout\n"); > > - } > > + ret = -ETIMEDOUT; > > + } else > > + ret = 1; /* completion succeeded */ > > I'd go one step further and make this function return < 0 on error and 0 on > success, like usually done through the kernel API. You could then simplify the > code using something like > > if (!wait_for_completion_timeout(&flctl->dma_complete, > msecs_to_jiffies(3000))) { > dmaengine_terminate_all(chan); > dev_err(&flctl->pdev->dev, "wait_for_completion_timeout\n"); > ret = -ETIMEDOUT; > } > > (pre-initializing ret to 0) > > > > > out: > > reg = readl(FLINTDMACR(flctl)); > ok - given that this needs some fixup anyway due to not properly reading dmaengine_submit() - I'll fix things up and re-submit. thx! hofrat