PATCH - Fix oob data copied into supplied buffer
authorTroy Kisky <troy.kisky@boundarydevices.com>
Mon, 24 Sep 2007 23:41:43 +0000 (16:41 -0700)
committerStefan Roese <sr@denx.de>
Mon, 21 Apr 2008 06:43:46 +0000 (08:43 +0200)
This patch correctly sets the oobavail variable
and fixes a bug where the oob data was not valid when
there where multiple groups in oobfree.

First segment fixes a typo
Second segment fixes a bug where oob data may be copied incorrectly.
Third segment adds an error message when exiting due to write protect.
Forth segment fixes a bug where oobavail may be set incorrectly.

Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com>
drivers/mtd/nand/nand_base.c

index 151f535c58bddbe2fac6873abd04cf7d84856011..2da1d4621c8467a4a7fdb540641530a903502d12 100644 (file)
@@ -931,7 +931,7 @@ static int nand_write_page (struct mtd_info *mtd, struct nand_chip *this, int pa
                        for (i = 0; i < eccbytes; i++, eccidx++)
                                oob_buf[oob_config[eccidx]] = ecc_code[i];
                        /* If the hardware ecc provides syndromes then
-                        * the ecc code must be written immidiately after
+                        * the ecc code must be written immediately after
                         * the data bytes (words) */
                        if (this->options & NAND_HWECC_SYNDROME)
                                this->write_buf(mtd, ecc_code, eccbytes);
@@ -1299,7 +1299,7 @@ static int nand_read_ecc (struct mtd_info *mtd, loff_t from, size_t len,
                                for (i = 0, j = 0; j < mtd->oobavail; i++) {
                                        int from = oobsel->oobfree[i][0];
                                        int num = oobsel->oobfree[i][1];
-                                       memcpy(&oob_buf[oob], &oob_data[from], num);
+                                       memcpy(&oob_buf[oob+j], &oob_data[from], num);
                                        j+= num;
                                }
                                oob += mtd->oobavail;
@@ -1644,8 +1644,10 @@ static int nand_write_ecc (struct mtd_info *mtd, loff_t to, size_t len,
        this->select_chip(mtd, chipnr);
 
        /* Check, if it is write protected */
-       if (nand_check_wp(mtd))
+       if (nand_check_wp(mtd)) {
+               printk (KERN_NOTICE "nand_write_ecc: Device is write protected\n");
                goto out;
+       }
 
        /* if oobsel is NULL, use chip defaults */
        if (oobsel == NULL)
@@ -2486,12 +2488,9 @@ int nand_scan (struct mtd_info *mtd, int maxchips)
 
        /* The number of bytes available for the filesystem to place fs dependend
         * oob data */
-       if (this->options & NAND_BUSWIDTH_16) {
-               mtd->oobavail = mtd->oobsize - (this->autooob->eccbytes + 2);
-               if (this->autooob->eccbytes & 0x01)
-                       mtd->oobavail--;
-       } else
-               mtd->oobavail = mtd->oobsize - (this->autooob->eccbytes + 1);
+       mtd->oobavail = 0;
+       for (i=0; this->autooob->oobfree[i][1]; i++)
+               mtd->oobavail += this->autooob->oobfree[i][1];
 
        /*
         * check ECC mode, default to software