Lines Matching refs:inftl

50 	struct INFTLrecord *inftl;  in inftl_add_mtd()  local
68 inftl = kzalloc(sizeof(*inftl), GFP_KERNEL); in inftl_add_mtd()
70 if (!inftl) in inftl_add_mtd()
73 inftl->mbd.mtd = mtd; in inftl_add_mtd()
74 inftl->mbd.devnum = -1; in inftl_add_mtd()
76 inftl->mbd.tr = tr; in inftl_add_mtd()
78 if (INFTL_mount(inftl) < 0) { in inftl_add_mtd()
80 kfree(inftl); in inftl_add_mtd()
87 inftl->cylinders = 1024; in inftl_add_mtd()
88 inftl->heads = 16; in inftl_add_mtd()
90 temp = inftl->cylinders * inftl->heads; in inftl_add_mtd()
91 inftl->sectors = inftl->mbd.size / temp; in inftl_add_mtd()
92 if (inftl->mbd.size % temp) { in inftl_add_mtd()
93 inftl->sectors++; in inftl_add_mtd()
94 temp = inftl->cylinders * inftl->sectors; in inftl_add_mtd()
95 inftl->heads = inftl->mbd.size / temp; in inftl_add_mtd()
97 if (inftl->mbd.size % temp) { in inftl_add_mtd()
98 inftl->heads++; in inftl_add_mtd()
99 temp = inftl->heads * inftl->sectors; in inftl_add_mtd()
100 inftl->cylinders = inftl->mbd.size / temp; in inftl_add_mtd()
104 if (inftl->mbd.size != inftl->heads * inftl->cylinders * inftl->sectors) { in inftl_add_mtd()
110 "match size of 0x%lx.\n", inftl->mbd.size); in inftl_add_mtd()
113 inftl->cylinders, inftl->heads , inftl->sectors, in inftl_add_mtd()
114 (long)inftl->cylinders * (long)inftl->heads * in inftl_add_mtd()
115 (long)inftl->sectors ); in inftl_add_mtd()
118 if (add_mtd_blktrans_dev(&inftl->mbd)) { in inftl_add_mtd()
119 kfree(inftl->PUtable); in inftl_add_mtd()
120 kfree(inftl->VUtable); in inftl_add_mtd()
121 kfree(inftl); in inftl_add_mtd()
125 printk(KERN_INFO "INFTL: Found new inftl%c\n", inftl->mbd.devnum + 'a'); in inftl_add_mtd()
132 struct INFTLrecord *inftl = (void *)dev; in inftl_remove_dev() local
138 kfree(inftl->PUtable); in inftl_remove_dev()
139 kfree(inftl->VUtable); in inftl_remove_dev()
211 static u16 INFTL_findfreeblock(struct INFTLrecord *inftl, int desperate) in INFTL_findfreeblock() argument
213 u16 pot = inftl->LastFreeEUN; in INFTL_findfreeblock()
214 int silly = inftl->nb_blocks; in INFTL_findfreeblock()
217 inftl, desperate); in INFTL_findfreeblock()
223 if (!desperate && inftl->numfreeEUNs < 2) { in INFTL_findfreeblock()
225 inftl->numfreeEUNs); in INFTL_findfreeblock()
231 if (inftl->PUtable[pot] == BLOCK_FREE) { in INFTL_findfreeblock()
232 inftl->LastFreeEUN = pot; in INFTL_findfreeblock()
236 if (++pot > inftl->lastEUN) in INFTL_findfreeblock()
241 "EUN range = %d - %d\n", 0, inftl->LastFreeEUN); in INFTL_findfreeblock()
244 } while (pot != inftl->LastFreeEUN); in INFTL_findfreeblock()
249 static u16 INFTL_foldchain(struct INFTLrecord *inftl, unsigned thisVUC, unsigned pendingblock) in INFTL_foldchain() argument
254 struct mtd_info *mtd = inftl->mbd.mtd; in INFTL_foldchain()
261 inftl, thisVUC, pendingblock); in INFTL_foldchain()
266 thisEUN = targetEUN = inftl->VUtable[thisVUC]; in INFTL_foldchain()
279 while (thisEUN < inftl->nb_blocks) { in INFTL_foldchain()
280 for (block = 0; block < inftl->EraseSize/SECTORSIZE; block ++) { in INFTL_foldchain()
285 if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) in INFTL_foldchain()
316 thisEUN = inftl->PUtable[thisEUN]; in INFTL_foldchain()
326 for (block = 0; block < inftl->EraseSize/SECTORSIZE ; block++) { in INFTL_foldchain()
335 (thisVUC * (inftl->EraseSize / SECTORSIZE) + block))) { in INFTL_foldchain()
347 (inftl->EraseSize * BlockMap[block]) + (block * SECTORSIZE), in INFTL_foldchain()
353 (inftl->EraseSize * BlockMap[block]) + (block * SECTORSIZE), in INFTL_foldchain()
363 inftl_write(inftl->mbd.mtd, (inftl->EraseSize * targetEUN) + in INFTL_foldchain()
378 thisEUN = inftl->VUtable[thisVUC]; in INFTL_foldchain()
380 while (inftl->PUtable[thisEUN] != BLOCK_NIL) { in INFTL_foldchain()
382 thisEUN = inftl->PUtable[thisEUN]; in INFTL_foldchain()
390 inftl->PUtable[prevEUN] = BLOCK_NIL; in INFTL_foldchain()
393 if (INFTL_formatblock(inftl, thisEUN) < 0) { in INFTL_foldchain()
397 inftl->PUtable[thisEUN] = BLOCK_RESERVED; in INFTL_foldchain()
400 inftl->PUtable[thisEUN] = BLOCK_FREE; in INFTL_foldchain()
401 inftl->numfreeEUNs++; in INFTL_foldchain()
408 static u16 INFTL_makefreeblock(struct INFTLrecord *inftl, unsigned pendingblock) in INFTL_makefreeblock() argument
423 "pending=%d)\n", inftl, pendingblock); in INFTL_makefreeblock()
425 for (chain = 0; chain < inftl->nb_blocks; chain++) { in INFTL_makefreeblock()
426 EUN = inftl->VUtable[chain]; in INFTL_makefreeblock()
429 while (EUN <= inftl->lastEUN) { in INFTL_makefreeblock()
431 EUN = inftl->PUtable[EUN]; in INFTL_makefreeblock()
457 return INFTL_foldchain(inftl, LongestChain, pendingblock); in INFTL_makefreeblock()
473 static inline u16 INFTL_findwriteunit(struct INFTLrecord *inftl, unsigned block) in INFTL_findwriteunit() argument
475 unsigned int thisVUC = block / (inftl->EraseSize / SECTORSIZE); in INFTL_findwriteunit()
477 unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize -1); in INFTL_findwriteunit()
478 struct mtd_info *mtd = inftl->mbd.mtd; in INFTL_findwriteunit()
486 inftl, block); in INFTL_findwriteunit()
494 thisEUN = inftl->VUtable[thisVUC]; in INFTL_findwriteunit()
497 while (thisEUN <= inftl->lastEUN) { in INFTL_findwriteunit()
498 inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) + in INFTL_findwriteunit()
530 thisEUN = inftl->PUtable[thisEUN]; in INFTL_findwriteunit()
542 writeEUN = INFTL_findfreeblock(inftl, 0); in INFTL_findwriteunit()
550 thisEUN = INFTL_makefreeblock(inftl, block); in INFTL_findwriteunit()
559 writeEUN = INFTL_findfreeblock(inftl, 1); in INFTL_findwriteunit()
571 INFTL_dumptables(inftl); in INFTL_findwriteunit()
572 INFTL_dumpVUchains(inftl); in INFTL_findwriteunit()
584 thisEUN = inftl->VUtable[thisVUC]; in INFTL_findwriteunit()
586 inftl_read_oob(mtd, thisEUN * inftl->EraseSize in INFTL_findwriteunit()
592 prev_block = inftl->VUtable[thisVUC]; in INFTL_findwriteunit()
593 if (prev_block < inftl->nb_blocks) in INFTL_findwriteunit()
594 prev_block -= inftl->firstEUN; in INFTL_findwriteunit()
608 inftl_write_oob(mtd, writeEUN * inftl->EraseSize + 8, 8, in INFTL_findwriteunit()
619 inftl_write_oob(mtd, writeEUN * inftl->EraseSize + in INFTL_findwriteunit()
622 inftl->PUtable[writeEUN] = inftl->VUtable[thisVUC]; in INFTL_findwriteunit()
623 inftl->VUtable[thisVUC] = writeEUN; in INFTL_findwriteunit()
625 inftl->numfreeEUNs--; in INFTL_findwriteunit()
638 static void INFTL_trydeletechain(struct INFTLrecord *inftl, unsigned thisVUC) in INFTL_trydeletechain() argument
640 struct mtd_info *mtd = inftl->mbd.mtd; in INFTL_trydeletechain()
649 "thisVUC=%d)\n", inftl, thisVUC); in INFTL_trydeletechain()
654 thisEUN = inftl->VUtable[thisVUC]; in INFTL_trydeletechain()
666 while (thisEUN < inftl->nb_blocks) { in INFTL_trydeletechain()
667 for (block = 0; block < inftl->EraseSize/SECTORSIZE; block++) { in INFTL_trydeletechain()
671 if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) in INFTL_trydeletechain()
701 thisEUN = inftl->PUtable[thisEUN]; in INFTL_trydeletechain()
704 for (block = 0; block < inftl->EraseSize/SECTORSIZE; block++) in INFTL_trydeletechain()
715 u16 *prevEUN = &inftl->VUtable[thisVUC]; in INFTL_trydeletechain()
725 while (inftl->PUtable[thisEUN] != BLOCK_NIL) { in INFTL_trydeletechain()
726 BUG_ON(thisEUN >= inftl->nb_blocks); in INFTL_trydeletechain()
728 prevEUN = &inftl->PUtable[thisEUN]; in INFTL_trydeletechain()
735 if (INFTL_formatblock(inftl, thisEUN) < 0) { in INFTL_trydeletechain()
739 inftl->PUtable[thisEUN] = BLOCK_RESERVED; in INFTL_trydeletechain()
742 inftl->PUtable[thisEUN] = BLOCK_FREE; in INFTL_trydeletechain()
743 inftl->numfreeEUNs++; in INFTL_trydeletechain()
755 inftl->VUtable[thisVUC] = BLOCK_NIL; in INFTL_trydeletechain()
758 static int INFTL_deleteblock(struct INFTLrecord *inftl, unsigned block) in INFTL_deleteblock() argument
760 unsigned int thisEUN = inftl->VUtable[block / (inftl->EraseSize / SECTORSIZE)]; in INFTL_deleteblock()
761 unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize - 1); in INFTL_deleteblock()
762 struct mtd_info *mtd = inftl->mbd.mtd; in INFTL_deleteblock()
769 "block=%d)\n", inftl, block); in INFTL_deleteblock()
771 while (thisEUN < inftl->nb_blocks) { in INFTL_deleteblock()
772 if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) + in INFTL_deleteblock()
797 block / (inftl->EraseSize / SECTORSIZE)); in INFTL_deleteblock()
800 thisEUN = inftl->PUtable[thisEUN]; in INFTL_deleteblock()
805 loff_t ptr = (thisEUN * inftl->EraseSize) + blockofs; in INFTL_deleteblock()
812 INFTL_trydeletechain(inftl, block / (inftl->EraseSize / SECTORSIZE)); in INFTL_deleteblock()
820 struct INFTLrecord *inftl = (void *)mbd; in inftl_writeblock() local
822 unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize - 1); in inftl_writeblock()
828 "buffer=%p)\n", inftl, block, buffer); in inftl_writeblock()
836 writeEUN = INFTL_findwriteunit(inftl, block); in inftl_writeblock()
851 inftl_write(inftl->mbd.mtd, (writeEUN * inftl->EraseSize) + in inftl_writeblock()
859 INFTL_deleteblock(inftl, block); in inftl_writeblock()
868 struct INFTLrecord *inftl = (void *)mbd; in inftl_readblock() local
869 unsigned int thisEUN = inftl->VUtable[block / (inftl->EraseSize / SECTORSIZE)]; in inftl_readblock()
870 unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize - 1); in inftl_readblock()
871 struct mtd_info *mtd = inftl->mbd.mtd; in inftl_readblock()
878 "buffer=%p)\n", inftl, block, buffer); in inftl_readblock()
880 while (thisEUN < inftl->nb_blocks) { in inftl_readblock()
881 if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) + in inftl_readblock()
906 block / (inftl->EraseSize / SECTORSIZE)); in inftl_readblock()
910 thisEUN = inftl->PUtable[thisEUN]; in inftl_readblock()
919 loff_t ptr = (thisEUN * inftl->EraseSize) + blockofs; in inftl_readblock()
931 struct INFTLrecord *inftl = (void *)dev; in inftl_getgeo() local
933 geo->heads = inftl->heads; in inftl_getgeo()
934 geo->sectors = inftl->sectors; in inftl_getgeo()
935 geo->cylinders = inftl->cylinders; in inftl_getgeo()