diff options
Diffstat (limited to 'firmware/target/arm')
-rw-r--r-- | firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c index 23fc8b8543..ed594b42e3 100644 --- a/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c +++ b/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c | |||
@@ -852,7 +852,7 @@ uint32_t ftl_vfl_read(uint32_t vpage, void* buffer, void* sparebuffer, | |||
852 | 852 | ||
853 | #ifndef FTL_READONLY | 853 | #ifndef FTL_READONLY |
854 | /* Writes the specified vPage, dealing with all kinds of trouble */ | 854 | /* Writes the specified vPage, dealing with all kinds of trouble */ |
855 | uint32_t ftl_vfl_write(uint32_t vpage, void* buffer, void* sparebuffer) | 855 | uint32_t ftl_vfl_write_single(uint32_t vpage, void* buffer, void* sparebuffer) |
856 | { | 856 | { |
857 | uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks; | 857 | uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks; |
858 | uint32_t syshyperblocks = (*ftl_nand_type).blocks | 858 | uint32_t syshyperblocks = (*ftl_nand_type).blocks |
@@ -884,6 +884,20 @@ uint32_t ftl_vfl_write(uint32_t vpage, void* buffer, void* sparebuffer) | |||
884 | #endif | 884 | #endif |
885 | 885 | ||
886 | 886 | ||
887 | #ifndef FTL_READONLY | ||
888 | /* Writes the specified vPage, dealing with all kinds of trouble */ | ||
889 | uint32_t ftl_vfl_write(uint32_t vpage, uint32_t count, void* buffer, void* sparebuffer) | ||
890 | { | ||
891 | uint32_t i; | ||
892 | for (i = 0; i < count; i++) | ||
893 | { | ||
894 | uint32_t rc = ftl_vfl_write_single(vpage + i, buffer, sparebuffer); | ||
895 | if (rc) return rc; | ||
896 | } | ||
897 | } | ||
898 | #endif | ||
899 | |||
900 | |||
887 | /* Mounts the VFL on all banks */ | 901 | /* Mounts the VFL on all banks */ |
888 | uint32_t ftl_vfl_open(void) | 902 | uint32_t ftl_vfl_open(void) |
889 | { | 903 | { |
@@ -1258,7 +1272,7 @@ uint32_t ftl_save_erasectr_page(uint32_t index) | |||
1258 | ftl_sparebuffer[0].meta.usn = ftl_cxt.usn; | 1272 | ftl_sparebuffer[0].meta.usn = ftl_cxt.usn; |
1259 | ftl_sparebuffer[0].meta.idx = index; | 1273 | ftl_sparebuffer[0].meta.idx = index; |
1260 | ftl_sparebuffer[0].meta.type = 0x46; | 1274 | ftl_sparebuffer[0].meta.type = 0x46; |
1261 | if (ftl_vfl_write(ftl_cxt.ftlctrlpage, &ftl_erasectr[index << 10], | 1275 | if (ftl_vfl_write(ftl_cxt.ftlctrlpage, 1, &ftl_erasectr[index << 10], |
1262 | &ftl_sparebuffer[0]) != 0) | 1276 | &ftl_sparebuffer[0]) != 0) |
1263 | return 1; | 1277 | return 1; |
1264 | if ((ftl_vfl_read(ftl_cxt.ftlctrlpage, ftl_buffer, | 1278 | if ((ftl_vfl_read(ftl_cxt.ftlctrlpage, ftl_buffer, |
@@ -1330,7 +1344,7 @@ uint32_t ftl_copy_page(uint32_t source, uint32_t destination, | |||
1330 | else if (rc != 0) ftl_copyspare[0].user.eccmark = 0x55; | 1344 | else if (rc != 0) ftl_copyspare[0].user.eccmark = 0x55; |
1331 | if (type == 1 && destination % ppb == ppb - 1) | 1345 | if (type == 1 && destination % ppb == ppb - 1) |
1332 | ftl_copyspare[0].user.type = 0x41; | 1346 | ftl_copyspare[0].user.type = 0x41; |
1333 | return ftl_vfl_write(destination, ftl_copybuffer[0], &ftl_copyspare[0]); | 1347 | return ftl_vfl_write(destination, 1, ftl_copybuffer[0], &ftl_copyspare[0]); |
1334 | } | 1348 | } |
1335 | #endif | 1349 | #endif |
1336 | 1350 | ||
@@ -1352,7 +1366,7 @@ uint32_t ftl_copy_block(uint32_t source, uint32_t destination) | |||
1352 | ftl_sparebuffer[0].user.type = 0x40; | 1366 | ftl_sparebuffer[0].user.type = 0x40; |
1353 | if (rc != 0) ftl_sparebuffer[0].user.eccmark = 0x55; | 1367 | if (rc != 0) ftl_sparebuffer[0].user.eccmark = 0x55; |
1354 | if (i == ppb - 1) ftl_sparebuffer[0].user.type = 0x41; | 1368 | if (i == ppb - 1) ftl_sparebuffer[0].user.type = 0x41; |
1355 | if (ftl_vfl_write(destination * ppb + i, | 1369 | if (ftl_vfl_write(destination * ppb + i, 1, |
1356 | ftl_copybuffer[0], &ftl_sparebuffer[0]) != 0) | 1370 | ftl_copybuffer[0], &ftl_sparebuffer[0]) != 0) |
1357 | { | 1371 | { |
1358 | error = 1; | 1372 | error = 1; |
@@ -1614,7 +1628,7 @@ uint32_t ftl_commit_cxt(void) | |||
1614 | ftl_sparebuffer[0].meta.usn = ftl_cxt.usn; | 1628 | ftl_sparebuffer[0].meta.usn = ftl_cxt.usn; |
1615 | ftl_sparebuffer[0].meta.idx = i; | 1629 | ftl_sparebuffer[0].meta.idx = i; |
1616 | ftl_sparebuffer[0].meta.type = 0x44; | 1630 | ftl_sparebuffer[0].meta.type = 0x44; |
1617 | if (ftl_vfl_write(ftl_cxt.ftlctrlpage, &ftl_map[i << 10], | 1631 | if (ftl_vfl_write(ftl_cxt.ftlctrlpage, 1, &ftl_map[i << 10], |
1618 | &ftl_sparebuffer[0]) != 0) | 1632 | &ftl_sparebuffer[0]) != 0) |
1619 | return 1; | 1633 | return 1; |
1620 | ftl_cxt.ftl_map_pages[i] = ftl_cxt.ftlctrlpage; | 1634 | ftl_cxt.ftl_map_pages[i] = ftl_cxt.ftlctrlpage; |
@@ -1624,7 +1638,7 @@ uint32_t ftl_commit_cxt(void) | |||
1624 | memset(&ftl_sparebuffer[0], 0xFF, 0x40); | 1638 | memset(&ftl_sparebuffer[0], 0xFF, 0x40); |
1625 | ftl_sparebuffer[0].meta.usn = ftl_cxt.usn; | 1639 | ftl_sparebuffer[0].meta.usn = ftl_cxt.usn; |
1626 | ftl_sparebuffer[0].meta.type = 0x43; | 1640 | ftl_sparebuffer[0].meta.type = 0x43; |
1627 | if (ftl_vfl_write(ftl_cxt.ftlctrlpage, &ftl_cxt, &ftl_sparebuffer[0]) != 0) | 1641 | if (ftl_vfl_write(ftl_cxt.ftlctrlpage, 1, &ftl_cxt, &ftl_sparebuffer[0]) != 0) |
1628 | return 1; | 1642 | return 1; |
1629 | return 0; | 1643 | return 0; |
1630 | } | 1644 | } |
@@ -1701,7 +1715,7 @@ uint32_t ftl_write(uint32_t sector, uint32_t count, const void* buffer) | |||
1701 | memset(&ftl_sparebuffer[0], 0xFF, 0x40); | 1715 | memset(&ftl_sparebuffer[0], 0xFF, 0x40); |
1702 | ftl_sparebuffer[0].meta.usn = ftl_cxt.usn; | 1716 | ftl_sparebuffer[0].meta.usn = ftl_cxt.usn; |
1703 | ftl_sparebuffer[0].meta.type = 0x47; | 1717 | ftl_sparebuffer[0].meta.type = 0x47; |
1704 | if (ftl_vfl_write(ftl_cxt.ftlctrlpage, ftl_buffer, | 1718 | if (ftl_vfl_write(ftl_cxt.ftlctrlpage, 1, ftl_buffer, |
1705 | &ftl_sparebuffer[0]) == 0) | 1719 | &ftl_sparebuffer[0]) == 0) |
1706 | break; | 1720 | break; |
1707 | } | 1721 | } |
@@ -1746,7 +1760,7 @@ uint32_t ftl_write(uint32_t sector, uint32_t count, const void* buffer) | |||
1746 | ftl_sparebuffer[0].user.usn = ftl_cxt.nextblockusn; | 1760 | ftl_sparebuffer[0].user.usn = ftl_cxt.nextblockusn; |
1747 | ftl_sparebuffer[0].user.type = 0x40; | 1761 | ftl_sparebuffer[0].user.type = 0x40; |
1748 | if (j == ppb - 1) ftl_sparebuffer[0].user.type = 0x41; | 1762 | if (j == ppb - 1) ftl_sparebuffer[0].user.type = 0x41; |
1749 | while (ftl_vfl_write(vblock * ppb + j, | 1763 | while (ftl_vfl_write(vblock * ppb + j, 1, |
1750 | &((uint8_t*)buffer)[(i + j) << 11], | 1764 | &((uint8_t*)buffer)[(i + j) << 11], |
1751 | &ftl_sparebuffer[0]) != 0); | 1765 | &ftl_sparebuffer[0]) != 0); |
1752 | } | 1766 | } |
@@ -1772,7 +1786,7 @@ uint32_t ftl_write(uint32_t sector, uint32_t count, const void* buffer) | |||
1772 | ftl_sparebuffer[0].user.type = 0x40; | 1786 | ftl_sparebuffer[0].user.type = 0x40; |
1773 | uint32_t abspage = (*logentry).scatteredvblock * ppb | 1787 | uint32_t abspage = (*logentry).scatteredvblock * ppb |
1774 | + (*logentry).pagesused++; | 1788 | + (*logentry).pagesused++; |
1775 | if (ftl_vfl_write(abspage, &((uint8_t*)buffer)[i << 11], | 1789 | if (ftl_vfl_write(abspage, 1, &((uint8_t*)buffer)[i << 11], |
1776 | &ftl_sparebuffer[0]) == 0) | 1790 | &ftl_sparebuffer[0]) == 0) |
1777 | { | 1791 | { |
1778 | if ((*logentry).pageoffsets[page] == 0xFFFF) | 1792 | if ((*logentry).pageoffsets[page] == 0xFFFF) |