yaffs_nand.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /*
  2. * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
  3. *
  4. * Copyright (C) 2002-2007 Aleph One Ltd.
  5. * for Toby Churchill Ltd and Brightstar Engineering
  6. *
  7. * Created by Charles Manning <charles@aleph1.co.uk>
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License version 2 as
  11. * published by the Free Software Foundation.
  12. */
  13. /* XXX U-BOOT XXX */
  14. #include <common.h>
  15. const char *yaffs_nand_c_version =
  16. "$Id: yaffs_nand.c,v 1.7 2007/02/14 01:09:06 wookey Exp $";
  17. #include "yaffs_nand.h"
  18. #include "yaffs_tagscompat.h"
  19. #include "yaffs_tagsvalidity.h"
  20. int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND,
  21. __u8 * buffer,
  22. yaffs_ExtendedTags * tags)
  23. {
  24. int result;
  25. yaffs_ExtendedTags localTags;
  26. int realignedChunkInNAND = chunkInNAND - dev->chunkOffset;
  27. /* If there are no tags provided, use local tags to get prioritised gc working */
  28. if(!tags)
  29. tags = &localTags;
  30. if (dev->readChunkWithTagsFromNAND)
  31. result = dev->readChunkWithTagsFromNAND(dev, realignedChunkInNAND, buffer,
  32. tags);
  33. else
  34. result = yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(dev,
  35. realignedChunkInNAND,
  36. buffer,
  37. tags);
  38. if(tags &&
  39. tags->eccResult > YAFFS_ECC_RESULT_NO_ERROR){
  40. yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, chunkInNAND/dev->nChunksPerBlock);
  41. yaffs_HandleChunkError(dev,bi);
  42. }
  43. return result;
  44. }
  45. int yaffs_WriteChunkWithTagsToNAND(yaffs_Device * dev,
  46. int chunkInNAND,
  47. const __u8 * buffer,
  48. yaffs_ExtendedTags * tags)
  49. {
  50. chunkInNAND -= dev->chunkOffset;
  51. if (tags) {
  52. tags->sequenceNumber = dev->sequenceNumber;
  53. tags->chunkUsed = 1;
  54. if (!yaffs_ValidateTags(tags)) {
  55. T(YAFFS_TRACE_ERROR,
  56. (TSTR("Writing uninitialised tags" TENDSTR)));
  57. YBUG();
  58. }
  59. T(YAFFS_TRACE_WRITE,
  60. (TSTR("Writing chunk %d tags %d %d" TENDSTR), chunkInNAND,
  61. tags->objectId, tags->chunkId));
  62. } else {
  63. T(YAFFS_TRACE_ERROR, (TSTR("Writing with no tags" TENDSTR)));
  64. YBUG();
  65. }
  66. if (dev->writeChunkWithTagsToNAND)
  67. return dev->writeChunkWithTagsToNAND(dev, chunkInNAND, buffer,
  68. tags);
  69. else
  70. return yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(dev,
  71. chunkInNAND,
  72. buffer,
  73. tags);
  74. }
  75. int yaffs_MarkBlockBad(yaffs_Device * dev, int blockNo)
  76. {
  77. blockNo -= dev->blockOffset;
  78. ;
  79. if (dev->markNANDBlockBad)
  80. return dev->markNANDBlockBad(dev, blockNo);
  81. else
  82. return yaffs_TagsCompatabilityMarkNANDBlockBad(dev, blockNo);
  83. }
  84. int yaffs_QueryInitialBlockState(yaffs_Device * dev,
  85. int blockNo,
  86. yaffs_BlockState * state,
  87. unsigned *sequenceNumber)
  88. {
  89. blockNo -= dev->blockOffset;
  90. if (dev->queryNANDBlock)
  91. return dev->queryNANDBlock(dev, blockNo, state, sequenceNumber);
  92. else
  93. return yaffs_TagsCompatabilityQueryNANDBlock(dev, blockNo,
  94. state,
  95. sequenceNumber);
  96. }
  97. int yaffs_EraseBlockInNAND(struct yaffs_DeviceStruct *dev,
  98. int blockInNAND)
  99. {
  100. int result;
  101. blockInNAND -= dev->blockOffset;
  102. dev->nBlockErasures++;
  103. result = dev->eraseBlockInNAND(dev, blockInNAND);
  104. return result;
  105. }
  106. int yaffs_InitialiseNAND(struct yaffs_DeviceStruct *dev)
  107. {
  108. return dev->initialiseNAND(dev);
  109. }