PATCH - Fix oob data copied into supplied buffer

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>
This commit is contained in:
Troy Kisky 2007-09-24 16:41:43 -07:00 committed by Stefan Roese
parent 46f373838e
commit 84c01d3a05

View 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++) for (i = 0; i < eccbytes; i++, eccidx++)
oob_buf[oob_config[eccidx]] = ecc_code[i]; oob_buf[oob_config[eccidx]] = ecc_code[i];
/* If the hardware ecc provides syndromes then /* 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) */ * the data bytes (words) */
if (this->options & NAND_HWECC_SYNDROME) if (this->options & NAND_HWECC_SYNDROME)
this->write_buf(mtd, ecc_code, eccbytes); 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++) { for (i = 0, j = 0; j < mtd->oobavail; i++) {
int from = oobsel->oobfree[i][0]; int from = oobsel->oobfree[i][0];
int num = oobsel->oobfree[i][1]; 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; j+= num;
} }
oob += mtd->oobavail; 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); this->select_chip(mtd, chipnr);
/* Check, if it is write protected */ /* 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; goto out;
}
/* if oobsel is NULL, use chip defaults */ /* if oobsel is NULL, use chip defaults */
if (oobsel == NULL) 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 /* The number of bytes available for the filesystem to place fs dependend
* oob data */ * oob data */
if (this->options & NAND_BUSWIDTH_16) { mtd->oobavail = 0;
mtd->oobavail = mtd->oobsize - (this->autooob->eccbytes + 2); for (i=0; this->autooob->oobfree[i][1]; i++)
if (this->autooob->eccbytes & 0x01) mtd->oobavail += this->autooob->oobfree[i][1];
mtd->oobavail--;
} else
mtd->oobavail = mtd->oobsize - (this->autooob->eccbytes + 1);
/* /*
* check ECC mode, default to software * check ECC mode, default to software