From 704fc7eb3dea26308a0af09c2f4a35b64ad3346f Mon Sep 17 00:00:00 2001 From: Evan Hunter Date: Thu, 17 Jan 2013 18:23:55 +0800 Subject: [PATCH] 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 Reviewed-on: http://openocd.zylin.com/1115 Tested-by: jenkins Reviewed-by: Spencer Oliver --- src/target/adi_v5_jtag.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/target/adi_v5_jtag.c b/src/target/adi_v5_jtag.c index e500416b..0445d548 100644 --- a/src/target/adi_v5_jtag.c +++ b/src/target/adi_v5_jtag.c @@ -50,6 +50,8 @@ #define JTAG_ACK_OK_FAULT 0x2 #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) @@ -232,12 +234,16 @@ static int jtagdp_transaction_endcheck(struct adiv5_dap *dap) while (dap->ack != JTAG_ACK_OK_FAULT) { if (dap->ack == JTAG_ACK_WAIT) { if ((timeval_ms()-then) > 1000) { - /* NOTE: this would be a good spot - * to use JTAG_DP_ABORT. - */ LOG_WARNING("Timeout (1000ms) waiting " "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; } } else { -- 2.39.5