]> git.sur5r.net Git - openocd/commitdiff
adi_v5_jtag: clear sticky overrun condition in WAIT timeout
authorMatthias Welwarsky <matthias.welwarsky@sysgo.com>
Wed, 13 Jul 2016 09:48:48 +0000 (11:48 +0200)
committerAndreas Fritiofson <andreas.fritiofson@gmail.com>
Tue, 9 Aug 2016 13:36:13 +0000 (14:36 +0100)
If WAIT recovery fails (times out), an ABORT command is issued to the
DAP but under some conditions the SSTICKYORUN bit in CTRL/STAT is not
cleared as well, which renders the DP unusable. This happens when
trying to access e.g. the ROM table of powered-down cores, on many
targets.

Change-Id: Id0a7ba6180069eee562871314f520f938df9718f
Signed-off-by: Matthias Welwarsky <matthias.welwarsky@sysgo.com>
Reviewed-on: http://openocd.zylin.com/3476
Tested-by: jenkins
Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
src/target/adi_v5_jtag.c

index 36d5cad5135d4b8ef5bc2dcd6abec668750b86ca..2717c9e369b796f0e58c5466601bf86693bd474f 100644 (file)
@@ -448,7 +448,12 @@ static int jtagdp_overrun_check(struct adiv5_dap *dap)
                                        /* timeout happened */
                                        if (tmp->ack != JTAG_ACK_OK_FAULT) {
                                                LOG_ERROR("Timeout during WAIT recovery");
+                                               dap->select = DP_SELECT_INVALID;
                                                jtag_ap_q_abort(dap, NULL);
+                                               /* clear the sticky overrun condition */
+                                               adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
+                                                       DP_CTRL_STAT, DPAP_WRITE,
+                                                       dap->dp_ctrl_stat | SSTICKYORUN, NULL, 0);
                                                retval = ERROR_JTAG_DEVICE_ERROR;
                                        }
                                }
@@ -525,8 +530,14 @@ static int jtagdp_overrun_check(struct adiv5_dap *dap)
                        if (retval == ERROR_OK) {
                                if (el->ack != JTAG_ACK_OK_FAULT) {
                                        LOG_ERROR("Timeout during WAIT recovery");
+                                       dap->select = DP_SELECT_INVALID;
                                        jtag_ap_q_abort(dap, NULL);
+                                       /* clear the sticky overrun condition */
+                                       adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
+                                               DP_CTRL_STAT, DPAP_WRITE,
+                                               dap->dp_ctrl_stat | SSTICKYORUN, NULL, 0);
                                        retval = ERROR_JTAG_DEVICE_ERROR;
+                                       break;
                                }
                        } else
                                break;