summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Stenberg <bjorn@haxx.se>2002-08-14 16:39:39 +0000
committerBjörn Stenberg <bjorn@haxx.se>2002-08-14 16:39:39 +0000
commit30033df6fa6ddecf3b21e5decb06d159ef2b9cae (patch)
tree5436497312ed8be16234234dd3254c381abe0f15
parent63457c5c638e52349eebdce8ce16bba84723118b (diff)
downloadrockbox-30033df6fa6ddecf3b21e5decb06d159ef2b9cae.zip
rockbox-30033df6fa6ddecf3b21e5decb06d159ef2b9cae.tar.gz
rockbox-30033df6fa6ddecf3b21e5decb06d159ef2b9cae.tar.bz2
rockbox-30033df6fa6ddecf3b21e5decb06d159ef2b9cae.tar.xz
fat_read() now reads multiple sectors per ATA command
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1737 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/drivers/fat.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/firmware/drivers/fat.c b/firmware/drivers/fat.c
index 78d0f8f..6f82f5a 100644
--- a/firmware/drivers/fat.c
+++ b/firmware/drivers/fat.c
@@ -881,20 +881,14 @@ int fat_read( struct fat_file *file, int sectorcount, void* buf )
int cluster = file->nextcluster;
int sector = file->nextsector;
int numsec = file->sectornum;
+ int first = sector, last = sector;
int err, i;
if ( sector == -1 )
return 0;
- for ( i=0; i<sectorcount; i++ ) {
- err = ata_read_sectors(sector + fat_bpb.startsector, 1,
- (char*)buf+(i*SECTOR_SIZE));
- if(err) {
- DEBUGF( "fat_read() - Couldn't read sector %d"
- " (error code %d)\n", sector,err);
- return -1;
- }
-
+ /* find sequential sectors and read them all at once */
+ for (i=0; i<sectorcount; i++ ) {
numsec++;
if ( numsec >= fat_bpb.bpb_secperclus ) {
cluster = get_next_cluster(cluster);
@@ -911,6 +905,21 @@ int fat_read( struct fat_file *file, int sectorcount, void* buf )
}
else
sector++;
+
+ if ( (sector != last+1) || /* not sequential any more? */
+ (i == sectorcount-1) || /* last sector requested? */
+ (last-first+1 == 256) ) { /* max 256 sectors per ata request */
+ int count = last-first+1;
+ err = ata_read_sectors(first + fat_bpb.startsector, count, buf);
+ if(err) {
+ DEBUGF( "fat_read() - Couldn't read sector %d"
+ " (error code %d)\n", sector,err);
+ return -1;
+ }
+ ((char*)buf) += count * SECTOR_SIZE;
+ first = sector;
+ }
+ last = sector;
}
file->nextcluster = cluster;
file->nextsector = sector;