diff mbox series

mtd: rawnand: Fix return value check of wait_for_completion_timeout

Message ID 20220412020834.7161-1-linmq006@gmail.com
State Changes Requested
Headers show
Series mtd: rawnand: Fix return value check of wait_for_completion_timeout | expand

Commit Message

Miaoqian Lin April 12, 2022, 2:08 a.m. UTC
wait_for_completion_timeout() returns unsigned long not int.
It returns 0 if timed out, and positive if completed.
The check for <= 0 is ambiguous and should be == 0 here
indicating timeout which is the only error case.

Fixes: 83738d87e3a0 ("mtd: sh_flctl: Add DMA capabilty")
Signed-off-by: Miaoqian Lin <linmq006@gmail.com>
---
 drivers/mtd/nand/raw/sh_flctl.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Comments

kernel test robot April 12, 2022, 5:01 a.m. UTC | #1
Hi Miaoqian,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on mtd/nand/next]
[also build test WARNING on linus/master linux/master v5.18-rc2 next-20220411]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/intel-lab-lkp/linux/commits/Miaoqian-Lin/mtd-rawnand-Fix-return-value-check-of-wait_for_completion_timeout/20220412-101006
base:   https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git nand/next
config: hexagon-randconfig-r045-20220411 (https://download.01.org/0day-ci/archive/20220412/202204121253.NcZifMQi-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project fe2478d44e4f7f191c43fef629ac7a23d0251e72)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/3de25b46a3f73a3e0031e5186eb4e2afa9098b46
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Miaoqian-Lin/mtd-rawnand-Fix-return-value-check-of-wait_for_completion_timeout/20220412-101006
        git checkout 3de25b46a3f73a3e0031e5186eb4e2afa9098b46
        # save the config file to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash drivers/mtd/nand/raw/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> drivers/mtd/nand/raw/sh_flctl.c:433:6: warning: variable 'ret' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
           if (time_left == 0) {
               ^~~~~~~~~~~~~~
   drivers/mtd/nand/raw/sh_flctl.c:447:9: note: uninitialized use occurs here
           return ret;
                  ^~~
   drivers/mtd/nand/raw/sh_flctl.c:433:2: note: remove the 'if' if its condition is always true
           if (time_left == 0) {
           ^~~~~~~~~~~~~~~~~~~~
   drivers/mtd/nand/raw/sh_flctl.c:387:9: note: initialize the variable 'ret' to silence this warning
           int ret;
                  ^
                   = 0
   1 warning generated.


vim +433 drivers/mtd/nand/raw/sh_flctl.c

   377	
   378	static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
   379						int len, enum dma_data_direction dir)
   380	{
   381		struct dma_async_tx_descriptor *desc = NULL;
   382		struct dma_chan *chan;
   383		enum dma_transfer_direction tr_dir;
   384		dma_addr_t dma_addr;
   385		dma_cookie_t cookie;
   386		uint32_t reg;
   387		int ret;
   388		unsigned long time_left;
   389	
   390		if (dir == DMA_FROM_DEVICE) {
   391			chan = flctl->chan_fifo0_rx;
   392			tr_dir = DMA_DEV_TO_MEM;
   393		} else {
   394			chan = flctl->chan_fifo0_tx;
   395			tr_dir = DMA_MEM_TO_DEV;
   396		}
   397	
   398		dma_addr = dma_map_single(chan->device->dev, buf, len, dir);
   399	
   400		if (!dma_mapping_error(chan->device->dev, dma_addr))
   401			desc = dmaengine_prep_slave_single(chan, dma_addr, len,
   402				tr_dir, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
   403	
   404		if (desc) {
   405			reg = readl(FLINTDMACR(flctl));
   406			reg |= DREQ0EN;
   407			writel(reg, FLINTDMACR(flctl));
   408	
   409			desc->callback = flctl_dma_complete;
   410			desc->callback_param = flctl;
   411			cookie = dmaengine_submit(desc);
   412			if (dma_submit_error(cookie)) {
   413				ret = dma_submit_error(cookie);
   414				dev_warn(&flctl->pdev->dev,
   415					 "DMA submit failed, falling back to PIO\n");
   416				goto out;
   417			}
   418	
   419			dma_async_issue_pending(chan);
   420		} else {
   421			/* DMA failed, fall back to PIO */
   422			flctl_release_dma(flctl);
   423			dev_warn(&flctl->pdev->dev,
   424				 "DMA failed, falling back to PIO\n");
   425			ret = -EIO;
   426			goto out;
   427		}
   428	
   429		time_left =
   430		wait_for_completion_timeout(&flctl->dma_complete,
   431					msecs_to_jiffies(3000));
   432	
 > 433		if (time_left == 0) {
   434			dmaengine_terminate_all(chan);
   435			dev_err(&flctl->pdev->dev, "wait_for_completion_timeout\n");
   436			ret = -ETIMEDOUT;
   437		}
   438	
   439	out:
   440		reg = readl(FLINTDMACR(flctl));
   441		reg &= ~DREQ0EN;
   442		writel(reg, FLINTDMACR(flctl));
   443	
   444		dma_unmap_single(chan->device->dev, dma_addr, len, dir);
   445	
   446		/* ret > 0 is success */
   447		return ret;
   448	}
   449
diff mbox series

Patch

diff --git a/drivers/mtd/nand/raw/sh_flctl.c b/drivers/mtd/nand/raw/sh_flctl.c
index b85b9c6fcc42..4f326a2dd170 100644
--- a/drivers/mtd/nand/raw/sh_flctl.c
+++ b/drivers/mtd/nand/raw/sh_flctl.c
@@ -385,6 +385,7 @@  static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,
 	dma_cookie_t cookie;
 	uint32_t reg;
 	int ret;
+	unsigned long time_left;
 
 	if (dir == DMA_FROM_DEVICE) {
 		chan = flctl->chan_fifo0_rx;
@@ -425,13 +426,14 @@  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;
 	}
 
 out: