Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1303313
| Path | csiph.com!aioe.org!bofh.it!news.nic.it!robomod |
|---|---|
| From | Peter Pan <peterpansjtu@gmail.com> |
| Newsgroups | linux.kernel |
| Subject | Re: [PATCH v2 05/12] mtd: nand: use new BBT API instead of old ones |
| Date | Thu, 07 Jan 2016 07:10:02 +0100 |
| Message-ID | <qObVM-43d-5@gated-at.bofh.it> (permalink) |
| References | <qFQY9-bO-3@gated-at.bofh.it> <qFR7Q-fs-15@gated-at.bofh.it> <qNYca-2Y2-31@gated-at.bofh.it> |
| X-Original-To | Boris Brezillon <boris.brezillon@free-electrons.com> |
| Dkim-Signature | v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=wb8LzaKsgfZQq6yNaKE/uBGzqYkkiCWG5LsND6ikccg=; b=Bb6U2raSJrUebiO3x6O+JQGMqyVtUl4He9Z9YwT0NpxzKEjQ3ym9U8Hvub/LMPK3gx ZqVxtzDb9LS0EhQC1ZnYcCwzQQTMI11LKv9CTNyQ+D0Z3OqaJdgPUe11d2YDOqZzfryM U6Mi5M42JQrDDYhJXP3P//PYsmgMZUIpxrfhY/oIx3V4yh8DsDxPwPYs1T9yrVA6aNpA vaaBkU+KnOk3+wgRKqZhckFuw/mECSTTLFRzcyrYSfB0zaTV1zUNoop+DO16SsTZtjB4 +baCKWEvdCKqKIpV8GdVGCTZ+8IY8eyRtdYWgzZt+Ch45b2n1a/ksR9ABfEM1FHt/qyW 11KA== |
| MIME-Version | 1.0 |
| X-Received | by 10.25.21.225 with SMTP id 94mr33278887lfv.159.1452146603996; Wed, 06 Jan 2016 22:03:23 -0800 (PST) |
| Content-Type | text/plain; charset=UTF-8 |
| Sender | robomod@news.nic.it |
| List-ID | <linux-kernel.vger.kernel.org> |
| X-Mailing-List | linux-kernel@vger.kernel.org |
| Approved | robomod@news.nic.it |
| Lines | 177 |
| Organization | linux.* mail to news gateway |
| X-Original-Cc | Brian Norris <computersforpeace@gmail.com>, David Woodhouse <dwmw2@infradead.org>, Frans Klaver <fransklaver@gmail.com>, Peter Pan <peterpandong@micron.com>, beanhuo@micron.com, linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org, karlzhang@micron.com |
| X-Original-Date | Thu, 7 Jan 2016 14:03:23 +0800 |
| X-Original-Message-ID | <CAAyFORKX7-jjjZsrZE7jk1soK=TsbThW_QJMk0uYqLkmTC0LYw@mail.gmail.com> |
| X-Original-References | <1450159178-29895-1-git-send-email-peterpandong@micron.com> <1450159178-29895-6-git-send-email-peterpandong@micron.com> <20160106162216.617f0811@bbrezillon> |
| X-Original-Sender | linux-kernel-owner@vger.kernel.org |
| Xref | csiph.com linux.kernel:1303313 |
Show key headers only | View raw
On Wed, Jan 6, 2016 at 11:22 PM, Boris Brezillon
<boris.brezillon@free-electrons.com> wrote:
> On Tue, 15 Dec 2015 05:59:31 +0000
> Peter Pan <peterpansjtu@gmail.com> wrote:
>
>> From: Brian Norris <computersforpeace@gmail.com>
>>
>> Use new BBT APIs (nand_bbt_*()) in NAND. Keep old APIs (nand_*_bbt())
>> exist temporarily.
>>
>> Signed-off-by: Brian Norris <computersforpeace@gmail.com>
>> [Peter: 1. use nand_bbt_markbad_factory() in docg4.c and implement
>> 2. nand_create_factory_badblock_pattern(), nand_is_bad_bbm() and
>> nand_default_bbt() in nand_base.c
>> 3. add NAND_BADBLOCK_PATTERN_ALLOC macro]
>> Signed-off-by: Peter Pan <peterpandong@micron.com>
>> ---
>> drivers/mtd/nand/docg4.c | 6 +-
>> drivers/mtd/nand/nand_base.c | 140 ++++++++++++++++++++++++++++++++++++++++---
>> include/linux/mtd/nand.h | 9 ++-
>> 3 files changed, 143 insertions(+), 12 deletions(-)
>>
>> diff --git a/drivers/mtd/nand/docg4.c b/drivers/mtd/nand/docg4.c
>> index da93d7f..1be7fa2 100644
>> --- a/drivers/mtd/nand/docg4.c
>> +++ b/drivers/mtd/nand/docg4.c
>> @@ -1037,7 +1037,7 @@ static int __init read_factory_bbt(struct mtd_info *mtd)
>> * operation after device power-up. The above read ensures it never is.
>> * Ugly, I know.
>> */
>> - if (nand->bbt == NULL) /* no memory-based bbt */
>> + if (nand->nand_bbt == NULL) /* no memory-based bbt */
>> goto exit;
>>
>> if (mtd->ecc_stats.failed > eccfailed_stats) {
>> @@ -1064,8 +1064,8 @@ static int __init read_factory_bbt(struct mtd_info *mtd)
>> unsigned long bits = ~buf[i];
>> for_each_set_bit(bitnum, &bits, 8) {
>> int badblock = block + 7 - bitnum;
>> - nand->bbt[badblock / 4] |=
>> - 0x03 << ((badblock % 4) * 2);
>> + nand_bbt_markbad_factory(nand->nand_bbt,
>> + badblock << nand->bbt_erase_shift);
>> mtd->ecc_stats.badblocks++;
>> dev_notice(doc->dev, "factory-marked bad block: %d\n",
>> badblock);
>> diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
>> index 5aec154..28d7a58 100644
>> --- a/drivers/mtd/nand/nand_base.c
>> +++ b/drivers/mtd/nand/nand_base.c
>
> [...]
>
>>
>> +/* NAND BBT helper - erase a block, including reserved blocks */
>> +static int nand_bbt_erase_block(struct mtd_info *mtd, loff_t addr)
>> +{
>> + struct erase_info einfo;
>> + struct nand_chip *chip = mtd->priv;
>
> nand_chip backpointer is no longer stored in mtd->priv (nand_chip now
> embeds its own mtd_info field and we use the container_of trick to
> retrieve the nand_chip pointer from the mtd_info pointer).
>
> struct nand_chip *chip = mtd_to_nand(mtd);
>
Fix this in v3.
>> +
>> + memset(&einfo, 0, sizeof(einfo));
>> + einfo.mtd = mtd;
>> + einfo.addr = addr;
>> + einfo.len = 1ULL << chip->phys_erase_shift;
>> +
>> + return nand_erase_nand(mtd, &einfo, 1);
>> +}
>> +
>
> [...]
>
>> +static int nand_is_bad_bbm(struct mtd_info *mtd, loff_t addr)
>> +{
>> + struct nand_chip *chip = mtd->priv;
>
> struct nand_chip *chip = mtd_to_nand(mtd);
Fix this in v3.
>
>> + struct mtd_oob_ops ops;
>> + struct nand_bbt_descr *bd = chip->badblock_pattern;
>> + int j, ret;
>> + int numpages;
>> +
>> + if (bd->options & NAND_BBT_SCAN2NDPAGE)
>> + numpages = 2;
>> + else
>> + numpages = 1;
>> +
>> + if (bd->options & NAND_BBT_SCANLASTPAGE)
>> + addr += mtd->erasesize - (mtd->writesize * numpages);
>> +
>> + ops.ooblen = mtd->oobsize;
>> + ops.oobbuf = chip->buffers->databuf;
>> + ops.ooboffs = 0;
>> + ops.datbuf = NULL;
>> + ops.mode = MTD_OPS_PLACE_OOB;
>> +
>> + for (j = 0; j < numpages; j++) {
>> + /*
>> + * Read the full oob until read_oob is fixed to handle single
>> + * byte reads for 16 bit buswidth.
>> + */
>> + ret = nand_do_read_oob(mtd, addr, &ops);
>> + /* Ignore ECC errors when checking for BBM */
>> + if (ret && !mtd_is_bitflip_or_eccerr(ret))
>> + return ret;
>> +
>> + if (memcmp(chip->buffers->databuf + bd->offs,
>> + bd->pattern, bd->len))
>> + return 1;
>> +
>> + addr += mtd->writesize;
>> + }
>> +
>> + return 0;
>> +}
>> +
>> +static int nand_default_bbt(struct mtd_info *mtd)
>> +{
>> + struct nand_chip *chip = mtd->priv;
>
> struct nand_chip *chip = mtd_to_nand(mtd);
Fix this in v3.
>
>> + struct nand_bbt *bbt = kzalloc(sizeof(struct nand_bbt), GFP_KERNEL);
>> +
>> + if (!bbt)
>> + return -ENOMEM;
>> +
>> + bbt->bbt_options = chip->bbt_options;
>> + bbt->mtd = mtd;
>> + bbt->numchips = chip->numchips;
>> + bbt->chipsize = chip->chipsize;
>> + bbt->chip_shift = chip->chip_shift;
>> + bbt->bbt_erase_shift = chip->phys_erase_shift;
>> + bbt->page_shift = chip->page_shift;
>> + bbt->bbt_td = chip->bbt_td;
>> + bbt->bbt_md = chip->bbt_md;
>> + bbt->is_bad_bbm = nand_is_bad_bbm;
>> + bbt->erase = nand_bbt_erase_block;
>> + chip->nand_bbt = bbt;
>> +
>> + if (!chip->badblock_pattern &&
>> + nand_create_factory_badblock_pattern(chip))
>> + return -ENOMEM;
>> +
>> + return nand_bbt_init(chip->nand_bbt);
>> +}
>
>
>
> --
> Boris Brezillon, Free Electrons
> Embedded Linux and Kernel engineering
> http://free-electrons.com
Thanks
Peter Pan
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Back to linux.kernel | Previous | Next — Previous in thread | Find similar | Unroll thread
Re: [PATCH v2 05/12] mtd: nand: use new BBT API instead of old ones Boris Brezillon <boris.brezillon@free-electrons.com> - 2016-01-06 16:30 +0100 Re: [PATCH v2 05/12] mtd: nand: use new BBT API instead of old ones Peter Pan <peterpansjtu@gmail.com> - 2016-01-07 07:10 +0100
csiph-web