diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-07 13:24:08 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-07 13:24:08 -0500 |
commit | b3ce1debe2685383a9ad6ace9c49869c3968c013 (patch) | |
tree | dcb606fac467d6ce78a9c608a1e0d2323af44f2b /drivers/mtd/inftlcore.c | |
parent | 5b2f7ffcb734d3046144dfbd5ac6d76254a9e522 (diff) | |
parent | c2965f1129ee54afcc4ef293ff0f25fa3a7e7392 (diff) |
Merge master.kernel.org:/pub/scm/linux/kernel/git/tglx/mtd-2.6
Some manual fixups for clashing kfree() cleanups etc.
Diffstat (limited to 'drivers/mtd/inftlcore.c')
-rw-r--r-- | drivers/mtd/inftlcore.c | 48 |
1 files changed, 24 insertions, 24 deletions
diff --git a/drivers/mtd/inftlcore.c b/drivers/mtd/inftlcore.c index 8db65bf029ea..8a544890173d 100644 --- a/drivers/mtd/inftlcore.c +++ b/drivers/mtd/inftlcore.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * inftlcore.c -- Linux driver for Inverse Flash Translation Layer (INFTL) | 2 | * inftlcore.c -- Linux driver for Inverse Flash Translation Layer (INFTL) |
3 | * | 3 | * |
4 | * (C) Copyright 2002, Greg Ungerer (gerg@snapgear.com) | 4 | * (C) Copyright 2002, Greg Ungerer (gerg@snapgear.com) |
@@ -7,7 +7,7 @@ | |||
7 | * (c) 1999 Machine Vision Holdings, Inc. | 7 | * (c) 1999 Machine Vision Holdings, Inc. |
8 | * Author: David Woodhouse <dwmw2@infradead.org> | 8 | * Author: David Woodhouse <dwmw2@infradead.org> |
9 | * | 9 | * |
10 | * $Id: inftlcore.c,v 1.18 2004/11/16 18:28:59 dwmw2 Exp $ | 10 | * $Id: inftlcore.c,v 1.19 2005/11/07 11:14:20 gleixner Exp $ |
11 | * | 11 | * |
12 | * This program is free software; you can redistribute it and/or modify | 12 | * This program is free software; you can redistribute it and/or modify |
13 | * it under the terms of the GNU General Public License as published by | 13 | * it under the terms of the GNU General Public License as published by |
@@ -113,14 +113,14 @@ static void inftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd) | |||
113 | 113 | ||
114 | if (inftl->mbd.size != inftl->heads * inftl->cylinders * inftl->sectors) { | 114 | if (inftl->mbd.size != inftl->heads * inftl->cylinders * inftl->sectors) { |
115 | /* | 115 | /* |
116 | Oh no we don't have | 116 | Oh no we don't have |
117 | mbd.size == heads * cylinders * sectors | 117 | mbd.size == heads * cylinders * sectors |
118 | */ | 118 | */ |
119 | printk(KERN_WARNING "INFTL: cannot calculate a geometry to " | 119 | printk(KERN_WARNING "INFTL: cannot calculate a geometry to " |
120 | "match size of 0x%lx.\n", inftl->mbd.size); | 120 | "match size of 0x%lx.\n", inftl->mbd.size); |
121 | printk(KERN_WARNING "INFTL: using C:%d H:%d S:%d " | 121 | printk(KERN_WARNING "INFTL: using C:%d H:%d S:%d " |
122 | "(== 0x%lx sects)\n", | 122 | "(== 0x%lx sects)\n", |
123 | inftl->cylinders, inftl->heads , inftl->sectors, | 123 | inftl->cylinders, inftl->heads , inftl->sectors, |
124 | (long)inftl->cylinders * (long)inftl->heads * | 124 | (long)inftl->cylinders * (long)inftl->heads * |
125 | (long)inftl->sectors ); | 125 | (long)inftl->sectors ); |
126 | } | 126 | } |
@@ -219,7 +219,7 @@ static u16 INFTL_foldchain(struct INFTLrecord *inftl, unsigned thisVUC, unsigned | |||
219 | "Virtual Unit Chain %d!\n", thisVUC); | 219 | "Virtual Unit Chain %d!\n", thisVUC); |
220 | return BLOCK_NIL; | 220 | return BLOCK_NIL; |
221 | } | 221 | } |
222 | 222 | ||
223 | /* | 223 | /* |
224 | * Scan to find the Erase Unit which holds the actual data for each | 224 | * Scan to find the Erase Unit which holds the actual data for each |
225 | * 512-byte block within the Chain. | 225 | * 512-byte block within the Chain. |
@@ -260,7 +260,7 @@ static u16 INFTL_foldchain(struct INFTLrecord *inftl, unsigned thisVUC, unsigned | |||
260 | "Unit Chain 0x%x\n", thisVUC); | 260 | "Unit Chain 0x%x\n", thisVUC); |
261 | return BLOCK_NIL; | 261 | return BLOCK_NIL; |
262 | } | 262 | } |
263 | 263 | ||
264 | thisEUN = inftl->PUtable[thisEUN]; | 264 | thisEUN = inftl->PUtable[thisEUN]; |
265 | } | 265 | } |
266 | 266 | ||
@@ -291,15 +291,15 @@ static u16 INFTL_foldchain(struct INFTLrecord *inftl, unsigned thisVUC, unsigned | |||
291 | */ | 291 | */ |
292 | if (BlockMap[block] == BLOCK_NIL) | 292 | if (BlockMap[block] == BLOCK_NIL) |
293 | continue; | 293 | continue; |
294 | 294 | ||
295 | ret = MTD_READ(inftl->mbd.mtd, (inftl->EraseSize * | 295 | ret = MTD_READ(inftl->mbd.mtd, (inftl->EraseSize * |
296 | BlockMap[block]) + (block * SECTORSIZE), SECTORSIZE, | 296 | BlockMap[block]) + (block * SECTORSIZE), SECTORSIZE, |
297 | &retlen, movebuf); | 297 | &retlen, movebuf); |
298 | if (ret < 0) { | 298 | if (ret < 0) { |
299 | ret = MTD_READ(inftl->mbd.mtd, (inftl->EraseSize * | 299 | ret = MTD_READ(inftl->mbd.mtd, (inftl->EraseSize * |
300 | BlockMap[block]) + (block * SECTORSIZE), | 300 | BlockMap[block]) + (block * SECTORSIZE), |
301 | SECTORSIZE, &retlen, movebuf); | 301 | SECTORSIZE, &retlen, movebuf); |
302 | if (ret != -EIO) | 302 | if (ret != -EIO) |
303 | DEBUG(MTD_DEBUG_LEVEL1, "INFTL: error went " | 303 | DEBUG(MTD_DEBUG_LEVEL1, "INFTL: error went " |
304 | "away on retry?\n"); | 304 | "away on retry?\n"); |
305 | } | 305 | } |
@@ -351,7 +351,7 @@ static u16 INFTL_foldchain(struct INFTLrecord *inftl, unsigned thisVUC, unsigned | |||
351 | static u16 INFTL_makefreeblock(struct INFTLrecord *inftl, unsigned pendingblock) | 351 | static u16 INFTL_makefreeblock(struct INFTLrecord *inftl, unsigned pendingblock) |
352 | { | 352 | { |
353 | /* | 353 | /* |
354 | * This is the part that needs some cleverness applied. | 354 | * This is the part that needs some cleverness applied. |
355 | * For now, I'm doing the minimum applicable to actually | 355 | * For now, I'm doing the minimum applicable to actually |
356 | * get the thing to work. | 356 | * get the thing to work. |
357 | * Wear-levelling and other clever stuff needs to be implemented | 357 | * Wear-levelling and other clever stuff needs to be implemented |
@@ -410,7 +410,7 @@ static int nrbits(unsigned int val, int bitcount) | |||
410 | } | 410 | } |
411 | 411 | ||
412 | /* | 412 | /* |
413 | * INFTL_findwriteunit: Return the unit number into which we can write | 413 | * INFTL_findwriteunit: Return the unit number into which we can write |
414 | * for this block. Make it available if it isn't already. | 414 | * for this block. Make it available if it isn't already. |
415 | */ | 415 | */ |
416 | static inline u16 INFTL_findwriteunit(struct INFTLrecord *inftl, unsigned block) | 416 | static inline u16 INFTL_findwriteunit(struct INFTLrecord *inftl, unsigned block) |
@@ -459,10 +459,10 @@ static inline u16 INFTL_findwriteunit(struct INFTLrecord *inftl, unsigned block) | |||
459 | * Invalid block. Don't use it any more. | 459 | * Invalid block. Don't use it any more. |
460 | * Must implement. | 460 | * Must implement. |
461 | */ | 461 | */ |
462 | break; | 462 | break; |
463 | } | 463 | } |
464 | 464 | ||
465 | if (!silly--) { | 465 | if (!silly--) { |
466 | printk(KERN_WARNING "INFTL: infinite loop in " | 466 | printk(KERN_WARNING "INFTL: infinite loop in " |
467 | "Virtual Unit Chain 0x%x\n", thisVUC); | 467 | "Virtual Unit Chain 0x%x\n", thisVUC); |
468 | return 0xffff; | 468 | return 0xffff; |
@@ -478,7 +478,7 @@ hitused: | |||
478 | 478 | ||
479 | 479 | ||
480 | /* | 480 | /* |
481 | * OK. We didn't find one in the existing chain, or there | 481 | * OK. We didn't find one in the existing chain, or there |
482 | * is no existing chain. Allocate a new one. | 482 | * is no existing chain. Allocate a new one. |
483 | */ | 483 | */ |
484 | writeEUN = INFTL_findfreeblock(inftl, 0); | 484 | writeEUN = INFTL_findfreeblock(inftl, 0); |
@@ -502,8 +502,8 @@ hitused: | |||
502 | if (writeEUN == BLOCK_NIL) { | 502 | if (writeEUN == BLOCK_NIL) { |
503 | /* | 503 | /* |
504 | * Ouch. This should never happen - we should | 504 | * Ouch. This should never happen - we should |
505 | * always be able to make some room somehow. | 505 | * always be able to make some room somehow. |
506 | * If we get here, we've allocated more storage | 506 | * If we get here, we've allocated more storage |
507 | * space than actual media, or our makefreeblock | 507 | * space than actual media, or our makefreeblock |
508 | * routine is missing something. | 508 | * routine is missing something. |
509 | */ | 509 | */ |
@@ -514,7 +514,7 @@ hitused: | |||
514 | INFTL_dumpVUchains(inftl); | 514 | INFTL_dumpVUchains(inftl); |
515 | #endif | 515 | #endif |
516 | return BLOCK_NIL; | 516 | return BLOCK_NIL; |
517 | } | 517 | } |
518 | } | 518 | } |
519 | 519 | ||
520 | /* | 520 | /* |
@@ -539,7 +539,7 @@ hitused: | |||
539 | parity |= (nrbits(prev_block, 16) & 0x1) ? 0x2 : 0; | 539 | parity |= (nrbits(prev_block, 16) & 0x1) ? 0x2 : 0; |
540 | parity |= (nrbits(anac, 8) & 0x1) ? 0x4 : 0; | 540 | parity |= (nrbits(anac, 8) & 0x1) ? 0x4 : 0; |
541 | parity |= (nrbits(nacs, 8) & 0x1) ? 0x8 : 0; | 541 | parity |= (nrbits(nacs, 8) & 0x1) ? 0x8 : 0; |
542 | 542 | ||
543 | oob.u.a.virtualUnitNo = cpu_to_le16(thisVUC); | 543 | oob.u.a.virtualUnitNo = cpu_to_le16(thisVUC); |
544 | oob.u.a.prevUnitNo = cpu_to_le16(prev_block); | 544 | oob.u.a.prevUnitNo = cpu_to_le16(prev_block); |
545 | oob.u.a.ANAC = anac; | 545 | oob.u.a.ANAC = anac; |
@@ -558,7 +558,7 @@ hitused: | |||
558 | oob.u.b.parityPerField = parity; | 558 | oob.u.b.parityPerField = parity; |
559 | oob.u.b.discarded = 0xaa; | 559 | oob.u.b.discarded = 0xaa; |
560 | 560 | ||
561 | MTD_WRITEOOB(inftl->mbd.mtd, writeEUN * inftl->EraseSize + | 561 | MTD_WRITEOOB(inftl->mbd.mtd, writeEUN * inftl->EraseSize + |
562 | SECTORSIZE * 4 + 8, 8, &retlen, (char *)&oob.u); | 562 | SECTORSIZE * 4 + 8, 8, &retlen, (char *)&oob.u); |
563 | 563 | ||
564 | inftl->PUtable[writeEUN] = inftl->VUtable[thisVUC]; | 564 | inftl->PUtable[writeEUN] = inftl->VUtable[thisVUC]; |
@@ -598,7 +598,7 @@ static void INFTL_trydeletechain(struct INFTLrecord *inftl, unsigned thisVUC) | |||
598 | "Virtual Unit Chain %d!\n", thisVUC); | 598 | "Virtual Unit Chain %d!\n", thisVUC); |
599 | return; | 599 | return; |
600 | } | 600 | } |
601 | 601 | ||
602 | /* | 602 | /* |
603 | * Scan through the Erase Units to determine whether any data is in | 603 | * Scan through the Erase Units to determine whether any data is in |
604 | * each of the 512-byte blocks within the Chain. | 604 | * each of the 512-byte blocks within the Chain. |
@@ -638,7 +638,7 @@ static void INFTL_trydeletechain(struct INFTLrecord *inftl, unsigned thisVUC) | |||
638 | "Unit Chain 0x%x\n", thisVUC); | 638 | "Unit Chain 0x%x\n", thisVUC); |
639 | return; | 639 | return; |
640 | } | 640 | } |
641 | 641 | ||
642 | thisEUN = inftl->PUtable[thisEUN]; | 642 | thisEUN = inftl->PUtable[thisEUN]; |
643 | } | 643 | } |
644 | 644 | ||
@@ -754,7 +754,7 @@ foundit: | |||
754 | return 0; | 754 | return 0; |
755 | } | 755 | } |
756 | 756 | ||
757 | static int inftl_writeblock(struct mtd_blktrans_dev *mbd, unsigned long block, | 757 | static int inftl_writeblock(struct mtd_blktrans_dev *mbd, unsigned long block, |
758 | char *buffer) | 758 | char *buffer) |
759 | { | 759 | { |
760 | struct INFTLrecord *inftl = (void *)mbd; | 760 | struct INFTLrecord *inftl = (void *)mbd; |
@@ -889,7 +889,7 @@ extern char inftlmountrev[]; | |||
889 | 889 | ||
890 | static int __init init_inftl(void) | 890 | static int __init init_inftl(void) |
891 | { | 891 | { |
892 | printk(KERN_INFO "INFTL: inftlcore.c $Revision: 1.18 $, " | 892 | printk(KERN_INFO "INFTL: inftlcore.c $Revision: 1.19 $, " |
893 | "inftlmount.c %s\n", inftlmountrev); | 893 | "inftlmount.c %s\n", inftlmountrev); |
894 | 894 | ||
895 | return register_mtd_blktrans(&inftl_tr); | 895 | return register_mtd_blktrans(&inftl_tr); |