From: Matthieu CASTET <matthieu.castet@parrot.com>
To: Brian Norris <computersforpeace@gmail.com>
Cc: Mike Dunn <mikedunn@newsguy.com>,
Artem Bityutskiy <dedekind1@gmail.com>,
Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
"linux-mtd@lists.infradead.org" <linux-mtd@lists.infradead.org>,
Shmulik Ladkani <shmulik.ladkani@gmail.com>,
David Woodhouse <dwmw2@infradead.org>
Subject: Re: [PATCH 8/8] mtd: nand: use ECC, if present, when scanning OOB
Date: Tue, 10 Jul 2012 09:45:52 +0200 [thread overview]
Message-ID: <4FFBDDB0.6010605@parrot.com> (raw)
In-Reply-To: <1340408145-24531-9-git-send-email-computersforpeace@gmail.com>
Hi Brian,
Brian Norris a écrit :
> scan_read_raw_oob() is used in only in places where the MTD_OPS_PLACE_OOB
> mode is preferable MTD_OPS_RAW mode, so use MTD_OPS_PLACE_OOB instead.
> MTD_OPS_PLACE_OOB provides the same functionality with the potential[1]
> added bonus of error correction.
>
> This brings scan_block_full() in line with scan_block_fast() so that they
> both read bad block markers with MTD_OPS_PLACE_OOB. This can help in
> preventing 0xff markers (in good blocks) from being interpreted as bad
> block indicators in the presence of a single bitflip.
As far I understand the code, this work when "chip->ecc.read_oob" (used in
nand_do_read_oob) correct bit flip.
But I see no "chip->ecc.read_oob" implementation that can return bit flip. Is
that expected ?
This can also work when nand_do_read_ops is used (ops->datbuf != NULL). But it
is hard to see case where it can correct bit flip in bad block marker. Do you
have any exemple ?
For example the default chip->ecc.read_page (nand_read_page_hwecc) doesn't read
oob with ecc [1].
Matthieu
PS : Did you have any comment on
http://thread.gmane.org/gmane.linux.drivers.mtd/42243 ?
[1]
for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
chip->ecc.hwctl(mtd, NAND_ECC_READ);
chip->read_buf(mtd, p, eccsize);
chip->ecc.calculate(mtd, p, &ecc_calc[i]);
}
chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
>
> Note that ECC error codes (EUCLEAN or EBADMSG) are already silently
> ignored in all users of scan_read_raw_oob().
>
> [1] Few drivers perform proper error correction on OOB data. In those
> cases, the use of MTD_OPS_RAW vs. MTD_OPS_PLACE_OOB is not
> significant.
>
> Signed-off-by: Brian Norris <computersforpeace@gmail.com>
> Cc: Shmulik Ladkani <shmulik.ladkani@gmail.com>
> Cc: Mike Dunn <mikedunn@newsguy.com>
> Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> ---
> drivers/mtd/nand/nand_bbt.c | 27 ++++++++++++++++++++-------
> 1 file changed, 20 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c
> index 45cdb97..7b9a0a7 100644
> --- a/drivers/mtd/nand/nand_bbt.c
> +++ b/drivers/mtd/nand/nand_bbt.c
> @@ -289,14 +289,24 @@ static int scan_read_data(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
> return mtd_read(mtd, offs, len, &retlen, buf);
> }
>
> -/* Scan read data from flash */
> +/**
> + * scan_read_oob - [GENERIC] Scan data+OOB region to buffer
> + * @mtd: MTD device structure
> + * @buf: temporary buffer
> + * @offs: offset at which to scan
> + * @len: length of data region to read
> + *
> + * Scan read data from data+OOB. May traverse multiple pages, interleaving
> + * page,OOB,page,OOB,... in buf. Completes transfer and returns the "strongest"
> + * ECC condition (error or bitflip). May quit on the first (non-ECC) error.
> + */
> static int scan_read_oob(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
> size_t len)
> {
> struct mtd_oob_ops ops;
> - int res;
> + int res, ret = 0;
>
> - ops.mode = MTD_OPS_RAW;
> + ops.mode = MTD_OPS_PLACE_OOB;
> ops.ooboffs = 0;
> ops.ooblen = mtd->oobsize;
>
> @@ -306,15 +316,18 @@ static int scan_read_oob(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
> ops.oobbuf = buf + ops.len;
>
> res = mtd_read_oob(mtd, offs, &ops);
> -
> - if (res)
> - return res;
> + if (res) {
> + if (!mtd_is_bitflip_or_eccerr(res))
> + return res;
> + else if (mtd_is_eccerr(res) || !ret)
> + ret = res;
> + }
>
> buf += mtd->oobsize + mtd->writesize;
> len -= mtd->writesize;
> offs += mtd->writesize;
> }
> - return 0;
> + return ret;
> }
>
> static int scan_read(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
next prev parent reply other threads:[~2012-07-10 7:46 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-22 23:35 [PATCH 0/8] NAND and NAND-BBT improvements Brian Norris
2012-06-22 23:35 ` [PATCH 1/8] mtd: move mtd_read_oob() definition out of mtd.h Brian Norris
2012-06-22 23:35 ` [PATCH 2/8] mtd: check for max_bitflips in mtd_read_oob() Brian Norris
2012-06-26 12:11 ` Shmulik Ladkani
2012-06-26 18:23 ` Mike Dunn
2012-07-11 2:12 ` Brian Norris
2012-08-15 11:24 ` Artem Bityutskiy
2012-08-15 19:15 ` Brian Norris
2012-08-16 10:48 ` Artem Bityutskiy
2012-08-17 22:58 ` Brian Norris
2012-06-22 23:35 ` [PATCH 3/8] mtd: nand: rename "no_bbt" descriptors to "no_oob" Brian Norris
2012-06-22 23:35 ` [PATCH 4/8] mtd: nand: remove unused 'int' return codes Brian Norris
2012-06-26 12:29 ` Shmulik Ladkani
2012-06-26 14:18 ` [PATCH 4/8] mtd: nand: remove unused 'int' return codes (SPAM) William F.
2012-08-15 11:40 ` [PATCH 4/8] mtd: nand: remove unused 'int' return codes Artem Bityutskiy
2012-06-22 23:35 ` [PATCH 5/8] mtd: nand: rename '_raw' BBT scan functions Brian Norris
2012-06-26 12:39 ` Shmulik Ladkani
2012-07-10 2:13 ` Brian Norris
2012-08-15 12:35 ` Artem Bityutskiy
2012-06-22 23:35 ` [PATCH 6/8] mtd: nand_bbt: refactor check_pattern_no_oob() Brian Norris
2012-06-22 23:35 ` [PATCH 7/8] mtd: nand_bbt: use string library Brian Norris
2012-06-26 13:37 ` Shmulik Ladkani
2012-07-16 6:06 ` Brian Norris
2012-07-16 23:57 ` Ivan Djelic
2012-08-15 11:53 ` Artem Bityutskiy
2012-06-22 23:35 ` [PATCH 8/8] mtd: nand: use ECC, if present, when scanning OOB Brian Norris
2012-06-26 14:09 ` Shmulik Ladkani
2012-07-10 2:39 ` Brian Norris
2012-07-10 7:45 ` Matthieu CASTET [this message]
2012-07-13 17:39 ` Brian Norris
2012-07-15 20:01 ` Mike Dunn
2012-07-16 14:01 ` Ivan Djelic
2012-07-16 18:36 ` Mike Dunn
2012-07-16 21:34 ` Ivan Djelic
2012-07-17 18:10 ` Mike Dunn
2013-11-07 14:56 ` Angus Clark
2013-11-18 18:36 ` Brian Norris
2012-08-15 12:05 ` Artem Bityutskiy
2012-08-15 14:31 ` Shmulik Ladkani
2012-08-16 10:40 ` Artem Bityutskiy
2012-08-20 13:12 ` Shmulik Ladkani
2012-06-27 13:52 ` [PATCH 0/8] NAND and NAND-BBT improvements Artem Bityutskiy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4FFBDDB0.6010605@parrot.com \
--to=matthieu.castet@parrot.com \
--cc=bigeasy@linutronix.de \
--cc=computersforpeace@gmail.com \
--cc=dedekind1@gmail.com \
--cc=dwmw2@infradead.org \
--cc=linux-mtd@lists.infradead.org \
--cc=mikedunn@newsguy.com \
--cc=shmulik.ladkani@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.