You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.8 KiB
50 lines
1.8 KiB
From 7efaa8677ffd07d54d0122b5e92f29b74a36ad39 Mon Sep 17 00:00:00 2001
|
|
From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
|
|
Date: Thu, 19 Dec 2013 06:08:03 -0300
|
|
Subject: [PATCH 162/203] mtd: nand: pxa3xx: Clear need_wait flag when starting
|
|
a command
|
|
|
|
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>
|
|
---
|
|
drivers/mtd/nand/pxa3xx_nand.c | 1 +
|
|
1 file changed, 1 insertion(+)
|
|
|
|
--- a/drivers/mtd/nand/pxa3xx_nand.c
|
|
+++ b/drivers/mtd/nand/pxa3xx_nand.c
|
|
@@ -694,6 +694,7 @@ static void prepare_start_command(struct
|
|
info->retcode = ERR_NONE;
|
|
info->ecc_err_cnt = 0;
|
|
info->ndcb3 = 0;
|
|
+ info->need_wait = 0;
|
|
|
|
switch (command) {
|
|
case NAND_CMD_READ0:
|
|
|