From 4382c68b3f1fbecb7bf731f02909bee09ec52102 Mon Sep 17 00:00:00 2001 From: Linus Nielsen Feltzing Date: Sat, 9 Nov 2002 09:23:43 +0000 Subject: Greg's improved fat_cache_sector() function, now updates the second FAT git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2814 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/fat.c | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/firmware/drivers/fat.c b/firmware/drivers/fat.c index 860e47df00..47bfd1afef 100644 --- a/firmware/drivers/fat.c +++ b/firmware/drivers/fat.c @@ -392,40 +392,50 @@ static void *cache_fat_sector(int fatsector) { int secnum = fatsector + fat_bpb.bpb_rsvdseccnt; int cache_index = secnum & FAT_CACHE_MASK; + struct fat_cache_entry *fce = &fat_cache[cache_index]; + unsigned char *sectorbuf = &fat_cache_sectors[cache_index][0]; /* Delete the cache entry if it isn't the sector we want */ - if(fat_cache[cache_index].inuse && - fat_cache[cache_index].secnum != secnum) + if(fce->inuse && fce->secnum != secnum) { /* Write back if it is dirty */ - if(fat_cache[cache_index].dirty) + if(fce->dirty) { - if(ata_write_sectors(fat_cache[cache_index].secnum + - fat_bpb.startsector, 1, - fat_cache_sectors[cache_index])) + if(ata_write_sectors(fce->secnum+fat_bpb.startsector, 1, + sectorbuf)) { panicf("cache_fat_sector() - Could not write sector %d\n", secnum); } + if(fat_bpb.bpb_numfats > 1) + { + /* Write to the second FAT */ + if(ata_write_sectors(fce->secnum+fat_bpb.startsector+ + fat_bpb.fatsize, 1, sectorbuf)) + { + panicf("cache_fat_sector() - Could not write sector %d\n", + secnum + fat_bpb.fatsize); + } + } } - fat_cache[cache_index].secnum = 8; /* Normally an unused sector */ - fat_cache[cache_index].dirty = false; - fat_cache[cache_index].inuse = false; + fce->secnum = 8; /* Normally an unused sector */ + fce->dirty = false; + fce->inuse = false; } - + /* Load the sector if it is not cached */ - if(!fat_cache[cache_index].inuse) + if(!fce->inuse) { if(ata_read_sectors(secnum + fat_bpb.startsector,1, - fat_cache_sectors[cache_index])) + sectorbuf)) { DEBUGF( "cache_fat_sector() - Could not read sector %d\n", secnum); return NULL; } - fat_cache[cache_index].inuse = true; - fat_cache[cache_index].secnum = secnum; + fce->inuse = true; + fce->secnum = secnum; } - return fat_cache_sectors[cache_index]; + return sectorbuf; } static int find_free_cluster(int startcluster) -- cgit v1.2.3