From patchwork Fri Aug 10 01:36:16 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Kernel crashes when CONFIG_MTD_NAND_VERIFY_WRITE=y Date: Thu, 09 Aug 2012 15:36:16 -0000 From: Fabio Estevam X-Patchwork-Id: 176307 Message-Id: To: Marek Vasut Cc: Shawn Guo , Subodh Nijsure , Huang Shijie , linux-mtd@lists.infradead.org, Sascha Hauer , computersforpeace@gmail.com Hi Marek, On Thu, Aug 9, 2012 at 8:53 PM, Marek Vasut wrote: > This problem is there because the GPMI NAND code doesn't implement verify buffer > function and defaults to nand_verify_buf() call in nand_base.c: Yes, you are right. > Now the chip->IO_ADDR_R is zero, making the kernel access bogus location, and > therefore crash. So the correct solution is to properly implement the struct > nand_chip *'s verify_buf function. Right, the patch below prevents the kernel to happen: Now we need to come up with a real gpmi_verify_buf function ;-) Regards, Fabio Estevam --- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c @@ -857,6 +857,15 @@ static uint8_t gpmi_read_byte(struct mtd_info *mtd) return buf[0]; } +/* Used by the upper layer to verify the data in NAND Flash + * with the data in the buf. */ +static int gpmi_verify_buf(struct mtd_info *mtd, + const u_char *buf, int len) +{ + /* TODO: implement verify_buf mechanism */ + return 0; +} + /* * Handles block mark swapping. * It can be called in swapping the block mark, or swapping it back, @@ -1568,6 +1577,7 @@ static int __devinit gpmi_nfc_init(struct gpmi_nand_data *this) chip->ecc.size = 1; chip->ecc.strength = 8; chip->ecc.layout = &gpmi_hw_ecclayout; + chip->verify_buf = gpmi_verify_buf; if (of_get_nand_on_flash_bbt(this->dev->of_node)) chip->bbt_options |= NAND_BBT_USE_FLASH | NAND_BBT_NO_OOB;