diff options
Diffstat (limited to 'firmware/target')
-rw-r--r-- | firmware/target/arm/as3525/sd-as3525v2.c | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/firmware/target/arm/as3525/sd-as3525v2.c b/firmware/target/arm/as3525/sd-as3525v2.c index 736bbf0b15..bef2e41db6 100644 --- a/firmware/target/arm/as3525/sd-as3525v2.c +++ b/firmware/target/arm/as3525/sd-as3525v2.c | |||
@@ -837,21 +837,18 @@ static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start, | |||
837 | { | 837 | { |
838 | ret = sd_init_card(drive); | 838 | ret = sd_init_card(drive); |
839 | if (!(card_info[drive].initialized)) | 839 | if (!(card_info[drive].initialized)) |
840 | { | 840 | goto sd_transfer_error_no_dma; |
841 | panicf("card not initialised (%d)", ret); | ||
842 | goto sd_transfer_error; | ||
843 | } | ||
844 | } | 841 | } |
845 | 842 | ||
846 | if(count < 0) /* XXX: why is it signed ? */ | 843 | if(count < 0) /* XXX: why is it signed ? */ |
847 | { | 844 | { |
848 | ret = -18; | 845 | ret = -18; |
849 | goto sd_transfer_error; | 846 | goto sd_transfer_error_no_dma; |
850 | } | 847 | } |
851 | if((start+count) > card_info[drive].numblocks) | 848 | if((start+count) > card_info[drive].numblocks) |
852 | { | 849 | { |
853 | ret = -19; | 850 | ret = -19; |
854 | goto sd_transfer_error; | 851 | goto sd_transfer_error_no_dma; |
855 | } | 852 | } |
856 | 853 | ||
857 | /* skip SanDisk OF */ | 854 | /* skip SanDisk OF */ |
@@ -860,7 +857,10 @@ static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start, | |||
860 | 857 | ||
861 | /* CMD7 w/rca: Select card to put it in TRAN state */ | 858 | /* CMD7 w/rca: Select card to put it in TRAN state */ |
862 | if(!send_cmd(drive, SD_SELECT_CARD, card_info[drive].rca, MCI_NO_RESP, NULL)) | 859 | if(!send_cmd(drive, SD_SELECT_CARD, card_info[drive].rca, MCI_NO_RESP, NULL)) |
863 | return -20; | 860 | { |
861 | ret = -20; | ||
862 | goto sd_transfer_error_no_dma; | ||
863 | } | ||
864 | 864 | ||
865 | last_disk_activity = current_tick; | 865 | last_disk_activity = current_tick; |
866 | dma_retain(); | 866 | dma_retain(); |
@@ -902,14 +902,7 @@ static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start, | |||
902 | ret = sd_wait_for_tran_state(drive); | 902 | ret = sd_wait_for_tran_state(drive); |
903 | if (ret < 0) | 903 | if (ret < 0) |
904 | { | 904 | { |
905 | static const char *st[9] = { | 905 | ret -= 25; |
906 | "IDLE", "RDY", "IDENT", "STBY", "TRAN", "DATA", "RCV", | ||
907 | "PRG", "DIS"}; | ||
908 | if(ret <= -10) | ||
909 | panicf("wait for TRAN state failed (%s) %d", | ||
910 | st[(-ret / 10) % 9], drive); | ||
911 | else | ||
912 | panicf("wait for state failed"); | ||
913 | goto sd_transfer_error; | 906 | goto sd_transfer_error; |
914 | } | 907 | } |
915 | 908 | ||
@@ -926,7 +919,10 @@ static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start, | |||
926 | 919 | ||
927 | unsigned long dummy; /* if we don't ask for a response, writing fails */ | 920 | unsigned long dummy; /* if we don't ask for a response, writing fails */ |
928 | if(!send_cmd(drive, cmd, arg, MCI_RESP, &dummy)) | 921 | if(!send_cmd(drive, cmd, arg, MCI_RESP, &dummy)) |
929 | panicf("%s multiple blocks failed", write ? "write" : "read"); | 922 | { |
923 | ret = -21; | ||
924 | goto sd_transfer_error; | ||
925 | } | ||
930 | 926 | ||
931 | wakeup_wait(&transfer_completion_signal, TIMEOUT_BLOCK); | 927 | wakeup_wait(&transfer_completion_signal, TIMEOUT_BLOCK); |
932 | 928 | ||
@@ -940,8 +936,7 @@ static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start, | |||
940 | 936 | ||
941 | if(!send_cmd(drive, SD_STOP_TRANSMISSION, 0, MCI_NO_RESP, NULL)) | 937 | if(!send_cmd(drive, SD_STOP_TRANSMISSION, 0, MCI_NO_RESP, NULL)) |
942 | { | 938 | { |
943 | ret = -666; | 939 | ret = -22; |
944 | panicf("STOP TRANSMISSION failed"); | ||
945 | goto sd_transfer_error; | 940 | goto sd_transfer_error; |
946 | } | 941 | } |
947 | 942 | ||
@@ -967,7 +962,10 @@ static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start, | |||
967 | /* CMD lines are separate, not common, so we need to actively deselect */ | 962 | /* CMD lines are separate, not common, so we need to actively deselect */ |
968 | /* CMD7 w/rca =0 : deselects card & puts it in STBY state */ | 963 | /* CMD7 w/rca =0 : deselects card & puts it in STBY state */ |
969 | if(!send_cmd(drive, SD_DESELECT_CARD, 0, MCI_NO_RESP, NULL)) | 964 | if(!send_cmd(drive, SD_DESELECT_CARD, 0, MCI_NO_RESP, NULL)) |
970 | return -21; | 965 | { |
966 | ret = -23; | ||
967 | goto sd_transfer_error; | ||
968 | } | ||
971 | 969 | ||
972 | #ifndef BOOTLOADER | 970 | #ifndef BOOTLOADER |
973 | sd_enable(false); | 971 | sd_enable(false); |
@@ -977,8 +975,13 @@ static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start, | |||
977 | return 0; | 975 | return 0; |
978 | 976 | ||
979 | sd_transfer_error: | 977 | sd_transfer_error: |
980 | panicf("transfer error : %d",ret); | 978 | |
979 | dma_release(); | ||
980 | |||
981 | sd_transfer_error_no_dma: | ||
982 | |||
981 | card_info[drive].initialized = 0; | 983 | card_info[drive].initialized = 0; |
984 | mutex_unlock(&sd_mtx); | ||
982 | return ret; | 985 | return ret; |
983 | } | 986 | } |
984 | 987 | ||