mtd: rawnand: check return code of nand_reset() and nand_readid_op()
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Mon, 21 Jan 2019 13:05:34 +0000 (22:05 +0900)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Tue, 5 Feb 2019 15:56:11 +0000 (16:56 +0100)
commitf9ffb406d35b38e026acf56f39efcefede1f232e
tree9d80a9357d6a824ad79e8c9572d25ff4156ea481
parent2d73f3d66b7052c0175f9f33d271ae50826c222e
mtd: rawnand: check return code of nand_reset() and nand_readid_op()

nand_scan_ident() iterates over maxchips to find as many homogeneous
chips as possible.

Since commit 2d472aba15ff ("mtd: nand: document the NAND
controller/NAND chip DT representation"), new drivers should pass in
the exact number of CS lines instead of possible max, but old
platforms may still rely on nand_scan_ident() to detect the actual
number of connected CS lines.

In that case, this loop bails out when manufacturer or device ID
unmatches. The reason of unmatch is most likely no chip is connected
to that CS line. If so, nand_reset() should already have failed,
and the following nand_readid_op() is pointless.

Before ->exec_op hook was introduced, drivers had no way to tell
the failure of NAND_CMD_RESET to the framework because the legacy
->cmdfunc() has void return type. Now drivers implementing ->exec_op
hook can return the error code. You can save nand_readid_op() by
checking the return value of nand_reset(). The return value of
nand_readid_op() should be checked as well. If it fails, probably
id[0] and id[1] are undefined values.

Just for consistency, it should be sensible to check the return
code in nand_do_write_oob() as well.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Reviewed-by: Boris Brezillon <bbrezillon@kernel.org>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
drivers/mtd/nand/raw/nand_base.c