mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-26 18:43:33 -05:00
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: Boris Brezillon <boris.brezillon@free-electrons.com>
This commit is contained in:
parent
7f2b092c9e
commit
aab616e31d
4 changed files with 7 additions and 144 deletions
|
@ -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,
|
* Copies (and truncates, if necessary) OOB layout information to the
|
||||||
* nand_ecclayout, to the smaller, deprecated layout struct,
|
* deprecated layout struct, nand_ecclayout_user. This is necessary only to
|
||||||
* nand_ecclayout_user. This is necessary only to support the deprecated
|
* support the deprecated API ioctl ECCGETLAYOUT while allowing all new
|
||||||
* API ioctl ECCGETLAYOUT while allowing all new functionality to use
|
* functionality to use mtd_ooblayout_ops flexibly (i.e. mtd_ooblayout_ops
|
||||||
* nand_ecclayout flexibly (i.e. the struct may change size in new
|
* can describe any kind of OOB layout with almost zero overhead from a
|
||||||
* releases without requiring major rewrites).
|
* memory usage point of view).
|
||||||
*/
|
*/
|
||||||
static int shrink_ecclayout(struct mtd_info *mtd,
|
static int shrink_ecclayout(struct mtd_info *mtd,
|
||||||
struct nand_ecclayout_user *to)
|
struct nand_ecclayout_user *to)
|
||||||
|
|
|
@ -1376,123 +1376,6 @@ int mtd_ooblayout_count_eccbytes(struct mtd_info *mtd)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mtd_ooblayout_count_eccbytes);
|
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
|
* 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
|
* devices. The user data is one time programmable but the factory data is read
|
||||||
|
|
|
@ -96,21 +96,6 @@ struct mtd_oob_ops {
|
||||||
|
|
||||||
#define MTD_MAX_OOBFREE_ENTRIES_LARGE 32
|
#define MTD_MAX_OOBFREE_ENTRIES_LARGE 32
|
||||||
#define MTD_MAX_ECCPOS_ENTRIES_LARGE 640
|
#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
|
* struct mtd_oob_region - oob region definition
|
||||||
* @offset: region offset
|
* @offset: region offset
|
||||||
|
@ -200,9 +185,6 @@ struct mtd_info {
|
||||||
const char *name;
|
const char *name;
|
||||||
int index;
|
int index;
|
||||||
|
|
||||||
/* [Deprecated] ECC layout structure pointer - read only! */
|
|
||||||
struct nand_ecclayout *ecclayout;
|
|
||||||
|
|
||||||
/* OOB layout description */
|
/* OOB layout description */
|
||||||
const struct mtd_ooblayout_ops *ooblayout;
|
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_freebytes(struct mtd_info *mtd);
|
||||||
int mtd_ooblayout_count_eccbytes(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,
|
static inline void mtd_set_ooblayout(struct mtd_info *mtd,
|
||||||
const struct mtd_ooblayout_ops *ooblayout)
|
const struct mtd_ooblayout_ops *ooblayout)
|
||||||
{
|
{
|
||||||
|
|
|
@ -228,7 +228,7 @@ struct nand_oobfree {
|
||||||
* complete set of ECC information. The ioctl truncates the larger internal
|
* complete set of ECC information. The ioctl truncates the larger internal
|
||||||
* structure to retain binary compatibility with the static declaration of the
|
* structure to retain binary compatibility with the static declaration of the
|
||||||
* ioctl. Note that the "MTD_MAX_..._ENTRIES" macros represent the max size of
|
* 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 {
|
struct nand_ecclayout_user {
|
||||||
__u32 eccbytes;
|
__u32 eccbytes;
|
||||||
|
|
Loading…
Add table
Reference in a new issue