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());

-- 

Reply via email to