summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/usbstack/usb_storage.c14
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;