Message ID | 1282155904-10113-1-git-send-email-norris@broadcom.com |
---|---|
State | New, archived |
Headers | show |
On 08/18/2010 08:25 PM, Brian Norris wrote: > Commit c7b28e25cb9beb943aead770ff14551b55fa8c79 caused a regression > in detection of factory-set bad block markers, especially for certain > small-page NAND. This fix removes some unneeded constraints on using > NAND_SMALL_BADBLOCK_POS, making the detection code more correct. > > This regression can be seen, for example, in Hynix HY27US081G1M and > similar. > > Signed-off-by: Brian Norris<norris@broadcom.com> > --- > drivers/mtd/nand/nand_base.c | 10 +++------- > 1 files changed, 3 insertions(+), 7 deletions(-) > > diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c > index a3c7473..a22ed7b 100644 > --- a/drivers/mtd/nand/nand_base.c > +++ b/drivers/mtd/nand/nand_base.c > @@ -2934,14 +2934,10 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd, > chip->chip_shift = ffs((unsigned)(chip->chipsize>> 32)) + 32 - 1; > > /* Set the bad block position */ > - if (!(busw& NAND_BUSWIDTH_16)&& (*maf_id == NAND_MFR_STMICRO || > - (*maf_id == NAND_MFR_SAMSUNG&& > - mtd->writesize == 512) || > - *maf_id == NAND_MFR_AMD)) > - chip->badblockpos = NAND_SMALL_BADBLOCK_POS; > - else > + if (mtd->writesize> 512 || (busw& NAND_BUSWIDTH_16)) > chip->badblockpos = NAND_LARGE_BADBLOCK_POS; > - > + else > + chip->badblockpos = NAND_SMALL_BADBLOCK_POS; > > /* Get chip options, preserve non chip based options */ > chip->options&= ~NAND_CHIPOPTIONS_MSK; > Brian, Sorry for the long delay! I tested the above patch unfortunately it does not help in my case! And when I go further and put a JFFS2 in that partition and boot the board I have (S3c2410 nand hardware ECC enable): mtd->read(0x400 bytes from 0x1274000) returned ECC error mtd->read(0x3c08 bytes from 0x12743f8) returned ECC error (without S3c2410 nand hardware ECC enable): uncorrectable error : uncorrectable error : uncorrectable error : uncorrectable error : mtd->read(0x400 bytes from 0x1274000) returned ECC error uncorrectable error : uncorrectable error : uncorrectable error : [...] uncorrectable error : uncorrectable error : mtd->read(0x3c08 bytes from 0x12743f8) returned ECC error Despite these errors I can actually use the board (no kernel panic)! The part is Samsung K9F1208U0C - PCB0 Hope that helps! Thanks, AWG
On 08/18/2010 12:30 PM, Abdoulaye Walsimou GAYE wrote: > Brian, > Sorry for the long delay! > I tested the above patch unfortunately it does not help in my case! Understood. That makes sense. In fact, your problem is most likely *not* related to this commit. As I mentioned before, please try narrowing down what specifically caused this; if I read correctly, you jumped from 2.6.33 to 2.6.36-rc1. There have been several important changes between those releases. Notably, this commit may be giving Samsung chips problems: 426c457a3216fac74e This thread is covering a few problems with Samsung: http://lists.infradead.org/pipermail/linux-mtd/2010-August/031590.html > And when I go further and put a JFFS2 in that partition and boot the > board I have <snip> > Despite these errors I can actually use the board (no kernel panic)! > The part is Samsung K9F1208U0C - PCB0 Unless you really know what you're doing, I wouldn't be writing/erasing the flash if it's not detecting bad blocks properly. Let me know if you have trouble with narrowing down to the problem commit. Brian
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index a3c7473..a22ed7b 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -2934,14 +2934,10 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd, chip->chip_shift = ffs((unsigned)(chip->chipsize >> 32)) + 32 - 1; /* Set the bad block position */ - if (!(busw & NAND_BUSWIDTH_16) && (*maf_id == NAND_MFR_STMICRO || - (*maf_id == NAND_MFR_SAMSUNG && - mtd->writesize == 512) || - *maf_id == NAND_MFR_AMD)) - chip->badblockpos = NAND_SMALL_BADBLOCK_POS; - else + if (mtd->writesize > 512 || (busw & NAND_BUSWIDTH_16)) chip->badblockpos = NAND_LARGE_BADBLOCK_POS; - + else + chip->badblockpos = NAND_SMALL_BADBLOCK_POS; /* Get chip options, preserve non chip based options */ chip->options &= ~NAND_CHIPOPTIONS_MSK;
Commit c7b28e25cb9beb943aead770ff14551b55fa8c79 caused a regression in detection of factory-set bad block markers, especially for certain small-page NAND. This fix removes some unneeded constraints on using NAND_SMALL_BADBLOCK_POS, making the detection code more correct. This regression can be seen, for example, in Hynix HY27US081G1M and similar. Signed-off-by: Brian Norris <norris@broadcom.com> --- drivers/mtd/nand/nand_base.c | 10 +++------- 1 files changed, 3 insertions(+), 7 deletions(-)