diff options
Diffstat (limited to 'drivers/mtd/nftlmount.c')
-rw-r--r-- | drivers/mtd/nftlmount.c | 74 |
1 files changed, 44 insertions, 30 deletions
diff --git a/drivers/mtd/nftlmount.c b/drivers/mtd/nftlmount.c index 90e5e7e97fdc..521b07cd2326 100644 --- a/drivers/mtd/nftlmount.c +++ b/drivers/mtd/nftlmount.c | |||
@@ -45,6 +45,7 @@ static int find_boot_record(struct NFTLrecord *nftl) | |||
45 | size_t retlen; | 45 | size_t retlen; |
46 | u8 buf[SECTORSIZE]; | 46 | u8 buf[SECTORSIZE]; |
47 | struct NFTLMediaHeader *mh = &nftl->MediaHdr; | 47 | struct NFTLMediaHeader *mh = &nftl->MediaHdr; |
48 | struct mtd_info *mtd = nftl->mbd.mtd; | ||
48 | unsigned int i; | 49 | unsigned int i; |
49 | 50 | ||
50 | /* Assume logical EraseSize == physical erasesize for starting the scan. | 51 | /* Assume logical EraseSize == physical erasesize for starting the scan. |
@@ -65,7 +66,8 @@ static int find_boot_record(struct NFTLrecord *nftl) | |||
65 | 66 | ||
66 | /* Check for ANAND header first. Then can whinge if it's found but later | 67 | /* Check for ANAND header first. Then can whinge if it's found but later |
67 | checks fail */ | 68 | checks fail */ |
68 | ret = MTD_READ(nftl->mbd.mtd, block * nftl->EraseSize, SECTORSIZE, &retlen, buf); | 69 | ret = mtd->read(mtd, block * nftl->EraseSize, SECTORSIZE, |
70 | &retlen, buf); | ||
69 | /* We ignore ret in case the ECC of the MediaHeader is invalid | 71 | /* We ignore ret in case the ECC of the MediaHeader is invalid |
70 | (which is apparently acceptable) */ | 72 | (which is apparently acceptable) */ |
71 | if (retlen != SECTORSIZE) { | 73 | if (retlen != SECTORSIZE) { |
@@ -90,8 +92,9 @@ static int find_boot_record(struct NFTLrecord *nftl) | |||
90 | } | 92 | } |
91 | 93 | ||
92 | /* To be safer with BIOS, also use erase mark as discriminant */ | 94 | /* To be safer with BIOS, also use erase mark as discriminant */ |
93 | if ((ret = MTD_READOOB(nftl->mbd.mtd, block * nftl->EraseSize + SECTORSIZE + 8, | 95 | if ((ret = mtd->read_oob(mtd, block * nftl->EraseSize + |
94 | 8, &retlen, (char *)&h1) < 0)) { | 96 | SECTORSIZE + 8, 8, &retlen, |
97 | (char *)&h1) < 0)) { | ||
95 | printk(KERN_WARNING "ANAND header found at 0x%x in mtd%d, but OOB data read failed (err %d)\n", | 98 | printk(KERN_WARNING "ANAND header found at 0x%x in mtd%d, but OOB data read failed (err %d)\n", |
96 | block * nftl->EraseSize, nftl->mbd.mtd->index, ret); | 99 | block * nftl->EraseSize, nftl->mbd.mtd->index, ret); |
97 | continue; | 100 | continue; |
@@ -109,8 +112,8 @@ static int find_boot_record(struct NFTLrecord *nftl) | |||
109 | } | 112 | } |
110 | 113 | ||
111 | /* Finally reread to check ECC */ | 114 | /* Finally reread to check ECC */ |
112 | if ((ret = MTD_READECC(nftl->mbd.mtd, block * nftl->EraseSize, SECTORSIZE, | 115 | if ((ret = mtd->read(mtd, block * nftl->EraseSize, SECTORSIZE, |
113 | &retlen, buf, (char *)&oob, NULL) < 0)) { | 116 | &retlen, buf) < 0)) { |
114 | printk(KERN_NOTICE "ANAND header found at 0x%x in mtd%d, but ECC read failed (err %d)\n", | 117 | printk(KERN_NOTICE "ANAND header found at 0x%x in mtd%d, but ECC read failed (err %d)\n", |
115 | block * nftl->EraseSize, nftl->mbd.mtd->index, ret); | 118 | block * nftl->EraseSize, nftl->mbd.mtd->index, ret); |
116 | continue; | 119 | continue; |
@@ -228,9 +231,9 @@ device is already correct. | |||
228 | The new DiskOnChip driver already scanned the bad block table. Just query it. | 231 | The new DiskOnChip driver already scanned the bad block table. Just query it. |
229 | if ((i & (SECTORSIZE - 1)) == 0) { | 232 | if ((i & (SECTORSIZE - 1)) == 0) { |
230 | /* read one sector for every SECTORSIZE of blocks */ | 233 | /* read one sector for every SECTORSIZE of blocks */ |
231 | if ((ret = MTD_READECC(nftl->mbd.mtd, block * nftl->EraseSize + | 234 | if ((ret = mtd->read(nftl->mbd.mtd, block * nftl->EraseSize + |
232 | i + SECTORSIZE, SECTORSIZE, &retlen, buf, | 235 | i + SECTORSIZE, SECTORSIZE, &retlen, |
233 | (char *)&oob, NULL)) < 0) { | 236 | buf)) < 0) { |
234 | printk(KERN_NOTICE "Read of bad sector table failed (err %d)\n", | 237 | printk(KERN_NOTICE "Read of bad sector table failed (err %d)\n", |
235 | ret); | 238 | ret); |
236 | kfree(nftl->ReplUnitTable); | 239 | kfree(nftl->ReplUnitTable); |
@@ -305,10 +308,11 @@ int NFTL_formatblock(struct NFTLrecord *nftl, int block) | |||
305 | unsigned int nb_erases, erase_mark; | 308 | unsigned int nb_erases, erase_mark; |
306 | struct nftl_uci1 uci; | 309 | struct nftl_uci1 uci; |
307 | struct erase_info *instr = &nftl->instr; | 310 | struct erase_info *instr = &nftl->instr; |
311 | struct mtd_info *mtd = nftl->mbd.mtd; | ||
308 | 312 | ||
309 | /* Read the Unit Control Information #1 for Wear-Leveling */ | 313 | /* Read the Unit Control Information #1 for Wear-Leveling */ |
310 | if (MTD_READOOB(nftl->mbd.mtd, block * nftl->EraseSize + SECTORSIZE + 8, | 314 | if (mtd->read_oob(mtd, block * nftl->EraseSize + SECTORSIZE + 8, |
311 | 8, &retlen, (char *)&uci) < 0) | 315 | 8, &retlen, (char *)&uci) < 0) |
312 | goto default_uci1; | 316 | goto default_uci1; |
313 | 317 | ||
314 | erase_mark = le16_to_cpu ((uci.EraseMark | uci.EraseMark1)); | 318 | erase_mark = le16_to_cpu ((uci.EraseMark | uci.EraseMark1)); |
@@ -325,7 +329,7 @@ int NFTL_formatblock(struct NFTLrecord *nftl, int block) | |||
325 | instr->mtd = nftl->mbd.mtd; | 329 | instr->mtd = nftl->mbd.mtd; |
326 | instr->addr = block * nftl->EraseSize; | 330 | instr->addr = block * nftl->EraseSize; |
327 | instr->len = nftl->EraseSize; | 331 | instr->len = nftl->EraseSize; |
328 | MTD_ERASE(nftl->mbd.mtd, instr); | 332 | mtd->erase(mtd, instr); |
329 | 333 | ||
330 | if (instr->state == MTD_ERASE_FAILED) { | 334 | if (instr->state == MTD_ERASE_FAILED) { |
331 | printk("Error while formatting block %d\n", block); | 335 | printk("Error while formatting block %d\n", block); |
@@ -347,8 +351,8 @@ int NFTL_formatblock(struct NFTLrecord *nftl, int block) | |||
347 | goto fail; | 351 | goto fail; |
348 | 352 | ||
349 | uci.WearInfo = le32_to_cpu(nb_erases); | 353 | uci.WearInfo = le32_to_cpu(nb_erases); |
350 | if (MTD_WRITEOOB(nftl->mbd.mtd, block * nftl->EraseSize + SECTORSIZE + 8, 8, | 354 | if (mtd->write_oob(mtd, block * nftl->EraseSize + SECTORSIZE + |
351 | &retlen, (char *)&uci) < 0) | 355 | 8, 8, &retlen, (char *)&uci) < 0) |
352 | goto fail; | 356 | goto fail; |
353 | return 0; | 357 | return 0; |
354 | fail: | 358 | fail: |
@@ -369,6 +373,7 @@ fail: | |||
369 | * case. */ | 373 | * case. */ |
370 | static void check_sectors_in_chain(struct NFTLrecord *nftl, unsigned int first_block) | 374 | static void check_sectors_in_chain(struct NFTLrecord *nftl, unsigned int first_block) |
371 | { | 375 | { |
376 | struct mtd_info *mtd = nftl->mbd.mtd; | ||
372 | unsigned int block, i, status; | 377 | unsigned int block, i, status; |
373 | struct nftl_bci bci; | 378 | struct nftl_bci bci; |
374 | int sectors_per_block; | 379 | int sectors_per_block; |
@@ -378,8 +383,9 @@ static void check_sectors_in_chain(struct NFTLrecord *nftl, unsigned int first_b | |||
378 | block = first_block; | 383 | block = first_block; |
379 | for (;;) { | 384 | for (;;) { |
380 | for (i = 0; i < sectors_per_block; i++) { | 385 | for (i = 0; i < sectors_per_block; i++) { |
381 | if (MTD_READOOB(nftl->mbd.mtd, block * nftl->EraseSize + i * SECTORSIZE, | 386 | if (mtd->read_oob(mtd, |
382 | 8, &retlen, (char *)&bci) < 0) | 387 | block * nftl->EraseSize + i * SECTORSIZE, |
388 | 8, &retlen, (char *)&bci) < 0) | ||
383 | status = SECTOR_IGNORE; | 389 | status = SECTOR_IGNORE; |
384 | else | 390 | else |
385 | status = bci.Status | bci.Status1; | 391 | status = bci.Status | bci.Status1; |
@@ -398,9 +404,10 @@ static void check_sectors_in_chain(struct NFTLrecord *nftl, unsigned int first_b | |||
398 | /* sector not free actually : mark it as SECTOR_IGNORE */ | 404 | /* sector not free actually : mark it as SECTOR_IGNORE */ |
399 | bci.Status = SECTOR_IGNORE; | 405 | bci.Status = SECTOR_IGNORE; |
400 | bci.Status1 = SECTOR_IGNORE; | 406 | bci.Status1 = SECTOR_IGNORE; |
401 | MTD_WRITEOOB(nftl->mbd.mtd, | 407 | mtd->write_oob(mtd, block * |
402 | block * nftl->EraseSize + i * SECTORSIZE, | 408 | nftl->EraseSize + |
403 | 8, &retlen, (char *)&bci); | 409 | i * SECTORSIZE, 8, |
410 | &retlen, (char *)&bci); | ||
404 | } | 411 | } |
405 | break; | 412 | break; |
406 | default: | 413 | default: |
@@ -485,13 +492,14 @@ static void format_chain(struct NFTLrecord *nftl, unsigned int first_block) | |||
485 | * 1. */ | 492 | * 1. */ |
486 | static int check_and_mark_free_block(struct NFTLrecord *nftl, int block) | 493 | static int check_and_mark_free_block(struct NFTLrecord *nftl, int block) |
487 | { | 494 | { |
495 | struct mtd_info *mtd = nftl->mbd.mtd; | ||
488 | struct nftl_uci1 h1; | 496 | struct nftl_uci1 h1; |
489 | unsigned int erase_mark; | 497 | unsigned int erase_mark; |
490 | size_t retlen; | 498 | size_t retlen; |
491 | 499 | ||
492 | /* check erase mark. */ | 500 | /* check erase mark. */ |
493 | if (MTD_READOOB(nftl->mbd.mtd, block * nftl->EraseSize + SECTORSIZE + 8, 8, | 501 | if (mtd->read_oob(mtd, block * nftl->EraseSize + SECTORSIZE + 8, 8, |
494 | &retlen, (char *)&h1) < 0) | 502 | &retlen, (char *)&h1) < 0) |
495 | return -1; | 503 | return -1; |
496 | 504 | ||
497 | erase_mark = le16_to_cpu ((h1.EraseMark | h1.EraseMark1)); | 505 | erase_mark = le16_to_cpu ((h1.EraseMark | h1.EraseMark1)); |
@@ -505,8 +513,9 @@ static int check_and_mark_free_block(struct NFTLrecord *nftl, int block) | |||
505 | h1.EraseMark = cpu_to_le16(ERASE_MARK); | 513 | h1.EraseMark = cpu_to_le16(ERASE_MARK); |
506 | h1.EraseMark1 = cpu_to_le16(ERASE_MARK); | 514 | h1.EraseMark1 = cpu_to_le16(ERASE_MARK); |
507 | h1.WearInfo = cpu_to_le32(0); | 515 | h1.WearInfo = cpu_to_le32(0); |
508 | if (MTD_WRITEOOB(nftl->mbd.mtd, block * nftl->EraseSize + SECTORSIZE + 8, 8, | 516 | if (mtd->write_oob(mtd, |
509 | &retlen, (char *)&h1) < 0) | 517 | block * nftl->EraseSize + SECTORSIZE + 8, 8, |
518 | &retlen, (char *)&h1) < 0) | ||
510 | return -1; | 519 | return -1; |
511 | } else { | 520 | } else { |
512 | #if 0 | 521 | #if 0 |
@@ -517,8 +526,8 @@ static int check_and_mark_free_block(struct NFTLrecord *nftl, int block) | |||
517 | SECTORSIZE, 0) != 0) | 526 | SECTORSIZE, 0) != 0) |
518 | return -1; | 527 | return -1; |
519 | 528 | ||
520 | if (MTD_READOOB(nftl->mbd.mtd, block * nftl->EraseSize + i, | 529 | if (mtd->read_oob(mtd, block * nftl->EraseSize + i, |
521 | 16, &retlen, buf) < 0) | 530 | 16, &retlen, buf) < 0) |
522 | return -1; | 531 | return -1; |
523 | if (i == SECTORSIZE) { | 532 | if (i == SECTORSIZE) { |
524 | /* skip erase mark */ | 533 | /* skip erase mark */ |
@@ -544,11 +553,12 @@ static int check_and_mark_free_block(struct NFTLrecord *nftl, int block) | |||
544 | */ | 553 | */ |
545 | static int get_fold_mark(struct NFTLrecord *nftl, unsigned int block) | 554 | static int get_fold_mark(struct NFTLrecord *nftl, unsigned int block) |
546 | { | 555 | { |
556 | struct mtd_info *mtd = nftl->mbd.mtd; | ||
547 | struct nftl_uci2 uci; | 557 | struct nftl_uci2 uci; |
548 | size_t retlen; | 558 | size_t retlen; |
549 | 559 | ||
550 | if (MTD_READOOB(nftl->mbd.mtd, block * nftl->EraseSize + 2 * SECTORSIZE + 8, | 560 | if (mtd->read_oob(mtd, block * nftl->EraseSize + 2 * SECTORSIZE + 8, |
551 | 8, &retlen, (char *)&uci) < 0) | 561 | 8, &retlen, (char *)&uci) < 0) |
552 | return 0; | 562 | return 0; |
553 | 563 | ||
554 | return le16_to_cpu((uci.FoldMark | uci.FoldMark1)); | 564 | return le16_to_cpu((uci.FoldMark | uci.FoldMark1)); |
@@ -562,6 +572,7 @@ int NFTL_mount(struct NFTLrecord *s) | |||
562 | int chain_length, do_format_chain; | 572 | int chain_length, do_format_chain; |
563 | struct nftl_uci0 h0; | 573 | struct nftl_uci0 h0; |
564 | struct nftl_uci1 h1; | 574 | struct nftl_uci1 h1; |
575 | struct mtd_info *mtd = s->mbd.mtd; | ||
565 | size_t retlen; | 576 | size_t retlen; |
566 | 577 | ||
567 | /* search for NFTL MediaHeader and Spare NFTL Media Header */ | 578 | /* search for NFTL MediaHeader and Spare NFTL Media Header */ |
@@ -586,10 +597,13 @@ int NFTL_mount(struct NFTLrecord *s) | |||
586 | 597 | ||
587 | for (;;) { | 598 | for (;;) { |
588 | /* read the block header. If error, we format the chain */ | 599 | /* read the block header. If error, we format the chain */ |
589 | if (MTD_READOOB(s->mbd.mtd, block * s->EraseSize + 8, 8, | 600 | if (mtd->read_oob(mtd, |
590 | &retlen, (char *)&h0) < 0 || | 601 | block * s->EraseSize + 8, 8, |
591 | MTD_READOOB(s->mbd.mtd, block * s->EraseSize + SECTORSIZE + 8, 8, | 602 | &retlen, (char *)&h0) < 0 || |
592 | &retlen, (char *)&h1) < 0) { | 603 | mtd->read_oob(mtd, |
604 | block * s->EraseSize + | ||
605 | SECTORSIZE + 8, 8, | ||
606 | &retlen, (char *)&h1) < 0) { | ||
593 | s->ReplUnitTable[block] = BLOCK_NIL; | 607 | s->ReplUnitTable[block] = BLOCK_NIL; |
594 | do_format_chain = 1; | 608 | do_format_chain = 1; |
595 | break; | 609 | break; |