Lines Matching refs:inftl

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