Add abort when JTAG-DP transaction times out.
Fixes system hang for devices that don't ignore transactions to bad addresses. Change-Id: Ia98344d7efc12951ef79dbc82b8f792b70a22cee Signed-off-by: Evan Hunter <ehunter@broadcom.com> Reviewed-on: http://openocd.zylin.com/1115 Tested-by: jenkins Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
This commit is contained in:
parent
2a8a89edcb
commit
704fc7eb3d
|
@ -50,6 +50,8 @@
|
||||||
#define JTAG_ACK_OK_FAULT 0x2
|
#define JTAG_ACK_OK_FAULT 0x2
|
||||||
#define JTAG_ACK_WAIT 0x1
|
#define JTAG_ACK_WAIT 0x1
|
||||||
|
|
||||||
|
static int jtag_ap_q_abort(struct adiv5_dap *dap, uint8_t *ack);
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
*
|
*
|
||||||
* DPACC and APACC scanchain access through JTAG-DP (or SWJ-DP)
|
* DPACC and APACC scanchain access through JTAG-DP (or SWJ-DP)
|
||||||
|
@ -232,12 +234,16 @@ static int jtagdp_transaction_endcheck(struct adiv5_dap *dap)
|
||||||
while (dap->ack != JTAG_ACK_OK_FAULT) {
|
while (dap->ack != JTAG_ACK_OK_FAULT) {
|
||||||
if (dap->ack == JTAG_ACK_WAIT) {
|
if (dap->ack == JTAG_ACK_WAIT) {
|
||||||
if ((timeval_ms()-then) > 1000) {
|
if ((timeval_ms()-then) > 1000) {
|
||||||
/* NOTE: this would be a good spot
|
|
||||||
* to use JTAG_DP_ABORT.
|
|
||||||
*/
|
|
||||||
LOG_WARNING("Timeout (1000ms) waiting "
|
LOG_WARNING("Timeout (1000ms) waiting "
|
||||||
"for ACK=OK/FAULT "
|
"for ACK=OK/FAULT "
|
||||||
"in JTAG-DP transaction");
|
"in JTAG-DP transaction - aborting");
|
||||||
|
|
||||||
|
uint8_t ack;
|
||||||
|
int abort_ret = jtag_ap_q_abort(dap, &ack);
|
||||||
|
|
||||||
|
if (abort_ret != 0)
|
||||||
|
LOG_WARNING("Abort failed : return=%d ack=%d", abort_ret, ack);
|
||||||
|
|
||||||
return ERROR_JTAG_DEVICE_ERROR;
|
return ERROR_JTAG_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue