|
@@ -950,20 +950,50 @@ static int doc200x_correct_data(struct mtd_info *mtd, u_char *dat,
|
|
|
|
|
|
//u_char mydatabuf[528];
|
|
//u_char mydatabuf[528];
|
|
|
|
|
|
-/* The strange out-of-order .oobfree list below is a (possibly unneeded)
|
|
|
|
- * attempt to retain compatibility. It used to read:
|
|
|
|
- * .oobfree = { {8, 8} }
|
|
|
|
- * Since that leaves two bytes unusable, it was changed. But the following
|
|
|
|
- * scheme might affect existing jffs2 installs by moving the cleanmarker:
|
|
|
|
- * .oobfree = { {6, 10} }
|
|
|
|
- * jffs2 seems to handle the above gracefully, but the current scheme seems
|
|
|
|
- * safer. The only problem with it is that any code that parses oobfree must
|
|
|
|
- * be able to handle out-of-order segments.
|
|
|
|
- */
|
|
|
|
-static struct nand_ecclayout doc200x_oobinfo = {
|
|
|
|
- .eccbytes = 6,
|
|
|
|
- .eccpos = {0, 1, 2, 3, 4, 5},
|
|
|
|
- .oobfree = {{8, 8}, {6, 2}}
|
|
|
|
|
|
+static int doc200x_ooblayout_ecc(struct mtd_info *mtd, int section,
|
|
|
|
+ struct mtd_oob_region *oobregion)
|
|
|
|
+{
|
|
|
|
+ if (section)
|
|
|
|
+ return -ERANGE;
|
|
|
|
+
|
|
|
|
+ oobregion->offset = 0;
|
|
|
|
+ oobregion->length = 6;
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int doc200x_ooblayout_free(struct mtd_info *mtd, int section,
|
|
|
|
+ struct mtd_oob_region *oobregion)
|
|
|
|
+{
|
|
|
|
+ if (section > 1)
|
|
|
|
+ return -ERANGE;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * The strange out-of-order free bytes definition is a (possibly
|
|
|
|
+ * unneeded) attempt to retain compatibility. It used to read:
|
|
|
|
+ * .oobfree = { {8, 8} }
|
|
|
|
+ * Since that leaves two bytes unusable, it was changed. But the
|
|
|
|
+ * following scheme might affect existing jffs2 installs by moving the
|
|
|
|
+ * cleanmarker:
|
|
|
|
+ * .oobfree = { {6, 10} }
|
|
|
|
+ * jffs2 seems to handle the above gracefully, but the current scheme
|
|
|
|
+ * seems safer. The only problem with it is that any code retrieving
|
|
|
|
+ * free bytes position must be able to handle out-of-order segments.
|
|
|
|
+ */
|
|
|
|
+ if (!section) {
|
|
|
|
+ oobregion->offset = 8;
|
|
|
|
+ oobregion->length = 8;
|
|
|
|
+ } else {
|
|
|
|
+ oobregion->offset = 6;
|
|
|
|
+ oobregion->length = 2;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static const struct mtd_ooblayout_ops doc200x_ooblayout_ops = {
|
|
|
|
+ .ecc = doc200x_ooblayout_ecc,
|
|
|
|
+ .free = doc200x_ooblayout_free,
|
|
};
|
|
};
|
|
|
|
|
|
/* Find the (I)NFTL Media Header, and optionally also the mirror media header.
|
|
/* Find the (I)NFTL Media Header, and optionally also the mirror media header.
|
|
@@ -1537,6 +1567,7 @@ static int __init doc_probe(unsigned long physadr)
|
|
nand->bbt_md = nand->bbt_td + 1;
|
|
nand->bbt_md = nand->bbt_td + 1;
|
|
|
|
|
|
mtd->owner = THIS_MODULE;
|
|
mtd->owner = THIS_MODULE;
|
|
|
|
+ mtd_set_ooblayout(mtd, &doc200x_ooblayout_ops);
|
|
|
|
|
|
nand_set_controller_data(nand, doc);
|
|
nand_set_controller_data(nand, doc);
|
|
nand->select_chip = doc200x_select_chip;
|
|
nand->select_chip = doc200x_select_chip;
|
|
@@ -1548,7 +1579,6 @@ static int __init doc_probe(unsigned long physadr)
|
|
nand->ecc.calculate = doc200x_calculate_ecc;
|
|
nand->ecc.calculate = doc200x_calculate_ecc;
|
|
nand->ecc.correct = doc200x_correct_data;
|
|
nand->ecc.correct = doc200x_correct_data;
|
|
|
|
|
|
- nand->ecc.layout = &doc200x_oobinfo;
|
|
|
|
nand->ecc.mode = NAND_ECC_HW_SYNDROME;
|
|
nand->ecc.mode = NAND_ECC_HW_SYNDROME;
|
|
nand->ecc.size = 512;
|
|
nand->ecc.size = 512;
|
|
nand->ecc.bytes = 6;
|
|
nand->ecc.bytes = 6;
|