Skip to content

Commit

Permalink
[sdmmc] Change internal read/write retries
Browse files Browse the repository at this point in the history
This can fix busy errors when writing to sd cards.
Additionally it now returns properly on success
  • Loading branch information
CTCaer committed May 28, 2018
1 parent 3877edd commit 391c28d
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 6 deletions.
4 changes: 2 additions & 2 deletions ipl/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -867,8 +867,8 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
EPRINTFARGS("Error reading %d blocks @ LBA %08X from eMMC (try %d), retrying...",
num, lba_curr, ++retryCount);

sleep(500000);
if (retryCount >= 10)
sleep(150000);
if (retryCount >= 3)
{
gfx_con_setfontsz(&gfx_con, 16);
EPRINTFARGS("\nFailed to read %d blocks @ LBA %08X\nfrom eMMC. Aborting..\n",
Expand Down
20 changes: 16 additions & 4 deletions ipl/sdmmc.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,15 +165,27 @@ static int _sdmmc_storage_readwrite(sdmmc_storage_t *storage, u32 sector, u32 nu
while (num_sectors)
{
u32 blkcnt = 0;
//Retry once on error.
if (!_sdmmc_storage_readwrite_ex(storage, &blkcnt, sector, MIN(num_sectors, 0xFFFF), bbuf, is_write))
if (!_sdmmc_storage_readwrite_ex(storage, &blkcnt, sector, MIN(num_sectors, 0xFFFF), bbuf, is_write))
return 0;
//Retry 9 times on error.
u32 retries = 10;
do
{
if (_sdmmc_storage_readwrite_ex(storage, &blkcnt, sector, MIN(num_sectors, 0xFFFF), bbuf, is_write))
goto out;
else
retries--;

sleep(500000);

} while (retries);
return 0;

out:;
DPRINTF("readwrite: %08X\n", blkcnt);
sector += blkcnt;
num_sectors -= blkcnt;
bbuf += 512 * blkcnt;
}
return 1;
}

int sdmmc_storage_read(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf)
Expand Down

0 comments on commit 391c28d

Please sign in to comment.