summaryrefslogtreecommitdiff
path: root/firmware/target
diff options
context:
space:
mode:
authorRafaël Carré <rafael.carre@gmail.com>2010-08-28 11:22:58 +0000
committerRafaël Carré <rafael.carre@gmail.com>2010-08-28 11:22:58 +0000
commit63c1769701ae9254bc99e9222c6399eefe6ce135 (patch)
tree615524eff05c46736cc67b1f9bc56e225a5ea920 /firmware/target
parentdb81bc0f163bcecbfeb219b45d4649118bcfb888 (diff)
downloadrockbox-63c1769701ae9254bc99e9222c6399eefe6ce135.tar.gz
rockbox-63c1769701ae9254bc99e9222c6399eefe6ce135.zip
AMSv2: remove a bunch of panicf() in SD driver
The driver is stable so we can use error codes for debugging Fix 2 problems in error code path: - release sd mutex - release dma module when needed git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27915 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target')
-rw-r--r--firmware/target/arm/as3525/sd-as3525v2.c43
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
979sd_transfer_error: 977sd_transfer_error:
980 panicf("transfer error : %d",ret); 978
979 dma_release();
980
981sd_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