|
@@ -322,6 +322,7 @@ struct mtd_info {
|
|
int (*_block_isreserved) (struct mtd_info *mtd, loff_t ofs);
|
|
int (*_block_isreserved) (struct mtd_info *mtd, loff_t ofs);
|
|
int (*_block_isbad) (struct mtd_info *mtd, loff_t ofs);
|
|
int (*_block_isbad) (struct mtd_info *mtd, loff_t ofs);
|
|
int (*_block_markbad) (struct mtd_info *mtd, loff_t ofs);
|
|
int (*_block_markbad) (struct mtd_info *mtd, loff_t ofs);
|
|
|
|
+ int (*_max_bad_blocks) (struct mtd_info *mtd, loff_t ofs, size_t len);
|
|
int (*_suspend) (struct mtd_info *mtd);
|
|
int (*_suspend) (struct mtd_info *mtd);
|
|
void (*_resume) (struct mtd_info *mtd);
|
|
void (*_resume) (struct mtd_info *mtd);
|
|
void (*_reboot) (struct mtd_info *mtd);
|
|
void (*_reboot) (struct mtd_info *mtd);
|
|
@@ -397,6 +398,18 @@ static inline int mtd_oobavail(struct mtd_info *mtd, struct mtd_oob_ops *ops)
|
|
return ops->mode == MTD_OPS_AUTO_OOB ? mtd->oobavail : mtd->oobsize;
|
|
return ops->mode == MTD_OPS_AUTO_OOB ? mtd->oobavail : mtd->oobsize;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static inline int mtd_max_bad_blocks(struct mtd_info *mtd,
|
|
|
|
+ loff_t ofs, size_t len)
|
|
|
|
+{
|
|
|
|
+ if (!mtd->_max_bad_blocks)
|
|
|
|
+ return -ENOTSUPP;
|
|
|
|
+
|
|
|
|
+ if (mtd->size < (len + ofs) || ofs < 0)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ return mtd->_max_bad_blocks(mtd, ofs, len);
|
|
|
|
+}
|
|
|
|
+
|
|
int mtd_wunit_to_pairing_info(struct mtd_info *mtd, int wunit,
|
|
int mtd_wunit_to_pairing_info(struct mtd_info *mtd, int wunit,
|
|
struct mtd_pairing_info *info);
|
|
struct mtd_pairing_info *info);
|
|
int mtd_pairing_info_to_wunit(struct mtd_info *mtd,
|
|
int mtd_pairing_info_to_wunit(struct mtd_info *mtd,
|