mtd: kill the nand_ecclayout struct
authorBoris Brezillon <boris.brezillon@free-electrons.com>
Thu, 4 Feb 2016 09:16:18 +0000 (10:16 +0100)
committerBoris Brezillon <boris.brezillon@free-electrons.com>
Thu, 5 May 2016 21:51:51 +0000 (23:51 +0200)
Now that all MTD drivers have moved to the mtd_ooblayout_ops model we can
safely remove the struct nand_ecclayout definition, and all the remaining
places where it was still used.

Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
drivers/mtd/mtdchar.c
drivers/mtd/mtdcore.c
include/linux/mtd/mtd.h
include/uapi/mtd/mtd-abi.h

index 3fad2c7425b087db5ae32bd112bfb450b6281a07..2a47a3f0e7308ea13b31391d77e8dab83f536dfe 100644 (file)
@@ -465,12 +465,12 @@ static int mtdchar_readoob(struct file *file, struct mtd_info *mtd,
 }
 
 /*
- * Copies (and truncates, if necessary) data from the larger struct,
- * nand_ecclayout, to the smaller, deprecated layout struct,
- * nand_ecclayout_user. This is necessary only to support the deprecated
- * API ioctl ECCGETLAYOUT while allowing all new functionality to use
- * nand_ecclayout flexibly (i.e. the struct may change size in new
- * releases without requiring major rewrites).
+ * Copies (and truncates, if necessary) OOB layout information to the
+ * deprecated layout struct, nand_ecclayout_user. This is necessary only to
+ * support the deprecated API ioctl ECCGETLAYOUT while allowing all new
+ * functionality to use mtd_ooblayout_ops flexibly (i.e. mtd_ooblayout_ops
+ * can describe any kind of OOB layout with almost zero overhead from a
+ * memory usage point of view).
  */
 static int shrink_ecclayout(struct mtd_info *mtd,
                            struct nand_ecclayout_user *to)
index 134ed2f7b919959a9676114c65b8aa1f72951b4f..e3936b847c6b3a7adaf757dfa3e0cddde0ae28bf 100644 (file)
@@ -1376,123 +1376,6 @@ int mtd_ooblayout_count_eccbytes(struct mtd_info *mtd)
 }
 EXPORT_SYMBOL_GPL(mtd_ooblayout_count_eccbytes);
 
-/**
- * mtd_ecclayout_ecc - Default ooblayout_ecc iterator implementation
- * @mtd: MTD device structure
- * @section: ECC section. Depending on the layout you may have all the ECC
- *          bytes stored in a single contiguous section, or one section
- *          per ECC chunk (and sometime several sections for a single ECC
- *          ECC chunk)
- * @oobecc: OOB region struct filled with the appropriate ECC position
- *         information
- *
- * This function is just a wrapper around the mtd->ecclayout field and is
- * here to ease the transition to the mtd_ooblayout_ops approach.
- * All it does is convert the layout->eccpos information into proper oob
- * region definitions.
- *
- * Returns zero on success, a negative error code otherwise.
- */
-static int mtd_ecclayout_ecc(struct mtd_info *mtd, int section,
-                            struct mtd_oob_region *oobecc)
-{
-       int eccbyte = 0, cursection = 0, length = 0, eccpos = 0;
-
-       if (!mtd->ecclayout)
-               return -ENOTSUPP;
-
-       /*
-        * This logic allows us to reuse the ->ecclayout information and
-        * expose them as ECC regions (as done for the OOB free regions).
-        *
-        * TODO: this should be dropped as soon as we get rid of the
-        * ->ecclayout field.
-        */
-       for (eccbyte = 0; eccbyte < mtd->ecclayout->eccbytes; eccbyte++) {
-               eccpos = mtd->ecclayout->eccpos[eccbyte];
-
-               if (eccbyte < mtd->ecclayout->eccbytes - 1) {
-                       int neccpos = mtd->ecclayout->eccpos[eccbyte + 1];
-
-                       if (eccpos + 1 == neccpos) {
-                               length++;
-                               continue;
-                       }
-               }
-
-               if (section == cursection)
-                       break;
-
-               length = 0;
-               cursection++;
-       }
-
-       if (cursection != section || eccbyte >= mtd->ecclayout->eccbytes)
-               return -ERANGE;
-
-       oobecc->length = length + 1;
-       oobecc->offset = eccpos - length;
-
-       return 0;
-}
-
-/**
- * mtd_ecclayout_ecc - Default ooblayout_free iterator implementation
- * @mtd: MTD device structure
- * @section: Free section. Depending on the layout you may have all the free
- *          bytes stored in a single contiguous section, or one section
- *          per ECC chunk (and sometime several sections for a single ECC
- *          ECC chunk)
- * @oobfree: OOB region struct filled with the appropriate free position
- *          information
- *
- * This function is just a wrapper around the mtd->ecclayout field and is
- * here to ease the transition to the mtd_ooblayout_ops approach.
- * All it does is convert the layout->oobfree information into proper oob
- * region definitions.
- *
- * Returns zero on success, a negative error code otherwise.
- */
-static int mtd_ecclayout_free(struct mtd_info *mtd, int section,
-                             struct mtd_oob_region *oobfree)
-{
-       struct nand_ecclayout *layout = mtd->ecclayout;
-
-       if (!layout)
-               return -ENOTSUPP;
-
-       if (section >= MTD_MAX_OOBFREE_ENTRIES_LARGE ||
-           !layout->oobfree[section].length)
-               return -ERANGE;
-
-       oobfree->offset = layout->oobfree[section].offset;
-       oobfree->length = layout->oobfree[section].length;
-
-       return 0;
-}
-
-static const struct mtd_ooblayout_ops mtd_ecclayout_wrapper_ops = {
-       .ecc = mtd_ecclayout_ecc,
-       .free = mtd_ecclayout_free,
-};
-
-/**
- * mtd_set_ecclayout - Attach an ecclayout to an MTD device
- * @mtd: MTD device structure
- * @ecclayout: The ecclayout to attach to the device
- *
- * Returns zero on success, a negative error code otherwise.
- */
-void mtd_set_ecclayout(struct mtd_info *mtd, struct nand_ecclayout *ecclayout)
-{
-       if (!mtd || !ecclayout)
-               return;
-
-       mtd->ecclayout = ecclayout;
-       mtd_set_ooblayout(mtd, &mtd_ecclayout_wrapper_ops);
-}
-EXPORT_SYMBOL_GPL(mtd_set_ecclayout);
-
 /*
  * Method to access the protection register area, present in some flash
  * devices. The user data is one time programmable but the factory data is read
index 177bf314ad70b469428169a447e39698028e6821..29a1706122035b74a52e77bfa3a1f6b60f115ee2 100644 (file)
@@ -96,21 +96,6 @@ struct mtd_oob_ops {
 
 #define MTD_MAX_OOBFREE_ENTRIES_LARGE  32
 #define MTD_MAX_ECCPOS_ENTRIES_LARGE   640
-/*
- * Internal ECC layout control structure. For historical reasons, there is a
- * similar, smaller struct nand_ecclayout_user (in mtd-abi.h) that is retained
- * for export to user-space via the ECCGETLAYOUT ioctl.
- * nand_ecclayout should be expandable in the future simply by the above macros.
- *
- * This structure is now deprecated, you should use struct nand_ecclayout_ops
- * to describe your OOB layout.
- */
-struct nand_ecclayout {
-       __u32 eccbytes;
-       __u32 eccpos[MTD_MAX_ECCPOS_ENTRIES_LARGE];
-       struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES_LARGE];
-};
-
 /**
  * struct mtd_oob_region - oob region definition
  * @offset: region offset
@@ -200,9 +185,6 @@ struct mtd_info {
        const char *name;
        int index;
 
-       /* [Deprecated] ECC layout structure pointer - read only! */
-       struct nand_ecclayout *ecclayout;
-
        /* OOB layout description */
        const struct mtd_ooblayout_ops *ooblayout;
 
@@ -308,8 +290,6 @@ int mtd_ooblayout_set_databytes(struct mtd_info *mtd, const u8 *databuf,
 int mtd_ooblayout_count_freebytes(struct mtd_info *mtd);
 int mtd_ooblayout_count_eccbytes(struct mtd_info *mtd);
 
-void mtd_set_ecclayout(struct mtd_info *mtd, struct nand_ecclayout *ecclayout);
-
 static inline void mtd_set_ooblayout(struct mtd_info *mtd,
                                     const struct mtd_ooblayout_ops *ooblayout)
 {
index 763bb6950402ba44ac2d2375589f5c4c08a37a58..0ec1da2ef6521658adc2656f120508242348042b 100644 (file)
@@ -228,7 +228,7 @@ struct nand_oobfree {
  * complete set of ECC information. The ioctl truncates the larger internal
  * structure to retain binary compatibility with the static declaration of the
  * ioctl. Note that the "MTD_MAX_..._ENTRIES" macros represent the max size of
- * the user struct, not the MAX size of the internal struct nand_ecclayout.
+ * the user struct, not the MAX size of the internal OOB layout representation.
  */
 struct nand_ecclayout_user {
        __u32 eccbytes;