mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-02-17 22:49:02 +00:00
NAND: Wrong calculation of page number in nand_block_bad()
In case that there is no memory based bad block table available the function nand_block_checkbad() in drivers/mtd/nand/nand_base.c will call nand_block_bad() directly. When parameter 'getchip' is set to zero, nand_block_bad() will not right shift the offset to calculate the correct page number. Signed-off-by: Thomas Knobloch <knobloch@siemens.com> Signed-off-by: Stefan Roese <sr@denx.de>
This commit is contained in:
parent
8d1c439e2d
commit
a798865905
1 changed files with 5 additions and 5 deletions
|
@ -427,8 +427,9 @@ static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
|
|||
struct nand_chip *this = mtd->priv;
|
||||
u16 bad;
|
||||
|
||||
page = (int)(ofs >> this->page_shift) & this->pagemask;
|
||||
|
||||
if (getchip) {
|
||||
page = (int)(ofs >> this->page_shift);
|
||||
chipnr = (int)(ofs >> this->chip_shift);
|
||||
|
||||
/* Grab the lock and see if the device is available */
|
||||
|
@ -436,18 +437,17 @@ static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
|
|||
|
||||
/* Select the NAND device */
|
||||
this->select_chip(mtd, chipnr);
|
||||
} else
|
||||
page = (int) ofs;
|
||||
}
|
||||
|
||||
if (this->options & NAND_BUSWIDTH_16) {
|
||||
this->cmdfunc (mtd, NAND_CMD_READOOB, this->badblockpos & 0xFE, page & this->pagemask);
|
||||
this->cmdfunc (mtd, NAND_CMD_READOOB, this->badblockpos & 0xFE, page);
|
||||
bad = cpu_to_le16(this->read_word(mtd));
|
||||
if (this->badblockpos & 0x1)
|
||||
bad >>= 1;
|
||||
if ((bad & 0xFF) != 0xff)
|
||||
res = 1;
|
||||
} else {
|
||||
this->cmdfunc (mtd, NAND_CMD_READOOB, this->badblockpos, page & this->pagemask);
|
||||
this->cmdfunc (mtd, NAND_CMD_READOOB, this->badblockpos, page);
|
||||
if (this->read_byte(mtd) != 0xff)
|
||||
res = 1;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue