]> git.sur5r.net Git - openocd/commitdiff
Add abort when JTAG-DP transaction times out.
authorEvan Hunter <ehunter@broadcom.com>
Thu, 17 Jan 2013 10:23:55 +0000 (18:23 +0800)
committerSpencer Oliver <spen@spen-soft.co.uk>
Tue, 2 Apr 2013 15:10:25 +0000 (15:10 +0000)
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>
src/target/adi_v5_jtag.c

index e500416b6e10587ffcb6c0fa544a7a4e60a586b4..0445d54854005c4471ad07d455c135b20b217fc0 100644 (file)
@@ -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 {