summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Sparmann <theseven@rockbox.org>2009-10-10 10:51:07 +0000
committerMichael Sparmann <theseven@rockbox.org>2009-10-10 10:51:07 +0000
commit51b00c9b0b3dce33daf5ecefcd7e04145decda39 (patch)
tree316aeac4ccde389f2515e883f43a5982087944ef
parent46a0db45dd2436442f3679b21b7cf631358be585 (diff)
downloadrockbox-51b00c9b0b3dce33daf5ecefcd7e04145decda39.tar.gz
rockbox-51b00c9b0b3dce33daf5ecefcd7e04145decda39.zip
Fixed some mutex issues in the iPod Nano 2G NAND driver and FTL.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23066 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c15
-rw-r--r--firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c8
2 files changed, 17 insertions, 6 deletions
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c
index e4abcafba8..15c97ccb0d 100644
--- a/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c
+++ b/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c
@@ -1778,6 +1778,8 @@ uint32_t ftl_sync(void)
1778 uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks; 1778 uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks;
1779 if (ftl_cxt.clean_flag == 1) return 0; 1779 if (ftl_cxt.clean_flag == 1) return 0;
1780 1780
1781 mutex_lock(&ftl_mtx);
1782
1781 if (ftl_cxt.swapcounter >= 20) 1783 if (ftl_cxt.swapcounter >= 20)
1782 for (i = 0; i < 4; i++) 1784 for (i = 0; i < 4; i++)
1783 if (ftl_swap_blocks() == 0) 1785 if (ftl_swap_blocks() == 0)
@@ -1793,10 +1795,19 @@ uint32_t ftl_sync(void)
1793 rc |= ftl_commit_sequential(&ftl_log[i]); 1795 rc |= ftl_commit_sequential(&ftl_log[i]);
1794 else rc |= ftl_commit_scattered(&ftl_log[i]); 1796 else rc |= ftl_commit_scattered(&ftl_log[i]);
1795 } 1797 }
1796 if (rc != 0) return 1; 1798 if (rc != 0)
1799 {
1800 mutex_unlock(&ftl_mtx);
1801 return 1;
1802 }
1797 for (i = 0; i < 5; i++) 1803 for (i = 0; i < 5; i++)
1798 if (ftl_commit_cxt() == 0) return 0; 1804 if (ftl_commit_cxt() == 0)
1805 {
1806 mutex_unlock(&ftl_mtx);
1807 return 0;
1808 }
1799 else ftl_cxt.ftlctrlpage |= ppb - 1; 1809 else ftl_cxt.ftlctrlpage |= ppb - 1;
1810 mutex_unlock(&ftl_mtx);
1800 return 1; 1811 return 1;
1801} 1812}
1802#endif 1813#endif
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c
index 302ffdee21..795e489258 100644
--- a/firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c
+++ b/firmware/target/arm/s5l8700/ipodnano2g/nand-nano2g.c
@@ -312,6 +312,7 @@ uint32_t nand_read_page(uint32_t bank, uint32_t page, void* databuffer,
312 if (databuffer != 0) 312 if (databuffer != 0)
313 if (nand_transfer_data(bank, 0, nand_uncached_data, 0x800) != 0) 313 if (nand_transfer_data(bank, 0, nand_uncached_data, 0x800) != 0)
314 return nand_unlock(1); 314 return nand_unlock(1);
315 rc = 0;
315 if (doecc == 0) 316 if (doecc == 0)
316 { 317 {
317 memcpy(databuffer, nand_uncached_data, 0x800); 318 memcpy(databuffer, nand_uncached_data, 0x800);
@@ -321,11 +322,10 @@ uint32_t nand_read_page(uint32_t bank, uint32_t page, void* databuffer,
321 return nand_unlock(1); 322 return nand_unlock(1);
322 memcpy(sparebuffer, nand_uncached_spare, 0x800); 323 memcpy(sparebuffer, nand_uncached_spare, 0x800);
323 if (checkempty != 0) 324 if (checkempty != 0)
324 return nand_check_empty((uint8_t*)sparebuffer) << 1; 325 rc = nand_check_empty((uint8_t*)sparebuffer) << 1;
325 } 326 }
326 return nand_unlock(0); 327 return nand_unlock(rc);
327 } 328 }
328 rc = 0;
329 if (nand_transfer_data(bank, 0, nand_uncached_spare, 0x40) != 0) 329 if (nand_transfer_data(bank, 0, nand_uncached_spare, 0x40) != 0)
330 return nand_unlock(1); 330 return nand_unlock(1);
331 memcpy(nand_uncached_ecc, &nand_uncached_spare[0xC], 0x28); 331 memcpy(nand_uncached_ecc, &nand_uncached_spare[0xC], 0x28);
@@ -377,7 +377,7 @@ uint32_t nand_write_page(uint32_t bank, uint32_t page, void* databuffer,
377 if (nand_transfer_data(bank, 1, nand_uncached_spare, 0x40) != 0) 377 if (nand_transfer_data(bank, 1, nand_uncached_spare, 0x40) != 0)
378 return nand_unlock(1); 378 return nand_unlock(1);
379 if (nand_send_cmd(NAND_CMD_PROGCNFRM) != 0) return nand_unlock(1); 379 if (nand_send_cmd(NAND_CMD_PROGCNFRM) != 0) return nand_unlock(1);
380 return nand_wait_status_ready(bank); 380 return nand_unlock(nand_wait_status_ready(bank));
381} 381}
382 382
383uint32_t nand_block_erase(uint32_t bank, uint32_t page) 383uint32_t nand_block_erase(uint32_t bank, uint32_t page)