From 30033df6fa6ddecf3b21e5decb06d159ef2b9cae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Stenberg?= Date: Wed, 14 Aug 2002 16:39:39 +0000 Subject: [PATCH] fat_read() now reads multiple sectors per ATA command git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1737 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/fat.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/firmware/drivers/fat.c b/firmware/drivers/fat.c index 78d0f8ff44..6f82f5ab36 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= 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;