Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aab616e3 authored by Boris Brezillon's avatar Boris Brezillon
Browse files

mtd: kill the nand_ecclayout struct



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: default avatarBoris Brezillon <boris.brezillon@free-electrons.com>
parent 7f2b092c
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -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)
+0 −117
Original line number Diff line number Diff line
@@ -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
+0 −20
Original line number Diff line number Diff line
@@ -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)
{
+1 −1
Original line number Diff line number Diff line
@@ -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;