diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mtd/inftlcore.c | 63 | ||||
-rw-r--r-- | drivers/mtd/inftlmount.c | 43 | ||||
-rw-r--r-- | drivers/mtd/maps/nettel.c | 2 | ||||
-rw-r--r-- | drivers/mtd/mtdblock.c | 13 | ||||
-rw-r--r-- | drivers/mtd/mtdchar.c | 4 | ||||
-rw-r--r-- | drivers/mtd/nftlcore.c | 144 | ||||
-rw-r--r-- | drivers/mtd/nftlmount.c | 74 |
7 files changed, 186 insertions, 157 deletions
diff --git a/drivers/mtd/inftlcore.c b/drivers/mtd/inftlcore.c index ddd12993780d..3396f0e1ac5f 100644 --- a/drivers/mtd/inftlcore.c +++ b/drivers/mtd/inftlcore.c | |||
@@ -197,10 +197,11 @@ static u16 INFTL_foldchain(struct INFTLrecord *inftl, unsigned thisVUC, unsigned | |||
197 | u16 BlockMap[MAX_SECTORS_PER_UNIT]; | 197 | u16 BlockMap[MAX_SECTORS_PER_UNIT]; |
198 | unsigned char BlockDeleted[MAX_SECTORS_PER_UNIT]; | 198 | unsigned char BlockDeleted[MAX_SECTORS_PER_UNIT]; |
199 | unsigned int thisEUN, prevEUN, status; | 199 | unsigned int thisEUN, prevEUN, status; |
200 | struct mtd_info *mtd = inftl->mbd.mtd; | ||
200 | int block, silly; | 201 | int block, silly; |
201 | unsigned int targetEUN; | 202 | unsigned int targetEUN; |
202 | struct inftl_oob oob; | 203 | struct inftl_oob oob; |
203 | size_t retlen; | 204 | size_t retlen; |
204 | 205 | ||
205 | DEBUG(MTD_DEBUG_LEVEL3, "INFTL: INFTL_foldchain(inftl=%p,thisVUC=%d," | 206 | DEBUG(MTD_DEBUG_LEVEL3, "INFTL: INFTL_foldchain(inftl=%p,thisVUC=%d," |
206 | "pending=%d)\n", inftl, thisVUC, pendingblock); | 207 | "pending=%d)\n", inftl, thisVUC, pendingblock); |
@@ -226,9 +227,9 @@ static u16 INFTL_foldchain(struct INFTLrecord *inftl, unsigned thisVUC, unsigned | |||
226 | if ((BlockMap[block] != 0xffff) || BlockDeleted[block]) | 227 | if ((BlockMap[block] != 0xffff) || BlockDeleted[block]) |
227 | continue; | 228 | continue; |
228 | 229 | ||
229 | if (MTD_READOOB(inftl->mbd.mtd, (thisEUN * inftl->EraseSize) | 230 | if (mtd->read_oob(mtd, (thisEUN * inftl->EraseSize) |
230 | + (block * SECTORSIZE), 16 , &retlen, | 231 | + (block * SECTORSIZE), 16 , &retlen, |
231 | (char *)&oob) < 0) | 232 | (char *)&oob) < 0) |
232 | status = SECTOR_IGNORE; | 233 | status = SECTOR_IGNORE; |
233 | else | 234 | else |
234 | status = oob.b.Status | oob.b.Status1; | 235 | status = oob.b.Status | oob.b.Status1; |
@@ -288,13 +289,14 @@ static u16 INFTL_foldchain(struct INFTLrecord *inftl, unsigned thisVUC, unsigned | |||
288 | if (BlockMap[block] == BLOCK_NIL) | 289 | if (BlockMap[block] == BLOCK_NIL) |
289 | continue; | 290 | continue; |
290 | 291 | ||
291 | ret = MTD_READ(inftl->mbd.mtd, (inftl->EraseSize * | 292 | ret = mtd->read(mtd, (inftl->EraseSize * BlockMap[block]) + |
292 | BlockMap[block]) + (block * SECTORSIZE), SECTORSIZE, | 293 | (block * SECTORSIZE), SECTORSIZE, &retlen, |
293 | &retlen, movebuf); | 294 | movebuf); |
294 | if (ret < 0) { | 295 | if (ret < 0) { |
295 | ret = MTD_READ(inftl->mbd.mtd, (inftl->EraseSize * | 296 | ret = mtd->read(mtd, |
296 | BlockMap[block]) + (block * SECTORSIZE), | 297 | (inftl->EraseSize * BlockMap[block]) + |
297 | SECTORSIZE, &retlen, movebuf); | 298 | (block * SECTORSIZE), SECTORSIZE, |
299 | &retlen, movebuf); | ||
298 | if (ret != -EIO) | 300 | if (ret != -EIO) |
299 | DEBUG(MTD_DEBUG_LEVEL1, "INFTL: error went " | 301 | DEBUG(MTD_DEBUG_LEVEL1, "INFTL: error went " |
300 | "away on retry?\n"); | 302 | "away on retry?\n"); |
@@ -415,6 +417,7 @@ static inline u16 INFTL_findwriteunit(struct INFTLrecord *inftl, unsigned block) | |||
415 | unsigned int thisVUC = block / (inftl->EraseSize / SECTORSIZE); | 417 | unsigned int thisVUC = block / (inftl->EraseSize / SECTORSIZE); |
416 | unsigned int thisEUN, writeEUN, prev_block, status; | 418 | unsigned int thisEUN, writeEUN, prev_block, status; |
417 | unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize -1); | 419 | unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize -1); |
420 | struct mtd_info *mtd = inftl->mbd.mtd; | ||
418 | struct inftl_oob oob; | 421 | struct inftl_oob oob; |
419 | struct inftl_bci bci; | 422 | struct inftl_bci bci; |
420 | unsigned char anac, nacs, parity; | 423 | unsigned char anac, nacs, parity; |
@@ -434,8 +437,8 @@ static inline u16 INFTL_findwriteunit(struct INFTLrecord *inftl, unsigned block) | |||
434 | silly = MAX_LOOPS; | 437 | silly = MAX_LOOPS; |
435 | 438 | ||
436 | while (thisEUN <= inftl->lastEUN) { | 439 | while (thisEUN <= inftl->lastEUN) { |
437 | MTD_READOOB(inftl->mbd.mtd, (thisEUN * inftl->EraseSize) + | 440 | mtd->read_oob(mtd, (thisEUN * inftl->EraseSize) + |
438 | blockofs, 8, &retlen, (char *)&bci); | 441 | blockofs, 8, &retlen, (char *)&bci); |
439 | 442 | ||
440 | status = bci.Status | bci.Status1; | 443 | status = bci.Status | bci.Status1; |
441 | DEBUG(MTD_DEBUG_LEVEL3, "INFTL: status of block %d in " | 444 | DEBUG(MTD_DEBUG_LEVEL3, "INFTL: status of block %d in " |
@@ -522,8 +525,8 @@ hitused: | |||
522 | nacs = 0; | 525 | nacs = 0; |
523 | thisEUN = inftl->VUtable[thisVUC]; | 526 | thisEUN = inftl->VUtable[thisVUC]; |
524 | if (thisEUN != BLOCK_NIL) { | 527 | if (thisEUN != BLOCK_NIL) { |
525 | MTD_READOOB(inftl->mbd.mtd, thisEUN * inftl->EraseSize | 528 | mtd->read_oob(mtd, thisEUN * inftl->EraseSize |
526 | + 8, 8, &retlen, (char *)&oob.u); | 529 | + 8, 8, &retlen, (char *)&oob.u); |
527 | anac = oob.u.a.ANAC + 1; | 530 | anac = oob.u.a.ANAC + 1; |
528 | nacs = oob.u.a.NACs + 1; | 531 | nacs = oob.u.a.NACs + 1; |
529 | } | 532 | } |
@@ -544,8 +547,8 @@ hitused: | |||
544 | oob.u.a.parityPerField = parity; | 547 | oob.u.a.parityPerField = parity; |
545 | oob.u.a.discarded = 0xaa; | 548 | oob.u.a.discarded = 0xaa; |
546 | 549 | ||
547 | MTD_WRITEOOB(inftl->mbd.mtd, writeEUN * inftl->EraseSize + 8, 8, | 550 | mtd->write_oob(mtd, writeEUN * inftl->EraseSize + 8, 8, |
548 | &retlen, (char *)&oob.u); | 551 | &retlen, (char *)&oob.u); |
549 | 552 | ||
550 | /* Also back up header... */ | 553 | /* Also back up header... */ |
551 | oob.u.b.virtualUnitNo = cpu_to_le16(thisVUC); | 554 | oob.u.b.virtualUnitNo = cpu_to_le16(thisVUC); |
@@ -555,8 +558,8 @@ hitused: | |||
555 | oob.u.b.parityPerField = parity; | 558 | oob.u.b.parityPerField = parity; |
556 | oob.u.b.discarded = 0xaa; | 559 | oob.u.b.discarded = 0xaa; |
557 | 560 | ||
558 | MTD_WRITEOOB(inftl->mbd.mtd, writeEUN * inftl->EraseSize + | 561 | mtd->write_oob(mtd, writeEUN * inftl->EraseSize + |
559 | SECTORSIZE * 4 + 8, 8, &retlen, (char *)&oob.u); | 562 | SECTORSIZE * 4 + 8, 8, &retlen, (char *)&oob.u); |
560 | 563 | ||
561 | inftl->PUtable[writeEUN] = inftl->VUtable[thisVUC]; | 564 | inftl->PUtable[writeEUN] = inftl->VUtable[thisVUC]; |
562 | inftl->VUtable[thisVUC] = writeEUN; | 565 | inftl->VUtable[thisVUC] = writeEUN; |
@@ -576,6 +579,7 @@ hitused: | |||
576 | */ | 579 | */ |
577 | static void INFTL_trydeletechain(struct INFTLrecord *inftl, unsigned thisVUC) | 580 | static void INFTL_trydeletechain(struct INFTLrecord *inftl, unsigned thisVUC) |
578 | { | 581 | { |
582 | struct mtd_info *mtd = inftl->mbd.mtd; | ||
579 | unsigned char BlockUsed[MAX_SECTORS_PER_UNIT]; | 583 | unsigned char BlockUsed[MAX_SECTORS_PER_UNIT]; |
580 | unsigned char BlockDeleted[MAX_SECTORS_PER_UNIT]; | 584 | unsigned char BlockDeleted[MAX_SECTORS_PER_UNIT]; |
581 | unsigned int thisEUN, status; | 585 | unsigned int thisEUN, status; |
@@ -606,9 +610,9 @@ static void INFTL_trydeletechain(struct INFTLrecord *inftl, unsigned thisVUC) | |||
606 | if (BlockUsed[block] || BlockDeleted[block]) | 610 | if (BlockUsed[block] || BlockDeleted[block]) |
607 | continue; | 611 | continue; |
608 | 612 | ||
609 | if (MTD_READOOB(inftl->mbd.mtd, (thisEUN * inftl->EraseSize) | 613 | if (mtd->read_oob(mtd, (thisEUN * inftl->EraseSize) |
610 | + (block * SECTORSIZE), 8 , &retlen, | 614 | + (block * SECTORSIZE), 8 , &retlen, |
611 | (char *)&bci) < 0) | 615 | (char *)&bci) < 0) |
612 | status = SECTOR_IGNORE; | 616 | status = SECTOR_IGNORE; |
613 | else | 617 | else |
614 | status = bci.Status | bci.Status1; | 618 | status = bci.Status | bci.Status1; |
@@ -697,6 +701,7 @@ static int INFTL_deleteblock(struct INFTLrecord *inftl, unsigned block) | |||
697 | { | 701 | { |
698 | unsigned int thisEUN = inftl->VUtable[block / (inftl->EraseSize / SECTORSIZE)]; | 702 | unsigned int thisEUN = inftl->VUtable[block / (inftl->EraseSize / SECTORSIZE)]; |
699 | unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize - 1); | 703 | unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize - 1); |
704 | struct mtd_info *mtd = inftl->mbd.mtd; | ||
700 | unsigned int status; | 705 | unsigned int status; |
701 | int silly = MAX_LOOPS; | 706 | int silly = MAX_LOOPS; |
702 | size_t retlen; | 707 | size_t retlen; |
@@ -706,8 +711,8 @@ static int INFTL_deleteblock(struct INFTLrecord *inftl, unsigned block) | |||
706 | "block=%d)\n", inftl, block); | 711 | "block=%d)\n", inftl, block); |
707 | 712 | ||
708 | while (thisEUN < inftl->nb_blocks) { | 713 | while (thisEUN < inftl->nb_blocks) { |
709 | if (MTD_READOOB(inftl->mbd.mtd, (thisEUN * inftl->EraseSize) + | 714 | if (mtd->read_oob(mtd, (thisEUN * inftl->EraseSize) + |
710 | blockofs, 8, &retlen, (char *)&bci) < 0) | 715 | blockofs, 8, &retlen, (char *)&bci) < 0) |
711 | status = SECTOR_IGNORE; | 716 | status = SECTOR_IGNORE; |
712 | else | 717 | else |
713 | status = bci.Status | bci.Status1; | 718 | status = bci.Status | bci.Status1; |
@@ -741,10 +746,10 @@ foundit: | |||
741 | if (thisEUN != BLOCK_NIL) { | 746 | if (thisEUN != BLOCK_NIL) { |
742 | loff_t ptr = (thisEUN * inftl->EraseSize) + blockofs; | 747 | loff_t ptr = (thisEUN * inftl->EraseSize) + blockofs; |
743 | 748 | ||
744 | if (MTD_READOOB(inftl->mbd.mtd, ptr, 8, &retlen, (char *)&bci) < 0) | 749 | if (mtd->read_oob(mtd, ptr, 8, &retlen, (char *)&bci) < 0) |
745 | return -EIO; | 750 | return -EIO; |
746 | bci.Status = bci.Status1 = SECTOR_DELETED; | 751 | bci.Status = bci.Status1 = SECTOR_DELETED; |
747 | if (MTD_WRITEOOB(inftl->mbd.mtd, ptr, 8, &retlen, (char *)&bci) < 0) | 752 | if (mtd->write_oob(mtd, ptr, 8, &retlen, (char *)&bci) < 0) |
748 | return -EIO; | 753 | return -EIO; |
749 | INFTL_trydeletechain(inftl, block / (inftl->EraseSize / SECTORSIZE)); | 754 | INFTL_trydeletechain(inftl, block / (inftl->EraseSize / SECTORSIZE)); |
750 | } | 755 | } |
@@ -805,6 +810,7 @@ static int inftl_readblock(struct mtd_blktrans_dev *mbd, unsigned long block, | |||
805 | struct INFTLrecord *inftl = (void *)mbd; | 810 | struct INFTLrecord *inftl = (void *)mbd; |
806 | unsigned int thisEUN = inftl->VUtable[block / (inftl->EraseSize / SECTORSIZE)]; | 811 | unsigned int thisEUN = inftl->VUtable[block / (inftl->EraseSize / SECTORSIZE)]; |
807 | unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize - 1); | 812 | unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize - 1); |
813 | struct mtd_info *mtd = inftl->mbd.mtd; | ||
808 | unsigned int status; | 814 | unsigned int status; |
809 | int silly = MAX_LOOPS; | 815 | int silly = MAX_LOOPS; |
810 | struct inftl_bci bci; | 816 | struct inftl_bci bci; |
@@ -814,8 +820,8 @@ static int inftl_readblock(struct mtd_blktrans_dev *mbd, unsigned long block, | |||
814 | "buffer=%p)\n", inftl, block, buffer); | 820 | "buffer=%p)\n", inftl, block, buffer); |
815 | 821 | ||
816 | while (thisEUN < inftl->nb_blocks) { | 822 | while (thisEUN < inftl->nb_blocks) { |
817 | if (MTD_READOOB(inftl->mbd.mtd, (thisEUN * inftl->EraseSize) + | 823 | if (mtd->read_oob(mtd, (thisEUN * inftl->EraseSize) + |
818 | blockofs, 8, &retlen, (char *)&bci) < 0) | 824 | blockofs, 8, &retlen, (char *)&bci) < 0) |
819 | status = SECTOR_IGNORE; | 825 | status = SECTOR_IGNORE; |
820 | else | 826 | else |
821 | status = bci.Status | bci.Status1; | 827 | status = bci.Status | bci.Status1; |
@@ -853,8 +859,7 @@ foundit: | |||
853 | } else { | 859 | } else { |
854 | size_t retlen; | 860 | size_t retlen; |
855 | loff_t ptr = (thisEUN * inftl->EraseSize) + blockofs; | 861 | loff_t ptr = (thisEUN * inftl->EraseSize) + blockofs; |
856 | if (MTD_READ(inftl->mbd.mtd, ptr, SECTORSIZE, &retlen, | 862 | if (mtd->read(mtd, ptr, SECTORSIZE, &retlen, buffer)) |
857 | buffer)) | ||
858 | return -EIO; | 863 | return -EIO; |
859 | } | 864 | } |
860 | return 0; | 865 | return 0; |
diff --git a/drivers/mtd/inftlmount.c b/drivers/mtd/inftlmount.c index f89a03795e76..b4cda7d0a52d 100644 --- a/drivers/mtd/inftlmount.c +++ b/drivers/mtd/inftlmount.c | |||
@@ -57,6 +57,7 @@ static int find_boot_record(struct INFTLrecord *inftl) | |||
57 | unsigned int i, block; | 57 | unsigned int i, block; |
58 | u8 buf[SECTORSIZE]; | 58 | u8 buf[SECTORSIZE]; |
59 | struct INFTLMediaHeader *mh = &inftl->MediaHdr; | 59 | struct INFTLMediaHeader *mh = &inftl->MediaHdr; |
60 | struct mtd_info *mtd = inftl->mbd.mtd; | ||
60 | struct INFTLPartition *ip; | 61 | struct INFTLPartition *ip; |
61 | size_t retlen; | 62 | size_t retlen; |
62 | 63 | ||
@@ -80,8 +81,8 @@ static int find_boot_record(struct INFTLrecord *inftl) | |||
80 | * Check for BNAND header first. Then whinge if it's found | 81 | * Check for BNAND header first. Then whinge if it's found |
81 | * but later checks fail. | 82 | * but later checks fail. |
82 | */ | 83 | */ |
83 | ret = MTD_READ(inftl->mbd.mtd, block * inftl->EraseSize, | 84 | ret = mtd->read(mtd, block * inftl->EraseSize, |
84 | SECTORSIZE, &retlen, buf); | 85 | SECTORSIZE, &retlen, buf); |
85 | /* We ignore ret in case the ECC of the MediaHeader is invalid | 86 | /* We ignore ret in case the ECC of the MediaHeader is invalid |
86 | (which is apparently acceptable) */ | 87 | (which is apparently acceptable) */ |
87 | if (retlen != SECTORSIZE) { | 88 | if (retlen != SECTORSIZE) { |
@@ -106,8 +107,9 @@ static int find_boot_record(struct INFTLrecord *inftl) | |||
106 | } | 107 | } |
107 | 108 | ||
108 | /* To be safer with BIOS, also use erase mark as discriminant */ | 109 | /* To be safer with BIOS, also use erase mark as discriminant */ |
109 | if ((ret = MTD_READOOB(inftl->mbd.mtd, block * inftl->EraseSize + | 110 | if ((ret = mtd->read_oob(mtd, block * inftl->EraseSize + |
110 | SECTORSIZE + 8, 8, &retlen, (char *)&h1) < 0)) { | 111 | SECTORSIZE + 8, 8, &retlen, |
112 | (char *)&h1) < 0)) { | ||
111 | printk(KERN_WARNING "INFTL: ANAND header found at " | 113 | printk(KERN_WARNING "INFTL: ANAND header found at " |
112 | "0x%x in mtd%d, but OOB data read failed " | 114 | "0x%x in mtd%d, but OOB data read failed " |
113 | "(err %d)\n", block * inftl->EraseSize, | 115 | "(err %d)\n", block * inftl->EraseSize, |
@@ -123,8 +125,8 @@ static int find_boot_record(struct INFTLrecord *inftl) | |||
123 | memcpy(mh, buf, sizeof(struct INFTLMediaHeader)); | 125 | memcpy(mh, buf, sizeof(struct INFTLMediaHeader)); |
124 | 126 | ||
125 | /* Read the spare media header at offset 4096 */ | 127 | /* Read the spare media header at offset 4096 */ |
126 | MTD_READ(inftl->mbd.mtd, block * inftl->EraseSize + 4096, | 128 | mtd->read(mtd, block * inftl->EraseSize + 4096, |
127 | SECTORSIZE, &retlen, buf); | 129 | SECTORSIZE, &retlen, buf); |
128 | if (retlen != SECTORSIZE) { | 130 | if (retlen != SECTORSIZE) { |
129 | printk(KERN_WARNING "INFTL: Unable to read spare " | 131 | printk(KERN_WARNING "INFTL: Unable to read spare " |
130 | "Media Header\n"); | 132 | "Media Header\n"); |
@@ -233,7 +235,7 @@ static int find_boot_record(struct INFTLrecord *inftl) | |||
233 | */ | 235 | */ |
234 | instr->addr = ip->Reserved0 * inftl->EraseSize; | 236 | instr->addr = ip->Reserved0 * inftl->EraseSize; |
235 | instr->len = inftl->EraseSize; | 237 | instr->len = inftl->EraseSize; |
236 | MTD_ERASE(inftl->mbd.mtd, instr); | 238 | mtd->erase(mtd, instr); |
237 | } | 239 | } |
238 | if ((ip->lastUnit - ip->firstUnit + 1) < ip->virtualUnits) { | 240 | if ((ip->lastUnit - ip->firstUnit + 1) < ip->virtualUnits) { |
239 | printk(KERN_WARNING "INFTL: Media Header " | 241 | printk(KERN_WARNING "INFTL: Media Header " |
@@ -387,6 +389,7 @@ int INFTL_formatblock(struct INFTLrecord *inftl, int block) | |||
387 | size_t retlen; | 389 | size_t retlen; |
388 | struct inftl_unittail uci; | 390 | struct inftl_unittail uci; |
389 | struct erase_info *instr = &inftl->instr; | 391 | struct erase_info *instr = &inftl->instr; |
392 | struct mtd_info *mtd = inftl->mbd.mtd; | ||
390 | int physblock; | 393 | int physblock; |
391 | 394 | ||
392 | DEBUG(MTD_DEBUG_LEVEL3, "INFTL: INFTL_formatblock(inftl=%p," | 395 | DEBUG(MTD_DEBUG_LEVEL3, "INFTL: INFTL_formatblock(inftl=%p," |
@@ -404,8 +407,9 @@ int INFTL_formatblock(struct INFTLrecord *inftl, int block) | |||
404 | /* Erase one physical eraseblock at a time, even though the NAND api | 407 | /* Erase one physical eraseblock at a time, even though the NAND api |
405 | allows us to group them. This way we if we have a failure, we can | 408 | allows us to group them. This way we if we have a failure, we can |
406 | mark only the failed block in the bbt. */ | 409 | mark only the failed block in the bbt. */ |
407 | for (physblock = 0; physblock < inftl->EraseSize; physblock += instr->len, instr->addr += instr->len) { | 410 | for (physblock = 0; physblock < inftl->EraseSize; |
408 | MTD_ERASE(inftl->mbd.mtd, instr); | 411 | physblock += instr->len, instr->addr += instr->len) { |
412 | mtd->erase(inftl->mbd.mtd, instr); | ||
409 | 413 | ||
410 | if (instr->state == MTD_ERASE_FAILED) { | 414 | if (instr->state == MTD_ERASE_FAILED) { |
411 | printk(KERN_WARNING "INFTL: error while formatting block %d\n", | 415 | printk(KERN_WARNING "INFTL: error while formatting block %d\n", |
@@ -414,10 +418,10 @@ int INFTL_formatblock(struct INFTLrecord *inftl, int block) | |||
414 | } | 418 | } |
415 | 419 | ||
416 | /* | 420 | /* |
417 | * Check the "freeness" of Erase Unit before updating metadata. | 421 | * Check the "freeness" of Erase Unit before updating metadata. |
418 | * FixMe: is this check really necessary? Since we have check the | 422 | * FixMe: is this check really necessary? Since we have check |
419 | * return code after the erase operation. | 423 | * the return code after the erase operation. |
420 | */ | 424 | */ |
421 | if (check_free_sectors(inftl, instr->addr, instr->len, 1) != 0) | 425 | if (check_free_sectors(inftl, instr->addr, instr->len, 1) != 0) |
422 | goto fail; | 426 | goto fail; |
423 | } | 427 | } |
@@ -429,8 +433,7 @@ int INFTL_formatblock(struct INFTLrecord *inftl, int block) | |||
429 | uci.Reserved[2] = 0; | 433 | uci.Reserved[2] = 0; |
430 | uci.Reserved[3] = 0; | 434 | uci.Reserved[3] = 0; |
431 | instr->addr = block * inftl->EraseSize + SECTORSIZE * 2; | 435 | instr->addr = block * inftl->EraseSize + SECTORSIZE * 2; |
432 | if (MTD_WRITEOOB(inftl->mbd.mtd, instr->addr + | 436 | if (mtd->write_oob(mtd, instr->addr + 8, 8, &retlen, (char *)&uci) < 0) |
433 | 8, 8, &retlen, (char *)&uci) < 0) | ||
434 | goto fail; | 437 | goto fail; |
435 | return 0; | 438 | return 0; |
436 | fail: | 439 | fail: |
@@ -549,6 +552,7 @@ void INFTL_dumpVUchains(struct INFTLrecord *s) | |||
549 | 552 | ||
550 | int INFTL_mount(struct INFTLrecord *s) | 553 | int INFTL_mount(struct INFTLrecord *s) |
551 | { | 554 | { |
555 | struct mtd_info *mtd = s->mbd.mtd; | ||
552 | unsigned int block, first_block, prev_block, last_block; | 556 | unsigned int block, first_block, prev_block, last_block; |
553 | unsigned int first_logical_block, logical_block, erase_mark; | 557 | unsigned int first_logical_block, logical_block, erase_mark; |
554 | int chain_length, do_format_chain; | 558 | int chain_length, do_format_chain; |
@@ -607,10 +611,11 @@ int INFTL_mount(struct INFTLrecord *s) | |||
607 | break; | 611 | break; |
608 | } | 612 | } |
609 | 613 | ||
610 | if (MTD_READOOB(s->mbd.mtd, block * s->EraseSize + 8, | 614 | if (mtd->read_oob(mtd, block * s->EraseSize + 8, |
611 | 8, &retlen, (char *)&h0) < 0 || | 615 | 8, &retlen, (char *)&h0) < 0 || |
612 | MTD_READOOB(s->mbd.mtd, block * s->EraseSize + | 616 | mtd->read_oob(mtd, block * s->EraseSize + |
613 | 2 * SECTORSIZE + 8, 8, &retlen, (char *)&h1) < 0) { | 617 | 2 * SECTORSIZE + 8, 8, &retlen, |
618 | (char *)&h1) < 0) { | ||
614 | /* Should never happen? */ | 619 | /* Should never happen? */ |
615 | do_format_chain++; | 620 | do_format_chain++; |
616 | break; | 621 | break; |
diff --git a/drivers/mtd/maps/nettel.c b/drivers/mtd/maps/nettel.c index 20771b2a05e1..0994b5b2e331 100644 --- a/drivers/mtd/maps/nettel.c +++ b/drivers/mtd/maps/nettel.c | |||
@@ -190,7 +190,7 @@ int nettel_eraseconfig(void) | |||
190 | set_current_state(TASK_INTERRUPTIBLE); | 190 | set_current_state(TASK_INTERRUPTIBLE); |
191 | add_wait_queue(&wait_q, &wait); | 191 | add_wait_queue(&wait_q, &wait); |
192 | 192 | ||
193 | ret = MTD_ERASE(mtd, &nettel_erase); | 193 | ret = mtd->erase(mtd, &nettel_erase); |
194 | if (ret) { | 194 | if (ret) { |
195 | set_current_state(TASK_RUNNING); | 195 | set_current_state(TASK_RUNNING); |
196 | remove_wait_queue(&wait_q, &wait); | 196 | remove_wait_queue(&wait_q, &wait); |
diff --git a/drivers/mtd/mtdblock.c b/drivers/mtd/mtdblock.c index 8e50170137e0..9b0bc20e4d8d 100644 --- a/drivers/mtd/mtdblock.c +++ b/drivers/mtd/mtdblock.c | |||
@@ -71,7 +71,7 @@ static int erase_write (struct mtd_info *mtd, unsigned long pos, | |||
71 | set_current_state(TASK_INTERRUPTIBLE); | 71 | set_current_state(TASK_INTERRUPTIBLE); |
72 | add_wait_queue(&wait_q, &wait); | 72 | add_wait_queue(&wait_q, &wait); |
73 | 73 | ||
74 | ret = MTD_ERASE(mtd, &erase); | 74 | ret = mtd->erase(mtd, &erase); |
75 | if (ret) { | 75 | if (ret) { |
76 | set_current_state(TASK_RUNNING); | 76 | set_current_state(TASK_RUNNING); |
77 | remove_wait_queue(&wait_q, &wait); | 77 | remove_wait_queue(&wait_q, &wait); |
@@ -88,7 +88,7 @@ static int erase_write (struct mtd_info *mtd, unsigned long pos, | |||
88 | * Next, writhe data to flash. | 88 | * Next, writhe data to flash. |
89 | */ | 89 | */ |
90 | 90 | ||
91 | ret = MTD_WRITE (mtd, pos, len, &retlen, buf); | 91 | ret = mtd->write(mtd, pos, len, &retlen, buf); |
92 | if (ret) | 92 | if (ret) |
93 | return ret; | 93 | return ret; |
94 | if (retlen != len) | 94 | if (retlen != len) |
@@ -138,7 +138,7 @@ static int do_cached_write (struct mtdblk_dev *mtdblk, unsigned long pos, | |||
138 | mtd->name, pos, len); | 138 | mtd->name, pos, len); |
139 | 139 | ||
140 | if (!sect_size) | 140 | if (!sect_size) |
141 | return MTD_WRITE (mtd, pos, len, &retlen, buf); | 141 | return mtd->write(mtd, pos, len, &retlen, buf); |
142 | 142 | ||
143 | while (len > 0) { | 143 | while (len > 0) { |
144 | unsigned long sect_start = (pos/sect_size)*sect_size; | 144 | unsigned long sect_start = (pos/sect_size)*sect_size; |
@@ -170,7 +170,8 @@ static int do_cached_write (struct mtdblk_dev *mtdblk, unsigned long pos, | |||
170 | mtdblk->cache_offset != sect_start) { | 170 | mtdblk->cache_offset != sect_start) { |
171 | /* fill the cache with the current sector */ | 171 | /* fill the cache with the current sector */ |
172 | mtdblk->cache_state = STATE_EMPTY; | 172 | mtdblk->cache_state = STATE_EMPTY; |
173 | ret = MTD_READ(mtd, sect_start, sect_size, &retlen, mtdblk->cache_data); | 173 | ret = mtd->read(mtd, sect_start, sect_size, |
174 | &retlen, mtdblk->cache_data); | ||
174 | if (ret) | 175 | if (ret) |
175 | return ret; | 176 | return ret; |
176 | if (retlen != sect_size) | 177 | if (retlen != sect_size) |
@@ -207,7 +208,7 @@ static int do_cached_read (struct mtdblk_dev *mtdblk, unsigned long pos, | |||
207 | mtd->name, pos, len); | 208 | mtd->name, pos, len); |
208 | 209 | ||
209 | if (!sect_size) | 210 | if (!sect_size) |
210 | return MTD_READ (mtd, pos, len, &retlen, buf); | 211 | return mtd->read(mtd, pos, len, &retlen, buf); |
211 | 212 | ||
212 | while (len > 0) { | 213 | while (len > 0) { |
213 | unsigned long sect_start = (pos/sect_size)*sect_size; | 214 | unsigned long sect_start = (pos/sect_size)*sect_size; |
@@ -226,7 +227,7 @@ static int do_cached_read (struct mtdblk_dev *mtdblk, unsigned long pos, | |||
226 | mtdblk->cache_offset == sect_start) { | 227 | mtdblk->cache_offset == sect_start) { |
227 | memcpy (buf, mtdblk->cache_data + offset, size); | 228 | memcpy (buf, mtdblk->cache_data + offset, size); |
228 | } else { | 229 | } else { |
229 | ret = MTD_READ (mtd, pos, size, &retlen, buf); | 230 | ret = mtd->read(mtd, pos, size, &retlen, buf); |
230 | if (ret) | 231 | if (ret) |
231 | return ret; | 232 | return ret; |
232 | if (retlen != size) | 233 | if (retlen != size) |
diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c index e75ec5fe7760..b45e7747daa3 100644 --- a/drivers/mtd/mtdchar.c +++ b/drivers/mtd/mtdchar.c | |||
@@ -194,7 +194,7 @@ static ssize_t mtd_read(struct file *file, char __user *buf, size_t count,loff_t | |||
194 | ret = mtd->read_user_prot_reg(mtd, *ppos, len, &retlen, kbuf); | 194 | ret = mtd->read_user_prot_reg(mtd, *ppos, len, &retlen, kbuf); |
195 | break; | 195 | break; |
196 | default: | 196 | default: |
197 | ret = MTD_READ(mtd, *ppos, len, &retlen, kbuf); | 197 | ret = mtd->read(mtd, *ppos, len, &retlen, kbuf); |
198 | } | 198 | } |
199 | /* Nand returns -EBADMSG on ecc errors, but it returns | 199 | /* Nand returns -EBADMSG on ecc errors, but it returns |
200 | * the data. For our userspace tools it is important | 200 | * the data. For our userspace tools it is important |
@@ -205,7 +205,7 @@ static ssize_t mtd_read(struct file *file, char __user *buf, size_t count,loff_t | |||
205 | if (!ret || (ret == -EBADMSG)) { | 205 | if (!ret || (ret == -EBADMSG)) { |
206 | *ppos += retlen; | 206 | *ppos += retlen; |
207 | if (copy_to_user(buf, kbuf, retlen)) { | 207 | if (copy_to_user(buf, kbuf, retlen)) { |
208 | kfree(kbuf); | 208 | kfree(kbuf); |
209 | return -EFAULT; | 209 | return -EFAULT; |
210 | } | 210 | } |
211 | else | 211 | else |
diff --git a/drivers/mtd/nftlcore.c b/drivers/mtd/nftlcore.c index dd03349946c2..359533b33d9b 100644 --- a/drivers/mtd/nftlcore.c +++ b/drivers/mtd/nftlcore.c | |||
@@ -183,6 +183,7 @@ static u16 NFTL_findfreeblock(struct NFTLrecord *nftl, int desperate ) | |||
183 | 183 | ||
184 | static u16 NFTL_foldchain (struct NFTLrecord *nftl, unsigned thisVUC, unsigned pendingblock ) | 184 | static u16 NFTL_foldchain (struct NFTLrecord *nftl, unsigned thisVUC, unsigned pendingblock ) |
185 | { | 185 | { |
186 | struct mtd_info *mtd = nftl->mbd.mtd; | ||
186 | u16 BlockMap[MAX_SECTORS_PER_UNIT]; | 187 | u16 BlockMap[MAX_SECTORS_PER_UNIT]; |
187 | unsigned char BlockLastState[MAX_SECTORS_PER_UNIT]; | 188 | unsigned char BlockLastState[MAX_SECTORS_PER_UNIT]; |
188 | unsigned char BlockFreeFound[MAX_SECTORS_PER_UNIT]; | 189 | unsigned char BlockFreeFound[MAX_SECTORS_PER_UNIT]; |
@@ -192,7 +193,7 @@ static u16 NFTL_foldchain (struct NFTLrecord *nftl, unsigned thisVUC, unsigned p | |||
192 | unsigned int targetEUN; | 193 | unsigned int targetEUN; |
193 | struct nftl_oob oob; | 194 | struct nftl_oob oob; |
194 | int inplace = 1; | 195 | int inplace = 1; |
195 | size_t retlen; | 196 | size_t retlen; |
196 | 197 | ||
197 | memset(BlockMap, 0xff, sizeof(BlockMap)); | 198 | memset(BlockMap, 0xff, sizeof(BlockMap)); |
198 | memset(BlockFreeFound, 0, sizeof(BlockFreeFound)); | 199 | memset(BlockFreeFound, 0, sizeof(BlockFreeFound)); |
@@ -208,21 +209,21 @@ static u16 NFTL_foldchain (struct NFTLrecord *nftl, unsigned thisVUC, unsigned p | |||
208 | /* Scan to find the Erase Unit which holds the actual data for each | 209 | /* Scan to find the Erase Unit which holds the actual data for each |
209 | 512-byte block within the Chain. | 210 | 512-byte block within the Chain. |
210 | */ | 211 | */ |
211 | silly = MAX_LOOPS; | 212 | silly = MAX_LOOPS; |
212 | targetEUN = BLOCK_NIL; | 213 | targetEUN = BLOCK_NIL; |
213 | while (thisEUN <= nftl->lastEUN ) { | 214 | while (thisEUN <= nftl->lastEUN ) { |
214 | unsigned int status, foldmark; | 215 | unsigned int status, foldmark; |
215 | 216 | ||
216 | targetEUN = thisEUN; | 217 | targetEUN = thisEUN; |
217 | for (block = 0; block < nftl->EraseSize / 512; block ++) { | 218 | for (block = 0; block < nftl->EraseSize / 512; block ++) { |
218 | MTD_READOOB(nftl->mbd.mtd, | 219 | mtd->read_oob(mtd, (thisEUN * nftl->EraseSize) + |
219 | (thisEUN * nftl->EraseSize) + (block * 512), | 220 | (block * 512), 16 , &retlen, |
220 | 16 , &retlen, (char *)&oob); | 221 | (char *)&oob); |
221 | if (block == 2) { | 222 | if (block == 2) { |
222 | foldmark = oob.u.c.FoldMark | oob.u.c.FoldMark1; | 223 | foldmark = oob.u.c.FoldMark | oob.u.c.FoldMark1; |
223 | if (foldmark == FOLD_MARK_IN_PROGRESS) { | 224 | if (foldmark == FOLD_MARK_IN_PROGRESS) { |
224 | DEBUG(MTD_DEBUG_LEVEL1, | 225 | DEBUG(MTD_DEBUG_LEVEL1, |
225 | "Write Inhibited on EUN %d\n", thisEUN); | 226 | "Write Inhibited on EUN %d\n", thisEUN); |
226 | inplace = 0; | 227 | inplace = 0; |
227 | } else { | 228 | } else { |
228 | /* There's no other reason not to do inplace, | 229 | /* There's no other reason not to do inplace, |
@@ -231,7 +232,7 @@ static u16 NFTL_foldchain (struct NFTLrecord *nftl, unsigned thisVUC, unsigned p | |||
231 | inplace = 1; | 232 | inplace = 1; |
232 | } | 233 | } |
233 | } | 234 | } |
234 | status = oob.b.Status | oob.b.Status1; | 235 | status = oob.b.Status | oob.b.Status1; |
235 | BlockLastState[block] = status; | 236 | BlockLastState[block] = status; |
236 | 237 | ||
237 | switch(status) { | 238 | switch(status) { |
@@ -326,15 +327,15 @@ static u16 NFTL_foldchain (struct NFTLrecord *nftl, unsigned thisVUC, unsigned p | |||
326 | return BLOCK_NIL; | 327 | return BLOCK_NIL; |
327 | } | 328 | } |
328 | } else { | 329 | } else { |
329 | /* We put a fold mark in the chain we are folding only if | 330 | /* We put a fold mark in the chain we are folding only if we |
330 | we fold in place to help the mount check code. If we do | 331 | fold in place to help the mount check code. If we do not fold in |
331 | not fold in place, it is possible to find the valid | 332 | place, it is possible to find the valid chain by selecting the |
332 | chain by selecting the longer one */ | 333 | longer one */ |
333 | oob.u.c.FoldMark = oob.u.c.FoldMark1 = cpu_to_le16(FOLD_MARK_IN_PROGRESS); | 334 | oob.u.c.FoldMark = oob.u.c.FoldMark1 = cpu_to_le16(FOLD_MARK_IN_PROGRESS); |
334 | oob.u.c.unused = 0xffffffff; | 335 | oob.u.c.unused = 0xffffffff; |
335 | MTD_WRITEOOB(nftl->mbd.mtd, (nftl->EraseSize * targetEUN) + 2 * 512 + 8, | 336 | mtd->write_oob(mtd, (nftl->EraseSize * targetEUN) + 2 * 512 + 8, |
336 | 8, &retlen, (char *)&oob.u); | 337 | 8, &retlen, (char *)&oob.u); |
337 | } | 338 | } |
338 | 339 | ||
339 | /* OK. We now know the location of every block in the Virtual Unit Chain, | 340 | /* OK. We now know the location of every block in the Virtual Unit Chain, |
340 | and the Erase Unit into which we are supposed to be copying. | 341 | and the Erase Unit into which we are supposed to be copying. |
@@ -351,20 +352,20 @@ static u16 NFTL_foldchain (struct NFTLrecord *nftl, unsigned thisVUC, unsigned p | |||
351 | continue; | 352 | continue; |
352 | } | 353 | } |
353 | 354 | ||
354 | /* copy only in non free block (free blocks can only | 355 | /* copy only in non free block (free blocks can only |
355 | happen in case of media errors or deleted blocks) */ | 356 | happen in case of media errors or deleted blocks) */ |
356 | if (BlockMap[block] == BLOCK_NIL) | 357 | if (BlockMap[block] == BLOCK_NIL) |
357 | continue; | 358 | continue; |
358 | 359 | ||
359 | ret = MTD_READ(nftl->mbd.mtd, (nftl->EraseSize * BlockMap[block]) + (block * 512), | 360 | ret = mtd->read(mtd, (nftl->EraseSize * BlockMap[block]) + (block * 512), |
360 | 512, &retlen, movebuf); | 361 | 512, &retlen, movebuf); |
361 | if (ret < 0) { | 362 | if (ret < 0) { |
362 | ret = MTD_READ(nftl->mbd.mtd, (nftl->EraseSize * BlockMap[block]) | 363 | ret = mtd->read(mtd, (nftl->EraseSize * BlockMap[block]) |
363 | + (block * 512), 512, &retlen, | 364 | + (block * 512), 512, &retlen, |
364 | movebuf); | 365 | movebuf); |
365 | if (ret != -EIO) | 366 | if (ret != -EIO) |
366 | printk("Error went away on retry.\n"); | 367 | printk("Error went away on retry.\n"); |
367 | } | 368 | } |
368 | memset(&oob, 0xff, sizeof(struct nftl_oob)); | 369 | memset(&oob, 0xff, sizeof(struct nftl_oob)); |
369 | oob.b.Status = oob.b.Status1 = SECTOR_USED; | 370 | oob.b.Status = oob.b.Status1 = SECTOR_USED; |
370 | 371 | ||
@@ -374,13 +375,12 @@ static u16 NFTL_foldchain (struct NFTLrecord *nftl, unsigned thisVUC, unsigned p | |||
374 | 375 | ||
375 | } | 376 | } |
376 | 377 | ||
377 | /* add the header so that it is now a valid chain */ | 378 | /* add the header so that it is now a valid chain */ |
378 | oob.u.a.VirtUnitNum = oob.u.a.SpareVirtUnitNum | 379 | oob.u.a.VirtUnitNum = oob.u.a.SpareVirtUnitNum = cpu_to_le16(thisVUC); |
379 | = cpu_to_le16(thisVUC); | 380 | oob.u.a.ReplUnitNum = oob.u.a.SpareReplUnitNum = 0xffff; |
380 | oob.u.a.ReplUnitNum = oob.u.a.SpareReplUnitNum = 0xffff; | ||
381 | 381 | ||
382 | MTD_WRITEOOB(nftl->mbd.mtd, (nftl->EraseSize * targetEUN) + 8, | 382 | mtd->write_oob(mtd, (nftl->EraseSize * targetEUN) + 8, |
383 | 8, &retlen, (char *)&oob.u); | 383 | 8, &retlen, (char *)&oob.u); |
384 | 384 | ||
385 | /* OK. We've moved the whole lot into the new block. Now we have to free the original blocks. */ | 385 | /* OK. We've moved the whole lot into the new block. Now we have to free the original blocks. */ |
386 | 386 | ||
@@ -397,18 +397,18 @@ static u16 NFTL_foldchain (struct NFTLrecord *nftl, unsigned thisVUC, unsigned p | |||
397 | while (thisEUN <= nftl->lastEUN && thisEUN != targetEUN) { | 397 | while (thisEUN <= nftl->lastEUN && thisEUN != targetEUN) { |
398 | unsigned int EUNtmp; | 398 | unsigned int EUNtmp; |
399 | 399 | ||
400 | EUNtmp = nftl->ReplUnitTable[thisEUN]; | 400 | EUNtmp = nftl->ReplUnitTable[thisEUN]; |
401 | 401 | ||
402 | if (NFTL_formatblock(nftl, thisEUN) < 0) { | 402 | if (NFTL_formatblock(nftl, thisEUN) < 0) { |
403 | /* could not erase : mark block as reserved | 403 | /* could not erase : mark block as reserved |
404 | */ | 404 | */ |
405 | nftl->ReplUnitTable[thisEUN] = BLOCK_RESERVED; | 405 | nftl->ReplUnitTable[thisEUN] = BLOCK_RESERVED; |
406 | } else { | 406 | } else { |
407 | /* correctly erased : mark it as free */ | 407 | /* correctly erased : mark it as free */ |
408 | nftl->ReplUnitTable[thisEUN] = BLOCK_FREE; | 408 | nftl->ReplUnitTable[thisEUN] = BLOCK_FREE; |
409 | nftl->numfreeEUNs++; | 409 | nftl->numfreeEUNs++; |
410 | } | 410 | } |
411 | thisEUN = EUNtmp; | 411 | thisEUN = EUNtmp; |
412 | } | 412 | } |
413 | 413 | ||
414 | /* Make this the new start of chain for thisVUC */ | 414 | /* Make this the new start of chain for thisVUC */ |
@@ -474,6 +474,7 @@ static inline u16 NFTL_findwriteunit(struct NFTLrecord *nftl, unsigned block) | |||
474 | { | 474 | { |
475 | u16 lastEUN; | 475 | u16 lastEUN; |
476 | u16 thisVUC = block / (nftl->EraseSize / 512); | 476 | u16 thisVUC = block / (nftl->EraseSize / 512); |
477 | struct mtd_info *mtd = nftl->mbd.mtd; | ||
477 | unsigned int writeEUN; | 478 | unsigned int writeEUN; |
478 | unsigned long blockofs = (block * 512) & (nftl->EraseSize -1); | 479 | unsigned long blockofs = (block * 512) & (nftl->EraseSize -1); |
479 | size_t retlen; | 480 | size_t retlen; |
@@ -490,21 +491,22 @@ static inline u16 NFTL_findwriteunit(struct NFTLrecord *nftl, unsigned block) | |||
490 | */ | 491 | */ |
491 | lastEUN = BLOCK_NIL; | 492 | lastEUN = BLOCK_NIL; |
492 | writeEUN = nftl->EUNtable[thisVUC]; | 493 | writeEUN = nftl->EUNtable[thisVUC]; |
493 | silly = MAX_LOOPS; | 494 | silly = MAX_LOOPS; |
494 | while (writeEUN <= nftl->lastEUN) { | 495 | while (writeEUN <= nftl->lastEUN) { |
495 | struct nftl_bci bci; | 496 | struct nftl_bci bci; |
496 | size_t retlen; | 497 | size_t retlen; |
497 | unsigned int status; | 498 | unsigned int status; |
498 | 499 | ||
499 | lastEUN = writeEUN; | 500 | lastEUN = writeEUN; |
500 | 501 | ||
501 | MTD_READOOB(nftl->mbd.mtd, (writeEUN * nftl->EraseSize) + blockofs, | 502 | mtd->read_oob(mtd, |
502 | 8, &retlen, (char *)&bci); | 503 | (writeEUN * nftl->EraseSize) + blockofs, |
504 | 8, &retlen, (char *)&bci); | ||
503 | 505 | ||
504 | DEBUG(MTD_DEBUG_LEVEL2, "Status of block %d in EUN %d is %x\n", | 506 | DEBUG(MTD_DEBUG_LEVEL2, "Status of block %d in EUN %d is %x\n", |
505 | block , writeEUN, le16_to_cpu(bci.Status)); | 507 | block , writeEUN, le16_to_cpu(bci.Status)); |
506 | 508 | ||
507 | status = bci.Status | bci.Status1; | 509 | status = bci.Status | bci.Status1; |
508 | switch(status) { | 510 | switch(status) { |
509 | case SECTOR_FREE: | 511 | case SECTOR_FREE: |
510 | return writeEUN; | 512 | return writeEUN; |
@@ -575,10 +577,10 @@ static inline u16 NFTL_findwriteunit(struct NFTLrecord *nftl, unsigned block) | |||
575 | /* We've found a free block. Insert it into the chain. */ | 577 | /* We've found a free block. Insert it into the chain. */ |
576 | 578 | ||
577 | if (lastEUN != BLOCK_NIL) { | 579 | if (lastEUN != BLOCK_NIL) { |
578 | thisVUC |= 0x8000; /* It's a replacement block */ | 580 | thisVUC |= 0x8000; /* It's a replacement block */ |
579 | } else { | 581 | } else { |
580 | /* The first block in a new chain */ | 582 | /* The first block in a new chain */ |
581 | nftl->EUNtable[thisVUC] = writeEUN; | 583 | nftl->EUNtable[thisVUC] = writeEUN; |
582 | } | 584 | } |
583 | 585 | ||
584 | /* set up the actual EUN we're writing into */ | 586 | /* set up the actual EUN we're writing into */ |
@@ -586,29 +588,29 @@ static inline u16 NFTL_findwriteunit(struct NFTLrecord *nftl, unsigned block) | |||
586 | nftl->ReplUnitTable[writeEUN] = BLOCK_NIL; | 588 | nftl->ReplUnitTable[writeEUN] = BLOCK_NIL; |
587 | 589 | ||
588 | /* ... and on the flash itself */ | 590 | /* ... and on the flash itself */ |
589 | MTD_READOOB(nftl->mbd.mtd, writeEUN * nftl->EraseSize + 8, 8, | 591 | mtd->read_oob(mtd, writeEUN * nftl->EraseSize + 8, 8, |
590 | &retlen, (char *)&oob.u); | 592 | &retlen, (char *)&oob.u); |
591 | 593 | ||
592 | oob.u.a.VirtUnitNum = oob.u.a.SpareVirtUnitNum = cpu_to_le16(thisVUC); | 594 | oob.u.a.VirtUnitNum = oob.u.a.SpareVirtUnitNum = cpu_to_le16(thisVUC); |
593 | 595 | ||
594 | MTD_WRITEOOB(nftl->mbd.mtd, writeEUN * nftl->EraseSize + 8, 8, | 596 | mtd->write_oob(mtd, writeEUN * nftl->EraseSize + 8, 8, |
595 | &retlen, (char *)&oob.u); | 597 | &retlen, (char *)&oob.u); |
596 | 598 | ||
597 | /* we link the new block to the chain only after the | 599 | /* we link the new block to the chain only after the |
598 | block is ready. It avoids the case where the chain | 600 | block is ready. It avoids the case where the chain |
599 | could point to a free block */ | 601 | could point to a free block */ |
600 | if (lastEUN != BLOCK_NIL) { | 602 | if (lastEUN != BLOCK_NIL) { |
601 | /* Both in our cache... */ | 603 | /* Both in our cache... */ |
602 | nftl->ReplUnitTable[lastEUN] = writeEUN; | 604 | nftl->ReplUnitTable[lastEUN] = writeEUN; |
603 | /* ... and on the flash itself */ | 605 | /* ... and on the flash itself */ |
604 | MTD_READOOB(nftl->mbd.mtd, (lastEUN * nftl->EraseSize) + 8, | 606 | mtd->read_oob(mtd, (lastEUN * nftl->EraseSize) + 8, |
605 | 8, &retlen, (char *)&oob.u); | 607 | 8, &retlen, (char *)&oob.u); |
606 | 608 | ||
607 | oob.u.a.ReplUnitNum = oob.u.a.SpareReplUnitNum | 609 | oob.u.a.ReplUnitNum = oob.u.a.SpareReplUnitNum |
608 | = cpu_to_le16(writeEUN); | 610 | = cpu_to_le16(writeEUN); |
609 | 611 | ||
610 | MTD_WRITEOOB(nftl->mbd.mtd, (lastEUN * nftl->EraseSize) + 8, | 612 | mtd->write_oob(mtd, (lastEUN * nftl->EraseSize) + 8, |
611 | 8, &retlen, (char *)&oob.u); | 613 | 8, &retlen, (char *)&oob.u); |
612 | } | 614 | } |
613 | 615 | ||
614 | return writeEUN; | 616 | return writeEUN; |
@@ -652,20 +654,22 @@ static int nftl_readblock(struct mtd_blktrans_dev *mbd, unsigned long block, | |||
652 | char *buffer) | 654 | char *buffer) |
653 | { | 655 | { |
654 | struct NFTLrecord *nftl = (void *)mbd; | 656 | struct NFTLrecord *nftl = (void *)mbd; |
657 | struct mtd_info *mtd = nftl->mbd.mtd; | ||
655 | u16 lastgoodEUN; | 658 | u16 lastgoodEUN; |
656 | u16 thisEUN = nftl->EUNtable[block / (nftl->EraseSize / 512)]; | 659 | u16 thisEUN = nftl->EUNtable[block / (nftl->EraseSize / 512)]; |
657 | unsigned long blockofs = (block * 512) & (nftl->EraseSize - 1); | 660 | unsigned long blockofs = (block * 512) & (nftl->EraseSize - 1); |
658 | unsigned int status; | 661 | unsigned int status; |
659 | int silly = MAX_LOOPS; | 662 | int silly = MAX_LOOPS; |
660 | size_t retlen; | 663 | size_t retlen; |
661 | struct nftl_bci bci; | 664 | struct nftl_bci bci; |
662 | 665 | ||
663 | lastgoodEUN = BLOCK_NIL; | 666 | lastgoodEUN = BLOCK_NIL; |
664 | 667 | ||
665 | if (thisEUN != BLOCK_NIL) { | 668 | if (thisEUN != BLOCK_NIL) { |
666 | while (thisEUN < nftl->nb_blocks) { | 669 | while (thisEUN < nftl->nb_blocks) { |
667 | if (MTD_READOOB(nftl->mbd.mtd, (thisEUN * nftl->EraseSize) + blockofs, | 670 | if (mtd->read_oob(mtd, (thisEUN * nftl->EraseSize) + |
668 | 8, &retlen, (char *)&bci) < 0) | 671 | blockofs, 8, &retlen, |
672 | (char *)&bci) < 0) | ||
669 | status = SECTOR_IGNORE; | 673 | status = SECTOR_IGNORE; |
670 | else | 674 | else |
671 | status = bci.Status | bci.Status1; | 675 | status = bci.Status | bci.Status1; |
@@ -695,7 +699,7 @@ static int nftl_readblock(struct mtd_blktrans_dev *mbd, unsigned long block, | |||
695 | } | 699 | } |
696 | thisEUN = nftl->ReplUnitTable[thisEUN]; | 700 | thisEUN = nftl->ReplUnitTable[thisEUN]; |
697 | } | 701 | } |
698 | } | 702 | } |
699 | 703 | ||
700 | the_end: | 704 | the_end: |
701 | if (lastgoodEUN == BLOCK_NIL) { | 705 | if (lastgoodEUN == BLOCK_NIL) { |
@@ -704,7 +708,7 @@ static int nftl_readblock(struct mtd_blktrans_dev *mbd, unsigned long block, | |||
704 | } else { | 708 | } else { |
705 | loff_t ptr = (lastgoodEUN * nftl->EraseSize) + blockofs; | 709 | loff_t ptr = (lastgoodEUN * nftl->EraseSize) + blockofs; |
706 | size_t retlen; | 710 | size_t retlen; |
707 | if (MTD_READ(nftl->mbd.mtd, ptr, 512, &retlen, buffer)) | 711 | if (mtd->read(mtd, ptr, 512, &retlen, buffer)) |
708 | return -EIO; | 712 | return -EIO; |
709 | } | 713 | } |
710 | return 0; | 714 | return 0; |
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; |