From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-out.m-online.net ([212.18.0.9]) by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1SzeE9-0008Mt-R0 for linux-mtd@lists.infradead.org; Fri, 10 Aug 2012 01:41:27 +0000 From: Marek Vasut To: Fabio Estevam Subject: Re: Kernel crashes when CONFIG_MTD_NAND_VERIFY_WRITE=y Date: Fri, 10 Aug 2012 03:41:22 +0200 References: <201208100153.51140.marex@denx.de> In-Reply-To: MIME-Version: 1.0 Content-Type: Text/Plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Message-Id: <201208100341.23167.marex@denx.de> Cc: Shawn Guo , Subodh Nijsure , Huang Shijie , linux-mtd@lists.infradead.org, Sascha Hauer , computersforpeace@gmail.com List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Dear Fabio Estevam, > 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: > > --- 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; > +} NAK! This is only a workaround, proper implementation is needed. If it's not implemented now, I'm pretty sure such workaround will be there forever. > /* > * 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; > > Now we need to come up with a real gpmi_verify_buf function ;-) > > Regards, > > Fabio Estevam Best regards, Marek Vasut