diff options
Diffstat (limited to 'firmware/target/arm/s5l8700')
-rw-r--r-- | firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c | 300 |
1 files changed, 150 insertions, 150 deletions
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c index 56d148346c..9cb350d004 100644 --- a/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c +++ b/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c | |||
@@ -423,15 +423,15 @@ static struct mutex ftl_mtx; | |||
423 | uint32_t ftl_find_devinfo(uint32_t bank) | 423 | uint32_t ftl_find_devinfo(uint32_t bank) |
424 | { | 424 | { |
425 | /* Scan the last 10% of the flash for device info pages */ | 425 | /* Scan the last 10% of the flash for device info pages */ |
426 | uint32_t lowestBlock = (*ftl_nand_type).blocks | 426 | uint32_t lowestBlock = ftl_nand_type->blocks |
427 | - ((*ftl_nand_type).blocks / 10); | 427 | - (ftl_nand_type->blocks / 10); |
428 | uint32_t block, page, pagenum; | 428 | uint32_t block, page, pagenum; |
429 | for (block = (*ftl_nand_type).blocks - 1; block >= lowestBlock; block--) | 429 | for (block = ftl_nand_type->blocks - 1; block >= lowestBlock; block--) |
430 | { | 430 | { |
431 | page = (*ftl_nand_type).pagesperblock - 8; | 431 | page = ftl_nand_type->pagesperblock - 8; |
432 | for (; page < (*ftl_nand_type).pagesperblock; page++) | 432 | for (; page < ftl_nand_type->pagesperblock; page++) |
433 | { | 433 | { |
434 | pagenum = block * (*ftl_nand_type).pagesperblock + page; | 434 | pagenum = block * ftl_nand_type->pagesperblock + page; |
435 | if ((nand_read_page(bank, pagenum, ftl_buffer, | 435 | if ((nand_read_page(bank, pagenum, ftl_buffer, |
436 | &ftl_sparebuffer[0], 1, 0) & 0x11F) != 0) | 436 | &ftl_sparebuffer[0], 1, 0) & 0x11F) != 0) |
437 | continue; | 437 | continue; |
@@ -460,7 +460,7 @@ uint32_t ftl_load_bbt(uint32_t bank, uint8_t* bbt) | |||
460 | uint32_t pagebase, page = ftl_find_devinfo(bank), page2; | 460 | uint32_t pagebase, page = ftl_find_devinfo(bank), page2; |
461 | uint32_t unk1, unk2, unk3; | 461 | uint32_t unk1, unk2, unk3; |
462 | if (page == 0) return 1; | 462 | if (page == 0) return 1; |
463 | pagebase = page & ~((*ftl_nand_type).pagesperblock - 1); | 463 | pagebase = page & ~(ftl_nand_type->pagesperblock - 1); |
464 | if ((nand_read_page(bank, page, ftl_buffer, | 464 | if ((nand_read_page(bank, page, ftl_buffer, |
465 | (uint32_t*)0, 1, 0) & 0x11F) != 0) return 1; | 465 | (uint32_t*)0, 1, 0) & 0x11F) != 0) return 1; |
466 | if (memcmp(&ftl_buffer[0x18], "BBT", 4) != 0) return 1; | 466 | if (memcmp(&ftl_buffer[0x18], "BBT", 4) != 0) return 1; |
@@ -473,7 +473,7 @@ uint32_t ftl_load_bbt(uint32_t bank, uint8_t* bbt) | |||
473 | for (j = 0; ; j++) | 473 | for (j = 0; ; j++) |
474 | { | 474 | { |
475 | page2 = unk2 + i + unk3 * j; | 475 | page2 = unk2 + i + unk3 * j; |
476 | if (page2 >= (uint32_t)((*ftl_nand_type).pagesperblock - 8)) | 476 | if (page2 >= (uint32_t)(ftl_nand_type->pagesperblock - 8)) |
477 | break; | 477 | break; |
478 | if ((nand_read_page(bank, pagebase + page2, ftl_buffer, | 478 | if ((nand_read_page(bank, pagebase + page2, ftl_buffer, |
479 | (void*)0, 1, 0) & 0x11F) == 0) | 479 | (void*)0, 1, 0) & 0x11F) == 0) |
@@ -545,7 +545,7 @@ uint32_t ftl_vfl_store_cxt(uint32_t bank) | |||
545 | { | 545 | { |
546 | uint32_t index = ftl_vfl_cxt[bank].activecxtblock; | 546 | uint32_t index = ftl_vfl_cxt[bank].activecxtblock; |
547 | uint32_t block = ftl_vfl_cxt[bank].vflcxtblocks[index]; | 547 | uint32_t block = ftl_vfl_cxt[bank].vflcxtblocks[index]; |
548 | uint32_t page = block * (*ftl_nand_type).pagesperblock; | 548 | uint32_t page = block * ftl_nand_type->pagesperblock; |
549 | page += ftl_vfl_cxt[bank].nextcxtpage - i; | 549 | page += ftl_vfl_cxt[bank].nextcxtpage - i; |
550 | nand_write_page(bank, page, &ftl_vfl_cxt[bank], &ftl_sparebuffer[0], 1); | 550 | nand_write_page(bank, page, &ftl_vfl_cxt[bank], &ftl_sparebuffer[0], 1); |
551 | } | 551 | } |
@@ -554,7 +554,7 @@ uint32_t ftl_vfl_store_cxt(uint32_t bank) | |||
554 | { | 554 | { |
555 | uint32_t index = ftl_vfl_cxt[bank].activecxtblock; | 555 | uint32_t index = ftl_vfl_cxt[bank].activecxtblock; |
556 | uint32_t block = ftl_vfl_cxt[bank].vflcxtblocks[index]; | 556 | uint32_t block = ftl_vfl_cxt[bank].vflcxtblocks[index]; |
557 | uint32_t page = block * (*ftl_nand_type).pagesperblock; | 557 | uint32_t page = block * ftl_nand_type->pagesperblock; |
558 | page += ftl_vfl_cxt[bank].nextcxtpage - i; | 558 | page += ftl_vfl_cxt[bank].nextcxtpage - i; |
559 | if ((nand_read_page(bank, page, ftl_buffer, | 559 | if ((nand_read_page(bank, page, ftl_buffer, |
560 | &ftl_sparebuffer[0], 1, 0) & 0x11F) != 0) | 560 | &ftl_sparebuffer[0], 1, 0) & 0x11F) != 0) |
@@ -576,7 +576,7 @@ uint32_t ftl_vfl_store_cxt(uint32_t bank) | |||
576 | retries until it works or all available pages have been tried */ | 576 | retries until it works or all available pages have been tried */ |
577 | uint32_t ftl_vfl_commit_cxt(uint32_t bank) | 577 | uint32_t ftl_vfl_commit_cxt(uint32_t bank) |
578 | { | 578 | { |
579 | if (ftl_vfl_cxt[bank].nextcxtpage + 8 <= (*ftl_nand_type).pagesperblock) | 579 | if (ftl_vfl_cxt[bank].nextcxtpage + 8 <= ftl_nand_type->pagesperblock) |
580 | if (ftl_vfl_store_cxt(bank) == 0) return 0; | 580 | if (ftl_vfl_store_cxt(bank) == 0) return 0; |
581 | uint32_t current = ftl_vfl_cxt[bank].activecxtblock; | 581 | uint32_t current = ftl_vfl_cxt[bank].activecxtblock; |
582 | uint32_t i = current, j; | 582 | uint32_t i = current, j; |
@@ -587,7 +587,7 @@ uint32_t ftl_vfl_commit_cxt(uint32_t bank) | |||
587 | if (ftl_vfl_cxt[bank].vflcxtblocks[i] == 0xFFFF) continue; | 587 | if (ftl_vfl_cxt[bank].vflcxtblocks[i] == 0xFFFF) continue; |
588 | for (j = 0; j < 4; j++) | 588 | for (j = 0; j < 4; j++) |
589 | if (nand_block_erase(bank, ftl_vfl_cxt[bank].vflcxtblocks[i] | 589 | if (nand_block_erase(bank, ftl_vfl_cxt[bank].vflcxtblocks[i] |
590 | * (*ftl_nand_type).pagesperblock) == 0) | 590 | * ftl_nand_type->pagesperblock) == 0) |
591 | break; | 591 | break; |
592 | if (j == 4) continue; | 592 | if (j == 4) continue; |
593 | ftl_vfl_cxt[bank].activecxtblock = i; | 593 | ftl_vfl_cxt[bank].activecxtblock = i; |
@@ -656,12 +656,12 @@ uint32_t ftl_vfl_read_page(uint32_t bank, uint32_t block, | |||
656 | uint32_t i; | 656 | uint32_t i; |
657 | for (i = 0; i < 8; i++) | 657 | for (i = 0; i < 8; i++) |
658 | { | 658 | { |
659 | uint32_t page = block * (*ftl_nand_type).pagesperblock | 659 | uint32_t page = block * ftl_nand_type->pagesperblock |
660 | + startpage + i; | 660 | + startpage + i; |
661 | if ((nand_read_page(bank, page, databuffer, | 661 | if ((nand_read_page(bank, page, databuffer, |
662 | sparebuffer, 1, 1) & 0x11F) == 0) | 662 | sparebuffer, 1, 1) & 0x11F) == 0) |
663 | if ((*sparebuffer).meta.field_8 == 0 | 663 | if (sparebuffer->meta.field_8 == 0 |
664 | && (*sparebuffer).meta.type == 0x80) | 664 | && sparebuffer->meta.type == 0x80) |
665 | return 0; | 665 | return 0; |
666 | } | 666 | } |
667 | return 1; | 667 | return 1; |
@@ -787,7 +787,7 @@ uint32_t ftl_vfl_remap_block(uint32_t bank, uint32_t block) | |||
787 | uint32_t i; | 787 | uint32_t i; |
788 | uint32_t newblock = 0, newidx; | 788 | uint32_t newblock = 0, newidx; |
789 | panicf("FTL: Remapping bank %u block %u!", (unsigned)bank, (unsigned)block); | 789 | panicf("FTL: Remapping bank %u block %u!", (unsigned)bank, (unsigned)block); |
790 | if (bank >= ftl_banks || block >= (*ftl_nand_type).blocks) return 0; | 790 | if (bank >= ftl_banks || block >= ftl_nand_type->blocks) return 0; |
791 | for (i = 0; i < ftl_vfl_cxt[bank].sparecount; i++) | 791 | for (i = 0; i < ftl_vfl_cxt[bank].sparecount; i++) |
792 | if (ftl_vfl_cxt[bank].remaptable[i] == 0) | 792 | if (ftl_vfl_cxt[bank].remaptable[i] == 0) |
793 | { | 793 | { |
@@ -798,7 +798,7 @@ uint32_t ftl_vfl_remap_block(uint32_t bank, uint32_t block) | |||
798 | if (newblock == 0) return 0; | 798 | if (newblock == 0) return 0; |
799 | for (i = 0; i < 9; i++) | 799 | for (i = 0; i < 9; i++) |
800 | if (nand_block_erase(bank, | 800 | if (nand_block_erase(bank, |
801 | newblock * (*ftl_nand_type).pagesperblock) == 0) | 801 | newblock * ftl_nand_type->pagesperblock) == 0) |
802 | break; | 802 | break; |
803 | for (i = 0; i < newidx; i++) | 803 | for (i = 0; i < newidx; i++) |
804 | if (ftl_vfl_cxt[bank].remaptable[i] == block) | 804 | if (ftl_vfl_cxt[bank].remaptable[i] == block) |
@@ -815,19 +815,19 @@ uint32_t ftl_vfl_remap_block(uint32_t bank, uint32_t block) | |||
815 | uint32_t ftl_vfl_read(uint32_t vpage, void* buffer, void* sparebuffer, | 815 | uint32_t ftl_vfl_read(uint32_t vpage, void* buffer, void* sparebuffer, |
816 | uint32_t checkempty, uint32_t remaponfail) | 816 | uint32_t checkempty, uint32_t remaponfail) |
817 | { | 817 | { |
818 | uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks; | 818 | uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks; |
819 | uint32_t syshyperblocks = (*ftl_nand_type).blocks | 819 | uint32_t syshyperblocks = ftl_nand_type->blocks |
820 | - (*ftl_nand_type).userblocks - 0x17; | 820 | - ftl_nand_type->userblocks - 0x17; |
821 | uint32_t abspage = vpage + ppb * syshyperblocks; | 821 | uint32_t abspage = vpage + ppb * syshyperblocks; |
822 | if (abspage >= (*ftl_nand_type).blocks * ppb || abspage < ppb) | 822 | if (abspage >= ftl_nand_type->blocks * ppb || abspage < ppb) |
823 | panicf("FTL: Trying to read out-of-bounds vPage %u", (unsigned)vpage); | 823 | panicf("FTL: Trying to read out-of-bounds vPage %u", (unsigned)vpage); |
824 | //return 4; | 824 | //return 4; |
825 | 825 | ||
826 | uint32_t bank = abspage % ftl_banks; | 826 | uint32_t bank = abspage % ftl_banks; |
827 | uint32_t block = abspage / ((*ftl_nand_type).pagesperblock * ftl_banks); | 827 | uint32_t block = abspage / (ftl_nand_type->pagesperblock * ftl_banks); |
828 | uint32_t page = (abspage / ftl_banks) % (*ftl_nand_type).pagesperblock; | 828 | uint32_t page = (abspage / ftl_banks) % ftl_nand_type->pagesperblock; |
829 | uint32_t physblock = ftl_vfl_get_physical_block(bank, block); | 829 | uint32_t physblock = ftl_vfl_get_physical_block(bank, block); |
830 | uint32_t physpage = physblock * (*ftl_nand_type).pagesperblock + page; | 830 | uint32_t physpage = physblock * ftl_nand_type->pagesperblock + page; |
831 | 831 | ||
832 | uint32_t ret = nand_read_page(bank, physpage, buffer, | 832 | uint32_t ret = nand_read_page(bank, physpage, buffer, |
833 | sparebuffer, 1, checkempty); | 833 | sparebuffer, 1, checkempty); |
@@ -855,17 +855,17 @@ uint32_t ftl_vfl_read_fast(uint32_t vpage, void* buffer, void* sparebuffer, | |||
855 | uint32_t checkempty, uint32_t remaponfail) | 855 | uint32_t checkempty, uint32_t remaponfail) |
856 | { | 856 | { |
857 | uint32_t i, rc = 0; | 857 | uint32_t i, rc = 0; |
858 | uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks; | 858 | uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks; |
859 | uint32_t syshyperblocks = (*ftl_nand_type).blocks | 859 | uint32_t syshyperblocks = ftl_nand_type->blocks |
860 | - (*ftl_nand_type).userblocks - 0x17; | 860 | - ftl_nand_type->userblocks - 0x17; |
861 | uint32_t abspage = vpage + ppb * syshyperblocks; | 861 | uint32_t abspage = vpage + ppb * syshyperblocks; |
862 | if (abspage + ftl_banks - 1 >= (*ftl_nand_type).blocks * ppb || abspage < ppb) | 862 | if (abspage + ftl_banks - 1 >= ftl_nand_type->blocks * ppb || abspage < ppb) |
863 | panicf("FTL: Trying to read out-of-bounds vPage %u", (unsigned)vpage); | 863 | panicf("FTL: Trying to read out-of-bounds vPage %u", (unsigned)vpage); |
864 | //return 4; | 864 | //return 4; |
865 | 865 | ||
866 | uint32_t bank = abspage % ftl_banks; | 866 | uint32_t bank = abspage % ftl_banks; |
867 | uint32_t block = abspage / ((*ftl_nand_type).pagesperblock * ftl_banks); | 867 | uint32_t block = abspage / (ftl_nand_type->pagesperblock * ftl_banks); |
868 | uint32_t page = (abspage / ftl_banks) % (*ftl_nand_type).pagesperblock; | 868 | uint32_t page = (abspage / ftl_banks) % ftl_nand_type->pagesperblock; |
869 | uint32_t remapped = 0; | 869 | uint32_t remapped = 0; |
870 | for (i = 0; i < ftl_banks; i++) | 870 | for (i = 0; i < ftl_banks; i++) |
871 | if (ftl_vfl_get_physical_block(i, block) != block) | 871 | if (ftl_vfl_get_physical_block(i, block) != block) |
@@ -886,7 +886,7 @@ uint32_t ftl_vfl_read_fast(uint32_t vpage, void* buffer, void* sparebuffer, | |||
886 | } | 886 | } |
887 | return rc; | 887 | return rc; |
888 | } | 888 | } |
889 | uint32_t physpage = block * (*ftl_nand_type).pagesperblock + page; | 889 | uint32_t physpage = block * ftl_nand_type->pagesperblock + page; |
890 | 890 | ||
891 | rc = nand_read_page_fast(physpage, buffer, sparebuffer, 1, checkempty); | 891 | rc = nand_read_page_fast(physpage, buffer, sparebuffer, 1, checkempty); |
892 | if (!(rc & 0xdddd)) return rc; | 892 | if (!(rc & 0xdddd)) return rc; |
@@ -925,11 +925,11 @@ uint32_t ftl_vfl_write(uint32_t vpage, uint32_t count, | |||
925 | void* buffer, void* sparebuffer) | 925 | void* buffer, void* sparebuffer) |
926 | { | 926 | { |
927 | uint32_t i, j; | 927 | uint32_t i, j; |
928 | uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks; | 928 | uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks; |
929 | uint32_t syshyperblocks = (*ftl_nand_type).blocks | 929 | uint32_t syshyperblocks = ftl_nand_type->blocks |
930 | - (*ftl_nand_type).userblocks - 0x17; | 930 | - ftl_nand_type->userblocks - 0x17; |
931 | uint32_t abspage = vpage + ppb * syshyperblocks; | 931 | uint32_t abspage = vpage + ppb * syshyperblocks; |
932 | if (abspage + count > (*ftl_nand_type).blocks * ppb || abspage < ppb) | 932 | if (abspage + count > ftl_nand_type->blocks * ppb || abspage < ppb) |
933 | panicf("FTL: Trying to write out-of-bounds vPage %u", | 933 | panicf("FTL: Trying to write out-of-bounds vPage %u", |
934 | (unsigned)vpage); | 934 | (unsigned)vpage); |
935 | //return 4; | 935 | //return 4; |
@@ -947,10 +947,10 @@ uint32_t ftl_vfl_write(uint32_t vpage, uint32_t count, | |||
947 | physpage[j] = physpage[j - 1]; | 947 | physpage[j] = physpage[j - 1]; |
948 | } | 948 | } |
949 | bank[0] = abspage % ftl_banks; | 949 | bank[0] = abspage % ftl_banks; |
950 | block[0] = abspage / ((*ftl_nand_type).pagesperblock * ftl_banks); | 950 | block[0] = abspage / (ftl_nand_type->pagesperblock * ftl_banks); |
951 | uint32_t page = (abspage / ftl_banks) % (*ftl_nand_type).pagesperblock; | 951 | uint32_t page = (abspage / ftl_banks) % ftl_nand_type->pagesperblock; |
952 | uint32_t physblock = ftl_vfl_get_physical_block(bank[0], block[0]); | 952 | uint32_t physblock = ftl_vfl_get_physical_block(bank[0], block[0]); |
953 | physpage[0] = physblock * (*ftl_nand_type).pagesperblock + page; | 953 | physpage[0] = physblock * ftl_nand_type->pagesperblock + page; |
954 | 954 | ||
955 | if (i >= ftl_banks) | 955 | if (i >= ftl_banks) |
956 | if (nand_write_page_collect(bank[ftl_banks])) | 956 | if (nand_write_page_collect(bank[ftl_banks])) |
@@ -1006,8 +1006,8 @@ uint32_t ftl_vfl_open(void) | |||
1006 | uint8_t bbt[0x410]; | 1006 | uint8_t bbt[0x410]; |
1007 | #endif | 1007 | #endif |
1008 | 1008 | ||
1009 | uint32_t syshyperblocks = (*ftl_nand_type).blocks | 1009 | uint32_t syshyperblocks = ftl_nand_type->blocks |
1010 | - (*ftl_nand_type).userblocks - 0x18; | 1010 | - ftl_nand_type->userblocks - 0x18; |
1011 | 1011 | ||
1012 | for (i = 0; i < ftl_banks; i++) | 1012 | for (i = 0; i < ftl_banks; i++) |
1013 | #ifndef FTL_READONLY | 1013 | #ifndef FTL_READONLY |
@@ -1027,7 +1027,7 @@ uint32_t ftl_vfl_open(void) | |||
1027 | { | 1027 | { |
1028 | struct ftl_vfl_cxt_type* cxt; | 1028 | struct ftl_vfl_cxt_type* cxt; |
1029 | cxt = (struct ftl_vfl_cxt_type*)ftl_buffer; | 1029 | cxt = (struct ftl_vfl_cxt_type*)ftl_buffer; |
1030 | memcpy(vflcxtblock, &(*cxt).vflcxtblocks, 8); | 1030 | memcpy(vflcxtblock, &cxt->vflcxtblocks, 8); |
1031 | minusn = 0xFFFFFFFF; | 1031 | minusn = 0xFFFFFFFF; |
1032 | vflcxtidx = 4; | 1032 | vflcxtidx = 4; |
1033 | for (k = 0; k < 4; k++) | 1033 | for (k = 0; k < 4; k++) |
@@ -1045,7 +1045,7 @@ uint32_t ftl_vfl_open(void) | |||
1045 | panicf("FTL: No VFL CXT block found on bank %u!", | 1045 | panicf("FTL: No VFL CXT block found on bank %u!", |
1046 | (unsigned)i); | 1046 | (unsigned)i); |
1047 | last = 0; | 1047 | last = 0; |
1048 | uint32_t max = (*ftl_nand_type).pagesperblock; | 1048 | uint32_t max = ftl_nand_type->pagesperblock; |
1049 | for (k = 8; k < max; k += 8) | 1049 | for (k = 8; k < max; k += 8) |
1050 | { | 1050 | { |
1051 | if (ftl_vfl_read_page(i, vflcxtblock[vflcxtidx], | 1051 | if (ftl_vfl_read_page(i, vflcxtblock[vflcxtidx], |
@@ -1073,7 +1073,7 @@ uint32_t ftl_vfl_open(void) | |||
1073 | panicf("FTL: Couldn't load bank %u lowlevel BBT!", (unsigned)i); | 1073 | panicf("FTL: Couldn't load bank %u lowlevel BBT!", (unsigned)i); |
1074 | cxt = ftl_vfl_get_newest_cxt(); | 1074 | cxt = ftl_vfl_get_newest_cxt(); |
1075 | for (i = 0; i < ftl_banks; i++) | 1075 | for (i = 0; i < ftl_banks; i++) |
1076 | memcpy(ftl_vfl_cxt[i].ftlctrlblocks, (*cxt).ftlctrlblocks, 6); | 1076 | memcpy(ftl_vfl_cxt[i].ftlctrlblocks, cxt->ftlctrlblocks, 6); |
1077 | return 0; | 1077 | return 0; |
1078 | } | 1078 | } |
1079 | 1079 | ||
@@ -1083,28 +1083,28 @@ uint32_t ftl_open(void) | |||
1083 | { | 1083 | { |
1084 | uint32_t i; | 1084 | uint32_t i; |
1085 | uint32_t ret; | 1085 | uint32_t ret; |
1086 | uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks; | 1086 | uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks; |
1087 | struct ftl_vfl_cxt_type* cxt = ftl_vfl_get_newest_cxt(); | 1087 | struct ftl_vfl_cxt_type* cxt = ftl_vfl_get_newest_cxt(); |
1088 | 1088 | ||
1089 | uint32_t ftlcxtblock = 0xffffffff; | 1089 | uint32_t ftlcxtblock = 0xffffffff; |
1090 | uint32_t minusn = 0xffffffff; | 1090 | uint32_t minusn = 0xffffffff; |
1091 | for (i = 0; i < 3; i++) | 1091 | for (i = 0; i < 3; i++) |
1092 | { | 1092 | { |
1093 | ret = ftl_vfl_read(ppb * (*cxt).ftlctrlblocks[i], | 1093 | ret = ftl_vfl_read(ppb * cxt->ftlctrlblocks[i], |
1094 | ftl_buffer, &ftl_sparebuffer[0], 1, 0); | 1094 | ftl_buffer, &ftl_sparebuffer[0], 1, 0); |
1095 | if ((ret &= 0x11F) != 0) continue; | 1095 | if ((ret &= 0x11F) != 0) continue; |
1096 | if (ftl_sparebuffer[0].meta.type - 0x43 > 4) continue; | 1096 | if (ftl_sparebuffer[0].meta.type - 0x43 > 4) continue; |
1097 | if (ftlcxtblock != 0xffffffff && ftl_sparebuffer[0].meta.usn >= minusn) | 1097 | if (ftlcxtblock != 0xffffffff && ftl_sparebuffer[0].meta.usn >= minusn) |
1098 | continue; | 1098 | continue; |
1099 | minusn = ftl_sparebuffer[0].meta.usn; | 1099 | minusn = ftl_sparebuffer[0].meta.usn; |
1100 | ftlcxtblock = (*cxt).ftlctrlblocks[i]; | 1100 | ftlcxtblock = cxt->ftlctrlblocks[i]; |
1101 | } | 1101 | } |
1102 | 1102 | ||
1103 | if (ftlcxtblock == 0xffffffff) //return 1; | 1103 | if (ftlcxtblock == 0xffffffff) //return 1; |
1104 | panicf("FTL: Couldn't find readable FTL CXT block!"); | 1104 | panicf("FTL: Couldn't find readable FTL CXT block!"); |
1105 | 1105 | ||
1106 | uint32_t ftlcxtfound = 0; | 1106 | uint32_t ftlcxtfound = 0; |
1107 | for (i = (*ftl_nand_type).pagesperblock * ftl_banks - 1; i > 0; i--) | 1107 | for (i = ftl_nand_type->pagesperblock * ftl_banks - 1; i > 0; i--) |
1108 | { | 1108 | { |
1109 | ret = ftl_vfl_read(ppb * ftlcxtblock + i, | 1109 | ret = ftl_vfl_read(ppb * ftlcxtblock + i, |
1110 | ftl_buffer, &ftl_sparebuffer[0], 1, 0); | 1110 | ftl_buffer, &ftl_sparebuffer[0], 1, 0); |
@@ -1128,8 +1128,8 @@ uint32_t ftl_open(void) | |||
1128 | if (ftlcxtfound == 0) //return 1; | 1128 | if (ftlcxtfound == 0) //return 1; |
1129 | panicf("FTL: Couldn't find FTL CXT page!"); | 1129 | panicf("FTL: Couldn't find FTL CXT page!"); |
1130 | 1130 | ||
1131 | uint32_t pagestoread = (*ftl_nand_type).userblocks >> 10; | 1131 | uint32_t pagestoread = ftl_nand_type->userblocks >> 10; |
1132 | if (((*ftl_nand_type).userblocks & 0x1FF) != 0) pagestoread++; | 1132 | if ((ftl_nand_type->userblocks & 0x1FF) != 0) pagestoread++; |
1133 | 1133 | ||
1134 | for (i = 0; i < pagestoread; i++) | 1134 | for (i = 0; i < pagestoread; i++) |
1135 | { | 1135 | { |
@@ -1139,15 +1139,15 @@ uint32_t ftl_open(void) | |||
1139 | //return 1; | 1139 | //return 1; |
1140 | 1140 | ||
1141 | uint32_t toread = 2048; | 1141 | uint32_t toread = 2048; |
1142 | if (toread > ((*ftl_nand_type).userblocks << 1) - (i << 11)) | 1142 | if (toread > (ftl_nand_type->userblocks << 1) - (i << 11)) |
1143 | toread = ((*ftl_nand_type).userblocks << 1) - (i << 11); | 1143 | toread = (ftl_nand_type->userblocks << 1) - (i << 11); |
1144 | 1144 | ||
1145 | memcpy(&ftl_map[i << 10], ftl_buffer, toread); | 1145 | memcpy(&ftl_map[i << 10], ftl_buffer, toread); |
1146 | } | 1146 | } |
1147 | 1147 | ||
1148 | #ifndef FTL_READONLY | 1148 | #ifndef FTL_READONLY |
1149 | pagestoread = ((*ftl_nand_type).userblocks + 23) >> 10; | 1149 | pagestoread = (ftl_nand_type->userblocks + 23) >> 10; |
1150 | if ((((*ftl_nand_type).userblocks + 23) & 0x1FF) != 0) pagestoread++; | 1150 | if (((ftl_nand_type->userblocks + 23) & 0x1FF) != 0) pagestoread++; |
1151 | 1151 | ||
1152 | for (i = 0; i < pagestoread; i++) | 1152 | for (i = 0; i < pagestoread; i++) |
1153 | { | 1153 | { |
@@ -1157,8 +1157,8 @@ uint32_t ftl_open(void) | |||
1157 | //return 1; | 1157 | //return 1; |
1158 | 1158 | ||
1159 | uint32_t toread = 2048; | 1159 | uint32_t toread = 2048; |
1160 | if (toread > (((*ftl_nand_type).userblocks + 23) << 1) - (i << 11)) | 1160 | if (toread > ((ftl_nand_type->userblocks + 23) << 1) - (i << 11)) |
1161 | toread = (((*ftl_nand_type).userblocks + 23) << 1) - (i << 11); | 1161 | toread = ((ftl_nand_type->userblocks + 23) << 1) - (i << 11); |
1162 | 1162 | ||
1163 | memcpy(&ftl_erasectr[i << 10], ftl_buffer, toread); | 1163 | memcpy(&ftl_erasectr[i << 10], ftl_buffer, toread); |
1164 | } | 1164 | } |
@@ -1197,10 +1197,10 @@ struct ftl_log_type* ftl_get_log_entry(uint32_t block) | |||
1197 | uint32_t ftl_read(uint32_t sector, uint32_t count, void* buffer) | 1197 | uint32_t ftl_read(uint32_t sector, uint32_t count, void* buffer) |
1198 | { | 1198 | { |
1199 | uint32_t i, j; | 1199 | uint32_t i, j; |
1200 | uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks; | 1200 | uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks; |
1201 | uint32_t error = 0; | 1201 | uint32_t error = 0; |
1202 | 1202 | ||
1203 | if (sector + count > (*ftl_nand_type).userblocks * ppb) | 1203 | if (sector + count > ftl_nand_type->userblocks * ppb) |
1204 | return 1; | 1204 | return 1; |
1205 | 1205 | ||
1206 | if (count == 0) return 0; | 1206 | if (count == 0) return 0; |
@@ -1216,10 +1216,10 @@ uint32_t ftl_read(uint32_t sector, uint32_t count, void* buffer) | |||
1216 | #ifndef FTL_READONLY | 1216 | #ifndef FTL_READONLY |
1217 | struct ftl_log_type* logentry = ftl_get_log_entry(block); | 1217 | struct ftl_log_type* logentry = ftl_get_log_entry(block); |
1218 | if (logentry != (struct ftl_log_type*)0) | 1218 | if (logentry != (struct ftl_log_type*)0) |
1219 | if ((*logentry).scatteredvblock != 0xFFFF | 1219 | if (logentry->scatteredvblock != 0xFFFF |
1220 | && (*logentry).pageoffsets[page] != 0xFFFF) | 1220 | && logentry->pageoffsets[page] != 0xFFFF) |
1221 | abspage = (*logentry).scatteredvblock * ppb | 1221 | abspage = logentry->scatteredvblock * ppb |
1222 | + (*logentry).pageoffsets[page]; | 1222 | + logentry->pageoffsets[page]; |
1223 | #endif | 1223 | #endif |
1224 | 1224 | ||
1225 | #ifndef FTL_READONLY | 1225 | #ifndef FTL_READONLY |
@@ -1266,9 +1266,9 @@ uint32_t ftl_read(uint32_t sector, uint32_t count, void* buffer) | |||
1266 | uint32_t ftl_erase_block_internal(uint32_t block) | 1266 | uint32_t ftl_erase_block_internal(uint32_t block) |
1267 | { | 1267 | { |
1268 | uint32_t i, j; | 1268 | uint32_t i, j; |
1269 | block = block + (*ftl_nand_type).blocks | 1269 | block = block + ftl_nand_type->blocks |
1270 | - (*ftl_nand_type).userblocks - 0x17; | 1270 | - ftl_nand_type->userblocks - 0x17; |
1271 | if (block == 0 || block >= (*ftl_nand_type).blocks) return 1; | 1271 | if (block == 0 || block >= ftl_nand_type->blocks) return 1; |
1272 | for (i = 0; i < ftl_banks; i++) | 1272 | for (i = 0; i < ftl_banks; i++) |
1273 | { | 1273 | { |
1274 | if (ftl_vfl_check_remap_scheduled(i, block) == 1) | 1274 | if (ftl_vfl_check_remap_scheduled(i, block) == 1) |
@@ -1281,7 +1281,7 @@ uint32_t ftl_erase_block_internal(uint32_t block) | |||
1281 | uint32_t rc; | 1281 | uint32_t rc; |
1282 | for (j = 0; j < 3; j++) | 1282 | for (j = 0; j < 3; j++) |
1283 | { | 1283 | { |
1284 | rc = nand_block_erase(i, pblock * (*ftl_nand_type).pagesperblock); | 1284 | rc = nand_block_erase(i, pblock * ftl_nand_type->pagesperblock); |
1285 | if (rc == 0) break; | 1285 | if (rc == 0) break; |
1286 | } | 1286 | } |
1287 | if (rc != 0) | 1287 | if (rc != 0) |
@@ -1342,7 +1342,7 @@ uint32_t ftl_allocate_pool_block(void) | |||
1342 | ftl_cxt.blockpool[bestidx] = ftl_cxt.blockpool[ftl_cxt.nextfreeidx]; | 1342 | ftl_cxt.blockpool[bestidx] = ftl_cxt.blockpool[ftl_cxt.nextfreeidx]; |
1343 | ftl_cxt.blockpool[ftl_cxt.nextfreeidx] = block; | 1343 | ftl_cxt.blockpool[ftl_cxt.nextfreeidx] = block; |
1344 | } | 1344 | } |
1345 | if (block > (uint32_t)(*ftl_nand_type).userblocks + 0x17) | 1345 | if (block > (uint32_t)ftl_nand_type->userblocks + 0x17) |
1346 | panicf("FTL: Bad block number in pool: %u", (unsigned)block); | 1346 | panicf("FTL: Bad block number in pool: %u", (unsigned)block); |
1347 | if (ftl_erase_block(block) != 0) return 0xFFFFFFFF; | 1347 | if (ftl_erase_block(block) != 0) return 0xFFFFFFFF; |
1348 | if (++ftl_cxt.nextfreeidx == 0x14) ftl_cxt.nextfreeidx = 0; | 1348 | if (++ftl_cxt.nextfreeidx == 0x14) ftl_cxt.nextfreeidx = 0; |
@@ -1356,7 +1356,7 @@ uint32_t ftl_allocate_pool_block(void) | |||
1356 | /* Releases a vBlock back into the pool */ | 1356 | /* Releases a vBlock back into the pool */ |
1357 | void ftl_release_pool_block(uint32_t block) | 1357 | void ftl_release_pool_block(uint32_t block) |
1358 | { | 1358 | { |
1359 | if (block >= (uint32_t)(*ftl_nand_type).userblocks + 0x17) | 1359 | if (block >= (uint32_t)ftl_nand_type->userblocks + 0x17) |
1360 | panicf("FTL: Tried to release block %u", (unsigned)block); | 1360 | panicf("FTL: Tried to release block %u", (unsigned)block); |
1361 | uint32_t idx = ftl_cxt.nextfreeidx + ftl_cxt.freecount++; | 1361 | uint32_t idx = ftl_cxt.nextfreeidx + ftl_cxt.freecount++; |
1362 | if (idx >= 0x14) idx -= 0x14; | 1362 | if (idx >= 0x14) idx -= 0x14; |
@@ -1410,7 +1410,7 @@ uint32_t ftl_save_erasectr_page(uint32_t index) | |||
1410 | uint32_t ftl_next_ctrl_pool_page(void) | 1410 | uint32_t ftl_next_ctrl_pool_page(void) |
1411 | { | 1411 | { |
1412 | uint32_t i; | 1412 | uint32_t i; |
1413 | uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks; | 1413 | uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks; |
1414 | if (++ftl_cxt.ftlctrlpage % ppb != 0) return 0; | 1414 | if (++ftl_cxt.ftlctrlpage % ppb != 0) return 0; |
1415 | for (i = 0; i < 3; i++) | 1415 | for (i = 0; i < 3; i++) |
1416 | if ((ftl_cxt.ftlctrlblocks[i] + 1) * ppb == ftl_cxt.ftlctrlpage) | 1416 | if ((ftl_cxt.ftlctrlblocks[i] + 1) * ppb == ftl_cxt.ftlctrlpage) |
@@ -1421,8 +1421,8 @@ uint32_t ftl_next_ctrl_pool_page(void) | |||
1421 | if (newblock == 0xFFFFFFFF) return 1; | 1421 | if (newblock == 0xFFFFFFFF) return 1; |
1422 | ftl_cxt.ftlctrlblocks[i] = newblock; | 1422 | ftl_cxt.ftlctrlblocks[i] = newblock; |
1423 | ftl_cxt.ftlctrlpage = newblock * ppb; | 1423 | ftl_cxt.ftlctrlpage = newblock * ppb; |
1424 | uint32_t pagestoread = ((*ftl_nand_type).userblocks + 23) >> 10; | 1424 | uint32_t pagestoread = (ftl_nand_type->userblocks + 23) >> 10; |
1425 | if ((((*ftl_nand_type).userblocks + 23) & 0x1FF) != 0) pagestoread++; | 1425 | if (((ftl_nand_type->userblocks + 23) & 0x1FF) != 0) pagestoread++; |
1426 | for (i = 0; i < pagestoread; i++) | 1426 | for (i = 0; i < pagestoread; i++) |
1427 | if (oldblock * ppb <= ftl_cxt.ftl_erasectr_pages[i] | 1427 | if (oldblock * ppb <= ftl_cxt.ftl_erasectr_pages[i] |
1428 | && (oldblock + 1) * ppb > ftl_cxt.ftl_erasectr_pages[i]) | 1428 | && (oldblock + 1) * ppb > ftl_cxt.ftl_erasectr_pages[i]) |
@@ -1448,7 +1448,7 @@ uint32_t ftl_next_ctrl_pool_page(void) | |||
1448 | uint32_t ftl_copy_page(uint32_t source, uint32_t destination, | 1448 | uint32_t ftl_copy_page(uint32_t source, uint32_t destination, |
1449 | uint32_t lpn, uint32_t type) | 1449 | uint32_t lpn, uint32_t type) |
1450 | { | 1450 | { |
1451 | uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks; | 1451 | uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks; |
1452 | uint32_t rc = ftl_vfl_read(source, ftl_copybuffer[0], | 1452 | uint32_t rc = ftl_vfl_read(source, ftl_copybuffer[0], |
1453 | &ftl_copyspare[0], 1, 1) & 0x11F; | 1453 | &ftl_copyspare[0], 1, 1) & 0x11F; |
1454 | memset(&ftl_copyspare[0], 0xFF, 0x40); | 1454 | memset(&ftl_copyspare[0], 0xFF, 0x40); |
@@ -1469,7 +1469,7 @@ uint32_t ftl_copy_page(uint32_t source, uint32_t destination, | |||
1469 | uint32_t ftl_copy_block(uint32_t source, uint32_t destination) | 1469 | uint32_t ftl_copy_block(uint32_t source, uint32_t destination) |
1470 | { | 1470 | { |
1471 | uint32_t i, j; | 1471 | uint32_t i, j; |
1472 | uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks; | 1472 | uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks; |
1473 | uint32_t error = 0; | 1473 | uint32_t error = 0; |
1474 | ftl_cxt.nextblockusn++; | 1474 | ftl_cxt.nextblockusn++; |
1475 | for (i = 0; i < ppb; i += FTL_COPYBUF_SIZE) | 1475 | for (i = 0; i < ppb; i += FTL_COPYBUF_SIZE) |
@@ -1510,9 +1510,9 @@ uint32_t ftl_copy_block(uint32_t source, uint32_t destination) | |||
1510 | /* Clears ftl_log.issequential, if something violating that is written. */ | 1510 | /* Clears ftl_log.issequential, if something violating that is written. */ |
1511 | void ftl_check_still_sequential(struct ftl_log_type* entry, uint32_t page) | 1511 | void ftl_check_still_sequential(struct ftl_log_type* entry, uint32_t page) |
1512 | { | 1512 | { |
1513 | if ((*entry).pagesused != (*entry).pagescurrent | 1513 | if (entry->pagesused != entry->pagescurrent |
1514 | || (*entry).pageoffsets[page] != page) | 1514 | || entry->pageoffsets[page] != page) |
1515 | (*entry).issequential = 0; | 1515 | entry->issequential = 0; |
1516 | } | 1516 | } |
1517 | #endif | 1517 | #endif |
1518 | 1518 | ||
@@ -1528,51 +1528,51 @@ void ftl_check_still_sequential(struct ftl_log_type* entry, uint32_t page) | |||
1528 | uint32_t ftl_compact_scattered(struct ftl_log_type* entry) | 1528 | uint32_t ftl_compact_scattered(struct ftl_log_type* entry) |
1529 | { | 1529 | { |
1530 | uint32_t i, j; | 1530 | uint32_t i, j; |
1531 | uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks; | 1531 | uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks; |
1532 | uint32_t error; | 1532 | uint32_t error; |
1533 | struct ftl_log_type backup; | 1533 | struct ftl_log_type backup; |
1534 | if ((*entry).pagescurrent == 0) | 1534 | if (entry->pagescurrent == 0) |
1535 | { | 1535 | { |
1536 | ftl_release_pool_block((*entry).scatteredvblock); | 1536 | ftl_release_pool_block(entry->scatteredvblock); |
1537 | (*entry).scatteredvblock = 0xFFFF; | 1537 | entry->scatteredvblock = 0xFFFF; |
1538 | return 0; | 1538 | return 0; |
1539 | } | 1539 | } |
1540 | backup = *entry; | 1540 | backup = *entry; |
1541 | memcpy(ftl_offsets_backup, (*entry).pageoffsets, 0x400); | 1541 | memcpy(ftl_offsets_backup, entry->pageoffsets, 0x400); |
1542 | for (i = 0; i < 4; i++) | 1542 | for (i = 0; i < 4; i++) |
1543 | { | 1543 | { |
1544 | uint32_t block = ftl_allocate_pool_block(); | 1544 | uint32_t block = ftl_allocate_pool_block(); |
1545 | if (block == 0xFFFFFFFF) return 1; | 1545 | if (block == 0xFFFFFFFF) return 1; |
1546 | (*entry).pagesused = 0; | 1546 | entry->pagesused = 0; |
1547 | (*entry).pagescurrent = 0; | 1547 | entry->pagescurrent = 0; |
1548 | (*entry).issequential = 1; | 1548 | entry->issequential = 1; |
1549 | (*entry).scatteredvblock = block; | 1549 | entry->scatteredvblock = block; |
1550 | error = 0; | 1550 | error = 0; |
1551 | for (j = 0; j < ppb; j++) | 1551 | for (j = 0; j < ppb; j++) |
1552 | if ((*entry).pageoffsets[j] != 0xFFFF) | 1552 | if (entry->pageoffsets[j] != 0xFFFF) |
1553 | { | 1553 | { |
1554 | uint32_t lpn = (*entry).logicalvblock * ppb + j; | 1554 | uint32_t lpn = entry->logicalvblock * ppb + j; |
1555 | uint32_t newpage = block * ppb + (*entry).pagesused; | 1555 | uint32_t newpage = block * ppb + entry->pagesused; |
1556 | uint32_t oldpage = backup.scatteredvblock * ppb | 1556 | uint32_t oldpage = backup.scatteredvblock * ppb |
1557 | + (*entry).pageoffsets[j]; | 1557 | + entry->pageoffsets[j]; |
1558 | if (ftl_copy_page(oldpage, newpage, lpn, | 1558 | if (ftl_copy_page(oldpage, newpage, lpn, |
1559 | (*entry).issequential) != 0) | 1559 | entry->issequential) != 0) |
1560 | { | 1560 | { |
1561 | error = 1; | 1561 | error = 1; |
1562 | break; | 1562 | break; |
1563 | } | 1563 | } |
1564 | (*entry).pageoffsets[j] = (*entry).pagesused++; | 1564 | entry->pageoffsets[j] = entry->pagesused++; |
1565 | (*entry).pagescurrent++; | 1565 | entry->pagescurrent++; |
1566 | ftl_check_still_sequential(entry, j); | 1566 | ftl_check_still_sequential(entry, j); |
1567 | } | 1567 | } |
1568 | if (backup.pagescurrent != (*entry).pagescurrent) error = 1; | 1568 | if (backup.pagescurrent != entry->pagescurrent) error = 1; |
1569 | if (error == 0) | 1569 | if (error == 0) |
1570 | { | 1570 | { |
1571 | ftl_release_pool_block(backup.scatteredvblock); | 1571 | ftl_release_pool_block(backup.scatteredvblock); |
1572 | break; | 1572 | break; |
1573 | } | 1573 | } |
1574 | *entry = backup; | 1574 | *entry = backup; |
1575 | memcpy((*entry).pageoffsets, ftl_offsets_backup, 0x400); | 1575 | memcpy(entry->pageoffsets, ftl_offsets_backup, 0x400); |
1576 | } | 1576 | } |
1577 | return error; | 1577 | return error; |
1578 | } | 1578 | } |
@@ -1590,15 +1590,15 @@ uint32_t ftl_commit_scattered(struct ftl_log_type* entry) | |||
1590 | { | 1590 | { |
1591 | block = ftl_allocate_pool_block(); | 1591 | block = ftl_allocate_pool_block(); |
1592 | if (block == 0xFFFFFFFF) return 1; | 1592 | if (block == 0xFFFFFFFF) return 1; |
1593 | error = ftl_copy_block((*entry).logicalvblock, block); | 1593 | error = ftl_copy_block(entry->logicalvblock, block); |
1594 | if (error == 0) break; | 1594 | if (error == 0) break; |
1595 | ftl_release_pool_block(block); | 1595 | ftl_release_pool_block(block); |
1596 | } | 1596 | } |
1597 | if (error != 0) return 1; | 1597 | if (error != 0) return 1; |
1598 | ftl_release_pool_block((*entry).scatteredvblock); | 1598 | ftl_release_pool_block(entry->scatteredvblock); |
1599 | (*entry).scatteredvblock = 0xFFFF; | 1599 | entry->scatteredvblock = 0xFFFF; |
1600 | ftl_release_pool_block(ftl_map[(*entry).logicalvblock]); | 1600 | ftl_release_pool_block(ftl_map[entry->logicalvblock]); |
1601 | ftl_map[(*entry).logicalvblock] = block; | 1601 | ftl_map[entry->logicalvblock] = block; |
1602 | return 0; | 1602 | return 0; |
1603 | } | 1603 | } |
1604 | #endif | 1604 | #endif |
@@ -1612,21 +1612,21 @@ uint32_t ftl_commit_scattered(struct ftl_log_type* entry) | |||
1612 | uint32_t ftl_commit_sequential(struct ftl_log_type* entry) | 1612 | uint32_t ftl_commit_sequential(struct ftl_log_type* entry) |
1613 | { | 1613 | { |
1614 | uint32_t i; | 1614 | uint32_t i; |
1615 | uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks; | 1615 | uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks; |
1616 | 1616 | ||
1617 | if ((*entry).issequential != 1 | 1617 | if (entry->issequential != 1 |
1618 | || (*entry).pagescurrent != (*entry).pagesused) | 1618 | || entry->pagescurrent != entry->pagesused) |
1619 | return 1; | 1619 | return 1; |
1620 | 1620 | ||
1621 | for (; (*entry).pagesused < ppb; ) | 1621 | for (; entry->pagesused < ppb; ) |
1622 | { | 1622 | { |
1623 | uint32_t lpn = (*entry).logicalvblock * ppb + (*entry).pagesused; | 1623 | uint32_t lpn = entry->logicalvblock * ppb + entry->pagesused; |
1624 | uint32_t newpage = (*entry).scatteredvblock * ppb | 1624 | uint32_t newpage = entry->scatteredvblock * ppb |
1625 | + (*entry).pagesused; | 1625 | + entry->pagesused; |
1626 | uint32_t count = FTL_COPYBUF_SIZE < ppb - (*entry).pagesused | 1626 | uint32_t count = FTL_COPYBUF_SIZE < ppb - entry->pagesused |
1627 | ? FTL_COPYBUF_SIZE : ppb - (*entry).pagesused; | 1627 | ? FTL_COPYBUF_SIZE : ppb - entry->pagesused; |
1628 | for (i = 0; i < count; i++) | 1628 | for (i = 0; i < count; i++) |
1629 | if ((*entry).pageoffsets[(*entry).pagesused + i] != 0xFFFF) | 1629 | if (entry->pageoffsets[entry->pagesused + i] != 0xFFFF) |
1630 | return ftl_commit_scattered(entry); | 1630 | return ftl_commit_scattered(entry); |
1631 | uint32_t rc = ftl_read(lpn, count, ftl_copybuffer[0]); | 1631 | uint32_t rc = ftl_read(lpn, count, ftl_copybuffer[0]); |
1632 | memset(&ftl_copyspare[0], 0xFF, 0x40 * FTL_COPYBUF_SIZE); | 1632 | memset(&ftl_copyspare[0], 0xFF, 0x40 * FTL_COPYBUF_SIZE); |
@@ -1636,16 +1636,16 @@ uint32_t ftl_commit_sequential(struct ftl_log_type* entry) | |||
1636 | ftl_copyspare[i].user.usn = ++ftl_cxt.nextblockusn; | 1636 | ftl_copyspare[i].user.usn = ++ftl_cxt.nextblockusn; |
1637 | ftl_copyspare[i].user.type = 0x40; | 1637 | ftl_copyspare[i].user.type = 0x40; |
1638 | if (rc) ftl_copyspare[i].user.eccmark = 0x55; | 1638 | if (rc) ftl_copyspare[i].user.eccmark = 0x55; |
1639 | if ((*entry).pagesused + i == ppb - 1) | 1639 | if (entry->pagesused + i == ppb - 1) |
1640 | ftl_copyspare[i].user.type = 0x41; | 1640 | ftl_copyspare[i].user.type = 0x41; |
1641 | } | 1641 | } |
1642 | if (ftl_vfl_write(newpage, count, ftl_copybuffer[0], &ftl_copyspare[0])) | 1642 | if (ftl_vfl_write(newpage, count, ftl_copybuffer[0], &ftl_copyspare[0])) |
1643 | return ftl_commit_scattered(entry); | 1643 | return ftl_commit_scattered(entry); |
1644 | (*entry).pagesused += count; | 1644 | entry->pagesused += count; |
1645 | } | 1645 | } |
1646 | ftl_release_pool_block(ftl_map[(*entry).logicalvblock]); | 1646 | ftl_release_pool_block(ftl_map[entry->logicalvblock]); |
1647 | ftl_map[(*entry).logicalvblock] = (*entry).scatteredvblock; | 1647 | ftl_map[entry->logicalvblock] = entry->scatteredvblock; |
1648 | (*entry).scatteredvblock = 0xFFFF; | 1648 | entry->scatteredvblock = 0xFFFF; |
1649 | return 0; | 1649 | return 0; |
1650 | } | 1650 | } |
1651 | #endif | 1651 | #endif |
@@ -1658,7 +1658,7 @@ uint32_t ftl_commit_sequential(struct ftl_log_type* entry) | |||
1658 | uint32_t ftl_remove_scattered_block(struct ftl_log_type* entry) | 1658 | uint32_t ftl_remove_scattered_block(struct ftl_log_type* entry) |
1659 | { | 1659 | { |
1660 | uint32_t i; | 1660 | uint32_t i; |
1661 | uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks; | 1661 | uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks; |
1662 | uint32_t age = 0xFFFFFFFF, used = 0; | 1662 | uint32_t age = 0xFFFFFFFF, used = 0; |
1663 | if (entry == (struct ftl_log_type*)0) | 1663 | if (entry == (struct ftl_log_type*)0) |
1664 | { | 1664 | { |
@@ -1677,13 +1677,13 @@ uint32_t ftl_remove_scattered_block(struct ftl_log_type* entry) | |||
1677 | } | 1677 | } |
1678 | if (entry == (struct ftl_log_type*)0) return 1; | 1678 | if (entry == (struct ftl_log_type*)0) return 1; |
1679 | } | 1679 | } |
1680 | else if ((*entry).pagescurrent < ppb / 2) | 1680 | else if (entry->pagescurrent < ppb / 2) |
1681 | { | 1681 | { |
1682 | ftl_cxt.swapcounter++; | 1682 | ftl_cxt.swapcounter++; |
1683 | return ftl_compact_scattered(entry); | 1683 | return ftl_compact_scattered(entry); |
1684 | } | 1684 | } |
1685 | ftl_cxt.swapcounter++; | 1685 | ftl_cxt.swapcounter++; |
1686 | if ((*entry).issequential == 1) return ftl_commit_sequential(entry); | 1686 | if (entry->issequential == 1) return ftl_commit_sequential(entry); |
1687 | else return ftl_commit_scattered(entry); | 1687 | else return ftl_commit_scattered(entry); |
1688 | } | 1688 | } |
1689 | #endif | 1689 | #endif |
@@ -1693,10 +1693,10 @@ uint32_t ftl_remove_scattered_block(struct ftl_log_type* entry) | |||
1693 | /* Initialize a log entry to the values for an empty scattered page block */ | 1693 | /* Initialize a log entry to the values for an empty scattered page block */ |
1694 | void ftl_init_log_entry(struct ftl_log_type* entry) | 1694 | void ftl_init_log_entry(struct ftl_log_type* entry) |
1695 | { | 1695 | { |
1696 | (*entry).issequential = 1; | 1696 | entry->issequential = 1; |
1697 | (*entry).pagescurrent = 0; | 1697 | entry->pagescurrent = 0; |
1698 | (*entry).pagesused = 0; | 1698 | entry->pagesused = 0; |
1699 | memset((*entry).pageoffsets, 0xFF, 0x400); | 1699 | memset(entry->pageoffsets, 0xFF, 0x400); |
1700 | } | 1700 | } |
1701 | #endif | 1701 | #endif |
1702 | 1702 | ||
@@ -1708,7 +1708,7 @@ struct ftl_log_type* ftl_allocate_log_entry(uint32_t block) | |||
1708 | { | 1708 | { |
1709 | uint32_t i; | 1709 | uint32_t i; |
1710 | struct ftl_log_type* entry = ftl_get_log_entry(block); | 1710 | struct ftl_log_type* entry = ftl_get_log_entry(block); |
1711 | (*entry).usn = ftl_cxt.nextblockusn - 1; | 1711 | entry->usn = ftl_cxt.nextblockusn - 1; |
1712 | if (entry != (struct ftl_log_type*)0) return entry; | 1712 | if (entry != (struct ftl_log_type*)0) return entry; |
1713 | 1713 | ||
1714 | for (i = 0; i < 0x11; i++) | 1714 | for (i = 0; i < 0x11; i++) |
@@ -1728,15 +1728,15 @@ struct ftl_log_type* ftl_allocate_log_entry(uint32_t block) | |||
1728 | if (ftl_remove_scattered_block((struct ftl_log_type*)0) != 0) | 1728 | if (ftl_remove_scattered_block((struct ftl_log_type*)0) != 0) |
1729 | return (struct ftl_log_type*)0; | 1729 | return (struct ftl_log_type*)0; |
1730 | entry = ftl_log; | 1730 | entry = ftl_log; |
1731 | while ((*entry).scatteredvblock != 0xFFFF) entry = &entry[1]; | 1731 | while (entry->scatteredvblock != 0xFFFF) entry = &entry[1]; |
1732 | (*entry).scatteredvblock = ftl_allocate_pool_block(); | 1732 | entry->scatteredvblock = ftl_allocate_pool_block(); |
1733 | if ((*entry).scatteredvblock == 0xFFFF) | 1733 | if (entry->scatteredvblock == 0xFFFF) |
1734 | return (struct ftl_log_type*)0; | 1734 | return (struct ftl_log_type*)0; |
1735 | } | 1735 | } |
1736 | 1736 | ||
1737 | ftl_init_log_entry(entry); | 1737 | ftl_init_log_entry(entry); |
1738 | (*entry).logicalvblock = block; | 1738 | entry->logicalvblock = block; |
1739 | (*entry).usn = ftl_cxt.nextblockusn - 1; | 1739 | entry->usn = ftl_cxt.nextblockusn - 1; |
1740 | 1740 | ||
1741 | return entry; | 1741 | return entry; |
1742 | } | 1742 | } |
@@ -1748,9 +1748,9 @@ struct ftl_log_type* ftl_allocate_log_entry(uint32_t block) | |||
1748 | uint32_t ftl_commit_cxt(void) | 1748 | uint32_t ftl_commit_cxt(void) |
1749 | { | 1749 | { |
1750 | uint32_t i; | 1750 | uint32_t i; |
1751 | uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks; | 1751 | uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks; |
1752 | uint32_t mappages = ((*ftl_nand_type).userblocks + 0x3ff) >> 10; | 1752 | uint32_t mappages = (ftl_nand_type->userblocks + 0x3ff) >> 10; |
1753 | uint32_t ctrpages = ((*ftl_nand_type).userblocks + 23 + 0x3ff) >> 10; | 1753 | uint32_t ctrpages = (ftl_nand_type->userblocks + 23 + 0x3ff) >> 10; |
1754 | uint32_t endpage = ftl_cxt.ftlctrlpage + mappages + ctrpages + 1; | 1754 | uint32_t endpage = ftl_cxt.ftlctrlpage + mappages + ctrpages + 1; |
1755 | if (endpage >= (ftl_cxt.ftlctrlpage / ppb + 1) * ppb) | 1755 | if (endpage >= (ftl_cxt.ftlctrlpage / ppb + 1) * ppb) |
1756 | ftl_cxt.ftlctrlpage |= ppb - 1; | 1756 | ftl_cxt.ftlctrlpage |= ppb - 1; |
@@ -1804,7 +1804,7 @@ uint32_t ftl_swap_blocks(void) | |||
1804 | } | 1804 | } |
1805 | } | 1805 | } |
1806 | if (maxidx == 0x14) return 0; | 1806 | if (maxidx == 0x14) return 0; |
1807 | for (i = 0; i < (*ftl_nand_type).userblocks; i++) | 1807 | for (i = 0; i < ftl_nand_type->userblocks; i++) |
1808 | { | 1808 | { |
1809 | if (ftl_erasectr[ftl_map[i]] > max) max = ftl_erasectr[ftl_map[i]]; | 1809 | if (ftl_erasectr[ftl_map[i]] > max) max = ftl_erasectr[ftl_map[i]]; |
1810 | if (ftl_get_log_entry(i) != (struct ftl_log_type*)0) continue; | 1810 | if (ftl_get_log_entry(i) != (struct ftl_log_type*)0) continue; |
@@ -1831,9 +1831,9 @@ uint32_t ftl_swap_blocks(void) | |||
1831 | uint32_t ftl_write(uint32_t sector, uint32_t count, const void* buffer) | 1831 | uint32_t ftl_write(uint32_t sector, uint32_t count, const void* buffer) |
1832 | { | 1832 | { |
1833 | uint32_t i, j, k; | 1833 | uint32_t i, j, k; |
1834 | uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks; | 1834 | uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks; |
1835 | 1835 | ||
1836 | if (sector + count > (*ftl_nand_type).userblocks * ppb) | 1836 | if (sector + count > ftl_nand_type->userblocks * ppb) |
1837 | return 1; | 1837 | return 1; |
1838 | 1838 | ||
1839 | if (count == 0) return 0; | 1839 | if (count == 0) return 0; |
@@ -1878,9 +1878,9 @@ uint32_t ftl_write(uint32_t sector, uint32_t count, const void* buffer) | |||
1878 | } | 1878 | } |
1879 | if (page == 0 && count - i >= ppb) | 1879 | if (page == 0 && count - i >= ppb) |
1880 | { | 1880 | { |
1881 | uint32_t vblock = (*logentry).scatteredvblock; | 1881 | uint32_t vblock = logentry->scatteredvblock; |
1882 | (*logentry).scatteredvblock = 0xFFFF; | 1882 | logentry->scatteredvblock = 0xFFFF; |
1883 | if ((*logentry).pagesused != 0) | 1883 | if (logentry->pagesused != 0) |
1884 | { | 1884 | { |
1885 | ftl_release_pool_block(vblock); | 1885 | ftl_release_pool_block(vblock); |
1886 | vblock = ftl_allocate_pool_block(); | 1886 | vblock = ftl_allocate_pool_block(); |
@@ -1919,7 +1919,7 @@ uint32_t ftl_write(uint32_t sector, uint32_t count, const void* buffer) | |||
1919 | } | 1919 | } |
1920 | else | 1920 | else |
1921 | { | 1921 | { |
1922 | if ((*logentry).pagesused == ppb) | 1922 | if (logentry->pagesused == ppb) |
1923 | { | 1923 | { |
1924 | ftl_remove_scattered_block(logentry); | 1924 | ftl_remove_scattered_block(logentry); |
1925 | logentry = ftl_allocate_log_entry(block); | 1925 | logentry = ftl_allocate_log_entry(block); |
@@ -1931,7 +1931,7 @@ uint32_t ftl_write(uint32_t sector, uint32_t count, const void* buffer) | |||
1931 | } | 1931 | } |
1932 | uint32_t cnt = FTL_WRITESPARE_SIZE; | 1932 | uint32_t cnt = FTL_WRITESPARE_SIZE; |
1933 | if (cnt > count - i) cnt = count - i; | 1933 | if (cnt > count - i) cnt = count - i; |
1934 | if (cnt > ppb - (*logentry).pagesused) cnt = ppb - (*logentry).pagesused; | 1934 | if (cnt > ppb - logentry->pagesused) cnt = ppb - logentry->pagesused; |
1935 | if (cnt > ppb - page) cnt = ppb - page; | 1935 | if (cnt > ppb - page) cnt = ppb - page; |
1936 | memset(&ftl_sparebuffer[0], 0xFF, 0x40 * cnt); | 1936 | memset(&ftl_sparebuffer[0], 0xFF, 0x40 * cnt); |
1937 | for (j = 0; j < cnt; j++) | 1937 | for (j = 0; j < cnt; j++) |
@@ -1939,30 +1939,30 @@ uint32_t ftl_write(uint32_t sector, uint32_t count, const void* buffer) | |||
1939 | ftl_sparebuffer[j].user.lpn = sector + i + j; | 1939 | ftl_sparebuffer[j].user.lpn = sector + i + j; |
1940 | ftl_sparebuffer[j].user.usn = ++ftl_cxt.nextblockusn; | 1940 | ftl_sparebuffer[j].user.usn = ++ftl_cxt.nextblockusn; |
1941 | ftl_sparebuffer[j].user.type = 0x40; | 1941 | ftl_sparebuffer[j].user.type = 0x40; |
1942 | if ((*logentry).pagesused + j == ppb - 1 && (*logentry).issequential) | 1942 | if (logentry->pagesused + j == ppb - 1 && logentry->issequential) |
1943 | ftl_sparebuffer[j].user.type = 0x41; | 1943 | ftl_sparebuffer[j].user.type = 0x41; |
1944 | } | 1944 | } |
1945 | uint32_t abspage = (*logentry).scatteredvblock * ppb | 1945 | uint32_t abspage = logentry->scatteredvblock * ppb |
1946 | + (*logentry).pagesused; | 1946 | + logentry->pagesused; |
1947 | (*logentry).pagesused += cnt; | 1947 | logentry->pagesused += cnt; |
1948 | if (ftl_vfl_write(abspage, cnt, &((uint8_t*)buffer)[i << 11], | 1948 | if (ftl_vfl_write(abspage, cnt, &((uint8_t*)buffer)[i << 11], |
1949 | &ftl_sparebuffer[0]) == 0) | 1949 | &ftl_sparebuffer[0]) == 0) |
1950 | { | 1950 | { |
1951 | for (j = 0; j < cnt; j++) | 1951 | for (j = 0; j < cnt; j++) |
1952 | { | 1952 | { |
1953 | if ((*logentry).pageoffsets[page + j] == 0xFFFF) | 1953 | if (logentry->pageoffsets[page + j] == 0xFFFF) |
1954 | (*logentry).pagescurrent++; | 1954 | logentry->pagescurrent++; |
1955 | (*logentry).pageoffsets[page + j] = (*logentry).pagesused - cnt + j; | 1955 | logentry->pageoffsets[page + j] = logentry->pagesused - cnt + j; |
1956 | if ((*logentry).pagesused - cnt + j + 1 != (*logentry).pagescurrent | 1956 | if (logentry->pagesused - cnt + j + 1 != logentry->pagescurrent |
1957 | || (*logentry).pageoffsets[page + j] != page + j) | 1957 | || logentry->pageoffsets[page + j] != page + j) |
1958 | (*logentry).issequential = 0; | 1958 | logentry->issequential = 0; |
1959 | } | 1959 | } |
1960 | i += cnt; | 1960 | i += cnt; |
1961 | } | 1961 | } |
1962 | else panicf("FTL: Write error: %u %u %u!", | 1962 | else panicf("FTL: Write error: %u %u %u!", |
1963 | (unsigned)sector, (unsigned)count, (unsigned)i); | 1963 | (unsigned)sector, (unsigned)count, (unsigned)i); |
1964 | } | 1964 | } |
1965 | if ((*logentry).pagesused == ppb) ftl_remove_scattered_block(logentry); | 1965 | if (logentry->pagesused == ppb) ftl_remove_scattered_block(logentry); |
1966 | } | 1966 | } |
1967 | if (ftl_cxt.swapcounter >= 300) | 1967 | if (ftl_cxt.swapcounter >= 300) |
1968 | { | 1968 | { |
@@ -1993,7 +1993,7 @@ uint32_t ftl_sync(void) | |||
1993 | { | 1993 | { |
1994 | uint32_t i; | 1994 | uint32_t i; |
1995 | uint32_t rc = 0; | 1995 | uint32_t rc = 0; |
1996 | uint32_t ppb = (*ftl_nand_type).pagesperblock * ftl_banks; | 1996 | uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks; |
1997 | if (ftl_cxt.clean_flag == 1) return 0; | 1997 | if (ftl_cxt.clean_flag == 1) return 0; |
1998 | 1998 | ||
1999 | mutex_lock(&ftl_mtx); | 1999 | mutex_lock(&ftl_mtx); |
@@ -2050,7 +2050,7 @@ uint32_t ftl_init(void) | |||
2050 | foundsignature = 0; | 2050 | foundsignature = 0; |
2051 | blockwiped = 1; | 2051 | blockwiped = 1; |
2052 | mutex_unlock(&ftl_mtx); | 2052 | mutex_unlock(&ftl_mtx); |
2053 | for (i = 0; i < (*ftl_nand_type).pagesperblock; i++) | 2053 | for (i = 0; i < ftl_nand_type->pagesperblock; i++) |
2054 | { | 2054 | { |
2055 | result = nand_read_page(0, i, ftl_buffer, (uint32_t*)0, 1, 1); | 2055 | result = nand_read_page(0, i, ftl_buffer, (uint32_t*)0, 1, 1); |
2056 | if ((result & 0x11F) == 0) | 2056 | if ((result & 0x11F) == 0) |