diff options
author | Michael Sparmann <theseven@rockbox.org> | 2010-03-13 21:55:42 +0000 |
---|---|---|
committer | Michael Sparmann <theseven@rockbox.org> | 2010-03-13 21:55:42 +0000 |
commit | 9c2baa6b17cbeb0facbbdfafefab965d7bdabb6f (patch) | |
tree | b1f184b41d3d705530b93b026055bca8756bc03a /firmware/target | |
parent | afd7a860565291da254fdc4dd5f42f2292f27a35 (diff) | |
download | rockbox-9c2baa6b17cbeb0facbbdfafefab965d7bdabb6f.tar.gz rockbox-9c2baa6b17cbeb0facbbdfafefab965d7bdabb6f.zip |
Make the Nano2G FTL use the new parallel read function
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25157 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target')
-rw-r--r-- | firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c | 55 |
1 files changed, 46 insertions, 9 deletions
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c index abff716ae7..4cf55766e5 100644 --- a/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c +++ b/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c | |||
@@ -863,18 +863,55 @@ uint32_t ftl_vfl_read_fast(uint32_t vpage, void* buffer, void* sparebuffer, | |||
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; | ||
867 | uint32_t block = abspage / ((*ftl_nand_type).pagesperblock * ftl_banks); | ||
868 | uint32_t page = (abspage / ftl_banks) % (*ftl_nand_type).pagesperblock; | ||
869 | if (bank) | ||
870 | { | ||
871 | for (i = 0; i < ftl_banks; i++) | ||
872 | { | ||
873 | void* databuf = (void*)0; | ||
874 | void* sparebuf = (void*)0; | ||
875 | if (buffer) databuf = (void*)((uint32_t)buffer + 0x800 * i); | ||
876 | if (sparebuffer) sparebuf = (void*)((uint32_t)sparebuffer + 0x40 * i); | ||
877 | uint32_t ret = ftl_vfl_read(vpage + i, databuf, sparebuf, checkempty, remaponfail); | ||
878 | if (ret & 1) rc |= 1 << (i << 2); | ||
879 | if (ret & 2) rc |= 2 << (i << 2); | ||
880 | if (ret & 0x10) rc |= 4 << (i << 2); | ||
881 | if (ret & 0x100) rc |= 8 << (i << 2); | ||
882 | } | ||
883 | return rc; | ||
884 | } | ||
885 | uint32_t physblock = ftl_vfl_get_physical_block(bank, block); | ||
886 | uint32_t physpage = physblock * (*ftl_nand_type).pagesperblock + page; | ||
887 | |||
888 | rc = nand_read_page_fast(physpage, buffer, sparebuffer, 1, checkempty); | ||
889 | if (!(rc & 0xdddd)) return rc; | ||
890 | |||
866 | for (i = 0; i < ftl_banks; i++) | 891 | for (i = 0; i < ftl_banks; i++) |
867 | { | 892 | { |
868 | void* databuf = (void*)0; | 893 | if ((rc >> (i << 2)) & 0x2) continue; |
869 | void* sparebuf = (void*)0; | 894 | if ((rc >> (i << 2)) & 0xf) |
870 | if (buffer) databuf = (void*)((uint32_t)buffer + 0x800 * i); | 895 | { |
871 | if (sparebuffer) sparebuf = (void*)((uint32_t)sparebuffer + 0x40 * i); | 896 | rc &= ~(0xf << (i << 2)); |
872 | uint32_t ret = ftl_vfl_read(vpage + i, databuf, sparebuf, checkempty, remaponfail); | 897 | nand_reset(i); |
873 | if (ret & 1) rc |= 1 << (i << 2); | 898 | uint32_t ret = nand_read_page(i, physpage, |
874 | if (ret & 2) rc |= 2 << (i << 2); | 899 | (void*)((uint32_t)buffer + 0x800 * i), |
875 | if (ret & 0x10) rc |= 4 << (i << 2); | 900 | (void*)((uint32_t)sparebuffer + 0x40 * i), |
876 | if (ret & 0x100) rc |= 8 << (i << 2); | 901 | 1, checkempty); |
902 | #ifdef FTL_READONLY | ||
903 | (void)remaponfail; | ||
904 | #else | ||
905 | if (remaponfail == 1 && (ret & 0x11D) != 0 && (ret & 2) == 0) | ||
906 | ftl_vfl_schedule_block_for_remap(i, block); | ||
907 | #endif | ||
908 | if (ret & 1) rc |= 1 << (i << 2); | ||
909 | if (ret & 2) rc |= 2 << (i << 2); | ||
910 | if (ret & 0x10) rc |= 4 << (i << 2); | ||
911 | if (ret & 0x100) rc |= 8 << (i << 2); | ||
912 | } | ||
877 | } | 913 | } |
914 | |||
878 | return rc; | 915 | return rc; |
879 | } | 916 | } |
880 | 917 | ||