diff -ru rockbox-19989-dma03/apps/buffering.c rockbox-19989-dev/apps/buffering.c --- rockbox-19989-dma03/apps/buffering.c 2009-02-12 16:32:18.944600000 -0500 +++ rockbox-19989-dev/apps/buffering.c 2009-02-12 16:38:05.388600000 -0500 @@ -86,7 +86,11 @@ /* default point to start buffer refill */ #define BUFFERING_DEFAULT_WATERMARK (1024*128) /* amount of data to read in one read() call */ +#if defined(HAVE_LBA48) && defined(HAVE_ATA_DMA) +#define BUFFERING_DEFAULT_FILECHUNK (2048*512) /* FIXME: For testing only */ +#else #define BUFFERING_DEFAULT_FILECHUNK (1024*256) /* AB: enlarged to 256KB */ +#endif #define BUF_HANDLE_MASK 0x7FFFFFFF @@ -606,8 +610,12 @@ size_t copy_n = MIN( MIN(h->filerem, BUFFERING_DEFAULT_FILECHUNK), buffer_len - h->widx); - /* stop copying if it would overwrite the reading position */ - if (RINGBUF_ADD_CROSS(h->widx, copy_n, buf_ridx) >= 0) + /* Don't overwrite the reading position */ + if (buf_ridx >= h->widx) + copy_n = MIN(buf_ridx - h->widx, copy_n); + + /* Check if buffer is full */ + if (copy_n == 0) return false; /* This would read into the next handle, this is broken */ diff -ru rockbox-19989-dma03/firmware/drivers/ata.c rockbox-19989-dev/firmware/drivers/ata.c --- rockbox-19989-dma03/firmware/drivers/ata.c 2009-02-12 16:32:11.754600000 -0500 +++ rockbox-19989-dev/firmware/drivers/ata.c 2009-02-12 15:45:53.056400000 -0500 @@ -1483,7 +1483,7 @@ #ifdef HAVE_LBA48 if (identify_info[83] & 0x0400 /* 48 bit address support */ - && total_sectors == 0x0FFFFFFF) /* and disk size >= 128 GiB */ +) // && total_sectors == 0x0FFFFFFF) /* and disk size >= 128 GiB */ { /* (needs BigLBA addressing) */ if (identify_info[102] || identify_info[103]) panicf("Unsupported disk size: >= 2^32 sectors"); diff -ru rockbox-19989-dma03/firmware/drivers/fat.c rockbox-19989-dev/firmware/drivers/fat.c --- rockbox-19989-dma03/firmware/drivers/fat.c 2008-12-24 13:34:52.590000000 -0500 +++ rockbox-19989-dev/firmware/drivers/fat.c 2009-02-12 16:08:05.787600000 -0500 @@ -2172,7 +2172,11 @@ first = sector; if ( ((sector != first) && (sector != last+1)) || /* not sequential */ +#if defined(HAVE_LBA48) && defined(HAVE_ATA_DMA) + (last-first+1 == 2048) ) { /* Max 2048 sectors per pp502x DMA request */ +#else (last-first+1 == 256) ) { /* max 256 sectors per ata request */ +#endif long count = last - first + 1; rc = transfer(IF_MV2(fat_bpb,) first, count, buf, write ); if (rc < 0) diff -ru rockbox-19989-dma03/firmware/export/config-ipodvideo.h rockbox-19989-dev/firmware/export/config-ipodvideo.h --- rockbox-19989-dma03/firmware/export/config-ipodvideo.h 2009-02-12 16:32:11.713600000 -0500 +++ rockbox-19989-dev/firmware/export/config-ipodvideo.h 2009-02-12 15:00:14.755400000 -0500 @@ -206,4 +206,7 @@ /* Define this to add support for ATA DMA */ #define HAVE_ATA_DMA + +/* Enable LBA48 for long reads */ +#define HAVE_LBA48 #endif