diff options
author | Anton Vorontsov <avorontsov@ru.mvista.com> | 2008-03-28 22:10:54 +0300 |
---|---|---|
committer | David Woodhouse <dwmw2@infradead.org> | 2008-04-22 21:13:53 +0100 |
commit | 0ff6631be150702ed4c92b46b77941affee866ba (patch) | |
tree | efce0cfff80141c4f432d89d872d4db9d1802cbf /drivers/mtd | |
parent | 93919d384df98eba02bebd417ecb2f481b3bdcb8 (diff) | |
download | linux-stable-0ff6631be150702ed4c92b46b77941affee866ba.tar.gz linux-stable-0ff6631be150702ed4c92b46b77941affee866ba.tar.bz2 linux-stable-0ff6631be150702ed4c92b46b77941affee866ba.zip |
[MTD] [NAND] fsl_elbc_nand: workaround for hangs during nand write
Using current driver elbc sometimes hangs during nand write. Reading back
last byte helps though (thanks to Scott Wood for the idea).
Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
Acked-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Diffstat (limited to 'drivers/mtd')
-rw-r--r-- | drivers/mtd/nand/fsl_elbc_nand.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/mtd/nand/fsl_elbc_nand.c b/drivers/mtd/nand/fsl_elbc_nand.c index 919c192b8f27..4b69aacdf5ca 100644 --- a/drivers/mtd/nand/fsl_elbc_nand.c +++ b/drivers/mtd/nand/fsl_elbc_nand.c @@ -481,7 +481,7 @@ static void fsl_elbc_write_buf(struct mtd_info *mtd, const u8 *buf, int len) struct fsl_elbc_ctrl *ctrl = priv->ctrl; unsigned int bufsize = mtd->writesize + mtd->oobsize; - if (len < 0) { + if (len <= 0) { dev_err(ctrl->dev, "write_buf of %d bytes", len); ctrl->status = 0; return; @@ -496,6 +496,15 @@ static void fsl_elbc_write_buf(struct mtd_info *mtd, const u8 *buf, int len) } memcpy_toio(&ctrl->addr[ctrl->index], buf, len); + /* + * This is workaround for the weird elbc hangs during nand write, + * Scott Wood says: "...perhaps difference in how long it takes a + * write to make it through the localbus compared to a write to IMMR + * is causing problems, and sync isn't helping for some reason." + * Reading back the last byte helps though. + */ + in_8(&ctrl->addr[ctrl->index] + len - 1); + ctrl->index += len; } |