diff options
Diffstat (limited to 'firmware/usbstack/usb_storage.c')
-rw-r--r-- | firmware/usbstack/usb_storage.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/firmware/usbstack/usb_storage.c b/firmware/usbstack/usb_storage.c index c528a3a21d..0b433764cf 100644 --- a/firmware/usbstack/usb_storage.c +++ b/firmware/usbstack/usb_storage.c | |||
@@ -673,6 +673,8 @@ static void handle_scsi(struct command_block_wrapper* cbw) | |||
673 | 673 | ||
674 | case SCSI_MODE_SENSE_10: { | 674 | case SCSI_MODE_SENSE_10: { |
675 | if(! lun_present) { | 675 | if(! lun_present) { |
676 | /* Windows expects an empty command result before the csw */ | ||
677 | usb_drv_send(usb_endpoint, 0, 0); | ||
676 | send_csw(UMS_STATUS_FAIL); | 678 | send_csw(UMS_STATUS_FAIL); |
677 | cur_sense_data.sense_key=SENSE_NOT_READY; | 679 | cur_sense_data.sense_key=SENSE_NOT_READY; |
678 | cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT; | 680 | cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT; |
@@ -717,6 +719,8 @@ static void handle_scsi(struct command_block_wrapper* cbw) | |||
717 | MIN(sizeof(struct mode_sense_data_10), length)); | 719 | MIN(sizeof(struct mode_sense_data_10), length)); |
718 | break; | 720 | break; |
719 | default: | 721 | default: |
722 | /* Windows expects an empty command result before the csw */ | ||
723 | usb_drv_send(usb_endpoint, 0, 0); | ||
720 | send_csw(UMS_STATUS_FAIL); | 724 | send_csw(UMS_STATUS_FAIL); |
721 | cur_sense_data.sense_key=SENSE_ILLEGAL_REQUEST; | 725 | cur_sense_data.sense_key=SENSE_ILLEGAL_REQUEST; |
722 | cur_sense_data.asc=ASC_INVALID_FIELD_IN_CBD; | 726 | cur_sense_data.asc=ASC_INVALID_FIELD_IN_CBD; |
@@ -727,6 +731,8 @@ static void handle_scsi(struct command_block_wrapper* cbw) | |||
727 | } | 731 | } |
728 | case SCSI_MODE_SENSE_6: { | 732 | case SCSI_MODE_SENSE_6: { |
729 | if(! lun_present) { | 733 | if(! lun_present) { |
734 | /* Windows expects an empty command result before the csw */ | ||
735 | usb_drv_send(usb_endpoint, 0, 0); | ||
730 | send_csw(UMS_STATUS_FAIL); | 736 | send_csw(UMS_STATUS_FAIL); |
731 | cur_sense_data.sense_key=SENSE_NOT_READY; | 737 | cur_sense_data.sense_key=SENSE_NOT_READY; |
732 | cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT; | 738 | cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT; |
@@ -770,6 +776,8 @@ static void handle_scsi(struct command_block_wrapper* cbw) | |||
770 | MIN(sizeof(struct mode_sense_data_6), length)); | 776 | MIN(sizeof(struct mode_sense_data_6), length)); |
771 | break; | 777 | break; |
772 | default: | 778 | default: |
779 | /* Windows expects an empty command result before the csw */ | ||
780 | usb_drv_send(usb_endpoint, 0, 0); | ||
773 | send_csw(UMS_STATUS_FAIL); | 781 | send_csw(UMS_STATUS_FAIL); |
774 | cur_sense_data.sense_key=SENSE_ILLEGAL_REQUEST; | 782 | cur_sense_data.sense_key=SENSE_ILLEGAL_REQUEST; |
775 | cur_sense_data.asc=ASC_INVALID_FIELD_IN_CBD; | 783 | cur_sense_data.asc=ASC_INVALID_FIELD_IN_CBD; |
@@ -819,6 +827,8 @@ static void handle_scsi(struct command_block_wrapper* cbw) | |||
819 | } | 827 | } |
820 | else | 828 | else |
821 | { | 829 | { |
830 | /* Windows expects an empty command result before the csw */ | ||
831 | usb_drv_send(usb_endpoint, 0, 0); | ||
822 | send_csw(UMS_STATUS_FAIL); | 832 | send_csw(UMS_STATUS_FAIL); |
823 | cur_sense_data.sense_key=SENSE_NOT_READY; | 833 | cur_sense_data.sense_key=SENSE_NOT_READY; |
824 | cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT; | 834 | cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT; |
@@ -841,6 +851,8 @@ static void handle_scsi(struct command_block_wrapper* cbw) | |||
841 | } | 851 | } |
842 | else | 852 | else |
843 | { | 853 | { |
854 | /* Windows expects an empty command result before the csw */ | ||
855 | usb_drv_send(usb_endpoint, 0, 0); | ||
844 | send_csw(UMS_STATUS_FAIL); | 856 | send_csw(UMS_STATUS_FAIL); |
845 | cur_sense_data.sense_key=SENSE_NOT_READY; | 857 | cur_sense_data.sense_key=SENSE_NOT_READY; |
846 | cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT; | 858 | cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT; |
@@ -852,6 +864,8 @@ static void handle_scsi(struct command_block_wrapper* cbw) | |||
852 | case SCSI_READ_10: | 864 | case SCSI_READ_10: |
853 | logf("scsi read10 %d",lun); | 865 | logf("scsi read10 %d",lun); |
854 | if(! lun_present) { | 866 | if(! lun_present) { |
867 | /* Windows expects an empty command result before the csw */ | ||
868 | usb_drv_send(usb_endpoint, 0, 0); | ||
855 | send_csw(UMS_STATUS_FAIL); | 869 | send_csw(UMS_STATUS_FAIL); |
856 | cur_sense_data.sense_key=SENSE_NOT_READY; | 870 | cur_sense_data.sense_key=SENSE_NOT_READY; |
857 | cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT; | 871 | cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT; |