diff options
author | Alexander Aring <a.aring@phytec.de> | 2012-01-05 12:03:29 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-01-06 09:49:37 +0100 |
commit | 364c3aadfde81e20adf51efdeae0bb8347c663c2 (patch) | |
tree | f0c39e1dd74984c071bfd824894d3a616f2dc853 /fs/devfs-core.c | |
parent | 9ee3fb9e4aff132593293fd6400ffaf32a0db2cd (diff) | |
download | barebox-364c3aadfde81e20adf51efdeae0bb8347c663c2.tar.gz barebox-364c3aadfde81e20adf51efdeae0bb8347c663c2.tar.xz |
ioctl: add support for ECCGETSTATS and MEMGETREGIONINFO
Support added for ioctl of ECCGETSTATS and MEMGETREGIONINFO.
Fix default handling in core.c to return -EINVAL, if request
was unknown.
Signed-off-by: Alexander Aring <a.aring@phytec.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'fs/devfs-core.c')
-rw-r--r-- | fs/devfs-core.c | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/fs/devfs-core.c b/fs/devfs-core.c index 5f22ce72f9..e11fea2eae 100644 --- a/fs/devfs-core.c +++ b/fs/devfs-core.c @@ -103,15 +103,18 @@ int cdev_flush(struct cdev *cdev) static int partition_ioctl(struct cdev *cdev, int request, void *buf) { + int ret = 0; size_t offset; struct mtd_info_user *user = buf; + struct region_info_user *reg = buf; switch (request) { case MEMSETBADBLOCK: case MEMGETBADBLOCK: offset = (off_t)buf; offset += cdev->offset; - return cdev->ops->ioctl(cdev, request, (void *)offset); + ret = cdev->ops->ioctl(cdev, request, (void *)offset); + break; case MEMGETINFO: if (cdev->mtd) { user->type = cdev->mtd->type; @@ -123,14 +126,38 @@ static int partition_ioctl(struct cdev *cdev, int request, void *buf) /* The below fields are obsolete */ user->ecctype = -1; user->eccsize = 0; - return 0; + break; } - if (!cdev->ops->ioctl) - return -EINVAL; - return cdev->ops->ioctl(cdev, request, buf); + if (!cdev->ops->ioctl) { + ret = -EINVAL; + break; + } + ret = cdev->ops->ioctl(cdev, request, buf); + break; +#if (defined(CONFIG_NAND_ECC_HW) || defined(CONFIG_NAND_ECC_SOFT)) + case ECCGETSTATS: + if (!cdev->ops->ioctl) { + ret = -EINVAL; + break; + } + ret = cdev->ops->ioctl(cdev, request, buf); + break; +#endif +#ifdef CONFIG_PARTITION + case MEMGETREGIONINFO: + if (cdev->mtd) { + reg->offset = cdev->offset; + reg->erasesize = cdev->mtd->erasesize; + reg->numblocks = cdev->size/reg->erasesize; + reg->regionindex = cdev->mtd->index; + } + break; +#endif default: - return -EINVAL; + ret = -EINVAL; } + + return ret; } int cdev_ioctl(struct cdev *cdev, int request, void *buf) |