linux-stable/drivers/mtd/nand
Brian Norris 9ebfdf5b18 mtd: nand: check status before reporting timeout
In commit b70af9bef4 ("mtd: nand: increase ready wait timeout and
report timeouts"), we increased the likelihood of scheduling during
nand_wait(). This makes us more likely to hit the time_before(...)
condition, since a lot of time may pass before we get scheduled again.

Now, the loop was already buggy, since we don't check if the NAND is
ready after exiting the loop; we simply print out a timeout warning. Fix
this by doing a final status check before printing a timeout message.

This isn't actually a critical bug, since the only effect is a false
warning print. But too many prints never hurt anyone, did they? :)

Side note: perhaps I'm not smart enough, but I'm not sure what the best
policy is for this kind of loop; do we busy loop (i.e., no
cond_resched()) to keep the lowest I/O latency (it's not great if the
resched is delaying Richard's system ~400ms)? Or do we allow
rescheduling, to play nice with the rest of the system (since some
operations can take quite a while)?

Reported-by: Richard Weinberger <richard@nod.at>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Reviewed-by: Richard Weinberger <richard@nod.at>
Reviewed-by: Harvey Hunt <harvey.hunt@imgtec.com>
2016-03-07 13:51:11 -08:00
..
bcm47xxnflash mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
brcmnand mtd: brcmnand: Fix v7.1 register offsets 2016-02-29 22:29:05 +00:00
gpmi-nand mtd: nand: gpmi: may use minimum required ecc for 744 oobsize NAND 2016-01-23 14:45:57 -08:00
ams-delta.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
atmel_nand.c mtd: atmel_nand: Support 32-bit ECC strength 2016-02-12 10:27:48 -08:00
atmel_nand_ecc.h mtd: atmel_nand: Support 32-bit ECC strength 2016-02-12 10:27:48 -08:00
atmel_nand_nfc.h mtd: atmel_nand: Support variable RB_EDGE interrupts 2016-02-12 10:27:46 -08:00
au1550nd.c mtd: nand: remove useless mtd->priv = chip assignments 2015-12-18 13:21:40 -08:00
bf5xx_nand.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
cafe_nand.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
cmx270_nand.c mtd: nand: remove useless mtd->priv = chip assignments 2015-12-18 13:21:40 -08:00
cs553x_nand.c mtd: nand: remove useless mtd->priv = chip assignments 2015-12-18 13:21:40 -08:00
davinci_nand.c mtd: nand: davinci: remove custom 'erased check' implementation 2016-01-06 18:53:46 -08:00
denali.c mtd: nand: remove useless mtd->priv = chip assignments 2015-12-18 13:21:40 -08:00
denali.h mtd: nand: denali: use the mtd instance embedded in struct nand_chip 2015-12-18 13:13:50 -08:00
denali_dt.c mtd: nand: drop owner assignment from platform_drivers 2014-10-20 16:20:58 +02:00
denali_pci.c mtd: denali_pci: switch to dev_err() 2015-08-18 17:21:37 -07:00
diskonchip.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
docg4.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
fsl_elbc_nand.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
fsl_ifc_nand.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
fsl_upm.c mtd: nand: remove useless mtd->priv = chip assignments 2015-12-18 13:21:40 -08:00
fsmc_nand.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
gpio.c mtd: nand: remove useless mtd->priv = chip assignments 2015-12-18 13:21:40 -08:00
hisi504_nand.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
jz4740_nand.c mtd: nand: jz4740: kill the ->ecc_layout field 2016-01-26 10:27:35 -08:00
jz4780_bch.c mtd: nand: jz4780: Update ecc correction error codes 2016-01-08 09:44:30 -08:00
jz4780_bch.h mtd: nand: jz4780: driver for NAND devices on JZ4780 SoCs 2016-01-07 09:35:11 -08:00
jz4780_nand.c mtd: jz4780_nand: replace if/else blocks with switch/case 2016-01-08 09:49:03 -08:00
Kconfig mtd: cs553x: Fix dependencies for !HAS_IOMEM archs 2016-02-01 09:37:03 -08:00
lpc32xx_mlc.c mtd: nand: lpc32xx_mlc: fix ecc.size 2016-01-26 10:27:37 -08:00
lpc32xx_slc.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
Makefile mtd: nand: jz4780: driver for NAND devices on JZ4780 SoCs 2016-01-07 09:35:11 -08:00
mpc5121_nfc.c mtd: nand: mpc5121: use 'of_machine_is_compatible' to simplify code 2016-01-22 16:35:25 -08:00
mxc_nand.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
nand_base.c mtd: nand: check status before reporting timeout 2016-03-07 13:51:11 -08:00
nand_bbt.c mtd: nand: remove EXPORT_SYMBOL of nand_scan_bbt() 2016-01-23 14:00:14 -08:00
nand_bch.c mtd: nand: return consistent error codes in ecc.correct() implementations 2016-01-06 18:45:46 -08:00
nand_ecc.c mtd: nand: return consistent error codes in ecc.correct() implementations 2016-01-06 18:45:46 -08:00
nand_ids.c mtd: nand: add NAND_NEED_SCRAMBLING flag to the H27UCG8T2ATR-BC definition 2016-01-22 16:36:54 -08:00
nand_timings.c mtd: nand: Use ULL-suffix for big u64 constant 2014-08-19 11:53:09 -07:00
nandsim.c mtd: nandsim: use nand_get_controller_data() 2016-01-07 12:25:58 -08:00
ndfc.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
nuc900_nand.c mtd: nuc900_nand: read correct SMISR register 2016-01-15 10:02:09 -08:00
omap2.c mtd: nand: return consistent error codes in ecc.correct() implementations 2016-01-06 18:45:46 -08:00
omap_elm.c mtd: omap_elm: print interrupt resource using %pr 2015-12-18 10:16:17 -08:00
orion_nand.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
pasemi_nand.c mtd: nand: remove useless mtd->priv = chip assignments 2015-12-18 13:21:40 -08:00
plat_nand.c mtd: nand: kill unused ->ecclayout field in platform_nand_chip struct 2016-01-26 10:27:36 -08:00
pxa3xx_nand.c mtd: nand: pxa3xx_nand: kill unused field 'drcmr_cmd' 2016-03-07 12:49:22 -08:00
r852.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
r852.h mtd: nand: r852: use the mtd instance embedded in struct nand_chip 2015-12-18 10:54:41 -08:00
s3c2410.c mtd: nand: s3c2410: kill the ->ecc_layout field 2016-01-26 10:27:35 -08:00
sh_flctl.c mtd: sh_flctl: pass FIFO as physical address 2015-12-18 18:27:13 -08:00
sharpsl.c mtd: nand: remove useless mtd->priv = chip assignments 2015-12-18 13:21:40 -08:00
sm_common.c mtd: nand: make use of mtd_to_nand() in NAND drivers 2015-12-08 12:24:36 -08:00
sm_common.h mtd: use __packed shorthand 2014-08-19 11:53:08 -07:00
socrates_nand.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
sunxi_nand.c mtd: nand: sunxi: remove direct mtd->priv accesses 2016-03-04 16:17:20 -08:00
tmio_nand.c mtd: nand: remove useless mtd->priv = chip assignments 2015-12-18 13:21:40 -08:00
txx9ndfmc.c mtd: nand: make use of nand_set/get_controller_data() helpers 2016-01-07 10:23:41 -08:00
vf610_nfc.c mtd: nand: vf610: remove useless mtd->ecclayout assignment 2016-01-26 10:27:38 -08:00
xway_nand.c mtd: nand: make use of mtd_to_nand() in NAND drivers 2015-12-08 12:24:36 -08:00