mtd: nand: pxa3xx: Clear need_wait flag when starting a command
authorEzequiel Garcia <ezequiel.garcia@free-electrons.com>
Wed, 18 Dec 2013 21:44:08 +0000 (18:44 -0300)
committerBrian Norris <computersforpeace@gmail.com>
Fri, 3 Jan 2014 19:22:26 +0000 (11:22 -0800)
Currently the driver assumes all commands will eventually trigger a RnB
transition, and thus a "device is ready" IRQ.

This assumption means that on every issued command, the dev_ready completion
handler is init'ed and the need_wait flag is set.

However this is incorrect: some commands (such as NAND_CMD_STATUS) don't
make the device 'busy' and thus a RnB transition never occurs.
Given, the NAND core never calls waitfunc() after such commands, this
is not a problem.

Therefore, it's possible to only clear the need_wait flag on every command
that is started.

This fixes a current bug that can be reproduced on PXA boards by writing
blank (all 0xff'ed) to a page:

  1. The kernel issues NAND_CMD_STATUS and sets need_wait=1. The flag
     won't be cleared for this command since no RnB transition is
     involved.

  2. NAND_CMD_PAGEPROG is issued but since the data is blank, the driver
     decides not to execute the command (and no IRQ activity is
     involved).

  3. The NAND core calls waitfunc() and waits for the dev_ready
     completion, which will never end since the device _is_ already ready.

Tested-by: Arnaud Ebalard <arno@natisbad.org>
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
drivers/mtd/nand/pxa3xx_nand.c

index 8f38abdb3310f665812a79caea14578e2b2a1927..9828033721852f0f741b7c36894dc3026eb90d80 100644 (file)
@@ -690,6 +690,7 @@ static void prepare_start_command(struct pxa3xx_nand_info *info, int command)
        info->retcode           = ERR_NONE;
        info->ecc_err_cnt       = 0;
        info->ndcb3             = 0;
+       info->need_wait         = 0;
 
        switch (command) {
        case NAND_CMD_READ0: