summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorStefan Roese <sr@denx.de>2007-01-05 11:46:05 +0100
committerStefan Roese <sr@denx.de>2007-01-05 11:46:05 +0100
commitcd1d937f90250a32988c37b2b4af8364d25de8ed (patch)
treec433290737f14b6c547443ad094d0519dbfa8bbf /drivers
parentc04a1a72878f6edf7b0ce62f166cdb857a8c2d88 (diff)
downloadu-boot-imx-cd1d937f90250a32988c37b2b4af8364d25de8ed.zip
u-boot-imx-cd1d937f90250a32988c37b2b4af8364d25de8ed.tar.gz
u-boot-imx-cd1d937f90250a32988c37b2b4af8364d25de8ed.tar.bz2
[PATCH] nand: Fix problem with oobsize calculation
Here the description from Brian Brelsford <Brian_Brelsford@dell.com>: The Hynix part returns a 0x1d in the 4th ID byte. The Samsung part returns a 0x15. In the code fragment below bits [1:0] determine the page size, it is ANDed via "(extid & 0x3)" then shifted out. The next field is also ANDed with 0x3. However this is a one bit field as defined in the Hynix and Samsung parts in the 4th ID byte that determins the oobsize, not a two bit field. It works on Samsung as bits[3:2] are 01. However for the Hynix there is a 11 in these two bits, so the oob size gets messed up. I checked the correct linux code and the suggested fix from Brian is also available in the linux nand mtd driver. Signed-off-by: Stefan Roese <sr@denx.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/nand/nand_base.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/nand/nand_base.c b/drivers/nand/nand_base.c
index 7fdf57b..8495829 100644
--- a/drivers/nand/nand_base.c
+++ b/drivers/nand/nand_base.c
@@ -2338,7 +2338,7 @@ int nand_scan (struct mtd_info *mtd, int maxchips)
mtd->oobblock = 1024 << (extid & 0x3);
extid >>= 2;
/* Calc oobsize */
- mtd->oobsize = (8 << (extid & 0x03)) * (mtd->oobblock / 512);
+ mtd->oobsize = (8 << (extid & 0x01)) * (mtd->oobblock / 512);
extid >>= 2;
/* Calc blocksize. Blocksize is multiples of 64KiB */
mtd->erasesize = (64 * 1024) << (extid & 0x03);