summaryrefslogtreecommitdiff
path: root/firmware/usbstack
diff options
context:
space:
mode:
authorFrank Gevaerts <frank@gevaerts.be>2009-02-28 19:39:28 +0000
committerFrank Gevaerts <frank@gevaerts.be>2009-02-28 19:39:28 +0000
commitec602b7e7512b24d7b6de22df97c824ecddc6bd3 (patch)
treee2b3c66c268603be78641dc6929eb17748febcb4 /firmware/usbstack
parent69a534936976817eddd135434e6723f9ffc3cfd6 (diff)
downloadrockbox-ec602b7e7512b24d7b6de22df97c824ecddc6bd3.zip
rockbox-ec602b7e7512b24d7b6de22df97c824ecddc6bd3.tar.gz
rockbox-ec602b7e7512b24d7b6de22df97c824ecddc6bd3.tar.bz2
rockbox-ec602b7e7512b24d7b6de22df97c824ecddc6bd3.tar.xz
send the USB broadcast events at a less busy time
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20142 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/usbstack')
-rw-r--r--firmware/usbstack/usb_storage.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/firmware/usbstack/usb_storage.c b/firmware/usbstack/usb_storage.c
index 5f28638..9b0625e 100644
--- a/firmware/usbstack/usb_storage.c
+++ b/firmware/usbstack/usb_storage.c
@@ -235,6 +235,8 @@ static union {
static struct {
unsigned int sector;
unsigned int count;
+ unsigned int orig_count;
+ unsigned int cur_cmd;
unsigned int tag;
unsigned int lun;
unsigned char *data[2];
@@ -519,6 +521,14 @@ void usb_storage_transfer_complete(int ep,int dir,int status,int length)
}
//logf("csw sent, now go back to idle");
state = WAITING_FOR_COMMAND;
+ if(cur_cmd.cur_cmd == SCSI_WRITE_10)
+ {
+ queue_broadcast(SYS_USB_WRITE_DATA, (cur_cmd.lun<<16)+cur_cmd.orig_count);
+ }
+ else if(cur_cmd.cur_cmd == SCSI_READ_10)
+ {
+ queue_broadcast(SYS_USB_READ_DATA, (cur_cmd.lun<<16)+cur_cmd.orig_count);
+ }
usb_drv_recv(ep_out, tb.transfer_buffer, 1024);
break;
case SENDING_RESULT:
@@ -688,6 +698,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
cur_cmd.tag = cbw->tag;
cur_cmd.lun = lun;
+ cur_cmd.cur_cmd = cbw->command_block[0];
switch (cbw->command_block[0]) {
case SCSI_TEST_UNIT_READY:
@@ -964,9 +975,9 @@ static void handle_scsi(struct command_block_wrapper* cbw)
cur_cmd.count = block_size_mult *
(cbw->command_block[7] << 8 |
cbw->command_block[8]);
+ cur_cmd.orig_count = cur_cmd.count;
//logf("scsi read %d %d", cur_cmd.sector, cur_cmd.count);
- queue_broadcast(SYS_USB_READ_DATA, (lun<<16)+cur_cmd.count);
if((cur_cmd.sector + cur_cmd.count) > block_count) {
send_csw(UMS_STATUS_FAIL);
@@ -1016,8 +1027,8 @@ static void handle_scsi(struct command_block_wrapper* cbw)
cur_cmd.count = block_size_mult *
(cbw->command_block[7] << 8 |
cbw->command_block[8]);
+ cur_cmd.orig_count = cur_cmd.count;
- queue_broadcast(SYS_USB_WRITE_DATA, (lun<<16)+cur_cmd.count);
/* expect data */
if((cur_cmd.sector + cur_cmd.count) > block_count) {
send_csw(UMS_STATUS_FAIL);