diff options
| -rw-r--r-- | drivers/mtd/nand/nand_base.c | 19 | ||||
| -rw-r--r-- | drivers/mtd/nand/nand_bbt.c | 26 | ||||
| -rw-r--r-- | include/linux/mtd/mtd.h | 4 |
3 files changed, 30 insertions, 19 deletions
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 138674183c1c..51dfea1b3ce6 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c | |||
| @@ -1474,18 +1474,13 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from, | |||
| 1474 | 1474 | ||
| 1475 | if (unlikely(oob)) { | 1475 | if (unlikely(oob)) { |
| 1476 | 1476 | ||
| 1477 | /* Raw mode does data:oob:data:oob */ | 1477 | int toread = min(oobreadlen, max_oobsize); |
| 1478 | if (ops->mode != MTD_OOB_RAW) { | 1478 | |
| 1479 | int toread = min(oobreadlen, | 1479 | if (toread) { |
| 1480 | max_oobsize); | 1480 | oob = nand_transfer_oob(chip, |
| 1481 | if (toread) { | 1481 | oob, ops, toread); |
| 1482 | oob = nand_transfer_oob(chip, | 1482 | oobreadlen -= toread; |
| 1483 | oob, ops, toread); | 1483 | } |
| 1484 | oobreadlen -= toread; | ||
| 1485 | } | ||
| 1486 | } else | ||
| 1487 | buf = nand_transfer_oob(chip, | ||
| 1488 | buf, ops, mtd->oobsize); | ||
| 1489 | } | 1484 | } |
| 1490 | 1485 | ||
| 1491 | if (!(chip->options & NAND_NO_READRDY)) { | 1486 | if (!(chip->options & NAND_NO_READRDY)) { |
diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c index 55c23e5cd210..387c45c366fe 100644 --- a/drivers/mtd/nand/nand_bbt.c +++ b/drivers/mtd/nand/nand_bbt.c | |||
| @@ -237,15 +237,33 @@ static int scan_read_raw(struct mtd_info *mtd, uint8_t *buf, loff_t offs, | |||
| 237 | size_t len) | 237 | size_t len) |
| 238 | { | 238 | { |
| 239 | struct mtd_oob_ops ops; | 239 | struct mtd_oob_ops ops; |
| 240 | int res; | ||
| 240 | 241 | ||
| 241 | ops.mode = MTD_OOB_RAW; | 242 | ops.mode = MTD_OOB_RAW; |
| 242 | ops.ooboffs = 0; | 243 | ops.ooboffs = 0; |
| 243 | ops.ooblen = mtd->oobsize; | 244 | ops.ooblen = mtd->oobsize; |
| 244 | ops.oobbuf = buf; | ||
| 245 | ops.datbuf = buf; | ||
| 246 | ops.len = len; | ||
| 247 | 245 | ||
| 248 | return mtd->read_oob(mtd, offs, &ops); | 246 | |
| 247 | while (len > 0) { | ||
| 248 | if (len <= mtd->writesize) { | ||
| 249 | ops.oobbuf = buf + len; | ||
| 250 | ops.datbuf = buf; | ||
| 251 | ops.len = len; | ||
| 252 | return mtd->read_oob(mtd, offs, &ops); | ||
| 253 | } else { | ||
| 254 | ops.oobbuf = buf + mtd->writesize; | ||
| 255 | ops.datbuf = buf; | ||
| 256 | ops.len = mtd->writesize; | ||
| 257 | res = mtd->read_oob(mtd, offs, &ops); | ||
| 258 | |||
| 259 | if (res) | ||
| 260 | return res; | ||
| 261 | } | ||
| 262 | |||
| 263 | buf += mtd->oobsize + mtd->writesize; | ||
| 264 | len -= mtd->writesize; | ||
| 265 | } | ||
| 266 | return 0; | ||
| 249 | } | 267 | } |
| 250 | 268 | ||
| 251 | /* | 269 | /* |
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index 11d8e68d17c0..5326435a7571 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h | |||
| @@ -60,9 +60,7 @@ struct mtd_erase_region_info { | |||
| 60 | * MTD_OOB_PLACE: oob data are placed at the given offset | 60 | * MTD_OOB_PLACE: oob data are placed at the given offset |
| 61 | * MTD_OOB_AUTO: oob data are automatically placed at the free areas | 61 | * MTD_OOB_AUTO: oob data are automatically placed at the free areas |
| 62 | * which are defined by the ecclayout | 62 | * which are defined by the ecclayout |
| 63 | * MTD_OOB_RAW: mode to read raw data+oob in one chunk. The oob data | 63 | * MTD_OOB_RAW: mode to read oob and data without doing ECC checking |
| 64 | * is inserted into the data. Thats a raw image of the | ||
| 65 | * flash contents. | ||
| 66 | */ | 64 | */ |
| 67 | typedef enum { | 65 | typedef enum { |
| 68 | MTD_OOB_PLACE, | 66 | MTD_OOB_PLACE, |
