Speed up USB storage by being a bit smarter in ordering transfer setups

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20982 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Frank Gevaerts 2009-05-18 19:45:24 +00:00
parent 0fd94237f3
commit c8d6a02c5a

View file

@ -234,6 +234,8 @@ static union {
char *max_lun; char *max_lun;
} tb; } tb;
static char *cbw_buffer;
static struct { static struct {
unsigned int sector; unsigned int sector;
unsigned int count; unsigned int count;
@ -397,6 +399,10 @@ void usb_storage_init_connection(void)
#if CONFIG_CPU == IMX31L || defined(CPU_TCC77X) || defined(CPU_TCC780X) || \ #if CONFIG_CPU == IMX31L || defined(CPU_TCC77X) || defined(CPU_TCC780X) || \
defined(BOOTLOADER) || CONFIG_CPU == DM320 defined(BOOTLOADER) || CONFIG_CPU == DM320
static unsigned char _cbw_buffer[BUFFER_SIZE*2]
USB_DEVBSS_ATTR __attribute__((aligned(32)));
cbw_buffer = (void *)_cbw_buffer;
static unsigned char _transfer_buffer[BUFFER_SIZE*2] static unsigned char _transfer_buffer[BUFFER_SIZE*2]
USB_DEVBSS_ATTR __attribute__((aligned(32))); USB_DEVBSS_ATTR __attribute__((aligned(32)));
tb.transfer_buffer = (void *)_transfer_buffer; tb.transfer_buffer = (void *)_transfer_buffer;
@ -410,14 +416,14 @@ void usb_storage_init_connection(void)
unsigned char * audio_buffer; unsigned char * audio_buffer;
audio_buffer = audio_get_buffer(false,&bufsize); audio_buffer = audio_get_buffer(false,&bufsize);
tb.transfer_buffer = cbw_buffer = (void *)UNCACHED_ADDR((unsigned int)(audio_buffer+31) & 0xffffffe0);
(void *)UNCACHED_ADDR((unsigned int)(audio_buffer+31) & 0xffffffe0); tb.transfer_buffer = cbw_buffer + 1024;
cpucache_invalidate(); cpucache_invalidate();
#ifdef USB_USE_RAMDISK #ifdef USB_USE_RAMDISK
ramdisk_buffer = tb.transfer_buffer + BUFFER_SIZE*2; ramdisk_buffer = tb.transfer_buffer + BUFFER_SIZE*2;
#endif #endif
#endif #endif
usb_drv_recv(ep_out, tb.transfer_buffer, 1024); usb_drv_recv(ep_out, cbw_buffer, 1024);
int i; int i;
for(i=0;i<NUM_VOLUMES;i++) { for(i=0;i<NUM_VOLUMES;i++) {
@ -443,7 +449,7 @@ void usb_storage_disconnect(void)
void usb_storage_transfer_complete(int ep,int dir,int status,int length) void usb_storage_transfer_complete(int ep,int dir,int status,int length)
{ {
(void)ep; (void)ep;
struct command_block_wrapper* cbw = (void*)tb.transfer_buffer; struct command_block_wrapper* cbw = (void*)cbw_buffer;
//logf("transfer result %X %d", status, length); //logf("transfer result %X %d", status, length);
switch(state) { switch(state) {
@ -538,7 +544,6 @@ void usb_storage_transfer_complete(int ep,int dir,int status,int length)
queue_broadcast(SYS_USB_READ_DATA, (cur_cmd.lun<<16)+cur_cmd.orig_count); queue_broadcast(SYS_USB_READ_DATA, (cur_cmd.lun<<16)+cur_cmd.orig_count);
} }
#endif #endif
usb_drv_recv(ep_out, tb.transfer_buffer, 1024);
break; break;
case SENDING_RESULT: case SENDING_RESULT:
if(dir==USB_DIR_OUT) { if(dir==USB_DIR_OUT) {
@ -1093,6 +1098,8 @@ static void send_csw(int status)
sizeof(struct command_status_wrapper)); sizeof(struct command_status_wrapper));
state = SENDING_CSW; state = SENDING_CSW;
//logf("CSW: %X",status); //logf("CSW: %X",status);
/* Already start waiting for the next command */
usb_drv_recv(ep_out, cbw_buffer, 1024);
if(status == UMS_STATUS_GOOD) { if(status == UMS_STATUS_GOOD) {
cur_sense_data.sense_key=0; cur_sense_data.sense_key=0;