diff options
| author | Frank Gevaerts <frank@gevaerts.be> | 2009-05-18 19:45:24 +0000 |
|---|---|---|
| committer | Frank Gevaerts <frank@gevaerts.be> | 2009-05-18 19:45:24 +0000 |
| commit | c8d6a02c5a792f7c5d634dac8a99a82c6b4c3ad5 (patch) | |
| tree | 6103b9d1e864480ec01cade6886b4537b36a3058 /firmware | |
| parent | 0fd94237f3aa88ca9cee80c52d3991e15d4ffa94 (diff) | |
| download | rockbox-c8d6a02c5a792f7c5d634dac8a99a82c6b4c3ad5.zip rockbox-c8d6a02c5a792f7c5d634dac8a99a82c6b4c3ad5.tar.gz rockbox-c8d6a02c5a792f7c5d634dac8a99a82c6b4c3ad5.tar.bz2 rockbox-c8d6a02c5a792f7c5d634dac8a99a82c6b4c3ad5.tar.xz | |
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
Diffstat (limited to 'firmware')
| -rw-r--r-- | firmware/usbstack/usb_storage.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/firmware/usbstack/usb_storage.c b/firmware/usbstack/usb_storage.c index 73176ee..9ee58f8 100644 --- a/firmware/usbstack/usb_storage.c +++ b/firmware/usbstack/usb_storage.c @@ -234,6 +234,8 @@ static union { char *max_lun; } tb; +static char *cbw_buffer; + static struct { unsigned int sector; unsigned int count; @@ -397,6 +399,10 @@ void usb_storage_init_connection(void) #if CONFIG_CPU == IMX31L || defined(CPU_TCC77X) || defined(CPU_TCC780X) || \ 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] USB_DEVBSS_ATTR __attribute__((aligned(32))); tb.transfer_buffer = (void *)_transfer_buffer; @@ -410,14 +416,14 @@ void usb_storage_init_connection(void) unsigned char * audio_buffer; audio_buffer = audio_get_buffer(false,&bufsize); - tb.transfer_buffer = - (void *)UNCACHED_ADDR((unsigned int)(audio_buffer+31) & 0xffffffe0); + cbw_buffer = (void *)UNCACHED_ADDR((unsigned int)(audio_buffer+31) & 0xffffffe0); + tb.transfer_buffer = cbw_buffer + 1024; cpucache_invalidate(); #ifdef USB_USE_RAMDISK ramdisk_buffer = tb.transfer_buffer + BUFFER_SIZE*2; #endif #endif - usb_drv_recv(ep_out, tb.transfer_buffer, 1024); + usb_drv_recv(ep_out, cbw_buffer, 1024); int 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)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); 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); } #endif - usb_drv_recv(ep_out, tb.transfer_buffer, 1024); break; case SENDING_RESULT: if(dir==USB_DIR_OUT) { @@ -1093,6 +1098,8 @@ static void send_csw(int status) sizeof(struct command_status_wrapper)); state = SENDING_CSW; //logf("CSW: %X",status); + /* Already start waiting for the next command */ + usb_drv_recv(ep_out, cbw_buffer, 1024); if(status == UMS_STATUS_GOOD) { cur_sense_data.sense_key=0; |