summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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,
{
ret = sd_init_card(drive);
if (!(card_info[drive].initialized))
- {
- panicf("card not initialised (%d)", ret);
- goto sd_transfer_error;
- }
+ goto sd_transfer_error_no_dma;
}
if(count < 0) /* XXX: why is it signed ? */
{
ret = -18;
- goto sd_transfer_error;
+ goto sd_transfer_error_no_dma;
}
if((start+count) > card_info[drive].numblocks)
{
ret = -19;
- goto sd_transfer_error;
+ goto sd_transfer_error_no_dma;
}
/* skip SanDisk OF */
@@ -860,7 +857,10 @@ static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start,
/* CMD7 w/rca: Select card to put it in TRAN state */
if(!send_cmd(drive, SD_SELECT_CARD, card_info[drive].rca, MCI_NO_RESP, NULL))
- return -20;
+ {
+ ret = -20;
+ goto sd_transfer_error_no_dma;
+ }
last_disk_activity = current_tick;
dma_retain();
@@ -902,14 +902,7 @@ static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start,
ret = sd_wait_for_tran_state(drive);
if (ret < 0)
{
- static const char *st[9] = {
- "IDLE", "RDY", "IDENT", "STBY", "TRAN", "DATA", "RCV",
- "PRG", "DIS"};
- if(ret <= -10)
- panicf("wait for TRAN state failed (%s) %d",
- st[(-ret / 10) % 9], drive);
- else
- panicf("wait for state failed");
+ ret -= 25;
goto sd_transfer_error;
}
@@ -926,7 +919,10 @@ static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start,
unsigned long dummy; /* if we don't ask for a response, writing fails */
if(!send_cmd(drive, cmd, arg, MCI_RESP, &dummy))
- panicf("%s multiple blocks failed", write ? "write" : "read");
+ {
+ ret = -21;
+ goto sd_transfer_error;
+ }
wakeup_wait(&transfer_completion_signal, TIMEOUT_BLOCK);
@@ -940,8 +936,7 @@ static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start,
if(!send_cmd(drive, SD_STOP_TRANSMISSION, 0, MCI_NO_RESP, NULL))
{
- ret = -666;
- panicf("STOP TRANSMISSION failed");
+ ret = -22;
goto sd_transfer_error;
}
@@ -967,7 +962,10 @@ static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start,
/* CMD lines are separate, not common, so we need to actively deselect */
/* CMD7 w/rca =0 : deselects card & puts it in STBY state */
if(!send_cmd(drive, SD_DESELECT_CARD, 0, MCI_NO_RESP, NULL))
- return -21;
+ {
+ ret = -23;
+ goto sd_transfer_error;
+ }
#ifndef BOOTLOADER
sd_enable(false);
@@ -977,8 +975,13 @@ static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start,
return 0;
sd_transfer_error:
- panicf("transfer error : %d",ret);
+
+ dma_release();
+
+sd_transfer_error_no_dma:
+
card_info[drive].initialized = 0;
+ mutex_unlock(&sd_mtx);
return ret;
}