From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.windriver.com ([147.11.1.11]) by bombadil.infradead.org with esmtps (Exim 4.69 #1 (Red Hat Linux)) id 1NdE9o-0002Ck-GG for linux-mtd@lists.infradead.org; Fri, 05 Feb 2010 02:43:00 +0000 Message-ID: <4B6B86EE.5050803@windriver.com> Date: Fri, 05 Feb 2010 10:48:14 +0800 From: "stanley.miao" MIME-Version: 1.0 To: Maxim Levitsky Subject: Re: [PATCH 10/17] MTD: nand: make reads using MTD_OOB_RAW affect only ECC validation References: <1265326257-4446-1-git-send-email-maximlevitsky@gmail.com> <1265326257-4446-11-git-send-email-maximlevitsky@gmail.com> In-Reply-To: <1265326257-4446-11-git-send-email-maximlevitsky@gmail.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Cc: Alex Dubov , Artem Bityutskiy , joern , linux-kernel , linux-mtd , Thomas Gleixner , David Woodhouse List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Maxim Levitsky wrote: > This changes the behavier of MTD_OOB_RAW. It used to read both OOB and data > to the data buffer, however you would still need to specify the dummy oob buffer. > > This is only used in one place, but makes it hard to read data+oob without ECC > test, thus I removed that behavier, and fixed the user. > > Now MTD_OOB_RAW behaves like MTD_OOB_PLACE, but doesn't do ECC validation > > Signed-off-by: Maxim Levitsky > --- > drivers/mtd/nand/nand_base.c | 5 ----- > drivers/mtd/nand/nand_bbt.c | 26 ++++++++++++++++++++++---- > include/linux/mtd/mtd.h | 4 +--- > 3 files changed, 23 insertions(+), 12 deletions(-) > > diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c > index 405c538..8ff36be 100644 > --- a/drivers/mtd/nand/nand_base.c > +++ b/drivers/mtd/nand/nand_base.c > @@ -1286,8 +1286,6 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from, > > if (unlikely(oob)) { > > - /* Raw mode does data:oob:data:oob */ > - if (ops->mode != MTD_OOB_RAW) { > I am not sure if it is legal to modify the behavior of MTD_OOB_RAW. But if you remove the "if" command, the following code should be indent again. Stanley. > int toread = min(oobreadlen, > max_oobsize); > if (toread) { > @@ -1295,9 +1293,6 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from, > oob, ops, toread); > oobreadlen -= toread; > } > - } else > - buf = nand_transfer_oob(chip, > - buf, ops, mtd->oobsize); > } > > if (!(chip->options & NAND_NO_READRDY)) { > diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c > index 55c23e5..387c45c 100644 > --- a/drivers/mtd/nand/nand_bbt.c > +++ b/drivers/mtd/nand/nand_bbt.c > @@ -237,15 +237,33 @@ static int scan_read_raw(struct mtd_info *mtd, uint8_t *buf, loff_t offs, > size_t len) > { > struct mtd_oob_ops ops; > + int res; > > ops.mode = MTD_OOB_RAW; > ops.ooboffs = 0; > ops.ooblen = mtd->oobsize; > - ops.oobbuf = buf; > - ops.datbuf = buf; > - ops.len = len; > > - return mtd->read_oob(mtd, offs, &ops); > + > + while (len > 0) { > + if (len <= mtd->writesize) { > + ops.oobbuf = buf + len; > + ops.datbuf = buf; > + ops.len = len; > + return mtd->read_oob(mtd, offs, &ops); > + } else { > + ops.oobbuf = buf + mtd->writesize; > + ops.datbuf = buf; > + ops.len = mtd->writesize; > + res = mtd->read_oob(mtd, offs, &ops); > + > + if (res) > + return res; > + } > + > + buf += mtd->oobsize + mtd->writesize; > + len -= mtd->writesize; > + } > + return 0; > } > > /* > diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h > index 662d747..84bb375 100644 > --- a/include/linux/mtd/mtd.h > +++ b/include/linux/mtd/mtd.h > @@ -61,9 +61,7 @@ struct mtd_erase_region_info { > * MTD_OOB_PLACE: oob data are placed at the given offset > * MTD_OOB_AUTO: oob data are automatically placed at the free areas > * which are defined by the ecclayout > - * MTD_OOB_RAW: mode to read raw data+oob in one chunk. The oob data > - * is inserted into the data. Thats a raw image of the > - * flash contents. > + * MTD_OOB_RAW: mode to read oob and data without doing ECC checking > */ > typedef enum { > MTD_OOB_PLACE, >