# HG changeset patch # User nkeynes # Date 1167351883 0 # Node ID 7c6881790cc234ab6ffa55ba5b691f9734d62755 # Parent 8864fae6592827ea7c545e47cbe01ec0e3cef189 Limit number of sectors read at once (linux driver seems to throw a hissy fit if you request too many at a time) --- a/src/gdrom/linux.c Fri Dec 29 00:23:16 2006 +0000 +++ b/src/gdrom/linux.c Fri Dec 29 00:24:43 2006 +0000 @@ -1,5 +1,5 @@ /** - * $Id: linux.c,v 1.1 2006-12-14 12:31:38 nkeynes Exp $ + * $Id: linux.c,v 1.2 2006-12-29 00:24:43 nkeynes Exp $ * * Linux cd-rom device driver * @@ -29,6 +29,7 @@ #define MAXTOCENTRIES 600 /* This is a fairly generous overestimate really */ #define MAXTOCSIZE 4 + (MAXTOCENTRIES*11) +#define MAX_SECTORS_PER_CALL 32 #define MSFTOLBA( m,s,f ) (f + (s*CD_FRAMES) + (m*CD_FRAMES*CD_SECS)) @@ -207,22 +208,31 @@ { int fd = fileno(disc->file); uint32_t real_sector = sector - CD_MSF_OFFSET; - int buflen = sector_count * 2048; + uint32_t sector_size = 2048; + int buflen = sector_count * sector_size; + int i; char cmd[12] = { 0xBE, 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - cmd[2] = (real_sector >> 24) & 0xFF; - cmd[3] = (real_sector >> 16) & 0xFF; - cmd[4] = (real_sector >> 8) & 0xFF; - cmd[5] = real_sector & 0xFF; - cmd[6] = (sector_count >> 16) & 0xFF; - cmd[7] = (sector_count >> 8) & 0xFF; - cmd[8] = sector_count & 0xFF; - cmd[9] = 0x10; + + for( i=0; i> 24) & 0xFF; + cmd[3] = (real_sector >> 16) & 0xFF; + cmd[4] = (real_sector >> 8) & 0xFF; + cmd[5] = real_sector & 0xFF; + cmd[6] = (count >> 16) & 0xFF; + cmd[7] = (count >> 8) & 0xFF; + cmd[8] = count & 0xFF; + cmd[9] = 0x10; - gdrom_error_t status = linux_send_command( fd, cmd, buf, buflen, CGC_DATA_READ ); - if( status == 0 ) { - *length = buflen; + gdrom_error_t status = linux_send_command( fd, cmd, buf, count * sector_size, CGC_DATA_READ ); + if( status != 0 ) { + return status; + } + real_sector += count; + buf += count * sector_size; } - return status; + *length = buflen; + return 0; } /**