|
@@ -459,10 +459,37 @@ static int cafe_nand_read_page(struct mtd_info *mtd, struct nand_chip *chip,
|
|
return max_bitflips;
|
|
return max_bitflips;
|
|
}
|
|
}
|
|
|
|
|
|
-static struct nand_ecclayout cafe_oobinfo_2048 = {
|
|
|
|
- .eccbytes = 14,
|
|
|
|
- .eccpos = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13},
|
|
|
|
- .oobfree = {{14, 50}}
|
|
|
|
|
|
+static int cafe_ooblayout_ecc(struct mtd_info *mtd, int section,
|
|
|
|
+ struct mtd_oob_region *oobregion)
|
|
|
|
+{
|
|
|
|
+ struct nand_chip *chip = mtd_to_nand(mtd);
|
|
|
|
+
|
|
|
|
+ if (section)
|
|
|
|
+ return -ERANGE;
|
|
|
|
+
|
|
|
|
+ oobregion->offset = 0;
|
|
|
|
+ oobregion->length = chip->ecc.total;
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int cafe_ooblayout_free(struct mtd_info *mtd, int section,
|
|
|
|
+ struct mtd_oob_region *oobregion)
|
|
|
|
+{
|
|
|
|
+ struct nand_chip *chip = mtd_to_nand(mtd);
|
|
|
|
+
|
|
|
|
+ if (section)
|
|
|
|
+ return -ERANGE;
|
|
|
|
+
|
|
|
|
+ oobregion->offset = chip->ecc.total;
|
|
|
|
+ oobregion->length = mtd->oobsize - chip->ecc.total;
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static const struct mtd_ooblayout_ops cafe_ooblayout_ops = {
|
|
|
|
+ .ecc = cafe_ooblayout_ecc,
|
|
|
|
+ .free = cafe_ooblayout_free,
|
|
};
|
|
};
|
|
|
|
|
|
/* Ick. The BBT code really ought to be able to work this bit out
|
|
/* Ick. The BBT code really ought to be able to work this bit out
|
|
@@ -494,12 +521,6 @@ static struct nand_bbt_descr cafe_bbt_mirror_descr_2048 = {
|
|
.pattern = cafe_mirror_pattern_2048
|
|
.pattern = cafe_mirror_pattern_2048
|
|
};
|
|
};
|
|
|
|
|
|
-static struct nand_ecclayout cafe_oobinfo_512 = {
|
|
|
|
- .eccbytes = 14,
|
|
|
|
- .eccpos = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13},
|
|
|
|
- .oobfree = {{14, 2}}
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
static struct nand_bbt_descr cafe_bbt_main_descr_512 = {
|
|
static struct nand_bbt_descr cafe_bbt_main_descr_512 = {
|
|
.options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
|
|
.options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
|
|
| NAND_BBT_2BIT | NAND_BBT_VERSION,
|
|
| NAND_BBT_2BIT | NAND_BBT_VERSION,
|
|
@@ -743,12 +764,11 @@ static int cafe_nand_probe(struct pci_dev *pdev,
|
|
cafe->ctl2 |= 1<<29; /* 2KiB page size */
|
|
cafe->ctl2 |= 1<<29; /* 2KiB page size */
|
|
|
|
|
|
/* Set up ECC according to the type of chip we found */
|
|
/* Set up ECC according to the type of chip we found */
|
|
|
|
+ mtd_set_ooblayout(mtd, &cafe_ooblayout_ops);
|
|
if (mtd->writesize == 2048) {
|
|
if (mtd->writesize == 2048) {
|
|
- cafe->nand.ecc.layout = &cafe_oobinfo_2048;
|
|
|
|
cafe->nand.bbt_td = &cafe_bbt_main_descr_2048;
|
|
cafe->nand.bbt_td = &cafe_bbt_main_descr_2048;
|
|
cafe->nand.bbt_md = &cafe_bbt_mirror_descr_2048;
|
|
cafe->nand.bbt_md = &cafe_bbt_mirror_descr_2048;
|
|
} else if (mtd->writesize == 512) {
|
|
} else if (mtd->writesize == 512) {
|
|
- cafe->nand.ecc.layout = &cafe_oobinfo_512;
|
|
|
|
cafe->nand.bbt_td = &cafe_bbt_main_descr_512;
|
|
cafe->nand.bbt_td = &cafe_bbt_main_descr_512;
|
|
cafe->nand.bbt_md = &cafe_bbt_mirror_descr_512;
|
|
cafe->nand.bbt_md = &cafe_bbt_mirror_descr_512;
|
|
} else {
|
|
} else {
|