mtd/drivers/mtd mtdpart.c,1.32,1.33 mtdchar.c,1.49,1.50
gleixner at infradead.org
gleixner at infradead.org
Tue Feb 18 05:09:10 EST 2003
Update of /home/cvs/mtd/drivers/mtd
In directory phoenix.infradead.org:/tmp/cvs-serv11331
Modified Files:
mtdpart.c mtdchar.c
Log Message:
update for new NAND oob-layout selection
Index: mtdpart.c
===================================================================
RCS file: /home/cvs/mtd/drivers/mtd/mtdpart.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- mtdpart.c 21 Oct 2002 13:40:05 -0000 1.32
+++ mtdpart.c 18 Feb 2003 10:09:07 -0000 1.33
@@ -54,8 +54,12 @@
len = 0;
else if (from + len > mtd->size)
len = mtd->size - from;
- return part->master->read (part->master, from + part->offset,
+ if (part->master->read_ecc == NULL)
+ return part->master->read (part->master, from + part->offset,
len, retlen, buf);
+ else
+ return part->master->read_ecc (part->master, from + part->offset,
+ len, retlen, buf, NULL, &mtd->oobsel);
}
static int part_point (struct mtd_info *mtd, loff_t from, size_t len,
@@ -78,9 +82,11 @@
static int part_read_ecc (struct mtd_info *mtd, loff_t from, size_t len,
- size_t *retlen, u_char *buf, u_char *eccbuf, int oobsel)
+ size_t *retlen, u_char *buf, u_char *eccbuf, int *oobsel)
{
struct mtd_part *part = PART(mtd);
+ if (oobsel == NULL)
+ oobsel = &mtd->oobsel;
if (from >= mtd->size)
len = 0;
else if (from + len > mtd->size)
@@ -127,17 +133,24 @@
len = 0;
else if (to + len > mtd->size)
len = mtd->size - to;
- return part->master->write (part->master, to + part->offset,
+ if (part->master->write_ecc == NULL)
+ return part->master->write (part->master, to + part->offset,
len, retlen, buf);
+ else
+ return part->master->write_ecc (part->master, to + part->offset,
+ len, retlen, buf, NULL, &mtd->oobsel);
+
}
static int part_write_ecc (struct mtd_info *mtd, loff_t to, size_t len,
size_t *retlen, const u_char *buf,
- u_char *eccbuf, int oobsel)
+ u_char *eccbuf, int *oobsel)
{
struct mtd_part *part = PART(mtd);
if (!(mtd->flags & MTD_WRITEABLE))
return -EROFS;
+ if (oobsel == NULL)
+ oobsel = &mtd->oobsel;
if (to >= mtd->size)
len = 0;
else if (to + len > mtd->size)
@@ -174,25 +187,37 @@
struct mtd_part *part = PART(mtd);
if (!(mtd->flags & MTD_WRITEABLE))
return -EROFS;
- return part->master->writev (part->master, vecs, count,
+ if (part->master->writev_ecc == NULL)
+ return part->master->writev (part->master, vecs, count,
to + part->offset, retlen);
+ else
+ return part->master->writev_ecc (part->master, vecs, count,
+ to + part->offset, retlen,
+ NULL, &mtd->oobsel);
}
static int part_readv (struct mtd_info *mtd, struct iovec *vecs,
unsigned long count, loff_t from, size_t *retlen)
{
struct mtd_part *part = PART(mtd);
- return part->master->readv (part->master, vecs, count,
+ if (part->master->readv_ecc == NULL)
+ return part->master->readv (part->master, vecs, count,
from + part->offset, retlen);
+ else
+ return part->master->readv_ecc (part->master, vecs, count,
+ from + part->offset, retlen,
+ NULL, &mtd->oobsel);
}
static int part_writev_ecc (struct mtd_info *mtd, const struct iovec *vecs,
unsigned long count, loff_t to, size_t *retlen,
- u_char *eccbuf, int oobsel)
+ u_char *eccbuf, int *oobsel)
{
struct mtd_part *part = PART(mtd);
if (!(mtd->flags & MTD_WRITEABLE))
return -EROFS;
+ if (oobsel == NULL)
+ oobsel = &mtd->oobsel;
return part->master->writev_ecc (part->master, vecs, count,
to + part->offset, retlen,
eccbuf, oobsel);
@@ -200,9 +225,11 @@
static int part_readv_ecc (struct mtd_info *mtd, struct iovec *vecs,
unsigned long count, loff_t from, size_t *retlen,
- u_char *eccbuf, int oobsel)
+ u_char *eccbuf, int *oobsel)
{
struct mtd_part *part = PART(mtd);
+ if (oobsel == NULL)
+ oobsel = &mtd->oobsel;
return part->master->readv_ecc (part->master, vecs, count,
from + part->offset, retlen,
eccbuf, oobsel);
@@ -318,6 +345,7 @@
slave->mtd.oobsize = master->oobsize;
slave->mtd.ecctype = master->ecctype;
slave->mtd.eccsize = master->eccsize;
+ slave->mtd.oobsel = parts[i].oobsel;
slave->mtd.name = parts[i].name;
slave->mtd.bank_size = master->bank_size;
Index: mtdchar.c
===================================================================
RCS file: /home/cvs/mtd/drivers/mtd/mtdchar.c,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -r1.49 -r1.50
--- mtdchar.c 24 Jan 2003 12:02:58 -0000 1.49
+++ mtdchar.c 18 Feb 2003 10:09:07 -0000 1.50
@@ -442,80 +442,13 @@
break;
}
- case MEMWRITEDATA:
+ case MEMSETOOBSEL:
{
- struct mtd_oob_buf buf;
- void *databuf;
- ssize_t retlen;
-
- if (copy_from_user(&buf, (struct mtd_oob_buf *)arg, sizeof(struct mtd_oob_buf)))
+ if (copy_from_user(&mtd->oobsel ,(void *)arg, sizeof(uint32_t)))
return -EFAULT;
-
- if (buf.length > 0x4096)
- return -EINVAL;
- if (!mtd->write_ecc)
- ret = -EOPNOTSUPP;
- else
- ret = verify_area(VERIFY_READ, (char *)buf.ptr, buf.length);
-
- if (ret)
- return ret;
-
- databuf = kmalloc(buf.length, GFP_KERNEL);
- if (!databuf)
- return -ENOMEM;
-
- if (copy_from_user(databuf, buf.ptr, buf.length)) {
- kfree(databuf);
- return -EFAULT;
- }
-
- ret = (mtd->write_ecc)(mtd, buf.start, buf.length, &retlen, databuf, NULL, 0);
-
- if (copy_to_user((void *)arg + sizeof(u_int32_t), &retlen, sizeof(u_int32_t)))
- ret = -EFAULT;
-
- kfree(databuf);
- break;
-
- }
-
- case MEMREADDATA:
- {
- struct mtd_oob_buf buf;
- void *databuf;
- ssize_t retlen = 0;
-
- if (copy_from_user(&buf, (struct mtd_oob_buf *)arg, sizeof(struct mtd_oob_buf)))
- return -EFAULT;
-
- if (buf.length > 0x4096)
- return -EINVAL;
-
- if (!mtd->read_ecc)
- ret = -EOPNOTSUPP;
- else
- ret = verify_area(VERIFY_WRITE, (char *)buf.ptr, buf.length);
-
- if (ret)
- return ret;
-
- databuf = kmalloc(buf.length, GFP_KERNEL);
- if (!databuf)
- return -ENOMEM;
-
- ret = (mtd->read_ecc)(mtd, buf.start, buf.length, &retlen, databuf, NULL, 0);
-
- if (copy_to_user((void *)arg + sizeof(u_int32_t), &retlen, sizeof(u_int32_t)))
- ret = -EFAULT;
- else if (retlen && copy_to_user(buf.ptr, databuf, retlen))
- ret = -EFAULT;
-
- kfree(databuf);
break;
}
-
default:
DEBUG(MTD_DEBUG_LEVEL0, "Invalid ioctl %x (MEMGETINFO = %x)\n", cmd, MEMGETINFO);
More information about the linux-mtd-cvs
mailing list