This is an automated email from Gerrit. "N S <[email protected]>" just uploaded a new patch set to Gerrit, which you can find at https://review.openocd.org/c/openocd/+/9189
-- gerrit commit 3db05ec70b2eb8394be97c83045de3a14b48d2a0 Author: N S <[email protected]> Date: Sun Oct 26 15:46:33 2025 -0700 jtag/drivers: Reduce time spent in OpenJTAG scan operation Reduce time spent in openjtag_execute_scan by not introducing extra TAP_IRPAUSE or TAP_DRPAUSE states. Bring inline with FTDI driver by only forcing pass though PAUSE state if final state is not TAP_IDLE. Change-Id: Ic4535b038872190f9241f97a3c23eb3b3d6b1067 Signed-off-by: N S <[email protected]> diff --git a/src/jtag/drivers/openjtag.c b/src/jtag/drivers/openjtag.c index d45a1c6a97..12a503dcac 100644 --- a/src/jtag/drivers/openjtag.c +++ b/src/jtag/drivers/openjtag.c @@ -715,30 +715,34 @@ static void openjtag_execute_statemove(struct jtag_command *cmd) static void openjtag_execute_scan(struct jtag_command *cmd) { - - int scan_size, old_state; + int scan_size; + enum tap_state end_state = cmd->cmd.scan->end_state; uint8_t *buffer; - LOG_DEBUG_IO("scan ends in %s", tap_state_name(cmd->cmd.scan->end_state)); + LOG_DEBUG_IO("scan ends in %s", tap_state_name(end_state)); /* get scan info */ - tap_set_end_state(cmd->cmd.scan->end_state); + tap_set_end_state(end_state); scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer); #ifdef _DEBUG_USB_COMMS_ openjtag_debug_buffer(buffer, (scan_size + 7) / 8, DEBUG_TYPE_BUFFER); #endif /* set state */ - old_state = tap_get_end_state(); openjtag_set_state(cmd->cmd.scan->ir_scan ? TAP_IRSHIFT : TAP_DRSHIFT); tap_set_state(cmd->cmd.scan->ir_scan ? TAP_IRSHIFT : TAP_DRSHIFT); - tap_set_end_state(old_state); openjtag_add_scan(buffer, scan_size, cmd->cmd.scan); + /* openjtag_add_scan leaves TAP in IREXIT1 or DREXIT1 */ + tap_set_state(cmd->cmd.scan->ir_scan ? TAP_IREXIT1 : TAP_DREXIT1); - openjtag_set_state(cmd->cmd.scan->ir_scan ? TAP_IRPAUSE : TAP_DRPAUSE); - tap_set_state(cmd->cmd.scan->ir_scan ? TAP_IRPAUSE : TAP_DRPAUSE); + /* insert PAUSE if not going IDLE */ + if (end_state != TAP_IDLE) { + openjtag_set_state(cmd->cmd.scan->ir_scan ? TAP_IRPAUSE : TAP_DRPAUSE); + tap_set_state(cmd->cmd.scan->ir_scan ? TAP_IRPAUSE : TAP_DRPAUSE); + } + tap_set_end_state(end_state); if (tap_get_state() != tap_get_end_state()) { openjtag_set_state(tap_get_end_state()); tap_set_state(tap_get_end_state()); --
