diff options
| author | Frank Gevaerts <frank@gevaerts.be> | 2009-02-28 19:39:28 +0000 |
|---|---|---|
| committer | Frank Gevaerts <frank@gevaerts.be> | 2009-02-28 19:39:28 +0000 |
| commit | ec602b7e7512b24d7b6de22df97c824ecddc6bd3 (patch) | |
| tree | e2b3c66c268603be78641dc6929eb17748febcb4 /firmware/usbstack | |
| parent | 69a534936976817eddd135434e6723f9ffc3cfd6 (diff) | |
| download | rockbox-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.c | 15 |
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); |