• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-WNDR4500-V1.0.1.40_1.0.68/src/linux/linux-2.6/drivers/mtd/

Lines Matching defs:inftl

37 #include <linux/mtd/inftl.h>
52 struct INFTLrecord *inftl;
70 inftl = kzalloc(sizeof(*inftl), GFP_KERNEL);
72 if (!inftl) {
77 inftl->mbd.mtd = mtd;
78 inftl->mbd.devnum = -1;
80 inftl->mbd.tr = tr;
82 if (INFTL_mount(inftl) < 0) {
84 kfree(inftl);
91 inftl->cylinders = 1024;
92 inftl->heads = 16;
94 temp = inftl->cylinders * inftl->heads;
95 inftl->sectors = inftl->mbd.size / temp;
96 if (inftl->mbd.size % temp) {
97 inftl->sectors++;
98 temp = inftl->cylinders * inftl->sectors;
99 inftl->heads = inftl->mbd.size / temp;
101 if (inftl->mbd.size % temp) {
102 inftl->heads++;
103 temp = inftl->heads * inftl->sectors;
104 inftl->cylinders = inftl->mbd.size / temp;
108 if (inftl->mbd.size != inftl->heads * inftl->cylinders * inftl->sectors) {
114 "match size of 0x%lx.\n", inftl->mbd.size);
117 inftl->cylinders, inftl->heads , inftl->sectors,
118 (long)inftl->cylinders * (long)inftl->heads *
119 (long)inftl->sectors );
122 if (add_mtd_blktrans_dev(&inftl->mbd)) {
123 kfree(inftl->PUtable);
124 kfree(inftl->VUtable);
125 kfree(inftl);
129 printk(KERN_INFO "INFTL: Found new inftl%c\n", inftl->mbd.devnum + 'a');
136 struct INFTLrecord *inftl = (void *)dev;
142 kfree(inftl->PUtable);
143 kfree(inftl->VUtable);
144 kfree(inftl);
216 static u16 INFTL_findfreeblock(struct INFTLrecord *inftl, int desperate)
218 u16 pot = inftl->LastFreeEUN;
219 int silly = inftl->nb_blocks;
221 DEBUG(MTD_DEBUG_LEVEL3, "INFTL: INFTL_findfreeblock(inftl=%p,"
222 "desperate=%d)\n", inftl, desperate);
228 if (!desperate && inftl->numfreeEUNs < 2) {
230 "EUNs (%d)\n", inftl->numfreeEUNs);
236 if (inftl->PUtable[pot] == BLOCK_FREE) {
237 inftl->LastFreeEUN = pot;
241 if (++pot > inftl->lastEUN)
246 "EUN range = %d - %d\n", 0, inftl->LastFreeEUN);
249 } while (pot != inftl->LastFreeEUN);
254 static u16 INFTL_foldchain(struct INFTLrecord *inftl, unsigned thisVUC, unsigned pendingblock)
259 struct mtd_info *mtd = inftl->mbd.mtd;
265 DEBUG(MTD_DEBUG_LEVEL3, "INFTL: INFTL_foldchain(inftl=%p,thisVUC=%d,"
266 "pending=%d)\n", inftl, thisVUC, pendingblock);
271 thisEUN = targetEUN = inftl->VUtable[thisVUC];
284 while (thisEUN < inftl->nb_blocks) {
285 for (block = 0; block < inftl->EraseSize/SECTORSIZE; block ++) {
289 if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize)
320 thisEUN = inftl->PUtable[thisEUN];
331 for (block = 0; block < inftl->EraseSize/SECTORSIZE ; block++) {
340 (thisVUC * (inftl->EraseSize / SECTORSIZE) + block))) {
351 ret = mtd->read(mtd, (inftl->EraseSize * BlockMap[block]) +
356 (inftl->EraseSize * BlockMap[block]) +
366 inftl_write(inftl->mbd.mtd, (inftl->EraseSize * targetEUN) +
382 thisEUN = inftl->VUtable[thisVUC];
384 while (inftl->PUtable[thisEUN] != BLOCK_NIL) {
386 thisEUN = inftl->PUtable[thisEUN];
393 if (INFTL_formatblock(inftl, thisEUN) < 0) {
397 inftl->PUtable[thisEUN] = BLOCK_RESERVED;
400 inftl->PUtable[thisEUN] = BLOCK_FREE;
401 inftl->PUtable[prevEUN] = BLOCK_NIL;
402 inftl->numfreeEUNs++;
409 static u16 INFTL_makefreeblock(struct INFTLrecord *inftl, unsigned pendingblock)
423 DEBUG(MTD_DEBUG_LEVEL3, "INFTL: INFTL_makefreeblock(inftl=%p,"
424 "pending=%d)\n", inftl, pendingblock);
426 for (chain = 0; chain < inftl->nb_blocks; chain++) {
427 EUN = inftl->VUtable[chain];
430 while (EUN <= inftl->lastEUN) {
432 EUN = inftl->PUtable[EUN];
458 return INFTL_foldchain(inftl, LongestChain, pendingblock);
474 static inline u16 INFTL_findwriteunit(struct INFTLrecord *inftl, unsigned block)
476 unsigned int thisVUC = block / (inftl->EraseSize / SECTORSIZE);
478 unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize -1);
479 struct mtd_info *mtd = inftl->mbd.mtd;
486 DEBUG(MTD_DEBUG_LEVEL3, "INFTL: INFTL_findwriteunit(inftl=%p,"
487 "block=%d)\n", inftl, block);
495 thisEUN = inftl->VUtable[thisVUC];
498 while (thisEUN <= inftl->lastEUN) {
499 inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) +
531 thisEUN = inftl->PUtable[thisEUN];
543 writeEUN = INFTL_findfreeblock(inftl, 0);
551 thisEUN = INFTL_makefreeblock(inftl, 0xffff);
560 writeEUN = INFTL_findfreeblock(inftl, 1);
572 INFTL_dumptables(inftl);
573 INFTL_dumpVUchains(inftl);
585 thisEUN = inftl->VUtable[thisVUC];
587 inftl_read_oob(mtd, thisEUN * inftl->EraseSize
593 prev_block = inftl->VUtable[thisVUC];
594 if (prev_block < inftl->nb_blocks)
595 prev_block -= inftl->firstEUN;
609 inftl_write_oob(mtd, writeEUN * inftl->EraseSize + 8, 8,
620 inftl_write_oob(mtd, writeEUN * inftl->EraseSize +
623 inftl->PUtable[writeEUN] = inftl->VUtable[thisVUC];
624 inftl->VUtable[thisVUC] = writeEUN;
626 inftl->numfreeEUNs--;
639 static void INFTL_trydeletechain(struct INFTLrecord *inftl, unsigned thisVUC)
641 struct mtd_info *mtd = inftl->mbd.mtd;
649 DEBUG(MTD_DEBUG_LEVEL3, "INFTL: INFTL_trydeletechain(inftl=%p,"
650 "thisVUC=%d)\n", inftl, thisVUC);
655 thisEUN = inftl->VUtable[thisVUC];
667 while (thisEUN < inftl->nb_blocks) {
668 for (block = 0; block < inftl->EraseSize/SECTORSIZE; block++) {
672 if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize)
702 thisEUN = inftl->PUtable[thisEUN];
705 for (block = 0; block < inftl->EraseSize/SECTORSIZE; block++)
716 u16 *prevEUN = &inftl->VUtable[thisVUC];
726 while (inftl->PUtable[thisEUN] != BLOCK_NIL) {
727 BUG_ON(thisEUN >= inftl->nb_blocks);
729 prevEUN = &inftl->PUtable[thisEUN];
736 if (INFTL_formatblock(inftl, thisEUN) < 0) {
740 inftl->PUtable[thisEUN] = BLOCK_RESERVED;
743 inftl->PUtable[thisEUN] = BLOCK_FREE;
744 inftl->numfreeEUNs++;
756 inftl->VUtable[thisVUC] = BLOCK_NIL;
759 static int INFTL_deleteblock(struct INFTLrecord *inftl, unsigned block)
761 unsigned int thisEUN = inftl->VUtable[block / (inftl->EraseSize / SECTORSIZE)];
762 unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize - 1);
763 struct mtd_info *mtd = inftl->mbd.mtd;
769 DEBUG(MTD_DEBUG_LEVEL3, "INFTL: INFTL_deleteblock(inftl=%p,"
770 "block=%d)\n", inftl, block);
772 while (thisEUN < inftl->nb_blocks) {
773 if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) +
798 block / (inftl->EraseSize / SECTORSIZE));
801 thisEUN = inftl->PUtable[thisEUN];
806 loff_t ptr = (thisEUN * inftl->EraseSize) + blockofs;
813 INFTL_trydeletechain(inftl, block / (inftl->EraseSize / SECTORSIZE));
821 struct INFTLrecord *inftl = (void *)mbd;
823 unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize - 1);
828 DEBUG(MTD_DEBUG_LEVEL3, "INFTL: inftl_writeblock(inftl=%p,block=%ld,"
829 "buffer=%p)\n", inftl, block, buffer);
837 writeEUN = INFTL_findwriteunit(inftl, block);
852 inftl_write(inftl->mbd.mtd, (writeEUN * inftl->EraseSize) +
860 INFTL_deleteblock(inftl, block);
869 struct INFTLrecord *inftl = (void *)mbd;
870 unsigned int thisEUN = inftl->VUtable[block / (inftl->EraseSize / SECTORSIZE)];
871 unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize - 1);
872 struct mtd_info *mtd = inftl->mbd.mtd;
878 DEBUG(MTD_DEBUG_LEVEL3, "INFTL: inftl_readblock(inftl=%p,block=%ld,"
879 "buffer=%p)\n", inftl, block, buffer);
881 while (thisEUN < inftl->nb_blocks) {
882 if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) +
907 block / (inftl->EraseSize / SECTORSIZE));
911 thisEUN = inftl->PUtable[thisEUN];
920 loff_t ptr = (thisEUN * inftl->EraseSize) + blockofs;
932 struct INFTLrecord *inftl = (void *)dev;
934 geo->heads = inftl->heads;
935 geo->sectors = inftl->sectors;
936 geo->cylinders = inftl->cylinders;
942 .name = "inftl",