summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 5f28638224..9b0625e4e2 100644
--- a/firmware/usbstack/usb_storage.c
+++ b/firmware/usbstack/usb_storage.c
@@ -235,6 +235,8 @@ static union {
235static struct { 235static struct {
236 unsigned int sector; 236 unsigned int sector;
237 unsigned int count; 237 unsigned int count;
238 unsigned int orig_count;
239 unsigned int cur_cmd;
238 unsigned int tag; 240 unsigned int tag;
239 unsigned int lun; 241 unsigned int lun;
240 unsigned char *data[2]; 242 unsigned char *data[2];
@@ -519,6 +521,14 @@ void usb_storage_transfer_complete(int ep,int dir,int status,int length)
519 } 521 }
520 //logf("csw sent, now go back to idle"); 522 //logf("csw sent, now go back to idle");
521 state = WAITING_FOR_COMMAND; 523 state = WAITING_FOR_COMMAND;
524 if(cur_cmd.cur_cmd == SCSI_WRITE_10)
525 {
526 queue_broadcast(SYS_USB_WRITE_DATA, (cur_cmd.lun<<16)+cur_cmd.orig_count);
527 }
528 else if(cur_cmd.cur_cmd == SCSI_READ_10)
529 {
530 queue_broadcast(SYS_USB_READ_DATA, (cur_cmd.lun<<16)+cur_cmd.orig_count);
531 }
522 usb_drv_recv(ep_out, tb.transfer_buffer, 1024); 532 usb_drv_recv(ep_out, tb.transfer_buffer, 1024);
523 break; 533 break;
524 case SENDING_RESULT: 534 case SENDING_RESULT:
@@ -688,6 +698,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
688 698
689 cur_cmd.tag = cbw->tag; 699 cur_cmd.tag = cbw->tag;
690 cur_cmd.lun = lun; 700 cur_cmd.lun = lun;
701 cur_cmd.cur_cmd = cbw->command_block[0];
691 702
692 switch (cbw->command_block[0]) { 703 switch (cbw->command_block[0]) {
693 case SCSI_TEST_UNIT_READY: 704 case SCSI_TEST_UNIT_READY:
@@ -964,9 +975,9 @@ static void handle_scsi(struct command_block_wrapper* cbw)
964 cur_cmd.count = block_size_mult * 975 cur_cmd.count = block_size_mult *
965 (cbw->command_block[7] << 8 | 976 (cbw->command_block[7] << 8 |
966 cbw->command_block[8]); 977 cbw->command_block[8]);
978 cur_cmd.orig_count = cur_cmd.count;
967 979
968 //logf("scsi read %d %d", cur_cmd.sector, cur_cmd.count); 980 //logf("scsi read %d %d", cur_cmd.sector, cur_cmd.count);
969 queue_broadcast(SYS_USB_READ_DATA, (lun<<16)+cur_cmd.count);
970 981
971 if((cur_cmd.sector + cur_cmd.count) > block_count) { 982 if((cur_cmd.sector + cur_cmd.count) > block_count) {
972 send_csw(UMS_STATUS_FAIL); 983 send_csw(UMS_STATUS_FAIL);
@@ -1016,8 +1027,8 @@ static void handle_scsi(struct command_block_wrapper* cbw)
1016 cur_cmd.count = block_size_mult * 1027 cur_cmd.count = block_size_mult *
1017 (cbw->command_block[7] << 8 | 1028 (cbw->command_block[7] << 8 |
1018 cbw->command_block[8]); 1029 cbw->command_block[8]);
1030 cur_cmd.orig_count = cur_cmd.count;
1019 1031
1020 queue_broadcast(SYS_USB_WRITE_DATA, (lun<<16)+cur_cmd.count);
1021 /* expect data */ 1032 /* expect data */
1022 if((cur_cmd.sector + cur_cmd.count) > block_count) { 1033 if((cur_cmd.sector + cur_cmd.count) > block_count) {
1023 send_csw(UMS_STATUS_FAIL); 1034 send_csw(UMS_STATUS_FAIL);