mtd: rawnand: Fix return value check of wait_for_completion_timeout
Subsystems (2)
PATCH 1/1 mtd: rawnand: Fix return value check of wait_for_completion_timeout
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.
--- drivers/mtd/nand/raw/sh_flctl.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/mtd/nand/raw/sh_flctl.c +4 -2
@@ -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:
Signature · 1 line
2.17.1
kernel test robot
build botThank you for the patch! Perhaps something to improve:
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/[email protected]/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
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;
^
= 01 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
Signature · 2 lines
0-DAY CI Kernel Test Service https://01.org/lkp
PATCH v2 1/1 mtd: rawnand: Fix return value check of wait_for_completion_timeout
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.
---
change in v2:
- initialize ret to 1.
--- drivers/mtd/nand/raw/sh_flctl.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/mtd/nand/raw/sh_flctl.c +5 -3
@@ -384,7 +384,8 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,dma_addr_t dma_addr;dma_cookie_t cookie;uint32_t reg; -int ret; +int ret =1 ; +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:
Signature · 6 lines
2.17.1 ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/
Miquel Raynal
maintainerHi Miaoqian,
[email protected] wrote on Tue, 12 Apr 2022 06:36:52 +0000:
Quoted 19 lines
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 <[email protected]>---
change in v2:
- initialize ret to 1.--- drivers/mtd/nand/raw/sh_flctl.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)drivers/mtd/nand/raw/sh_flctl.c +0
-0
drivers/mtd/nand/raw/sh_flctl.c static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, · line 387
Quoted 5 lines
drivers/mtd/nand/raw/sh_flctl.c +1
-1@@ -384,7 +384,8 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,dma_addr_t dma_addr;dma_cookie_t cookie;uint32_t reg; -int ret; +int ret =1 ;
Does not look right. I know this function returns > 0 on positive outcomes but this does not make any sense in the first place.
This function is static and only called twice, please turn it into something like:
if (dma_fifo_transfer())
error
else
ok
Quoted 11 lines
drivers/mtd/nand/raw/sh_flctl.c +2
-1+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,
drivers/mtd/nand/raw/sh_flctl.c static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, · line 439
Quoted 10 lines
drivers/mtd/nand/raw/sh_flctl.c +2
-1msecs_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:
Thanks,
Miquèl
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
Hi Miquel,
Thanks for your reply.
Quoted 18 lines · Miquel Raynal
Hi Miaoqian,
[email protected] wrote on Tue, 12 Apr 2022 06:36:52 +0000:
Quoted 14 lines
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 <[email protected]>---
change in v2:
- initialize ret to 1.--- drivers/mtd/nand/raw/sh_flctl.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
Quoted 12 lines
drivers/mtd/nand/raw/sh_flctl.c static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, · line 387
Quoted 10 lines
drivers/mtd/nand/raw/sh_flctl.c +1
-1@@ -384,7 +384,8 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,dma_addr_t dma_addr;dma_cookie_t cookie;uint32_t reg; -int ret; +int ret =1 ;Does not look right. I know this function returns > 0 on positive outcomes but this does not make any sense in the first place.
Yes, I made a mistake, Now I realize that in v2, it will return 1 in error path
when DMA submit failed.
And for patch v1, it will return 0 if calls wait_for_completion_timeout succeeds.
Quoted 7 lines
This function is static and only called twice, please turn it into something like:
if (
dma_fifo_transfer())
error
else
ok
So I want to keep ret>0 means success.
Or could I set ret > 0 after in wait_for_completion_timeout() success path?
like:
if(time_left == 0)
ret = -ETIMEDOUT;
else
ret = 1;
What do you think?
Thanks,
Quoted 20 lines
Quoted 20 lines
drivers/mtd/nand/raw/sh_flctl.c +4
-2+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 ; }
Quoted 4 lines
drivers/mtd/nand/raw/sh_flctl.c static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, · line 439
Quoted 1 line
drivers/mtd/nand/raw/sh_flctl.c +0
-0out:Thanks,
Miquèl
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
Miquel Raynal
maintainerHi Miaoqian,
[email protected] wrote on Tue, 12 Apr 2022 15:42:02 +0800:
Quoted 36 lines
Hi Miquel,
Thanks for your reply.
Quoted 18 lines · Miquel Raynal
Hi Miaoqian,
[email protected] wrote on Tue, 12 Apr 2022 06:36:52 +0000:
Quoted 14 lines
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 <[email protected]>---
change in v2:
- initialize ret to 1.--- drivers/mtd/nand/raw/sh_flctl.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)Quoted 12 lines
drivers/mtd/nand/raw/sh_flctl.c static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, · line 387
Quoted 10 lines
drivers/mtd/nand/raw/sh_flctl.c +1
-1@@ -384,7 +384,8 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,dma_addr_t dma_addr;dma_cookie_t cookie;uint32_t reg; -int ret; +int ret =1 ;Does not look right. I know this function returns > 0 on positive outcomes but this does not make any sense in the first place.
Quoted 3 lines
Yes, I made a mistake, Now I realize that in v2, it will return 1 in error path
when DMA submit failed.
Not 1, but a proper error code please (-ETIMEDOUT, -EINVAL, whatever)
Quoted 17 lines
And for patch v1, it will return 0 if calls
wait_for_completion_timeoutsucceeds.Quoted 7 lines
This function is static and only called twice, please turn it into something like:
if (
dma_fifo_transfer())
error
else
okSo I want to keep ret>0 means success.
Or could I set ret > 0 after in
wait_for_completion_timeout()success path?like:
Quoted 7 lines
if(time_left == 0)ret =
-ETIMEDOUT;else
ret = 1;
You can initialize ret to zero at to top. So that anything != 0 is an error (like a lot of functions in the kernel). And use:
if (dma_fifo_transfer()) error();
Quoted 30 lines
What do you think?
Thanks,
Quoted 24 lines
Quoted 11 lines
drivers/mtd/nand/raw/sh_flctl.c +2
-1+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,drivers/mtd/nand/raw/sh_flctl.c static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, · line 439
Quoted 10 lines
drivers/mtd/nand/raw/sh_flctl.c +2
-1msecs_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:Thanks,
Miquèl
Thanks,
Miquèl
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
Hi Miquel,
Quoted 53 lines · Miquel Raynal
Quoted 31 lines
Quoted 19 lines
Hi Miaoqian,
[email protected] wrote on Tue, 12 Apr 2022 06:36:52 +0000:
Quoted 14 lines
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 <[email protected]>---
change in v2:
- initialize ret to 1.--- drivers/mtd/nand/raw/sh_flctl.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)Quoted 12 lines
drivers/mtd/nand/raw/sh_flctl.c static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, · line 387
Quoted 10 lines
drivers/mtd/nand/raw/sh_flctl.c +1
-1@@ -384,7 +384,8 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,dma_addr_t dma_addr;dma_cookie_t cookie;uint32_t reg; -int ret; +int ret =1 ;Does not look right. I know this function returns > 0 on positive outcomes but this does not make any sense in the first place.
Quoted 3 lines
Yes, I made a mistake, Now I realize that in v2, it will return 1 in error path
when DMA submit failed.
Not 1, but a proper error code please (
-ETIMEDOUT,-EINVAL, whatever)Quoted 17 lines
And for patch v1, it will return 0 if calls
wait_for_completion_timeoutsucceeds.Quoted 7 lines
This function is static and only called twice, please turn it into something like:
if (
dma_fifo_transfer())
error
else
okSo I want to keep ret>0 means success.
Or could I set ret > 0 after in
wait_for_completion_timeout()success path?like:
if(time_left == 0)
Quoted 7 lines
Quoted 5 lines
ret =
-ETIMEDOUT;else
ret = 1;
You can initialize ret to zero at to top. So that anything != 0 is an error (like a lot of functions in the kernel).
Thanks for your advice, I will do this.
Quoted 4 lines
And use:
if (dma_fifo_transfer()) error();
I think keeping the original condition structure is better, something like:
if (dma_fifo_transfer()==0)
succeed();
In this way, only minor changes is needed——only need to update the symbol in condition. Otherwise It needs to restructure the code and be more complicated.
Thanks,
Quoted 25 lines
Quoted 25 lines
What do you think?
Thanks,
Quoted 20 lines
Quoted 20 lines
drivers/mtd/nand/raw/sh_flctl.c +4
-2+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 ; }
Quoted 6 lines
Quoted 3 lines
Quoted 3 lines
drivers/mtd/nand/raw/sh_flctl.c static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, · line 439
Quoted 1 line
drivers/mtd/nand/raw/sh_flctl.c +0
-0out:Thanks,
MiquèlThanks,
Miquèl
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
Miquel Raynal
maintainerHi Miaoqian,
[email protected] wrote on Tue, 12 Apr 2022 16:23:24 +0800:
Quoted 65 lines
Hi Miquel,
Quoted 53 lines · Miquel Raynal
Quoted 31 lines
Quoted 19 lines
Hi Miaoqian,
[email protected] wrote on Tue, 12 Apr 2022 06:36:52 +0000:
Quoted 14 lines
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 <[email protected]>---
change in v2:
- initialize ret to 1.--- drivers/mtd/nand/raw/sh_flctl.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)Quoted 12 lines
drivers/mtd/nand/raw/sh_flctl.c static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, · line 387
Quoted 10 lines
drivers/mtd/nand/raw/sh_flctl.c +1
-1@@ -384,7 +384,8 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,dma_addr_t dma_addr;dma_cookie_t cookie;uint32_t reg; -int ret; +int ret =1 ;Does not look right. I know this function returns > 0 on positive outcomes but this does not make any sense in the first place.
Quoted 3 lines
Yes, I made a mistake, Now I realize that in v2, it will return 1 in error path
when DMA submit failed.
Not 1, but a proper error code please (
-ETIMEDOUT,-EINVAL, whatever)Quoted 17 lines
And for patch v1, it will return 0 if calls
wait_for_completion_timeoutsucceeds.Quoted 7 lines
This function is static and only called twice, please turn it into something like:
if (
dma_fifo_transfer())
error
else
okSo I want to keep ret>0 means success.
Or could I set ret > 0 after in
wait_for_completion_timeout()success path?like:
if(time_left == 0)Quoted 7 lines
Quoted 5 lines
ret =
-ETIMEDOUT;else
ret = 1;
You can initialize ret to zero at to top. So that anything != 0 is an error (like a lot of functions in the kernel).
Thanks for your advice, I will do this.
Quoted 8 lines
Quoted 4 lines
And use:
if (dma_fifo_transfer()) error();I think keeping the original condition structure is better, something like:
if (dma_fifo_transfer()==0)
if (cond && cond && !dma_fifo_transfer())
Quoted 39 lines
succeed();In this way, only minor changes is needed——only need to update the symbol in condition. Otherwise It needs to restructure the code and be more complicated.
Thanks,
Quoted 31 lines
Quoted 28 lines
What do you think?
Thanks,
Quoted 23 lines
Quoted 11 lines
drivers/mtd/nand/raw/sh_flctl.c +2
-1+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,drivers/mtd/nand/raw/sh_flctl.c static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, · line 439
Quoted 10 lines
drivers/mtd/nand/raw/sh_flctl.c +2
-1msecs_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:Thanks,
MiquèlThanks,
Miquèl
Thanks,
Miquèl
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
PATCH v3 1/1 mtd: rawnand: Fix return value check of wait_for_completion_timeout
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.
---
change in v2:
- initialize ret to 1.
---
changes in v3:
- initialize ret to 0, now ret==0 means success.
- update condition check in caller.
--- drivers/mtd/nand/raw/sh_flctl.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
drivers/mtd/nand/raw/sh_flctl.c +8 -6
@@ -384,7 +384,8 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,dma_addr_t dma_addr;dma_cookie_t cookie;uint32_t reg; -int ret; +int ret =0 ; +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:
@@ -441,7 +443,7 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf,dma_unmap_single (chan->device->dev, dma_addr, len, dir); -/* ret > 0 is success */ +/* ret == 0 is success */ return ret; }
@@ -465,7 +467,7 @@ static void read_fiforeg(struct sh_flctl *flctl, int rlen, int offset)/* initiate DMA transfer */ if (flctl->chan_fifo0_rx && rlen >=32 && -flctl_dma_fifo0_transfer (flctl, buf, rlen,DMA_FROM_DEVICE ) >0 ) + !flctl_dma_fifo0_transfer (flctl, buf, rlen,DMA_FROM_DEVICE )) goto convert;/* DMA success */ /* do polling transfer */
@@ -524,7 +526,7 @@ static void write_ec_fiforeg(struct sh_flctl *flctl, int rlen,/* initiate DMA transfer */ if (flctl->chan_fifo0_tx && rlen >=32 && -flctl_dma_fifo0_transfer (flctl, buf, rlen,DMA_TO_DEVICE ) >0 ) + !flctl_dma_fifo0_transfer (flctl, buf, rlen,DMA_TO_DEVICE ))return ;/* DMA success */ /* do polling transfer */
Signature · 6 lines
2.17.1 ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/
Quoted 7 lines · Miaoqian Lin
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 <[email protected]>
Applied to https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git mtd/fixes, thanks.
Miquel
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/