Lines Matching refs:inftl

37 	struct INFTLrecord *inftl;  in inftl_add_mtd()  local
55 inftl = kzalloc(sizeof(*inftl), GFP_KERNEL); in inftl_add_mtd()
57 if (!inftl) in inftl_add_mtd()
60 inftl->mbd.mtd = mtd; in inftl_add_mtd()
61 inftl->mbd.devnum = -1; in inftl_add_mtd()
63 inftl->mbd.tr = tr; in inftl_add_mtd()
65 if (INFTL_mount(inftl) < 0) { in inftl_add_mtd()
67 kfree(inftl); in inftl_add_mtd()
74 inftl->cylinders = 1024; in inftl_add_mtd()
75 inftl->heads = 16; in inftl_add_mtd()
77 temp = inftl->cylinders * inftl->heads; in inftl_add_mtd()
78 inftl->sectors = inftl->mbd.size / temp; in inftl_add_mtd()
79 if (inftl->mbd.size % temp) { in inftl_add_mtd()
80 inftl->sectors++; in inftl_add_mtd()
81 temp = inftl->cylinders * inftl->sectors; in inftl_add_mtd()
82 inftl->heads = inftl->mbd.size / temp; in inftl_add_mtd()
84 if (inftl->mbd.size % temp) { in inftl_add_mtd()
85 inftl->heads++; in inftl_add_mtd()
86 temp = inftl->heads * inftl->sectors; in inftl_add_mtd()
87 inftl->cylinders = inftl->mbd.size / temp; in inftl_add_mtd()
91 if (inftl->mbd.size != inftl->heads * inftl->cylinders * inftl->sectors) { in inftl_add_mtd()
97 "match size of 0x%lx.\n", inftl->mbd.size); in inftl_add_mtd()
100 inftl->cylinders, inftl->heads , inftl->sectors, in inftl_add_mtd()
101 (long)inftl->cylinders * (long)inftl->heads * in inftl_add_mtd()
102 (long)inftl->sectors ); in inftl_add_mtd()
105 if (add_mtd_blktrans_dev(&inftl->mbd)) { in inftl_add_mtd()
106 kfree(inftl->PUtable); in inftl_add_mtd()
107 kfree(inftl->VUtable); in inftl_add_mtd()
108 kfree(inftl); in inftl_add_mtd()
112 printk(KERN_INFO "INFTL: Found new inftl%c\n", inftl->mbd.devnum + 'a'); in inftl_add_mtd()
119 struct INFTLrecord *inftl = (void *)dev; in inftl_remove_dev() local
125 kfree(inftl->PUtable); in inftl_remove_dev()
126 kfree(inftl->VUtable); in inftl_remove_dev()
198 static u16 INFTL_findfreeblock(struct INFTLrecord *inftl, int desperate) in INFTL_findfreeblock() argument
200 u16 pot = inftl->LastFreeEUN; in INFTL_findfreeblock()
201 int silly = inftl->nb_blocks; in INFTL_findfreeblock()
204 inftl, desperate); in INFTL_findfreeblock()
210 if (!desperate && inftl->numfreeEUNs < 2) { in INFTL_findfreeblock()
212 inftl->numfreeEUNs); in INFTL_findfreeblock()
218 if (inftl->PUtable[pot] == BLOCK_FREE) { in INFTL_findfreeblock()
219 inftl->LastFreeEUN = pot; in INFTL_findfreeblock()
223 if (++pot > inftl->lastEUN) in INFTL_findfreeblock()
228 "EUN range = %d - %d\n", 0, inftl->LastFreeEUN); in INFTL_findfreeblock()
231 } while (pot != inftl->LastFreeEUN); in INFTL_findfreeblock()
236 static u16 INFTL_foldchain(struct INFTLrecord *inftl, unsigned thisVUC, unsigned pendingblock) in INFTL_foldchain() argument
241 struct mtd_info *mtd = inftl->mbd.mtd; in INFTL_foldchain()
248 inftl, thisVUC, pendingblock); in INFTL_foldchain()
253 thisEUN = targetEUN = inftl->VUtable[thisVUC]; in INFTL_foldchain()
266 while (thisEUN < inftl->nb_blocks) { in INFTL_foldchain()
267 for (block = 0; block < inftl->EraseSize/SECTORSIZE; block ++) { in INFTL_foldchain()
272 if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) in INFTL_foldchain()
303 thisEUN = inftl->PUtable[thisEUN]; in INFTL_foldchain()
313 for (block = 0; block < inftl->EraseSize/SECTORSIZE ; block++) { in INFTL_foldchain()
322 (thisVUC * (inftl->EraseSize / SECTORSIZE) + block))) { in INFTL_foldchain()
334 (inftl->EraseSize * BlockMap[block]) + (block * SECTORSIZE), in INFTL_foldchain()
340 (inftl->EraseSize * BlockMap[block]) + (block * SECTORSIZE), in INFTL_foldchain()
350 inftl_write(inftl->mbd.mtd, (inftl->EraseSize * targetEUN) + in INFTL_foldchain()
365 thisEUN = inftl->VUtable[thisVUC]; in INFTL_foldchain()
367 while (inftl->PUtable[thisEUN] != BLOCK_NIL) { in INFTL_foldchain()
369 thisEUN = inftl->PUtable[thisEUN]; in INFTL_foldchain()
377 inftl->PUtable[prevEUN] = BLOCK_NIL; in INFTL_foldchain()
380 if (INFTL_formatblock(inftl, thisEUN) < 0) { in INFTL_foldchain()
384 inftl->PUtable[thisEUN] = BLOCK_RESERVED; in INFTL_foldchain()
387 inftl->PUtable[thisEUN] = BLOCK_FREE; in INFTL_foldchain()
388 inftl->numfreeEUNs++; in INFTL_foldchain()
395 static u16 INFTL_makefreeblock(struct INFTLrecord *inftl, unsigned pendingblock) in INFTL_makefreeblock() argument
410 "pending=%d)\n", inftl, pendingblock); in INFTL_makefreeblock()
412 for (chain = 0; chain < inftl->nb_blocks; chain++) { in INFTL_makefreeblock()
413 EUN = inftl->VUtable[chain]; in INFTL_makefreeblock()
416 while (EUN <= inftl->lastEUN) { in INFTL_makefreeblock()
418 EUN = inftl->PUtable[EUN]; in INFTL_makefreeblock()
444 return INFTL_foldchain(inftl, LongestChain, pendingblock); in INFTL_makefreeblock()
460 static inline u16 INFTL_findwriteunit(struct INFTLrecord *inftl, unsigned block) in INFTL_findwriteunit() argument
462 unsigned int thisVUC = block / (inftl->EraseSize / SECTORSIZE); in INFTL_findwriteunit()
464 unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize -1); in INFTL_findwriteunit()
465 struct mtd_info *mtd = inftl->mbd.mtd; in INFTL_findwriteunit()
473 inftl, block); in INFTL_findwriteunit()
481 thisEUN = inftl->VUtable[thisVUC]; in INFTL_findwriteunit()
484 while (thisEUN <= inftl->lastEUN) { in INFTL_findwriteunit()
485 inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) + in INFTL_findwriteunit()
517 thisEUN = inftl->PUtable[thisEUN]; in INFTL_findwriteunit()
529 writeEUN = INFTL_findfreeblock(inftl, 0); in INFTL_findwriteunit()
537 thisEUN = INFTL_makefreeblock(inftl, block); in INFTL_findwriteunit()
546 writeEUN = INFTL_findfreeblock(inftl, 1); in INFTL_findwriteunit()
558 INFTL_dumptables(inftl); in INFTL_findwriteunit()
559 INFTL_dumpVUchains(inftl); in INFTL_findwriteunit()
571 thisEUN = inftl->VUtable[thisVUC]; in INFTL_findwriteunit()
573 inftl_read_oob(mtd, thisEUN * inftl->EraseSize in INFTL_findwriteunit()
579 prev_block = inftl->VUtable[thisVUC]; in INFTL_findwriteunit()
580 if (prev_block < inftl->nb_blocks) in INFTL_findwriteunit()
581 prev_block -= inftl->firstEUN; in INFTL_findwriteunit()
595 inftl_write_oob(mtd, writeEUN * inftl->EraseSize + 8, 8, in INFTL_findwriteunit()
606 inftl_write_oob(mtd, writeEUN * inftl->EraseSize + in INFTL_findwriteunit()
609 inftl->PUtable[writeEUN] = inftl->VUtable[thisVUC]; in INFTL_findwriteunit()
610 inftl->VUtable[thisVUC] = writeEUN; in INFTL_findwriteunit()
612 inftl->numfreeEUNs--; in INFTL_findwriteunit()
625 static void INFTL_trydeletechain(struct INFTLrecord *inftl, unsigned thisVUC) in INFTL_trydeletechain() argument
627 struct mtd_info *mtd = inftl->mbd.mtd; in INFTL_trydeletechain()
636 "thisVUC=%d)\n", inftl, thisVUC); in INFTL_trydeletechain()
641 thisEUN = inftl->VUtable[thisVUC]; in INFTL_trydeletechain()
653 while (thisEUN < inftl->nb_blocks) { in INFTL_trydeletechain()
654 for (block = 0; block < inftl->EraseSize/SECTORSIZE; block++) { in INFTL_trydeletechain()
658 if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) in INFTL_trydeletechain()
688 thisEUN = inftl->PUtable[thisEUN]; in INFTL_trydeletechain()
691 for (block = 0; block < inftl->EraseSize/SECTORSIZE; block++) in INFTL_trydeletechain()
702 u16 *prevEUN = &inftl->VUtable[thisVUC]; in INFTL_trydeletechain()
712 while (inftl->PUtable[thisEUN] != BLOCK_NIL) { in INFTL_trydeletechain()
713 BUG_ON(thisEUN >= inftl->nb_blocks); in INFTL_trydeletechain()
715 prevEUN = &inftl->PUtable[thisEUN]; in INFTL_trydeletechain()
722 if (INFTL_formatblock(inftl, thisEUN) < 0) { in INFTL_trydeletechain()
726 inftl->PUtable[thisEUN] = BLOCK_RESERVED; in INFTL_trydeletechain()
729 inftl->PUtable[thisEUN] = BLOCK_FREE; in INFTL_trydeletechain()
730 inftl->numfreeEUNs++; in INFTL_trydeletechain()
742 inftl->VUtable[thisVUC] = BLOCK_NIL; in INFTL_trydeletechain()
745 static int INFTL_deleteblock(struct INFTLrecord *inftl, unsigned block) in INFTL_deleteblock() argument
747 unsigned int thisEUN = inftl->VUtable[block / (inftl->EraseSize / SECTORSIZE)]; in INFTL_deleteblock()
748 unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize - 1); in INFTL_deleteblock()
749 struct mtd_info *mtd = inftl->mbd.mtd; in INFTL_deleteblock()
756 "block=%d)\n", inftl, block); in INFTL_deleteblock()
758 while (thisEUN < inftl->nb_blocks) { in INFTL_deleteblock()
759 if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) + in INFTL_deleteblock()
784 block / (inftl->EraseSize / SECTORSIZE)); in INFTL_deleteblock()
787 thisEUN = inftl->PUtable[thisEUN]; in INFTL_deleteblock()
792 loff_t ptr = (thisEUN * inftl->EraseSize) + blockofs; in INFTL_deleteblock()
799 INFTL_trydeletechain(inftl, block / (inftl->EraseSize / SECTORSIZE)); in INFTL_deleteblock()
807 struct INFTLrecord *inftl = (void *)mbd; in inftl_writeblock() local
809 unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize - 1); in inftl_writeblock()
815 "buffer=%p)\n", inftl, block, buffer); in inftl_writeblock()
823 writeEUN = INFTL_findwriteunit(inftl, block); in inftl_writeblock()
838 inftl_write(inftl->mbd.mtd, (writeEUN * inftl->EraseSize) + in inftl_writeblock()
846 INFTL_deleteblock(inftl, block); in inftl_writeblock()
855 struct INFTLrecord *inftl = (void *)mbd; in inftl_readblock() local
856 unsigned int thisEUN = inftl->VUtable[block / (inftl->EraseSize / SECTORSIZE)]; in inftl_readblock()
857 unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize - 1); in inftl_readblock()
858 struct mtd_info *mtd = inftl->mbd.mtd; in inftl_readblock()
865 "buffer=%p)\n", inftl, block, buffer); in inftl_readblock()
867 while (thisEUN < inftl->nb_blocks) { in inftl_readblock()
868 if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) + in inftl_readblock()
893 block / (inftl->EraseSize / SECTORSIZE)); in inftl_readblock()
897 thisEUN = inftl->PUtable[thisEUN]; in inftl_readblock()
906 loff_t ptr = (thisEUN * inftl->EraseSize) + blockofs; in inftl_readblock()
918 struct INFTLrecord *inftl = (void *)dev; in inftl_getgeo() local
920 geo->heads = inftl->heads; in inftl_getgeo()
921 geo->sectors = inftl->sectors; in inftl_getgeo()
922 geo->cylinders = inftl->cylinders; in inftl_getgeo()