summaryrefslogtreecommitdiffstats
path: root/drivers/mtd/mtdconcat.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2016-02-23 14:41:48 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2016-03-15 08:56:53 +0100
commit172af2a30c4fbd71087103e4cf9b6c9f585d8602 (patch)
tree1e5c8022adfcb2191064a50d155f9239311924e3 /drivers/mtd/mtdconcat.c
parenta0fa6e1d2b6ac59ecb0cf531fb3b37fab636e336 (diff)
downloadbarebox-172af2a30c4fbd71087103e4cf9b6c9f585d8602.tar.gz
barebox-172af2a30c4fbd71087103e4cf9b6c9f585d8602.tar.xz
mtd: Add support for marking blocks as good
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/mtd/mtdconcat.c')
-rw-r--r--drivers/mtd/mtdconcat.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/mtd/mtdconcat.c b/drivers/mtd/mtdconcat.c
index 6395b2fd52..fa430712d0 100644
--- a/drivers/mtd/mtdconcat.c
+++ b/drivers/mtd/mtdconcat.c
@@ -506,6 +506,28 @@ static int concat_block_markbad(struct mtd_info *mtd, loff_t ofs)
return err;
}
+static int concat_block_markgood(struct mtd_info *mtd, loff_t ofs)
+{
+ struct mtd_concat *concat = CONCAT(mtd);
+ int i, err = -EINVAL;
+
+ for (i = 0; i < concat->num_subdev; i++) {
+ struct mtd_info *subdev = concat->subdev[i];
+
+ if (ofs >= subdev->size) {
+ ofs -= subdev->size;
+ continue;
+ }
+
+ err = mtd_block_markgood(subdev, ofs);
+ if (!err)
+ mtd->ecc_stats.badblocks--;
+ break;
+ }
+
+ return err;
+}
+
/*
* This function constructs a virtual MTD device by concatenating
* num_devs MTD devices. A pointer to the new device object is
@@ -565,6 +587,8 @@ struct mtd_info *mtd_concat_create(struct mtd_info *subdev[], /* subdevices to c
concat->mtd.block_isbad = concat_block_isbad;
if (subdev[0]->block_markbad)
concat->mtd.block_markbad = concat_block_markbad;
+ if (subdev[0]->block_markgood)
+ concat->mtd.block_markgood = concat_block_markgood;
concat->mtd.ecc_stats.badblocks = subdev[0]->ecc_stats.badblocks;