mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-12-08 12:45:26 -05:00
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
This commit is contained in:
parent
db81bc0f16
commit
63c1769701
1 changed files with 23 additions and 20 deletions
|
|
@ -837,21 +837,18 @@ static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start,
|
||||||
{
|
{
|
||||||
ret = sd_init_card(drive);
|
ret = sd_init_card(drive);
|
||||||
if (!(card_info[drive].initialized))
|
if (!(card_info[drive].initialized))
|
||||||
{
|
goto sd_transfer_error_no_dma;
|
||||||
panicf("card not initialised (%d)", ret);
|
|
||||||
goto sd_transfer_error;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(count < 0) /* XXX: why is it signed ? */
|
if(count < 0) /* XXX: why is it signed ? */
|
||||||
{
|
{
|
||||||
ret = -18;
|
ret = -18;
|
||||||
goto sd_transfer_error;
|
goto sd_transfer_error_no_dma;
|
||||||
}
|
}
|
||||||
if((start+count) > card_info[drive].numblocks)
|
if((start+count) > card_info[drive].numblocks)
|
||||||
{
|
{
|
||||||
ret = -19;
|
ret = -19;
|
||||||
goto sd_transfer_error;
|
goto sd_transfer_error_no_dma;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* skip SanDisk OF */
|
/* 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 */
|
/* 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))
|
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;
|
last_disk_activity = current_tick;
|
||||||
dma_retain();
|
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);
|
ret = sd_wait_for_tran_state(drive);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
static const char *st[9] = {
|
ret -= 25;
|
||||||
"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");
|
|
||||||
goto sd_transfer_error;
|
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 */
|
unsigned long dummy; /* if we don't ask for a response, writing fails */
|
||||||
if(!send_cmd(drive, cmd, arg, MCI_RESP, &dummy))
|
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);
|
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))
|
if(!send_cmd(drive, SD_STOP_TRANSMISSION, 0, MCI_NO_RESP, NULL))
|
||||||
{
|
{
|
||||||
ret = -666;
|
ret = -22;
|
||||||
panicf("STOP TRANSMISSION failed");
|
|
||||||
goto sd_transfer_error;
|
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 */
|
/* CMD lines are separate, not common, so we need to actively deselect */
|
||||||
/* CMD7 w/rca =0 : deselects card & puts it in STBY state */
|
/* CMD7 w/rca =0 : deselects card & puts it in STBY state */
|
||||||
if(!send_cmd(drive, SD_DESELECT_CARD, 0, MCI_NO_RESP, NULL))
|
if(!send_cmd(drive, SD_DESELECT_CARD, 0, MCI_NO_RESP, NULL))
|
||||||
return -21;
|
{
|
||||||
|
ret = -23;
|
||||||
|
goto sd_transfer_error;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef BOOTLOADER
|
#ifndef BOOTLOADER
|
||||||
sd_enable(false);
|
sd_enable(false);
|
||||||
|
|
@ -977,8 +975,13 @@ static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
sd_transfer_error:
|
sd_transfer_error:
|
||||||
panicf("transfer error : %d",ret);
|
|
||||||
|
dma_release();
|
||||||
|
|
||||||
|
sd_transfer_error_no_dma:
|
||||||
|
|
||||||
card_info[drive].initialized = 0;
|
card_info[drive].initialized = 0;
|
||||||
|
mutex_unlock(&sd_mtx);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue