diff options
| -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 | ||||
| -rw-r--r-- | fs/jffs/intrep.c | 15 | ||||
| -rw-r--r-- | include/linux/mtd/mtd.h | 16 |
9 files changed, 195 insertions, 179 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; |
diff --git a/fs/jffs/intrep.c b/fs/jffs/intrep.c index 0ef207dfaf6f..5371a403130a 100644 --- a/fs/jffs/intrep.c +++ b/fs/jffs/intrep.c | |||
| @@ -247,7 +247,7 @@ flash_safe_read(struct mtd_info *mtd, loff_t from, | |||
| 247 | D3(printk(KERN_NOTICE "flash_safe_read(%p, %08x, %p, %08x)\n", | 247 | D3(printk(KERN_NOTICE "flash_safe_read(%p, %08x, %p, %08x)\n", |
| 248 | mtd, (unsigned int) from, buf, count)); | 248 | mtd, (unsigned int) from, buf, count)); |
| 249 | 249 | ||
| 250 | res = MTD_READ(mtd, from, count, &retlen, buf); | 250 | res = mtd->read(mtd, from, count, &retlen, buf); |
| 251 | if (retlen != count) { | 251 | if (retlen != count) { |
| 252 | panic("Didn't read all bytes in flash_safe_read(). Returned %d\n", res); | 252 | panic("Didn't read all bytes in flash_safe_read(). Returned %d\n", res); |
| 253 | } | 253 | } |
| @@ -262,7 +262,7 @@ flash_read_u32(struct mtd_info *mtd, loff_t from) | |||
| 262 | __u32 ret; | 262 | __u32 ret; |
| 263 | int res; | 263 | int res; |
| 264 | 264 | ||
| 265 | res = MTD_READ(mtd, from, 4, &retlen, (unsigned char *)&ret); | 265 | res = mtd->read(mtd, from, 4, &retlen, (unsigned char *)&ret); |
| 266 | if (retlen != 4) { | 266 | if (retlen != 4) { |
| 267 | printk("Didn't read all bytes in flash_read_u32(). Returned %d\n", res); | 267 | printk("Didn't read all bytes in flash_read_u32(). Returned %d\n", res); |
| 268 | return 0; | 268 | return 0; |
| @@ -282,7 +282,7 @@ flash_safe_write(struct mtd_info *mtd, loff_t to, | |||
| 282 | D3(printk(KERN_NOTICE "flash_safe_write(%p, %08x, %p, %08x)\n", | 282 | D3(printk(KERN_NOTICE "flash_safe_write(%p, %08x, %p, %08x)\n", |
| 283 | mtd, (unsigned int) to, buf, count)); | 283 | mtd, (unsigned int) to, buf, count)); |
| 284 | 284 | ||
| 285 | res = MTD_WRITE(mtd, to, count, &retlen, buf); | 285 | res = mtd->write(mtd, to, count, &retlen, buf); |
| 286 | if (retlen != count) { | 286 | if (retlen != count) { |
| 287 | printk("Didn't write all bytes in flash_safe_write(). Returned %d\n", res); | 287 | printk("Didn't write all bytes in flash_safe_write(). Returned %d\n", res); |
| 288 | } | 288 | } |
| @@ -300,9 +300,9 @@ flash_safe_writev(struct mtd_info *mtd, const struct kvec *vecs, | |||
| 300 | 300 | ||
| 301 | D3(printk(KERN_NOTICE "flash_safe_writev(%p, %08x, %p)\n", | 301 | D3(printk(KERN_NOTICE "flash_safe_writev(%p, %08x, %p)\n", |
| 302 | mtd, (unsigned int) to, vecs)); | 302 | mtd, (unsigned int) to, vecs)); |
| 303 | 303 | ||
| 304 | if (mtd->writev) { | 304 | if (mtd->writev) { |
| 305 | res = MTD_WRITEV(mtd, vecs, iovec_cnt, to, &retlen); | 305 | res = mtd->writev(mtd, vecs, iovec_cnt, to, &retlen); |
| 306 | return res ? res : retlen; | 306 | return res ? res : retlen; |
| 307 | } | 307 | } |
| 308 | /* Not implemented writev. Repeatedly use write - on the not so | 308 | /* Not implemented writev. Repeatedly use write - on the not so |
| @@ -312,7 +312,8 @@ flash_safe_writev(struct mtd_info *mtd, const struct kvec *vecs, | |||
| 312 | retlen=0; | 312 | retlen=0; |
| 313 | 313 | ||
| 314 | for (i=0; !res && i<iovec_cnt; i++) { | 314 | for (i=0; !res && i<iovec_cnt; i++) { |
| 315 | res = MTD_WRITE(mtd, to, vecs[i].iov_len, &retlen_a, vecs[i].iov_base); | 315 | res = mtd->write(mtd, to, vecs[i].iov_len, &retlen_a, |
| 316 | vecs[i].iov_base); | ||
| 316 | if (retlen_a != vecs[i].iov_len) { | 317 | if (retlen_a != vecs[i].iov_len) { |
| 317 | printk("Didn't write all bytes in flash_safe_writev(). Returned %d\n", res); | 318 | printk("Didn't write all bytes in flash_safe_writev(). Returned %d\n", res); |
| 318 | if (i != iovec_cnt-1) | 319 | if (i != iovec_cnt-1) |
| @@ -393,7 +394,7 @@ flash_erase_region(struct mtd_info *mtd, loff_t start, | |||
| 393 | set_current_state(TASK_UNINTERRUPTIBLE); | 394 | set_current_state(TASK_UNINTERRUPTIBLE); |
| 394 | add_wait_queue(&wait_q, &wait); | 395 | add_wait_queue(&wait_q, &wait); |
| 395 | 396 | ||
| 396 | if (MTD_ERASE(mtd, erase) < 0) { | 397 | if (mtd->erase(mtd, erase) < 0) { |
| 397 | set_current_state(TASK_RUNNING); | 398 | set_current_state(TASK_RUNNING); |
| 398 | remove_wait_queue(&wait_q, &wait); | 399 | remove_wait_queue(&wait_q, &wait); |
| 399 | kfree(erase); | 400 | kfree(erase); |
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index 48a9df21ab11..4970c2e96fbf 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h | |||
| @@ -199,20 +199,6 @@ int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs, | |||
| 199 | int default_mtd_readv(struct mtd_info *mtd, struct kvec *vecs, | 199 | int default_mtd_readv(struct mtd_info *mtd, struct kvec *vecs, |
| 200 | unsigned long count, loff_t from, size_t *retlen); | 200 | unsigned long count, loff_t from, size_t *retlen); |
| 201 | 201 | ||
| 202 | #define MTD_ERASE(mtd, args...) (*(mtd->erase))(mtd, args) | ||
| 203 | #define MTD_POINT(mtd, a,b,c,d) (*(mtd->point))(mtd, a,b,c, (u_char **)(d)) | ||
| 204 | #define MTD_UNPOINT(mtd, arg) (*(mtd->unpoint))(mtd, (u_char *)arg) | ||
| 205 | #define MTD_READ(mtd, args...) (*(mtd->read))(mtd, args) | ||
| 206 | #define MTD_WRITE(mtd, args...) (*(mtd->write))(mtd, args) | ||
| 207 | #define MTD_READV(mtd, args...) (*(mtd->readv))(mtd, args) | ||
| 208 | #define MTD_WRITEV(mtd, args...) (*(mtd->writev))(mtd, args) | ||
| 209 | #define MTD_READECC(mtd, args...) (*(mtd->read_ecc))(mtd, args) | ||
| 210 | #define MTD_WRITEECC(mtd, args...) (*(mtd->write_ecc))(mtd, args) | ||
| 211 | #define MTD_READOOB(mtd, args...) (*(mtd->read_oob))(mtd, args) | ||
| 212 | #define MTD_WRITEOOB(mtd, args...) (*(mtd->write_oob))(mtd, args) | ||
| 213 | #define MTD_SYNC(mtd) do { if (mtd->sync) (*(mtd->sync))(mtd); } while (0) | ||
| 214 | |||
| 215 | |||
| 216 | #ifdef CONFIG_MTD_PARTITIONS | 202 | #ifdef CONFIG_MTD_PARTITIONS |
| 217 | void mtd_erase_callback(struct erase_info *instr); | 203 | void mtd_erase_callback(struct erase_info *instr); |
| 218 | #else | 204 | #else |
| @@ -233,7 +219,7 @@ static inline void mtd_erase_callback(struct erase_info *instr) | |||
| 233 | 219 | ||
| 234 | #ifdef CONFIG_MTD_DEBUG | 220 | #ifdef CONFIG_MTD_DEBUG |
| 235 | #define DEBUG(n, args...) \ | 221 | #define DEBUG(n, args...) \ |
| 236 | do { \ | 222 | do { \ |
| 237 | if (n <= CONFIG_MTD_DEBUG_VERBOSE) \ | 223 | if (n <= CONFIG_MTD_DEBUG_VERBOSE) \ |
| 238 | printk(KERN_INFO args); \ | 224 | printk(KERN_INFO args); \ |
| 239 | } while(0) | 225 | } while(0) |
