| From 30863e38ebeb500a31cecee8096fb5002677dd9b Mon Sep 17 00:00:00 2001 |
| From: Brent Taylor <motobud@gmail.com> |
| Date: Mon, 30 Oct 2017 22:32:45 -0500 |
| Subject: mtd: nand: Fix writing mtdoops to nand flash. |
| |
| From: Brent Taylor <motobud@gmail.com> |
| |
| commit 30863e38ebeb500a31cecee8096fb5002677dd9b upstream. |
| |
| When mtdoops calls mtd_panic_write(), it eventually calls |
| panic_nand_write() in nand_base.c. In order to properly wait for the |
| nand chip to be ready in panic_nand_wait(), the chip must first be |
| selected. |
| |
| When using the atmel nand flash controller, a panic would occur due to |
| a NULL pointer exception. |
| |
| Fixes: 2af7c6539931 ("mtd: Add panic_write for NAND flashes") |
| Signed-off-by: Brent Taylor <motobud@gmail.com> |
| Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| |
| --- |
| drivers/mtd/nand/nand_base.c | 9 ++++++--- |
| 1 file changed, 6 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/mtd/nand/nand_base.c |
| +++ b/drivers/mtd/nand/nand_base.c |
| @@ -2501,15 +2501,18 @@ static int panic_nand_write(struct mtd_i |
| size_t *retlen, const uint8_t *buf) |
| { |
| struct nand_chip *chip = mtd->priv; |
| + int chipnr = (int)(to >> chip->chip_shift); |
| struct mtd_oob_ops ops; |
| int ret; |
| |
| - /* Wait for the device to get ready */ |
| - panic_nand_wait(mtd, chip, 400); |
| - |
| /* Grab the device */ |
| panic_nand_get_device(chip, mtd, FL_WRITING); |
| |
| + chip->select_chip(mtd, chipnr); |
| + |
| + /* Wait for the device to get ready */ |
| + panic_nand_wait(mtd, chip, 400); |
| + |
| ops.len = len; |
| ops.datbuf = (uint8_t *)buf; |
| ops.oobbuf = NULL; |