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/usbstack | |
parent | 0fd94237f3aa88ca9cee80c52d3991e15d4ffa94 (diff) | |
download | rockbox-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
Diffstat (limited to 'firmware/usbstack')
-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 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 | ||
237 | static char *cbw_buffer; | ||
238 | |||
237 | static struct { | 239 | static 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) | |||
443 | void usb_storage_transfer_complete(int ep,int dir,int status,int length) | 449 | void 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; |