diff options
author | Frank Gevaerts <frank@gevaerts.be> | 2010-12-04 13:56:19 +0000 |
---|---|---|
committer | Frank Gevaerts <frank@gevaerts.be> | 2010-12-04 13:56:19 +0000 |
commit | f9a6bde15fc584574d5b5f11d8767c06dcc24702 (patch) | |
tree | 61d999bc08aba9a4e04772982792d74b17d889a3 /firmware | |
parent | 911f2a7dac59cab16f6c47420e2d1e12e8b60b70 (diff) | |
download | rockbox-f9a6bde15fc584574d5b5f11d8767c06dcc24702.tar.gz rockbox-f9a6bde15fc584574d5b5f11d8767c06dcc24702.zip |
Handle disk errors properly in USB storage driver. Fixes FS#10873
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28733 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/usbstack/usb_storage.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/firmware/usbstack/usb_storage.c b/firmware/usbstack/usb_storage.c index 567331d714..005697f6fa 100644 --- a/firmware/usbstack/usb_storage.c +++ b/firmware/usbstack/usb_storage.c | |||
@@ -647,7 +647,16 @@ void usb_storage_transfer_complete(int ep,int dir,int status,int length) | |||
647 | if(status==0) { | 647 | if(status==0) { |
648 | if(cur_cmd.count==0) { | 648 | if(cur_cmd.count==0) { |
649 | //logf("data sent, now send csw"); | 649 | //logf("data sent, now send csw"); |
650 | send_csw(UMS_STATUS_GOOD); | 650 | if(cur_cmd.last_result!=0) { |
651 | /* The last read failed. */ | ||
652 | send_csw(UMS_STATUS_FAIL); | ||
653 | cur_sense_data.sense_key=SENSE_MEDIUM_ERROR; | ||
654 | cur_sense_data.asc=ASC_READ_ERROR; | ||
655 | cur_sense_data.ascq=0; | ||
656 | return; | ||
657 | } | ||
658 | else | ||
659 | send_csw(UMS_STATUS_GOOD); | ||
651 | } | 660 | } |
652 | else { | 661 | else { |
653 | send_and_read_next(); | 662 | send_and_read_next(); |
@@ -716,14 +725,6 @@ bool usb_storage_control_request(struct usb_ctrlrequest* req, unsigned char* des | |||
716 | 725 | ||
717 | static void send_and_read_next(void) | 726 | static void send_and_read_next(void) |
718 | { | 727 | { |
719 | if(cur_cmd.last_result!=0) { | ||
720 | /* The last read failed. */ | ||
721 | send_csw(UMS_STATUS_FAIL); | ||
722 | cur_sense_data.sense_key=SENSE_MEDIUM_ERROR; | ||
723 | cur_sense_data.asc=ASC_READ_ERROR; | ||
724 | cur_sense_data.ascq=0; | ||
725 | return; | ||
726 | } | ||
727 | send_block_data(cur_cmd.data[cur_cmd.data_select], | 728 | send_block_data(cur_cmd.data[cur_cmd.data_select], |
728 | MIN(READ_BUFFER_SIZE,cur_cmd.count*SECTOR_SIZE)); | 729 | MIN(READ_BUFFER_SIZE,cur_cmd.count*SECTOR_SIZE)); |
729 | 730 | ||
@@ -741,10 +742,13 @@ static void send_and_read_next(void) | |||
741 | ramdisk_buffer + cur_cmd.sector*SECTOR_SIZE, | 742 | ramdisk_buffer + cur_cmd.sector*SECTOR_SIZE, |
742 | MIN(READ_BUFFER_SIZE/SECTOR_SIZE, cur_cmd.count)*SECTOR_SIZE); | 743 | MIN(READ_BUFFER_SIZE/SECTOR_SIZE, cur_cmd.count)*SECTOR_SIZE); |
743 | #else | 744 | #else |
744 | cur_cmd.last_result = storage_read_sectors(IF_MD2(cur_cmd.lun,) | 745 | int result = storage_read_sectors(IF_MD2(cur_cmd.lun,) |
745 | cur_cmd.sector, | 746 | cur_cmd.sector, |
746 | MIN(READ_BUFFER_SIZE/SECTOR_SIZE, cur_cmd.count), | 747 | MIN(READ_BUFFER_SIZE/SECTOR_SIZE, cur_cmd.count), |
747 | cur_cmd.data[cur_cmd.data_select]); | 748 | cur_cmd.data[cur_cmd.data_select]); |
749 | if(cur_cmd.last_result == 0) | ||
750 | cur_cmd.last_result = result; | ||
751 | |||
748 | #endif | 752 | #endif |
749 | } | 753 | } |
750 | } | 754 | } |