summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorMichael Sparmann <theseven@rockbox.org>2010-03-13 18:25:42 +0000
committerMichael Sparmann <theseven@rockbox.org>2010-03-13 18:25:42 +0000
commit1a7e090b41ac1dd9a54d51952df8adbee521c147 (patch)
treef1731907cbececb32c0a88c6616052584dac6581 /firmware
parent4a7b2cc9f349c9991d84cca2aae59e070f7524ac (diff)
downloadrockbox-1a7e090b41ac1dd9a54d51952df8adbee521c147.tar.gz
rockbox-1a7e090b41ac1dd9a54d51952df8adbee521c147.zip
Make Nano2G FTL buffer size configurable, no (intended) function changes
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25144 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r--firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c165
1 files changed, 84 insertions, 81 deletions
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c
index e85830d642..23fc8b8543 100644
--- a/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c
+++ b/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c
@@ -31,6 +31,8 @@
31 31
32 32
33 33
34#define FTL_COPYBUF_SIZE 1
35#define FTL_WRITESPARE_SIZE 1
34//#define FTL_FORCEMOUNT 36//#define FTL_FORCEMOUNT
35 37
36 38
@@ -372,7 +374,7 @@ struct ftl_cxt_type ftl_cxt;
372uint8_t ftl_buffer[0x800] __attribute__((aligned(16))); 374uint8_t ftl_buffer[0x800] __attribute__((aligned(16)));
373 375
374/* Temporary spare byte buffer for internal use by the FTL */ 376/* Temporary spare byte buffer for internal use by the FTL */
375union ftl_spare_data_type ftl_sparebuffer __attribute__((aligned(16))); 377union ftl_spare_data_type ftl_sparebuffer[FTL_WRITESPARE_SIZE] __attribute__((aligned(16)));
376 378
377 379
378#ifndef FTL_READONLY 380#ifndef FTL_READONLY
@@ -402,7 +404,8 @@ uint8_t ftl_erasectr_dirt[8];
402/* Buffer needed for copying pages around while moving or committing blocks. 404/* Buffer needed for copying pages around while moving or committing blocks.
403 This can't be shared with ftl_buffer, because this one could be overwritten 405 This can't be shared with ftl_buffer, because this one could be overwritten
404 during the copying operation in order to e.g. commit a CXT. */ 406 during the copying operation in order to e.g. commit a CXT. */
405uint8_t ftl_copybuffer[0x800] __attribute__((aligned(16))); 407uint8_t ftl_copybuffer[FTL_COPYBUF_SIZE][0x800] __attribute__((aligned(16)));
408union ftl_spare_data_type ftl_copyspare[FTL_COPYBUF_SIZE] __attribute__((aligned(16)));
406 409
407/* Needed to store the old scattered page offsets in order to be able to roll 410/* Needed to store the old scattered page offsets in order to be able to roll
408 back if something fails while compacting a scattered page block. */ 411 back if something fails while compacting a scattered page block. */
@@ -430,7 +433,7 @@ uint32_t ftl_find_devinfo(uint32_t bank)
430 { 433 {
431 pagenum = block * (*ftl_nand_type).pagesperblock + page; 434 pagenum = block * (*ftl_nand_type).pagesperblock + page;
432 if ((nand_read_page(bank, pagenum, ftl_buffer, 435 if ((nand_read_page(bank, pagenum, ftl_buffer,
433 &ftl_sparebuffer, 1, 0) & 0x11F) != 0) 436 &ftl_sparebuffer[0], 1, 0) & 0x11F) != 0)
434 continue; 437 continue;
435 if (memcmp(ftl_buffer, "DEVICEINFOSIGN\0", 0x10) == 0) 438 if (memcmp(ftl_buffer, "DEVICEINFOSIGN\0", 0x10) == 0)
436 return pagenum; 439 return pagenum;
@@ -534,17 +537,17 @@ uint32_t ftl_vfl_store_cxt(uint32_t bank)
534 ftl_vfl_cxt[bank].usn = ++ftl_vfl_usn; 537 ftl_vfl_cxt[bank].usn = ++ftl_vfl_usn;
535 ftl_vfl_cxt[bank].nextcxtpage += 8; 538 ftl_vfl_cxt[bank].nextcxtpage += 8;
536 ftl_vfl_update_checksum(bank); 539 ftl_vfl_update_checksum(bank);
537 memset(&ftl_sparebuffer, 0xFF, 0x40); 540 memset(&ftl_sparebuffer[0], 0xFF, 0x40);
538 ftl_sparebuffer.meta.usn = ftl_vfl_cxt[bank].updatecount; 541 ftl_sparebuffer[0].meta.usn = ftl_vfl_cxt[bank].updatecount;
539 ftl_sparebuffer.meta.field_8 = 0; 542 ftl_sparebuffer[0].meta.field_8 = 0;
540 ftl_sparebuffer.meta.type = 0x80; 543 ftl_sparebuffer[0].meta.type = 0x80;
541 for (i = 1; i <= 8; i++) 544 for (i = 1; i <= 8; i++)
542 { 545 {
543 uint32_t index = ftl_vfl_cxt[bank].activecxtblock; 546 uint32_t index = ftl_vfl_cxt[bank].activecxtblock;
544 uint32_t block = ftl_vfl_cxt[bank].vflcxtblocks[index]; 547 uint32_t block = ftl_vfl_cxt[bank].vflcxtblocks[index];
545 uint32_t page = block * (*ftl_nand_type).pagesperblock; 548 uint32_t page = block * (*ftl_nand_type).pagesperblock;
546 page += ftl_vfl_cxt[bank].nextcxtpage - i; 549 page += ftl_vfl_cxt[bank].nextcxtpage - i;
547 nand_write_page(bank, page, &ftl_vfl_cxt[bank], &ftl_sparebuffer, 1); 550 nand_write_page(bank, page, &ftl_vfl_cxt[bank], &ftl_sparebuffer[0], 1);
548 } 551 }
549 uint32_t good = 0; 552 uint32_t good = 0;
550 for (i = 1; i <= 8; i++) 553 for (i = 1; i <= 8; i++)
@@ -554,14 +557,14 @@ uint32_t ftl_vfl_store_cxt(uint32_t bank)
554 uint32_t page = block * (*ftl_nand_type).pagesperblock; 557 uint32_t page = block * (*ftl_nand_type).pagesperblock;
555 page += ftl_vfl_cxt[bank].nextcxtpage - i; 558 page += ftl_vfl_cxt[bank].nextcxtpage - i;
556 if ((nand_read_page(bank, page, ftl_buffer, 559 if ((nand_read_page(bank, page, ftl_buffer,
557 &ftl_sparebuffer, 1, 0) & 0x11F) != 0) 560 &ftl_sparebuffer[0], 1, 0) & 0x11F) != 0)
558 continue; 561 continue;
559 if (memcmp(ftl_buffer, &ftl_vfl_cxt[bank], 0x7AC) != 0) 562 if (memcmp(ftl_buffer, &ftl_vfl_cxt[bank], 0x7AC) != 0)
560 continue; 563 continue;
561 if (ftl_sparebuffer.meta.usn != ftl_vfl_cxt[bank].updatecount) 564 if (ftl_sparebuffer[0].meta.usn != ftl_vfl_cxt[bank].updatecount)
562 continue; 565 continue;
563 if (ftl_sparebuffer.meta.field_8 == 0 566 if (ftl_sparebuffer[0].meta.field_8 == 0
564 && ftl_sparebuffer.meta.type == 0x80) good++; 567 && ftl_sparebuffer[0].meta.type == 0x80) good++;
565 } 568 }
566 return good > 3 ? 0 : 1; 569 return good > 3 ? 0 : 1;
567} 570}
@@ -870,7 +873,7 @@ uint32_t ftl_vfl_write(uint32_t vpage, void* buffer, void* sparebuffer)
870 return 0; 873 return 0;
871 874
872 if ((nand_read_page(bank, physpage, ftl_buffer, 875 if ((nand_read_page(bank, physpage, ftl_buffer,
873 &ftl_sparebuffer, 1, 1) & 0x11F) == 0) 876 &ftl_sparebuffer[0], 1, 1) & 0x11F) == 0)
874 return 0; 877 return 0;
875 878
876 panicf("FTL: write error on vPage %u, bank %u, pPage %u", 879 panicf("FTL: write error on vPage %u, bank %u, pPage %u",
@@ -913,7 +916,7 @@ uint32_t ftl_vfl_open(void)
913 if (ftl_is_good_block(bbt, j) != 0) 916 if (ftl_is_good_block(bbt, j) != 0)
914#endif 917#endif
915 if (ftl_vfl_read_page(i, j, 0, ftl_buffer, 918 if (ftl_vfl_read_page(i, j, 0, ftl_buffer,
916 &ftl_sparebuffer) == 0) 919 &ftl_sparebuffer[0]) == 0)
917 { 920 {
918 struct ftl_vfl_cxt_type* cxt; 921 struct ftl_vfl_cxt_type* cxt;
919 cxt = (struct ftl_vfl_cxt_type*)ftl_buffer; 922 cxt = (struct ftl_vfl_cxt_type*)ftl_buffer;
@@ -924,11 +927,11 @@ uint32_t ftl_vfl_open(void)
924 if (vflcxtblock[k] != 0xFFFF) 927 if (vflcxtblock[k] != 0xFFFF)
925 if (ftl_vfl_read_page(i, vflcxtblock[k], 0, 928 if (ftl_vfl_read_page(i, vflcxtblock[k], 0,
926 ftl_buffer, 929 ftl_buffer,
927 &ftl_sparebuffer) == 0) 930 &ftl_sparebuffer[0]) == 0)
928 if (ftl_sparebuffer.meta.usn > 0 931 if (ftl_sparebuffer[0].meta.usn > 0
929 && ftl_sparebuffer.meta.usn <= minusn) 932 && ftl_sparebuffer[0].meta.usn <= minusn)
930 { 933 {
931 minusn = ftl_sparebuffer.meta.usn; 934 minusn = ftl_sparebuffer[0].meta.usn;
932 vflcxtidx = k; 935 vflcxtidx = k;
933 } 936 }
934 if (vflcxtidx == 4) //return 1; 937 if (vflcxtidx == 4) //return 1;
@@ -940,13 +943,13 @@ uint32_t ftl_vfl_open(void)
940 { 943 {
941 if (ftl_vfl_read_page(i, vflcxtblock[vflcxtidx], 944 if (ftl_vfl_read_page(i, vflcxtblock[vflcxtidx],
942 k, ftl_buffer, 945 k, ftl_buffer,
943 &ftl_sparebuffer) != 0) 946 &ftl_sparebuffer[0]) != 0)
944 break; 947 break;
945 last = k; 948 last = k;
946 } 949 }
947 if (ftl_vfl_read_page(i, vflcxtblock[vflcxtidx], 950 if (ftl_vfl_read_page(i, vflcxtblock[vflcxtidx],
948 last, ftl_buffer, 951 last, ftl_buffer,
949 &ftl_sparebuffer) != 0) 952 &ftl_sparebuffer[0]) != 0)
950 panicf("FTL: Re-reading VFL CXT block " 953 panicf("FTL: Re-reading VFL CXT block "
951 "on bank %u failed!?", (unsigned)i); 954 "on bank %u failed!?", (unsigned)i);
952 //return 1; 955 //return 1;
@@ -981,12 +984,12 @@ uint32_t ftl_open(void)
981 for (i = 0; i < 3; i++) 984 for (i = 0; i < 3; i++)
982 { 985 {
983 ret = ftl_vfl_read(ppb * (*cxt).ftlctrlblocks[i], 986 ret = ftl_vfl_read(ppb * (*cxt).ftlctrlblocks[i],
984 ftl_buffer, &ftl_sparebuffer, 1, 0); 987 ftl_buffer, &ftl_sparebuffer[0], 1, 0);
985 if ((ret &= 0x11F) != 0) continue; 988 if ((ret &= 0x11F) != 0) continue;
986 if (ftl_sparebuffer.meta.type - 0x43 > 4) continue; 989 if (ftl_sparebuffer[0].meta.type - 0x43 > 4) continue;
987 if (ftlcxtblock != 0xffffffff && ftl_sparebuffer.meta.usn >= minusn) 990 if (ftlcxtblock != 0xffffffff && ftl_sparebuffer[0].meta.usn >= minusn)
988 continue; 991 continue;
989 minusn = ftl_sparebuffer.meta.usn; 992 minusn = ftl_sparebuffer[0].meta.usn;
990 ftlcxtblock = (*cxt).ftlctrlblocks[i]; 993 ftlcxtblock = (*cxt).ftlctrlblocks[i];
991 } 994 }
992 995
@@ -997,9 +1000,9 @@ uint32_t ftl_open(void)
997 for (i = (*ftl_nand_type).pagesperblock * ftl_banks - 1; i > 0; i--) 1000 for (i = (*ftl_nand_type).pagesperblock * ftl_banks - 1; i > 0; i--)
998 { 1001 {
999 ret = ftl_vfl_read(ppb * ftlcxtblock + i, 1002 ret = ftl_vfl_read(ppb * ftlcxtblock + i,
1000 ftl_buffer, &ftl_sparebuffer, 1, 0); 1003 ftl_buffer, &ftl_sparebuffer[0], 1, 0);
1001 if ((ret & 0x11F) != 0) continue; 1004 if ((ret & 0x11F) != 0) continue;
1002 else if (ftl_sparebuffer.meta.type == 0x43) 1005 else if (ftl_sparebuffer[0].meta.type == 0x43)
1003 { 1006 {
1004 memcpy(&ftl_cxt, ftl_buffer, 0x28C); 1007 memcpy(&ftl_cxt, ftl_buffer, 0x28C);
1005 ftlcxtfound = 1; 1008 ftlcxtfound = 1;
@@ -1024,7 +1027,7 @@ uint32_t ftl_open(void)
1024 for (i = 0; i < pagestoread; i++) 1027 for (i = 0; i < pagestoread; i++)
1025 { 1028 {
1026 if ((ftl_vfl_read(ftl_cxt.ftl_map_pages[i], 1029 if ((ftl_vfl_read(ftl_cxt.ftl_map_pages[i],
1027 ftl_buffer, &ftl_sparebuffer, 1, 1) & 0x11F) != 0) 1030 ftl_buffer, &ftl_sparebuffer[0], 1, 1) & 0x11F) != 0)
1028 panicf("FTL: Failed to read block map page %u", (unsigned)i); 1031 panicf("FTL: Failed to read block map page %u", (unsigned)i);
1029 //return 1; 1032 //return 1;
1030 1033
@@ -1042,7 +1045,7 @@ uint32_t ftl_open(void)
1042 for (i = 0; i < pagestoread; i++) 1045 for (i = 0; i < pagestoread; i++)
1043 { 1046 {
1044 if ((ftl_vfl_read(ftl_cxt.ftl_erasectr_pages[i], 1047 if ((ftl_vfl_read(ftl_cxt.ftl_erasectr_pages[i],
1045 ftl_buffer, &ftl_sparebuffer, 1, 1) & 0x11F) != 0) 1048 ftl_buffer, &ftl_sparebuffer[0], 1, 1) & 0x11F) != 0)
1046 panicf("FTL: Failed to read erase counter page %u", (unsigned)i); 1049 panicf("FTL: Failed to read erase counter page %u", (unsigned)i);
1047 //return 1; 1050 //return 1;
1048 1051
@@ -1113,9 +1116,9 @@ uint32_t ftl_read(uint32_t sector, uint32_t count, void* buffer)
1113#endif 1116#endif
1114 1117
1115 uint32_t ret = ftl_vfl_read(abspage, &((uint8_t*)buffer)[i << 11], 1118 uint32_t ret = ftl_vfl_read(abspage, &((uint8_t*)buffer)[i << 11],
1116 &ftl_sparebuffer, 1, 1); 1119 &ftl_sparebuffer[0], 1, 1);
1117 if ((ret & 2) != 0) memset(&((uint8_t*)buffer)[i << 11], 0, 0x800); 1120 if ((ret & 2) != 0) memset(&((uint8_t*)buffer)[i << 11], 0, 0x800);
1118 else if ((ret & 0x11D) != 0 || ftl_sparebuffer.user.eccmark != 0xFF) 1121 else if ((ret & 0x11D) != 0 || ftl_sparebuffer[0].user.eccmark != 0xFF)
1119 { 1122 {
1120 error = 1; 1123 error = 1;
1121 memset(&((uint8_t*)buffer)[i << 11], 0, 0x800); 1124 memset(&((uint8_t*)buffer)[i << 11], 0, 0x800);
@@ -1251,20 +1254,20 @@ uint32_t ftl_store_ctrl_block_list(void)
1251 because it is too dirty or needs to be moved. */ 1254 because it is too dirty or needs to be moved. */
1252uint32_t ftl_save_erasectr_page(uint32_t index) 1255uint32_t ftl_save_erasectr_page(uint32_t index)
1253{ 1256{
1254 memset(&ftl_sparebuffer, 0xFF, 0x40); 1257 memset(&ftl_sparebuffer[0], 0xFF, 0x40);
1255 ftl_sparebuffer.meta.usn = ftl_cxt.usn; 1258 ftl_sparebuffer[0].meta.usn = ftl_cxt.usn;
1256 ftl_sparebuffer.meta.idx = index; 1259 ftl_sparebuffer[0].meta.idx = index;
1257 ftl_sparebuffer.meta.type = 0x46; 1260 ftl_sparebuffer[0].meta.type = 0x46;
1258 if (ftl_vfl_write(ftl_cxt.ftlctrlpage, &ftl_erasectr[index << 10], 1261 if (ftl_vfl_write(ftl_cxt.ftlctrlpage, &ftl_erasectr[index << 10],
1259 &ftl_sparebuffer) != 0) 1262 &ftl_sparebuffer[0]) != 0)
1260 return 1; 1263 return 1;
1261 if ((ftl_vfl_read(ftl_cxt.ftlctrlpage, ftl_buffer, 1264 if ((ftl_vfl_read(ftl_cxt.ftlctrlpage, ftl_buffer,
1262 &ftl_sparebuffer, 1, 1) & 0x11F) != 0) 1265 &ftl_sparebuffer[0], 1, 1) & 0x11F) != 0)
1263 return 1; 1266 return 1;
1264 if (memcmp(ftl_buffer, &ftl_erasectr[index << 10], 0x800) != 0) return 1; 1267 if (memcmp(ftl_buffer, &ftl_erasectr[index << 10], 0x800) != 0) return 1;
1265 if (ftl_sparebuffer.meta.type != 0x46) return 1; 1268 if (ftl_sparebuffer[0].meta.type != 0x46) return 1;
1266 if (ftl_sparebuffer.meta.idx != index) return 1; 1269 if (ftl_sparebuffer[0].meta.idx != index) return 1;
1267 if (ftl_sparebuffer.meta.usn != ftl_cxt.usn) return 1; 1270 if (ftl_sparebuffer[0].meta.usn != ftl_cxt.usn) return 1;
1268 ftl_cxt.ftl_erasectr_pages[index] = ftl_cxt.ftlctrlpage; 1271 ftl_cxt.ftl_erasectr_pages[index] = ftl_cxt.ftlctrlpage;
1269 ftl_erasectr_dirt[index] = 0; 1272 ftl_erasectr_dirt[index] = 0;
1270 return 0; 1273 return 0;
@@ -1317,17 +1320,17 @@ uint32_t ftl_copy_page(uint32_t source, uint32_t destination,
1317 uint32_t lpn, uint32_t type) 1320 uint32_t lpn, uint32_t type)
1318{ 1321{
1319 uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks; 1322 uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks;
1320 uint32_t rc = ftl_vfl_read(source, ftl_copybuffer, 1323 uint32_t rc = ftl_vfl_read(source, ftl_copybuffer[0],
1321 &ftl_sparebuffer, 1, 1) & 0x11F; 1324 &ftl_copyspare[0], 1, 1) & 0x11F;
1322 memset(&ftl_sparebuffer, 0xFF, 0x40); 1325 memset(&ftl_copyspare[0], 0xFF, 0x40);
1323 ftl_sparebuffer.user.lpn = lpn; 1326 ftl_copyspare[0].user.lpn = lpn;
1324 ftl_sparebuffer.user.usn = ++ftl_cxt.nextblockusn; 1327 ftl_copyspare[0].user.usn = ++ftl_cxt.nextblockusn;
1325 ftl_sparebuffer.user.type = 0x40; 1328 ftl_copyspare[0].user.type = 0x40;
1326 if ((rc & 2) != 0) memset(ftl_copybuffer, 0, 0x800); 1329 if ((rc & 2) != 0) memset(ftl_copybuffer[0], 0, 0x800);
1327 else if (rc != 0) ftl_sparebuffer.user.eccmark = 0x55; 1330 else if (rc != 0) ftl_copyspare[0].user.eccmark = 0x55;
1328 if (type == 1 && destination % ppb == ppb - 1) 1331 if (type == 1 && destination % ppb == ppb - 1)
1329 ftl_sparebuffer.user.type = 0x41; 1332 ftl_copyspare[0].user.type = 0x41;
1330 return ftl_vfl_write(destination, ftl_copybuffer, &ftl_sparebuffer); 1333 return ftl_vfl_write(destination, ftl_copybuffer[0], &ftl_copyspare[0]);
1331} 1334}
1332#endif 1335#endif
1333 1336
@@ -1342,15 +1345,15 @@ uint32_t ftl_copy_block(uint32_t source, uint32_t destination)
1342 ftl_cxt.nextblockusn++; 1345 ftl_cxt.nextblockusn++;
1343 for (i = 0; i < ppb; i++) 1346 for (i = 0; i < ppb; i++)
1344 { 1347 {
1345 uint32_t rc = ftl_read(source * ppb + i, 1, ftl_copybuffer); 1348 uint32_t rc = ftl_read(source * ppb + i, 1, ftl_copybuffer[0]);
1346 memset(&ftl_sparebuffer, 0xFF, 0x40); 1349 memset(&ftl_sparebuffer[0], 0xFF, 0x40);
1347 ftl_sparebuffer.user.lpn = source * ppb + i; 1350 ftl_sparebuffer[0].user.lpn = source * ppb + i;
1348 ftl_sparebuffer.user.usn = ftl_cxt.nextblockusn; 1351 ftl_sparebuffer[0].user.usn = ftl_cxt.nextblockusn;
1349 ftl_sparebuffer.user.type = 0x40; 1352 ftl_sparebuffer[0].user.type = 0x40;
1350 if (rc != 0) ftl_sparebuffer.user.eccmark = 0x55; 1353 if (rc != 0) ftl_sparebuffer[0].user.eccmark = 0x55;
1351 if (i == ppb - 1) ftl_sparebuffer.user.type = 0x41; 1354 if (i == ppb - 1) ftl_sparebuffer[0].user.type = 0x41;
1352 if (ftl_vfl_write(destination * ppb + i, 1355 if (ftl_vfl_write(destination * ppb + i,
1353 ftl_copybuffer, &ftl_sparebuffer) != 0) 1356 ftl_copybuffer[0], &ftl_sparebuffer[0]) != 0)
1354 { 1357 {
1355 error = 1; 1358 error = 1;
1356 break; 1359 break;
@@ -1607,21 +1610,21 @@ uint32_t ftl_commit_cxt(void)
1607 for (i = 0; i < mappages; i++) 1610 for (i = 0; i < mappages; i++)
1608 { 1611 {
1609 if (ftl_next_ctrl_pool_page() != 0) return 1; 1612 if (ftl_next_ctrl_pool_page() != 0) return 1;
1610 memset(&ftl_sparebuffer, 0xFF, 0x40); 1613 memset(&ftl_sparebuffer[0], 0xFF, 0x40);
1611 ftl_sparebuffer.meta.usn = ftl_cxt.usn; 1614 ftl_sparebuffer[0].meta.usn = ftl_cxt.usn;
1612 ftl_sparebuffer.meta.idx = i; 1615 ftl_sparebuffer[0].meta.idx = i;
1613 ftl_sparebuffer.meta.type = 0x44; 1616 ftl_sparebuffer[0].meta.type = 0x44;
1614 if (ftl_vfl_write(ftl_cxt.ftlctrlpage, &ftl_map[i << 10], 1617 if (ftl_vfl_write(ftl_cxt.ftlctrlpage, &ftl_map[i << 10],
1615 &ftl_sparebuffer) != 0) 1618 &ftl_sparebuffer[0]) != 0)
1616 return 1; 1619 return 1;
1617 ftl_cxt.ftl_map_pages[i] = ftl_cxt.ftlctrlpage; 1620 ftl_cxt.ftl_map_pages[i] = ftl_cxt.ftlctrlpage;
1618 } 1621 }
1619 if (ftl_next_ctrl_pool_page() != 0) return 1; 1622 if (ftl_next_ctrl_pool_page() != 0) return 1;
1620 ftl_cxt.clean_flag = 1; 1623 ftl_cxt.clean_flag = 1;
1621 memset(&ftl_sparebuffer, 0xFF, 0x40); 1624 memset(&ftl_sparebuffer[0], 0xFF, 0x40);
1622 ftl_sparebuffer.meta.usn = ftl_cxt.usn; 1625 ftl_sparebuffer[0].meta.usn = ftl_cxt.usn;
1623 ftl_sparebuffer.meta.type = 0x43; 1626 ftl_sparebuffer[0].meta.type = 0x43;
1624 if (ftl_vfl_write(ftl_cxt.ftlctrlpage, &ftl_cxt, &ftl_sparebuffer) != 0) 1627 if (ftl_vfl_write(ftl_cxt.ftlctrlpage, &ftl_cxt, &ftl_sparebuffer[0]) != 0)
1625 return 1; 1628 return 1;
1626 return 0; 1629 return 0;
1627} 1630}
@@ -1695,11 +1698,11 @@ uint32_t ftl_write(uint32_t sector, uint32_t count, const void* buffer)
1695 return 1; 1698 return 1;
1696 } 1699 }
1697 memset(ftl_buffer, 0xFF, 0x800); 1700 memset(ftl_buffer, 0xFF, 0x800);
1698 memset(&ftl_sparebuffer, 0xFF, 0x40); 1701 memset(&ftl_sparebuffer[0], 0xFF, 0x40);
1699 ftl_sparebuffer.meta.usn = ftl_cxt.usn; 1702 ftl_sparebuffer[0].meta.usn = ftl_cxt.usn;
1700 ftl_sparebuffer.meta.type = 0x47; 1703 ftl_sparebuffer[0].meta.type = 0x47;
1701 if (ftl_vfl_write(ftl_cxt.ftlctrlpage, ftl_buffer, 1704 if (ftl_vfl_write(ftl_cxt.ftlctrlpage, ftl_buffer,
1702 &ftl_sparebuffer) == 0) 1705 &ftl_sparebuffer[0]) == 0)
1703 break; 1706 break;
1704 } 1707 }
1705 if (i == 3) 1708 if (i == 3)
@@ -1738,14 +1741,14 @@ uint32_t ftl_write(uint32_t sector, uint32_t count, const void* buffer)
1738 ftl_cxt.nextblockusn++; 1741 ftl_cxt.nextblockusn++;
1739 for (j = 0; j < ppb; j++) 1742 for (j = 0; j < ppb; j++)
1740 { 1743 {
1741 memset(&ftl_sparebuffer, 0xFF, 0x40); 1744 memset(&ftl_sparebuffer[0], 0xFF, 0x40);
1742 ftl_sparebuffer.user.lpn = sector + i + j; 1745 ftl_sparebuffer[0].user.lpn = sector + i + j;
1743 ftl_sparebuffer.user.usn = ftl_cxt.nextblockusn; 1746 ftl_sparebuffer[0].user.usn = ftl_cxt.nextblockusn;
1744 ftl_sparebuffer.user.type = 0x40; 1747 ftl_sparebuffer[0].user.type = 0x40;
1745 if (j == ppb - 1) ftl_sparebuffer.user.type = 0x41; 1748 if (j == ppb - 1) ftl_sparebuffer[0].user.type = 0x41;
1746 while (ftl_vfl_write(vblock * ppb + j, 1749 while (ftl_vfl_write(vblock * ppb + j,
1747 &((uint8_t*)buffer)[(i + j) << 11], 1750 &((uint8_t*)buffer)[(i + j) << 11],
1748 &ftl_sparebuffer) != 0); 1751 &ftl_sparebuffer[0]) != 0);
1749 } 1752 }
1750 ftl_release_pool_block(ftl_map[block]); 1753 ftl_release_pool_block(ftl_map[block]);
1751 ftl_map[block] = vblock; 1754 ftl_map[block] = vblock;
@@ -1763,14 +1766,14 @@ uint32_t ftl_write(uint32_t sector, uint32_t count, const void* buffer)
1763 return 1; 1766 return 1;
1764 } 1767 }
1765 } 1768 }
1766 memset(&ftl_sparebuffer, 0xFF, 0x40); 1769 memset(&ftl_sparebuffer[0], 0xFF, 0x40);
1767 ftl_sparebuffer.user.lpn = sector + i; 1770 ftl_sparebuffer[0].user.lpn = sector + i;
1768 ftl_sparebuffer.user.usn = ++ftl_cxt.nextblockusn; 1771 ftl_sparebuffer[0].user.usn = ++ftl_cxt.nextblockusn;
1769 ftl_sparebuffer.user.type = 0x40; 1772 ftl_sparebuffer[0].user.type = 0x40;
1770 uint32_t abspage = (*logentry).scatteredvblock * ppb 1773 uint32_t abspage = (*logentry).scatteredvblock * ppb
1771 + (*logentry).pagesused++; 1774 + (*logentry).pagesused++;
1772 if (ftl_vfl_write(abspage, &((uint8_t*)buffer)[i << 11], 1775 if (ftl_vfl_write(abspage, &((uint8_t*)buffer)[i << 11],
1773 &ftl_sparebuffer) == 0) 1776 &ftl_sparebuffer[0]) == 0)
1774 { 1777 {
1775 if ((*logentry).pageoffsets[page] == 0xFFFF) 1778 if ((*logentry).pageoffsets[page] == 0xFFFF)
1776 (*logentry).pagescurrent++; 1779 (*logentry).pagescurrent++;