mtd: nand: make MTD_OOB_PLACE work correctly.
authorMaxim Levitsky <maximlevitsky@gmail.com>
Mon, 22 Feb 2010 18:39:35 +0000 (20:39 +0200)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Fri, 26 Feb 2010 17:44:51 +0000 (17:44 +0000)
MTD_OOB_PLACE is supposed to read/write the raw oob data similiar to the
MTD_OOB_RAW however due to a bug, currently it is not possible to read
more data that is specified by the oob 'free' regions.

Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/mtd/nand/nand_base.c

index 7442b3a29b256341601638d0f2b1597881d51f79..cada4cffacf88bb2a67dae733bc6b5469ff7b7cd 100644 (file)
@@ -1420,6 +1420,9 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
        int ret = 0;
        uint32_t readlen = ops->len;
        uint32_t oobreadlen = ops->ooblen;
+       uint32_t max_oobsize = ops->mode == MTD_OOB_AUTO ?
+               mtd->oobavail : mtd->oobsize;
+
        uint8_t *bufpoi, *oob, *buf;
 
        stats = mtd->ecc_stats;
@@ -1470,10 +1473,11 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
                        buf += bytes;
 
                        if (unlikely(oob)) {
+
                                /* Raw mode does data:oob:data:oob */
                                if (ops->mode != MTD_OOB_RAW) {
                                        int toread = min(oobreadlen,
-                                               chip->ecc.layout->oobavail);
+                                                               max_oobsize);
                                        if (toread) {
                                                oob = nand_transfer_oob(chip,
                                                        oob, ops, toread);