diff options
author | Michael Sparmann <theseven@rockbox.org> | 2010-03-12 20:44:03 +0000 |
---|---|---|
committer | Michael Sparmann <theseven@rockbox.org> | 2010-03-12 20:44:03 +0000 |
commit | 9f8e76bf22482e67cceddd35580c84d66877af5d (patch) | |
tree | e707985559bf5ee9e8751caeca80c42f80efdb70 /firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c | |
parent | 24c0474472015655c7b40bcdfc1537baf1642927 (diff) | |
download | rockbox-9f8e76bf22482e67cceddd35580c84d66877af5d.tar.gz rockbox-9f8e76bf22482e67cceddd35580c84d66877af5d.zip |
Hopefully fix the latest Nano2G NAND issues. (FS#11092) Transfers for some of the chips apple is using will be slow until someone implements cached writes.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25137 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c')
-rw-r--r-- | firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c | 49 |
1 files changed, 19 insertions, 30 deletions
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c index 6926c41607..321495a321 100644 --- a/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c +++ b/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c | |||
@@ -1266,8 +1266,6 @@ uint32_t ftl_erase_block_internal(uint32_t block) | |||
1266 | block = block + (*ftl_nand_type).blocks | 1266 | block = block + (*ftl_nand_type).blocks |
1267 | - (*ftl_nand_type).userblocks - 0x17; | 1267 | - (*ftl_nand_type).userblocks - 0x17; |
1268 | if (block == 0 || block >= (*ftl_nand_type).blocks) return 1; | 1268 | if (block == 0 || block >= (*ftl_nand_type).blocks) return 1; |
1269 | uint32_t pblock[4]; | ||
1270 | uint32_t differs = 0; | ||
1271 | for (i = 0; i < ftl_banks; i++) | 1269 | for (i = 0; i < ftl_banks; i++) |
1272 | { | 1270 | { |
1273 | if (ftl_vfl_check_remap_scheduled(i, block) == 1) | 1271 | if (ftl_vfl_check_remap_scheduled(i, block) == 1) |
@@ -1276,38 +1274,29 @@ uint32_t ftl_erase_block_internal(uint32_t block) | |||
1276 | ftl_vfl_mark_remap_done(i, block); | 1274 | ftl_vfl_mark_remap_done(i, block); |
1277 | } | 1275 | } |
1278 | ftl_vfl_log_success(i, block); | 1276 | ftl_vfl_log_success(i, block); |
1279 | pblock[i] = ftl_vfl_get_physical_block(i, block); | 1277 | uint32_t pblock = ftl_vfl_get_physical_block(i, block); |
1280 | if (pblock[i] != pblock[0]) differs = 1; | 1278 | uint32_t rc; |
1281 | } | 1279 | for (j = 0; j < 3; j++) |
1282 | uint32_t res = 0xf; | ||
1283 | if (!differs) | ||
1284 | res = nand_block_erase_fast(pblock[0] * (*ftl_nand_type).pagesperblock); | ||
1285 | if (!res) return 0; | ||
1286 | for (i = 0; i < ftl_banks; i++) | ||
1287 | if (res & (1 << i)) | ||
1288 | { | 1280 | { |
1289 | uint32_t rc; | 1281 | rc = nand_block_erase(i, pblock * (*ftl_nand_type).pagesperblock); |
1290 | for (j = 0; j < 3; j++) | 1282 | if (rc == 0) break; |
1291 | { | 1283 | } |
1292 | rc = nand_block_erase(i, pblock[i] * (*ftl_nand_type).pagesperblock); | 1284 | if (rc != 0) |
1293 | if (rc == 0) break; | 1285 | { |
1294 | } | 1286 | panicf("FTL: Block erase failed on bank %u block %u", |
1295 | if (rc != 0) | 1287 | (unsigned)i, (unsigned)block); |
1288 | if (pblock != block) | ||
1296 | { | 1289 | { |
1297 | panicf("FTL: Block erase failed on bank %u block %u", | 1290 | uint32_t spareindex = pblock - ftl_vfl_cxt[i].firstspare; |
1298 | (unsigned)i, (unsigned)block); | 1291 | ftl_vfl_cxt[i].remaptable[spareindex] = 0xFFFF; |
1299 | if (pblock[i] != block) | ||
1300 | { | ||
1301 | uint32_t spareindex = pblock[i] - ftl_vfl_cxt[i].firstspare; | ||
1302 | ftl_vfl_cxt[i].remaptable[spareindex] = 0xFFFF; | ||
1303 | } | ||
1304 | ftl_vfl_cxt[i].field_18++; | ||
1305 | if (ftl_vfl_remap_block(i, block) == 0) return 1; | ||
1306 | if (ftl_vfl_commit_cxt(i) != 0) return 1; | ||
1307 | memset(&ftl_sparebuffer[0], 0, 0x40); | ||
1308 | nand_write_page(i, pblock[i], &ftl_vfl_cxt[0], &ftl_sparebuffer[0], 1); | ||
1309 | } | 1292 | } |
1293 | ftl_vfl_cxt[i].field_18++; | ||
1294 | if (ftl_vfl_remap_block(i, block) == 0) return 1; | ||
1295 | if (ftl_vfl_commit_cxt(i) != 0) return 1; | ||
1296 | memset(&ftl_sparebuffer, 0, 0x40); | ||
1297 | nand_write_page(i, pblock, &ftl_vfl_cxt[0], &ftl_sparebuffer, 1); | ||
1310 | } | 1298 | } |
1299 | } | ||
1311 | return 0; | 1300 | return 0; |
1312 | } | 1301 | } |
1313 | #endif | 1302 | #endif |