From mboxrd@z Thu Jan 1 00:00:00 1970 From: Peter Pan Date: Fri, 30 Sep 2011 23:35:31 +0800 Subject: [U-Boot] The command "nand write.yaffs" is not working correctly In-Reply-To: References: Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Thank you, Zhengxiong. The patch seems reasonable. My nand flash has no bad block currently. That need_skip will skip the oob write part. I will check that after the golden holiday. ? 2011-9-30 ??5:10?"Jin Zhengxiong-R64188" ??? >> -----Original Message----- >> From: u-boot-bounces at lists.denx.de [mailto:u-boot-bounces at lists.denx.de] On >> Behalf Of Peter Pan >> Sent: Wednesday, September 21, 2011 9:09 AM >> To: u-boot at lists.denx.de >> Subject: [U-Boot] The command "nand write.yaffs" is not working correctly >> >> I'm recently facing a yaffs2 image write problem in u-boot. >> >> In u-boot console, I write the yaffs2 image in ram to an already erased nand >> flash with command "nand write.yaffs ${loadaddr} ${nandrootoffset} ${filesize}". >> After that, if I boot using a ramdisk and mount that yaffs2 partition, I can >> only see a folder of "lost+fount". I seems nothing has been written into that >> partition. >> >> But if now I write this image using "nandwrite -a -o /dev/mtd4 yaffs2.img" and >> mount that partition, it's working. >> >> Anyone met that problem already? Or if I did anything wrong? > > [Jin Zhengxiong-R64188] > I once met the similar issue with 2011.03 base and fixed it with following patch, But > I didn't do a detail checking for that, FYI... > > @@ -499,6 +499,7 @@ int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length, > return -EINVAL; > } > > +#ifndef CONFIG_CMD_NAND_YAFFS > if (!need_skip) { > rval = nand_write (nand, offset, length, buffer); > if (rval == 0) > @@ -509,13 +510,12 @@ int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length, > offset, rval); > return rval; > } > - > +#endif > while (left_to_write > 0) { > size_t block_offset = offset & (nand->erasesize - 1); > size_t write_size; > > WATCHDOG_RESET (); > - > if (nand_block_isbad (nand, offset & ~(nand->erasesize - 1))) { > printf ("Skip bad block 0x%08llx\n", > offset & ~(nand->erasesize - 1)); > @@ -546,7 +546,7 @@ int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length, > ops.oobbuf = ops.datbuf + pagesize; > > rval = nand->write_oob(nand, offset, &ops); > - if (!rval) > + if ( rval != 0) > break; > > offset += pagesize; > >