From: Stefan Brüns <stefan.bru...@rwth-aachen.de> Instead of shuffling bits from two adjacent 16 bit words, use one 16 bit word with the appropriate byte offset in the buffer.
Signed-off-by: Stefan Brüns <stefan.bru...@rwth-aachen.de> --- fs/fat/fat.c | 34 +++++----------------------------- 1 file changed, 5 insertions(+), 29 deletions(-) diff --git a/fs/fat/fat.c b/fs/fat/fat.c index 73c3dd7f85..fe899d0442 100644 --- a/fs/fat/fat.c +++ b/fs/fat/fat.c @@ -181,7 +181,6 @@ static __u32 get_fatent(fsdata *mydata, __u32 entry) __u32 bufnum; __u32 off16, offset; __u32 ret = 0x00; - __u16 val1, val2; if (CHECK_CLUST(entry, mydata->fatsize)) { printf("Error: Invalid FAT entry: 0x%08x\n", entry); @@ -243,35 +242,12 @@ static __u32 get_fatent(fsdata *mydata, __u32 entry) ret = FAT2CPU16(((__u16 *) mydata->fatbuf)[offset]); break; case 12: - off16 = (offset * 3) / 4; + off16 = (offset * 3) / 2; + ret = FAT2CPU16(*(__u16 *)(mydata->fatbuf + off16)); - switch (offset & 0x3) { - case 0: - ret = FAT2CPU16(((__u16 *) mydata->fatbuf)[off16]); - ret &= 0xfff; - break; - case 1: - val1 = FAT2CPU16(((__u16 *)mydata->fatbuf)[off16]); - val1 &= 0xf000; - val2 = FAT2CPU16(((__u16 *)mydata->fatbuf)[off16 + 1]); - val2 &= 0x00ff; - ret = (val2 << 4) | (val1 >> 12); - break; - case 2: - val1 = FAT2CPU16(((__u16 *)mydata->fatbuf)[off16]); - val1 &= 0xff00; - val2 = FAT2CPU16(((__u16 *)mydata->fatbuf)[off16 + 1]); - val2 &= 0x000f; - ret = (val2 << 8) | (val1 >> 8); - break; - case 3: - ret = FAT2CPU16(((__u16 *)mydata->fatbuf)[off16]); - ret = (ret & 0xfff0) >> 4; - break; - default: - break; - } - break; + if (offset & 0x1) + ret >>= 4; + ret &= 0xfff; } debug("FAT%d: ret: 0x%08x, entry: 0x%08x, offset: 0x%04x\n", mydata->fatsize, ret, entry, offset); -- 2.11.0 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot