diff options
-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 5f28638224..9b0625e4e2 100644 --- a/firmware/usbstack/usb_storage.c +++ b/firmware/usbstack/usb_storage.c | |||
@@ -235,6 +235,8 @@ static union { | |||
235 | static struct { | 235 | static 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); |