Index: debug-as3525.c =================================================================== --- debug-as3525.c (revision 27164) +++ debug-as3525.c (working copy) @@ -268,6 +268,30 @@ { while(1) { + int i; + extern int sd_cmds_submitted[NUM_VOLUMES]; + extern int sd_cmds_errors[NUM_VOLUMES]; + extern int sd_transfers[NUM_VOLUMES]; + extern int sd_transfer_errors[NUM_VOLUMES]; + lcd_clear_display(); + line = 0; + lcd_puts(0, line++, "[SD error stats]"); + for (i=0; i> 9) & 0xf) == SD_TRAN) + if (ret && ((response >> 9) & 0xf) == SD_TRAN) return 0; - if(TIME_AFTER(current_tick, timeout)) + if(TIME_AFTER(current_tick, timeout)) { + if (!ret) + return -1; return -2; + } if (TIME_AFTER(current_tick, next_yield)) { @@ -690,6 +720,7 @@ bool aligned = !((uintptr_t)buf & (CACHEALIGN_SIZE - 1)); mutex_lock(&sd_mtx); + sd_transfers[drive]++; sd_enable(true); led(true); @@ -724,7 +755,7 @@ if(write) clean_dcache_range(buf, count * SECTOR_SIZE); else - dump_dcache_range(buf, count * SECTOR_SIZE); + invalidate_dcache(); } while(count) @@ -853,9 +884,12 @@ count -= transfer; loops = 0; /* reset errors counter */ } - else if(loops++ > PL180_MAX_TRANSFER_ERRORS) + else { + sd_transfer_errors[drive]++; + if(loops++ > PL180_MAX_TRANSFER_ERRORS) panicf("SD Xfer %s err:0x%x Disk%d", (write? "write": "read"), transfer_error[drive], drive); + } } sd_transfer_error: @@ -874,10 +908,35 @@ return ret; } +#define VERIFY_READ 1 + int sd_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf) { - return sd_transfer_sectors(IF_MD2(drive,) start, count, buf, false); + int ret; + + ret = sd_transfer_sectors(IF_MD2(drive,) start, count, buf, false); + +#ifdef VERIFY_READ + if (ret) /* read failed, no point in verifying? */ + return ret; + + while (count) { + int transfer = count; + if(transfer > UNALIGNED_NUM_SECTORS) + transfer = UNALIGNED_NUM_SECTORS; + + sd_transfer_sectors(IF_MD2(drive,) start, transfer, aligned_buffer, false); + if (memcmp(buf, aligned_buffer, transfer * 512) != 0) + panicf("sd: read verify failed: sec=%ld n=%d!", start, transfer); + + buf += transfer * 512; + count -= transfer; + start += transfer; + } + +#endif + return ret; } int sd_write_sectors(IF_MD2(int drive,) unsigned long start, int count, @@ -908,7 +967,7 @@ if (memcmp(buf, aligned_buffer, transfer * 512) != 0) { /* try the write again in the hope to repair the damage */ sd_transfer_sectors(IF_MD2(drive,) saved_start, saved_count, saved_buf, true); - panicf("sd: verify failed: sec=%ld n=%d!", start, transfer); + panicf("sd: write verify failed: sec=%ld n=%d!", start, transfer); } buf += transfer * 512;