summaryrefslogtreecommitdiff
path: root/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c
diff options
context:
space:
mode:
authorMichael Sparmann <theseven@rockbox.org>2010-03-12 20:44:03 +0000
committerMichael Sparmann <theseven@rockbox.org>2010-03-12 20:44:03 +0000
commit9f8e76bf22482e67cceddd35580c84d66877af5d (patch)
treee707985559bf5ee9e8751caeca80c42f80efdb70 /firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c
parent24c0474472015655c7b40bcdfc1537baf1642927 (diff)
downloadrockbox-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.c49
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