summaryrefslogtreecommitdiffstats
path: root/fs/devfs-core.c
diff options
context:
space:
mode:
authorAlexander Aring <a.aring@phytec.de>2012-01-05 12:03:29 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2012-01-06 09:49:37 +0100
commit364c3aadfde81e20adf51efdeae0bb8347c663c2 (patch)
treef0c39e1dd74984c071bfd824894d3a616f2dc853 /fs/devfs-core.c
parent9ee3fb9e4aff132593293fd6400ffaf32a0db2cd (diff)
downloadbarebox-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.c39
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)