summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c32
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 */
855uint32_t ftl_vfl_write(uint32_t vpage, void* buffer, void* sparebuffer) 855uint32_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 */
889uint32_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 */
888uint32_t ftl_vfl_open(void) 902uint32_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)