diff options
author | Thomas Gleixner <tglx@cruncher.tec.linutronix.de> | 2006-06-20 14:05:05 -0400 |
---|---|---|
committer | David Woodhouse <dwmw2@infradead.org> | 2006-06-20 15:31:24 -0400 |
commit | 7bc3312bef4d6f220812500c0de7868fb7625a41 (patch) | |
tree | 9ad49e850cdfe9868a19a37681bbf4d403e47ed3 /drivers/mtd/mtdchar.c | |
parent | 7e4178f90eec862affc97469118d5008bd1b5bda (diff) |
[MTD] NAND: Fix breakage all over the place
Following problems are addressed:
- wrong status caused early break out of nand_wait()
- removed the bogus status check in nand_wait() which
is a relict of the abandoned support for interrupted
erase.
- status check moved to the correct place in read_oob
- oob support for syndrom based ecc with strange layouts
- use given offset in the AUTOOOB based oob operations
Partially based on a patch from Vitaly Vool <vwool@ru.mvista.com>
Thanks to Savin Zlobec <savin@epico.si> for tracking down the
status problem.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'drivers/mtd/mtdchar.c')
-rw-r--r-- | drivers/mtd/mtdchar.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c index 5dd0b8d72c8b..aa18d45b264b 100644 --- a/drivers/mtd/mtdchar.c +++ b/drivers/mtd/mtdchar.c | |||
@@ -504,12 +504,12 @@ static int mtd_ioctl(struct inode *inode, struct file *file, | |||
504 | return ret; | 504 | return ret; |
505 | 505 | ||
506 | ops.len = buf.length; | 506 | ops.len = buf.length; |
507 | ops.ooblen = mtd->oobsize; | 507 | ops.ooblen = buf.length; |
508 | ops.ooboffs = buf.start & (mtd->oobsize - 1); | 508 | ops.ooboffs = buf.start & (mtd->oobsize - 1); |
509 | ops.datbuf = NULL; | 509 | ops.datbuf = NULL; |
510 | ops.mode = MTD_OOB_PLACE; | 510 | ops.mode = MTD_OOB_PLACE; |
511 | 511 | ||
512 | if (ops.ooboffs && ops.len > (ops.ooblen - ops.ooboffs)) | 512 | if (ops.ooboffs && ops.len > (mtd->oobsize - ops.ooboffs)) |
513 | return -EINVAL; | 513 | return -EINVAL; |
514 | 514 | ||
515 | ops.oobbuf = kmalloc(buf.length, GFP_KERNEL); | 515 | ops.oobbuf = kmalloc(buf.length, GFP_KERNEL); |
@@ -553,12 +553,12 @@ static int mtd_ioctl(struct inode *inode, struct file *file, | |||
553 | return ret; | 553 | return ret; |
554 | 554 | ||
555 | ops.len = buf.length; | 555 | ops.len = buf.length; |
556 | ops.ooblen = mtd->oobsize; | 556 | ops.ooblen = buf.length; |
557 | ops.ooboffs = buf.start & (mtd->oobsize - 1); | 557 | ops.ooboffs = buf.start & (mtd->oobsize - 1); |
558 | ops.datbuf = NULL; | 558 | ops.datbuf = NULL; |
559 | ops.mode = MTD_OOB_PLACE; | 559 | ops.mode = MTD_OOB_PLACE; |
560 | 560 | ||
561 | if (ops.ooboffs && ops.len > (ops.ooblen - ops.ooboffs)) | 561 | if (ops.ooboffs && ops.len > (mtd->oobsize - ops.ooboffs)) |
562 | return -EINVAL; | 562 | return -EINVAL; |
563 | 563 | ||
564 | ops.oobbuf = kmalloc(buf.length, GFP_KERNEL); | 564 | ops.oobbuf = kmalloc(buf.length, GFP_KERNEL); |