summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorFrank Gevaerts <frank@gevaerts.be>2010-12-04 13:56:19 +0000
committerFrank Gevaerts <frank@gevaerts.be>2010-12-04 13:56:19 +0000
commitf9a6bde15fc584574d5b5f11d8767c06dcc24702 (patch)
tree61d999bc08aba9a4e04772982792d74b17d889a3 /firmware
parent911f2a7dac59cab16f6c47420e2d1e12e8b60b70 (diff)
downloadrockbox-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.c24
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
717static void send_and_read_next(void) 726static 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}