summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrank Gevaerts <frank@gevaerts.be>2009-05-18 19:45:24 +0000
committerFrank Gevaerts <frank@gevaerts.be>2009-05-18 19:45:24 +0000
commitc8d6a02c5a792f7c5d634dac8a99a82c6b4c3ad5 (patch)
tree6103b9d1e864480ec01cade6886b4537b36a3058
parent0fd94237f3aa88ca9cee80c52d3991e15d4ffa94 (diff)
downloadrockbox-c8d6a02c5a792f7c5d634dac8a99a82c6b4c3ad5.tar.gz
rockbox-c8d6a02c5a792f7c5d634dac8a99a82c6b4c3ad5.zip
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
-rw-r--r--firmware/usbstack/usb_storage.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/firmware/usbstack/usb_storage.c b/firmware/usbstack/usb_storage.c
index 73176ee93e..9ee58f8d90 100644
--- a/firmware/usbstack/usb_storage.c
+++ b/firmware/usbstack/usb_storage.c
@@ -234,6 +234,8 @@ static union {
234 char *max_lun; 234 char *max_lun;
235} tb; 235} tb;
236 236
237static char *cbw_buffer;
238
237static struct { 239static struct {
238 unsigned int sector; 240 unsigned int sector;
239 unsigned int count; 241 unsigned int count;
@@ -397,6 +399,10 @@ void usb_storage_init_connection(void)
397 399
398#if CONFIG_CPU == IMX31L || defined(CPU_TCC77X) || defined(CPU_TCC780X) || \ 400#if CONFIG_CPU == IMX31L || defined(CPU_TCC77X) || defined(CPU_TCC780X) || \
399 defined(BOOTLOADER) || CONFIG_CPU == DM320 401 defined(BOOTLOADER) || CONFIG_CPU == DM320
402 static unsigned char _cbw_buffer[BUFFER_SIZE*2]
403 USB_DEVBSS_ATTR __attribute__((aligned(32)));
404 cbw_buffer = (void *)_cbw_buffer;
405
400 static unsigned char _transfer_buffer[BUFFER_SIZE*2] 406 static unsigned char _transfer_buffer[BUFFER_SIZE*2]
401 USB_DEVBSS_ATTR __attribute__((aligned(32))); 407 USB_DEVBSS_ATTR __attribute__((aligned(32)));
402 tb.transfer_buffer = (void *)_transfer_buffer; 408 tb.transfer_buffer = (void *)_transfer_buffer;
@@ -410,14 +416,14 @@ void usb_storage_init_connection(void)
410 unsigned char * audio_buffer; 416 unsigned char * audio_buffer;
411 417
412 audio_buffer = audio_get_buffer(false,&bufsize); 418 audio_buffer = audio_get_buffer(false,&bufsize);
413 tb.transfer_buffer = 419 cbw_buffer = (void *)UNCACHED_ADDR((unsigned int)(audio_buffer+31) & 0xffffffe0);
414 (void *)UNCACHED_ADDR((unsigned int)(audio_buffer+31) & 0xffffffe0); 420 tb.transfer_buffer = cbw_buffer + 1024;
415 cpucache_invalidate(); 421 cpucache_invalidate();
416#ifdef USB_USE_RAMDISK 422#ifdef USB_USE_RAMDISK
417 ramdisk_buffer = tb.transfer_buffer + BUFFER_SIZE*2; 423 ramdisk_buffer = tb.transfer_buffer + BUFFER_SIZE*2;
418#endif 424#endif
419#endif 425#endif
420 usb_drv_recv(ep_out, tb.transfer_buffer, 1024); 426 usb_drv_recv(ep_out, cbw_buffer, 1024);
421 427
422 int i; 428 int i;
423 for(i=0;i<NUM_VOLUMES;i++) { 429 for(i=0;i<NUM_VOLUMES;i++) {
@@ -443,7 +449,7 @@ void usb_storage_disconnect(void)
443void usb_storage_transfer_complete(int ep,int dir,int status,int length) 449void usb_storage_transfer_complete(int ep,int dir,int status,int length)
444{ 450{
445 (void)ep; 451 (void)ep;
446 struct command_block_wrapper* cbw = (void*)tb.transfer_buffer; 452 struct command_block_wrapper* cbw = (void*)cbw_buffer;
447 453
448 //logf("transfer result %X %d", status, length); 454 //logf("transfer result %X %d", status, length);
449 switch(state) { 455 switch(state) {
@@ -538,7 +544,6 @@ void usb_storage_transfer_complete(int ep,int dir,int status,int length)
538 queue_broadcast(SYS_USB_READ_DATA, (cur_cmd.lun<<16)+cur_cmd.orig_count); 544 queue_broadcast(SYS_USB_READ_DATA, (cur_cmd.lun<<16)+cur_cmd.orig_count);
539 } 545 }
540#endif 546#endif
541 usb_drv_recv(ep_out, tb.transfer_buffer, 1024);
542 break; 547 break;
543 case SENDING_RESULT: 548 case SENDING_RESULT:
544 if(dir==USB_DIR_OUT) { 549 if(dir==USB_DIR_OUT) {
@@ -1093,6 +1098,8 @@ static void send_csw(int status)
1093 sizeof(struct command_status_wrapper)); 1098 sizeof(struct command_status_wrapper));
1094 state = SENDING_CSW; 1099 state = SENDING_CSW;
1095 //logf("CSW: %X",status); 1100 //logf("CSW: %X",status);
1101 /* Already start waiting for the next command */
1102 usb_drv_recv(ep_out, cbw_buffer, 1024);
1096 1103
1097 if(status == UMS_STATUS_GOOD) { 1104 if(status == UMS_STATUS_GOOD) {
1098 cur_sense_data.sense_key=0; 1105 cur_sense_data.sense_key=0;