diff options
author | Michael Sparmann <theseven@rockbox.org> | 2010-03-13 18:25:42 +0000 |
---|---|---|
committer | Michael Sparmann <theseven@rockbox.org> | 2010-03-13 18:25:42 +0000 |
commit | 1a7e090b41ac1dd9a54d51952df8adbee521c147 (patch) | |
tree | f1731907cbececb32c0a88c6616052584dac6581 /firmware | |
parent | 4a7b2cc9f349c9991d84cca2aae59e070f7524ac (diff) | |
download | rockbox-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.c | 165 |
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; | |||
372 | uint8_t ftl_buffer[0x800] __attribute__((aligned(16))); | 374 | uint8_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 */ |
375 | union ftl_spare_data_type ftl_sparebuffer __attribute__((aligned(16))); | 377 | union 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. */ |
405 | uint8_t ftl_copybuffer[0x800] __attribute__((aligned(16))); | 407 | uint8_t ftl_copybuffer[FTL_COPYBUF_SIZE][0x800] __attribute__((aligned(16))); |
408 | union 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. */ |
1252 | uint32_t ftl_save_erasectr_page(uint32_t index) | 1255 | uint32_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++; |