From 4b2ae15069017ce8f61ad9166ad5f5fbbf0b0ae1 Mon Sep 17 00:00:00 2001 From: p-zhangliming1 Date: Wed, 29 Mar 2023 18:10:56 +0800 Subject: [PATCH] nuttx/mtd: Add new functions part_isbad and part_markbad in mtd partition. Signed-off-by: p-zhangliming1 --- drivers/mtd/mtd_partition.c | 82 +++++++++++++++++++++++++++++++------ 1 file changed, 70 insertions(+), 12 deletions(-) diff --git a/drivers/mtd/mtd_partition.c b/drivers/mtd/mtd_partition.c index e4787a27734..554d4ecc728 100644 --- a/drivers/mtd/mtd_partition.c +++ b/drivers/mtd/mtd_partition.c @@ -116,6 +116,8 @@ static ssize_t part_write(FAR struct mtd_dev_s *dev, off_t offset, #endif static int part_ioctl(FAR struct mtd_dev_s *dev, int cmd, unsigned long arg); +static int part_isbad(FAR struct mtd_dev_s *dev, off_t block); +static int part_markbad(FAR struct mtd_dev_s *dev, off_t block); /* File system methods */ @@ -494,6 +496,60 @@ static int part_ioctl(FAR struct mtd_dev_s *dev, int cmd, unsigned long arg) return ret; } +/**************************************************************************** + * Name: part_isbad + * + * Description: + * Check bad block for the specified block number. + * + ****************************************************************************/ + +static int part_isbad(FAR struct mtd_dev_s *dev, off_t block) +{ + FAR struct mtd_partition_s *priv = (FAR struct mtd_partition_s *)dev; + + DEBUGASSERT(priv); + + /* Does the underlying MTD device support the isbad method? */ + + if (priv->parent->isbad) + { + return priv->parent->isbad(priv->parent, block + + priv->firstblock / priv->blkpererase); + } + + /* The underlying MTD driver does not support the isbad() method */ + + return -ENOSYS; +} + +/**************************************************************************** + * Name: part_markbad + * + * Description: + * Mark bad block for the specified block number. + * + ****************************************************************************/ + +static int part_markbad(FAR struct mtd_dev_s *dev, off_t block) +{ + FAR struct mtd_partition_s *priv = (FAR struct mtd_partition_s *)dev; + + DEBUGASSERT(priv); + + /* Does the underlying MTD device support the markbad method? */ + + if (priv->parent->markbad) + { + return priv->parent->markbad(priv->parent, block + + priv->firstblock / priv->blkpererase); + } + + /* The underlying MTD driver does not support the markbad() method */ + + return -ENOSYS; +} + #if defined(CONFIG_FS_PROCFS) && !defined(CONFIG_PROCFS_EXCLUDE_PARTITIONS) /**************************************************************************** @@ -851,21 +907,23 @@ FAR struct mtd_dev_s *mtd_partition(FAR struct mtd_dev_s *mtd, * nullified by kmm_zalloc). */ - part->child.erase = part_erase; - part->child.bread = part_bread; - part->child.bwrite = part_bwrite; - part->child.read = mtd->read ? part_read : NULL; - part->child.ioctl = part_ioctl; + part->child.erase = part_erase; + part->child.bread = part_bread; + part->child.bwrite = part_bwrite; + part->child.read = mtd->read ? part_read : NULL; + part->child.ioctl = part_ioctl; + part->child.isbad = part_isbad; + part->child.markbad = part_markbad; #ifdef CONFIG_MTD_BYTE_WRITE - part->child.write = mtd->write ? part_write : NULL; + part->child.write = mtd->write ? part_write : NULL; #endif - part->child.name = "part"; + part->child.name = "part"; - part->parent = mtd; - part->firstblock = erasestart * blkpererase; - part->neraseblocks = eraseend - erasestart; - part->blocksize = geo.blocksize; - part->blkpererase = blkpererase; + part->parent = mtd; + part->firstblock = erasestart * blkpererase; + part->neraseblocks = eraseend - erasestart; + part->blocksize = geo.blocksize; + part->blkpererase = blkpererase; #ifdef CONFIG_MTD_PARTITION_NAMES strlcpy(part->name, "(noname)", sizeof(part->name));