diff options
Diffstat (limited to 'meta/recipes-devtools/yaffs2/files/yaffs2-unioob.patch')
| -rw-r--r-- | meta/recipes-devtools/yaffs2/files/yaffs2-unioob.patch | 218 |
1 files changed, 0 insertions, 218 deletions
diff --git a/meta/recipes-devtools/yaffs2/files/yaffs2-unioob.patch b/meta/recipes-devtools/yaffs2/files/yaffs2-unioob.patch deleted file mode 100644 index 8152dabe43..0000000000 --- a/meta/recipes-devtools/yaffs2/files/yaffs2-unioob.patch +++ /dev/null | |||
| @@ -1,218 +0,0 @@ | |||
| 1 | Upstream-Status: Backport | ||
| 2 | |||
| 3 | diff -urN yaffs2.orig/yaffs_mtdif2.c yaffs2/yaffs_mtdif2.c | ||
| 4 | --- yaffs2.orig/yaffs_mtdif2.c 2005-12-07 14:00:38.000000000 -0800 | ||
| 5 | +++ yaffs2/yaffs_mtdif2.c 2006-02-10 17:13:58.000000000 -0800 | ||
| 6 | @@ -29,6 +29,130 @@ | ||
| 7 | |||
| 8 | #include "yaffs_packedtags2.h" | ||
| 9 | |||
| 10 | +#define PT2_BYTES 25 | ||
| 11 | + | ||
| 12 | +void nandmtd2_pt2buf(yaffs_Device *dev, yaffs_PackedTags2 *pt, int is_raw) | ||
| 13 | +{ | ||
| 14 | + struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); | ||
| 15 | + int i, j = 0, k, n; | ||
| 16 | + __u8 pt2_byte_buf[PT2_BYTES]; | ||
| 17 | + | ||
| 18 | + /* Pack buffer with 0xff */ | ||
| 19 | + for (i = 0; i < mtd->oobsize; i++) | ||
| 20 | + dev->spareBuffer[i] = 0xff; | ||
| 21 | + | ||
| 22 | + if (!is_raw) { | ||
| 23 | + *((unsigned int *) &dev->spareBuffer[0]) = pt->t.sequenceNumber; | ||
| 24 | + *((unsigned int *) &dev->spareBuffer[4]) = pt->t.objectId; | ||
| 25 | + *((unsigned int *) &dev->spareBuffer[8]) = pt->t.chunkId; | ||
| 26 | + *((unsigned int *) &dev->spareBuffer[12]) = pt->t.byteCount; | ||
| 27 | + dev->spareBuffer[16] = pt->ecc.colParity; | ||
| 28 | + dev->spareBuffer[17] = pt->ecc.lineParity & 0xff; | ||
| 29 | + dev->spareBuffer[18] = (pt->ecc.lineParity >> 8) & 0xff; | ||
| 30 | + dev->spareBuffer[19] = (pt->ecc.lineParity >> 16) & 0xff; | ||
| 31 | + dev->spareBuffer[20] = (pt->ecc.lineParity >> 24) & 0xff; | ||
| 32 | + dev->spareBuffer[21] = pt->ecc.lineParityPrime & 0xff; | ||
| 33 | + dev->spareBuffer[22] = (pt->ecc.lineParityPrime >> 8) & 0xff; | ||
| 34 | + dev->spareBuffer[23] = (pt->ecc.lineParityPrime >> 16) & 0xff; | ||
| 35 | + dev->spareBuffer[24] = (pt->ecc.lineParityPrime >> 24) & 0xff; | ||
| 36 | + } else { | ||
| 37 | + *((unsigned int *) &pt2_byte_buf[0]) = pt->t.sequenceNumber; | ||
| 38 | + *((unsigned int *) &pt2_byte_buf[4]) = pt->t.objectId; | ||
| 39 | + *((unsigned int *) &pt2_byte_buf[8]) = pt->t.chunkId; | ||
| 40 | + *((unsigned int *) &pt2_byte_buf[12]) = pt->t.byteCount; | ||
| 41 | + pt2_byte_buf[16] = pt->ecc.colParity; | ||
| 42 | + pt2_byte_buf[17] = pt->ecc.lineParity & 0xff; | ||
| 43 | + pt2_byte_buf[18] = (pt->ecc.lineParity >> 8) & 0xff; | ||
| 44 | + pt2_byte_buf[19] = (pt->ecc.lineParity >> 16) & 0xff; | ||
| 45 | + pt2_byte_buf[20] = (pt->ecc.lineParity >> 24) & 0xff; | ||
| 46 | + pt2_byte_buf[21] = pt->ecc.lineParityPrime & 0xff; | ||
| 47 | + pt2_byte_buf[22] = (pt->ecc.lineParityPrime >> 8) & 0xff; | ||
| 48 | + pt2_byte_buf[23] = (pt->ecc.lineParityPrime >> 16) & 0xff; | ||
| 49 | + pt2_byte_buf[24] = (pt->ecc.lineParityPrime >> 24) & 0xff; | ||
| 50 | + | ||
| 51 | + k = mtd->oobinfo.oobfree[j][0]; | ||
| 52 | + n = mtd->oobinfo.oobfree[j][1]; | ||
| 53 | + | ||
| 54 | + if (n == 0) { | ||
| 55 | + T(YAFFS_TRACE_ERROR, (TSTR("No OOB space for tags" TENDSTR))); | ||
| 56 | + YBUG(); | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | + for (i = 0; i < PT2_BYTES; i++) { | ||
| 60 | + if (n == 0) { | ||
| 61 | + j++; | ||
| 62 | + k = mtd->oobinfo.oobfree[j][0]; | ||
| 63 | + n = mtd->oobinfo.oobfree[j][1]; | ||
| 64 | + if (n == 0) { | ||
| 65 | + T(YAFFS_TRACE_ERROR, (TSTR("No OOB space for tags" TENDSTR))); | ||
| 66 | + YBUG(); | ||
| 67 | + } | ||
| 68 | + } | ||
| 69 | + dev->spareBuffer[k++] = pt2_byte_buf[i]; | ||
| 70 | + n--; | ||
| 71 | + } | ||
| 72 | + } | ||
| 73 | +} | ||
| 74 | + | ||
| 75 | +void nandmtd2_buf2pt(yaffs_Device *dev, yaffs_PackedTags2 *pt, int is_raw) | ||
| 76 | +{ | ||
| 77 | + struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); | ||
| 78 | + int i, j = 0, k, n; | ||
| 79 | + __u8 pt2_byte_buf[PT2_BYTES]; | ||
| 80 | + | ||
| 81 | + | ||
| 82 | + if (!is_raw) { | ||
| 83 | + pt->t.sequenceNumber = *((unsigned int *) &dev->spareBuffer[0]); | ||
| 84 | + pt->t.objectId = *((unsigned int *) &dev->spareBuffer[4]); | ||
| 85 | + pt->t.chunkId = *((unsigned int *) &dev->spareBuffer[8]); | ||
| 86 | + pt->t.byteCount = *((unsigned int *) &dev->spareBuffer[12]); | ||
| 87 | + pt->ecc.colParity = dev->spareBuffer[16]; | ||
| 88 | + pt->ecc.lineParity = (dev->spareBuffer[17] & 0x000000ff) | | ||
| 89 | + ((dev->spareBuffer[18] << 8) & 0x0000ff00) | | ||
| 90 | + ((dev->spareBuffer[19] << 16) & 0x00ff0000) | | ||
| 91 | + ((dev->spareBuffer[20] << 24) & 0xff000000); | ||
| 92 | + pt->ecc.lineParityPrime = (dev->spareBuffer[21] & 0x000000ff) | | ||
| 93 | + ((dev->spareBuffer[22] << 8) & 0x0000ff00) | | ||
| 94 | + ((dev->spareBuffer[23] << 16) & 0x00ff0000) | | ||
| 95 | + ((dev->spareBuffer[24] << 24) & 0xff000000); | ||
| 96 | + } else { | ||
| 97 | + k = mtd->oobinfo.oobfree[j][0]; | ||
| 98 | + n = mtd->oobinfo.oobfree[j][1]; | ||
| 99 | + | ||
| 100 | + if (n == 0) { | ||
| 101 | + T(YAFFS_TRACE_ERROR, (TSTR("No space in OOB for tags" TENDSTR))); | ||
| 102 | + YBUG(); | ||
| 103 | + } | ||
| 104 | + | ||
| 105 | + for (i = 0; i < PT2_BYTES; i++) { | ||
| 106 | + if (n == 0) { | ||
| 107 | + j++; | ||
| 108 | + k = mtd->oobinfo.oobfree[j][0]; | ||
| 109 | + n = mtd->oobinfo.oobfree[j][1]; | ||
| 110 | + if (n == 0) { | ||
| 111 | + T(YAFFS_TRACE_ERROR, (TSTR("No space in OOB for tags" TENDSTR))); | ||
| 112 | + YBUG(); | ||
| 113 | + } | ||
| 114 | + } | ||
| 115 | + pt2_byte_buf[i] = dev->spareBuffer[k++]; | ||
| 116 | + n--; | ||
| 117 | + } | ||
| 118 | + pt->t.sequenceNumber = *((unsigned int *) &pt2_byte_buf[0]); | ||
| 119 | + pt->t.objectId = *((unsigned int *) &pt2_byte_buf[4]); | ||
| 120 | + pt->t.chunkId = *((unsigned int *) &pt2_byte_buf[8]); | ||
| 121 | + pt->t.byteCount = *((unsigned int *) &pt2_byte_buf[12]); | ||
| 122 | + pt->ecc.colParity = pt2_byte_buf[16]; | ||
| 123 | + pt->ecc.lineParity = (pt2_byte_buf[17] & 0x000000ff) | | ||
| 124 | + ((pt2_byte_buf[18] << 8) & 0x0000ff00) | | ||
| 125 | + ((pt2_byte_buf[19] << 16) & 0x00ff0000) | | ||
| 126 | + ((pt2_byte_buf[20] << 24) & 0xff000000); | ||
| 127 | + pt->ecc.lineParityPrime = (pt2_byte_buf[21] & 0x000000ff) | | ||
| 128 | + ((pt2_byte_buf[22] << 8) & 0x0000ff00) | | ||
| 129 | + ((pt2_byte_buf[23] << 16) & 0x00ff0000) | | ||
| 130 | + ((pt2_byte_buf[24] << 24) & 0xff000000); | ||
| 131 | + } | ||
| 132 | +} | ||
| 133 | + | ||
| 134 | int nandmtd2_WriteChunkWithTagsToNAND(yaffs_Device * dev, int chunkInNAND, | ||
| 135 | const __u8 * data, | ||
| 136 | const yaffs_ExtendedTags * tags) | ||
| 137 | @@ -51,24 +175,22 @@ | ||
| 138 | } | ||
| 139 | |||
| 140 | if (data && tags) { | ||
| 141 | - if (dev->useNANDECC) | ||
| 142 | - retval = | ||
| 143 | - mtd->write_ecc(mtd, addr, dev->nBytesPerChunk, | ||
| 144 | - &dummy, data, (__u8 *) & pt, NULL); | ||
| 145 | - else | ||
| 146 | + nandmtd2_pt2buf(dev, &pt, 0); | ||
| 147 | retval = | ||
| 148 | mtd->write_ecc(mtd, addr, dev->nBytesPerChunk, | ||
| 149 | - &dummy, data, (__u8 *) & pt, NULL); | ||
| 150 | + &dummy, data, dev->spareBuffer, | ||
| 151 | + NULL); | ||
| 152 | } else { | ||
| 153 | if (data) | ||
| 154 | retval = | ||
| 155 | mtd->write(mtd, addr, dev->nBytesPerChunk, &dummy, | ||
| 156 | data); | ||
| 157 | - if (tags) | ||
| 158 | + if (tags) { | ||
| 159 | + nandmtd2_pt2buf(dev, &pt, 1); | ||
| 160 | retval = | ||
| 161 | mtd->write_oob(mtd, addr, mtd->oobsize, &dummy, | ||
| 162 | - (__u8 *) & pt); | ||
| 163 | - | ||
| 164 | + dev->spareBuffer); | ||
| 165 | + } | ||
| 166 | } | ||
| 167 | |||
| 168 | if (retval == 0) | ||
| 169 | @@ -94,30 +216,24 @@ | ||
| 170 | TENDSTR), chunkInNAND, data, tags)); | ||
| 171 | |||
| 172 | if (data && tags) { | ||
| 173 | - if (dev->useNANDECC) { | ||
| 174 | retval = | ||
| 175 | mtd->read_ecc(mtd, addr, dev->nBytesPerChunk, | ||
| 176 | &dummy, data, dev->spareBuffer, | ||
| 177 | NULL); | ||
| 178 | - } else { | ||
| 179 | - retval = | ||
| 180 | - mtd->read_ecc(mtd, addr, dev->nBytesPerChunk, | ||
| 181 | - &dummy, data, dev->spareBuffer, | ||
| 182 | - NULL); | ||
| 183 | - } | ||
| 184 | + nandmtd2_buf2pt(dev, &pt, 0); | ||
| 185 | } else { | ||
| 186 | if (data) | ||
| 187 | retval = | ||
| 188 | mtd->read(mtd, addr, dev->nBytesPerChunk, &dummy, | ||
| 189 | data); | ||
| 190 | - if (tags) | ||
| 191 | + if (tags) { | ||
| 192 | retval = | ||
| 193 | mtd->read_oob(mtd, addr, mtd->oobsize, &dummy, | ||
| 194 | dev->spareBuffer); | ||
| 195 | + nandmtd2_buf2pt(dev, &pt, 1); | ||
| 196 | + } | ||
| 197 | } | ||
| 198 | |||
| 199 | - memcpy(&pt, dev->spareBuffer, sizeof(pt)); | ||
| 200 | - | ||
| 201 | if (tags) | ||
| 202 | yaffs_UnpackTags2(tags, &pt); | ||
| 203 | |||
| 204 | @@ -178,10 +294,11 @@ | ||
| 205 | *sequenceNumber = 0; | ||
| 206 | *state = YAFFS_BLOCK_STATE_EMPTY; | ||
| 207 | } | ||
| 208 | + | ||
| 209 | + T(YAFFS_TRACE_MTD, | ||
| 210 | + (TSTR("block is OK seq %d state %d" TENDSTR), *sequenceNumber, | ||
| 211 | + *state)); | ||
| 212 | } | ||
| 213 | - T(YAFFS_TRACE_MTD, | ||
| 214 | - (TSTR("block is bad seq %d state %d" TENDSTR), *sequenceNumber, | ||
| 215 | - *state)); | ||
| 216 | |||
| 217 | if (retval == 0) | ||
| 218 | return YAFFS_OK; | ||
