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. const char *yaffs_nand_c_version =
  14. "$Id: yaffs_nand.c,v 1.7 2007/02/14 01:09:06 wookey Exp $";
  15. #include "yaffs_nand.h"
  16. #include "yaffs_tagscompat.h"
  17. #include "yaffs_tagsvalidity.h"
  18. int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND,
  19. __u8 * buffer,
  20. yaffs_ExtendedTags * tags)
  21. {
  22. int result;
  23. yaffs_ExtendedTags localTags;
  24. int realignedChunkInNAND = chunkInNAND - dev->chunkOffset;
  25. /* If there are no tags provided, use local tags to get prioritised gc working */
  26. if(!tags)
  27. tags = &localTags;
  28. if (dev->readChunkWithTagsFromNAND)
  29. result = dev->readChunkWithTagsFromNAND(dev, realignedChunkInNAND, buffer,
  30. tags);
  31. else
  32. result = yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(dev,
  33. realignedChunkInNAND,
  34. buffer,
  35. tags);
  36. if(tags &&
  37. tags->eccResult > YAFFS_ECC_RESULT_NO_ERROR){
  38. yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, chunkInNAND/dev->nChunksPerBlock);
  39. yaffs_HandleChunkError(dev,bi);
  40. }
  41. return result;
  42. }
  43. int yaffs_WriteChunkWithTagsToNAND(yaffs_Device * dev,
  44. int chunkInNAND,
  45. const __u8 * buffer,
  46. yaffs_ExtendedTags * tags)
  47. {
  48. chunkInNAND -= dev->chunkOffset;
  49. if (tags) {
  50. tags->sequenceNumber = dev->sequenceNumber;
  51. tags->chunkUsed = 1;
  52. if (!yaffs_ValidateTags(tags)) {
  53. T(YAFFS_TRACE_ERROR,
  54. (TSTR("Writing uninitialised tags" TENDSTR)));
  55. YBUG();
  56. }
  57. T(YAFFS_TRACE_WRITE,
  58. (TSTR("Writing chunk %d tags %d %d" TENDSTR), chunkInNAND,
  59. tags->objectId, tags->chunkId));
  60. } else {
  61. T(YAFFS_TRACE_ERROR, (TSTR("Writing with no tags" TENDSTR)));
  62. YBUG();
  63. }
  64. if (dev->writeChunkWithTagsToNAND)
  65. return dev->writeChunkWithTagsToNAND(dev, chunkInNAND, buffer,
  66. tags);
  67. else
  68. return yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(dev,
  69. chunkInNAND,
  70. buffer,
  71. tags);
  72. }
  73. int yaffs_MarkBlockBad(yaffs_Device * dev, int blockNo)
  74. {
  75. blockNo -= dev->blockOffset;
  76. ;
  77. if (dev->markNANDBlockBad)
  78. return dev->markNANDBlockBad(dev, blockNo);
  79. else
  80. return yaffs_TagsCompatabilityMarkNANDBlockBad(dev, blockNo);
  81. }
  82. int yaffs_QueryInitialBlockState(yaffs_Device * dev,
  83. int blockNo,
  84. yaffs_BlockState * state,
  85. unsigned *sequenceNumber)
  86. {
  87. blockNo -= dev->blockOffset;
  88. if (dev->queryNANDBlock)
  89. return dev->queryNANDBlock(dev, blockNo, state, sequenceNumber);
  90. else
  91. return yaffs_TagsCompatabilityQueryNANDBlock(dev, blockNo,
  92. state,
  93. sequenceNumber);
  94. }
  95. int yaffs_EraseBlockInNAND(struct yaffs_DeviceStruct *dev,
  96. int blockInNAND)
  97. {
  98. int result;
  99. blockInNAND -= dev->blockOffset;
  100. dev->nBlockErasures++;
  101. result = dev->eraseBlockInNAND(dev, blockInNAND);
  102. return result;
  103. }
  104. int yaffs_InitialiseNAND(struct yaffs_DeviceStruct *dev)
  105. {
  106. return dev->initialiseNAND(dev);
  107. }