arm_adi_v5: error propagation fixes

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
This commit is contained in:
Øyvind Harboe 2010-06-21 13:41:53 +02:00
parent f747b16e4e
commit 19925e4d7f
1 changed files with 22 additions and 18 deletions

View File

@ -603,43 +603,47 @@ int mem_ap_read_buf_u32(struct adiv5_dap *dap, uint8_t *buffer,
*/ */
/* Scan out first read */ /* Scan out first read */
adi_jtag_dp_scan(dap, JTAG_DP_APACC, AP_REG_DRW, retval = adi_jtag_dp_scan(dap, JTAG_DP_APACC, AP_REG_DRW,
DPAP_READ, 0, NULL, NULL); DPAP_READ, 0, NULL, NULL);
if (retval != ERROR_OK)
return retval;
for (readcount = 0; readcount < blocksize - 1; readcount++) for (readcount = 0; readcount < blocksize - 1; readcount++)
{ {
/* Scan out next read; scan in posted value for the /* Scan out next read; scan in posted value for the
* previous one. Assumes read is acked "OK/FAULT", * previous one. Assumes read is acked "OK/FAULT",
* and CTRL_STAT says that meant "OK". * and CTRL_STAT says that meant "OK".
*/ */
adi_jtag_dp_scan(dap, JTAG_DP_APACC, AP_REG_DRW, retval = adi_jtag_dp_scan(dap, JTAG_DP_APACC, AP_REG_DRW,
DPAP_READ, 0, buffer + 4 * readcount, DPAP_READ, 0, buffer + 4 * readcount,
&dap->ack); &dap->ack);
if (retval != ERROR_OK)
return retval;
} }
/* Scan in last posted value; RDBUFF has no other effect, /* Scan in last posted value; RDBUFF has no other effect,
* assuming ack is OK/FAULT and CTRL_STAT says "OK". * assuming ack is OK/FAULT and CTRL_STAT says "OK".
*/ */
adi_jtag_dp_scan(dap, JTAG_DP_DPACC, DP_RDBUFF, retval = adi_jtag_dp_scan(dap, JTAG_DP_DPACC, DP_RDBUFF,
DPAP_READ, 0, buffer + 4 * readcount, DPAP_READ, 0, buffer + 4 * readcount,
&dap->ack); &dap->ack);
if (dap_run(dap) == ERROR_OK) if (retval != ERROR_OK)
{ return retval;
wcount = wcount - blocksize;
address += 4 * blocksize; retval = dap_run(dap);
buffer += 4 * blocksize; if (retval != ERROR_OK)
}
else
{ {
errorcount++; errorcount++;
if (errorcount <= 1)
{
/* try again */
continue;
}
LOG_WARNING("Block read error address 0x%" PRIx32, address);
return retval;
} }
wcount = wcount - blocksize;
if (errorcount > 1) address += 4 * blocksize;
{ buffer += 4 * blocksize;
LOG_WARNING("Block read error address 0x%" PRIx32
", count 0x%x", address, count);
/* REVISIT return the *actual* fault code */
return ERROR_JTAG_DEVICE_ERROR;
}
} }
/* if we have an unaligned access - reorder data */ /* if we have an unaligned access - reorder data */