stlink-dap: add 'cmd' to send arbitrary commands
[fw/openocd] / src / jtag / core.c
index 97caeb18aaaf4e3c6896b431f774c2153bfe23fa..7da2a6c35fdbc396e6752bd4c377cfbbb4346353 100644 (file)
@@ -35,8 +35,7 @@
 #include "interface.h"
 #include <transport/transport.h>
 #include <helper/jep106.h>
-#include <jtag/hla/hla_transport.h>
-#include <jtag/hla/hla_interface.h>
+#include "helper/system.h"
 
 #ifdef HAVE_STRINGS_H
 #include <strings.h>
@@ -46,6 +45,9 @@
 #include "svf/svf.h"
 #include "xsvf/xsvf.h"
 
+/* ipdbg are utilities to debug IP-cores. It uses JTAG for transport. */
+#include "server/ipdbg.h"
+
 /** The number of JTAG queue flushes (for profiling and debugging purposes). */
 static int jtag_flush_queue_count;
 
@@ -128,10 +130,10 @@ static int rclk_fallback_speed_khz;
 static enum {CLOCK_MODE_UNSELECTED, CLOCK_MODE_KHZ, CLOCK_MODE_RCLK} clock_mode;
 static int jtag_speed;
 
-static struct jtag_interface *jtag;
+/* FIXME: change name to this variable, it is not anymore JTAG only */
+static struct adapter_driver *jtag;
 
-/* configuration */
-struct jtag_interface *jtag_interface;
+extern struct adapter_driver *adapter_driver;
 
 void jtag_set_flush_queue_sleep(int ms)
 {
@@ -211,12 +213,12 @@ unsigned jtag_tap_count_enabled(void)
 }
 
 /** Append a new TAP to the chain of all taps. */
-void jtag_tap_add(struct jtag_tap *t)
+static void jtag_tap_add(struct jtag_tap *t)
 {
        unsigned jtag_num_taps = 0;
 
        struct jtag_tap **tap = &__jtag_all_taps;
-       while (*tap != NULL) {
+       while (*tap) {
                jtag_num_taps++;
                tap = &(*tap)->next_tap;
        }
@@ -241,7 +243,7 @@ struct jtag_tap *jtag_tap_by_string(const char *s)
        struct jtag_tap *t = jtag_all_taps();
 
        while (t) {
-               if (0 == strcmp(t->dotted_name, s))
+               if (strcmp(t->dotted_name, s) == 0)
                        return t;
                t = t->next_tap;
        }
@@ -276,7 +278,7 @@ struct jtag_tap *jtag_tap_next_enabled(struct jtag_tap *p)
 
 const char *jtag_tap_name(const struct jtag_tap *tap)
 {
-       return (tap == NULL) ? "(unknown)" : tap->dotted_name;
+       return (!tap) ? "(unknown)" : tap->dotted_name;
 }
 
 
@@ -284,7 +286,7 @@ int jtag_register_event_callback(jtag_event_handler_t callback, void *priv)
 {
        struct jtag_event_callback **callbacks_p = &jtag_event_callbacks;
 
-       if (callback == NULL)
+       if (!callback)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
        if (*callbacks_p) {
@@ -305,7 +307,7 @@ int jtag_unregister_event_callback(jtag_event_handler_t callback, void *priv)
 {
        struct jtag_event_callback **p = &jtag_event_callbacks, *temp;
 
-       if (callback == NULL)
+       if (!callback)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
        while (*p) {
@@ -393,7 +395,7 @@ void jtag_add_ir_scan(struct jtag_tap *active, struct scan_field *in_fields, tap
 void jtag_add_plain_ir_scan(int num_bits, const uint8_t *out_bits, uint8_t *in_bits,
        tap_state_t state)
 {
-       assert(out_bits != NULL);
+       assert(out_bits);
        assert(state != TAP_RESET);
 
        jtag_prelude(state);
@@ -427,8 +429,7 @@ static void jtag_add_scan_check(struct jtag_tap *active, void (*jtag_add_scan)(
        jtag_add_scan(active, in_num_fields, in_fields, state);
 
        for (int i = 0; i < in_num_fields; i++) {
-               if ((in_fields[i].check_value != NULL) && (in_fields[i].in_value != NULL)) {
-                       /* this is synchronous for a minidriver */
+               if ((in_fields[i].check_value) && (in_fields[i].in_value)) {
                        jtag_add_callback4(jtag_check_value_mask_callback,
                                (jtag_callback_data_t)in_fields[i].in_value,
                                (jtag_callback_data_t)in_fields[i].check_value,
@@ -467,7 +468,7 @@ void jtag_add_dr_scan(struct jtag_tap *active,
 void jtag_add_plain_dr_scan(int num_bits, const uint8_t *out_bits, uint8_t *in_bits,
        tap_state_t state)
 {
-       assert(out_bits != NULL);
+       assert(out_bits);
        assert(state != TAP_RESET);
 
        jtag_prelude(state);
@@ -489,7 +490,7 @@ void jtag_add_tlr(void)
 
 /**
  * If supported by the underlying adapter, this clocks a raw bit sequence
- * onto TMS for switching betwen JTAG and SWD modes.
+ * onto TMS for switching between JTAG and SWD modes.
  *
  * DO NOT use this to bypass the integrity checks and logging provided
  * by the jtag_add_pathmove() and jtag_add_statemove() calls.
@@ -505,7 +506,7 @@ int jtag_add_tms_seq(unsigned nbits, const uint8_t *seq, enum tap_state state)
 {
        int retval;
 
-       if (!(jtag->supported & DEBUG_CAP_TMS_SEQ))
+       if (!(jtag->jtag_ops->supported & DEBUG_CAP_TMS_SEQ))
                return ERROR_JTAG_NOT_IMPLEMENTED;
 
        jtag_checks();
@@ -844,6 +845,7 @@ void jtag_add_reset(int req_tlr_or_trst, int req_srst)
        if (trst_with_tlr) {
                LOG_DEBUG("JTAG reset with TLR instead of TRST");
                jtag_add_tlr();
+               jtag_execute_queue();
 
        } else if (jtag_trst != new_trst) {
                jtag_trst = new_trst;
@@ -892,8 +894,8 @@ static int jtag_check_value_inner(uint8_t *captured, uint8_t *in_check_value,
 
                /* NOTE:  we've lost diagnostic context here -- 'which tap' */
 
-               captured_str = buf_to_str(captured, bits, 16);
-               in_check_value_str = buf_to_str(in_check_value, bits, 16);
+               captured_str = buf_to_hex_str(captured, bits);
+               in_check_value_str = buf_to_hex_str(in_check_value, bits);
 
                LOG_WARNING("Bad value '%s' captured during DR or IR scan:",
                        captured_str);
@@ -905,7 +907,7 @@ static int jtag_check_value_inner(uint8_t *captured, uint8_t *in_check_value,
                if (in_check_mask) {
                        char *in_check_mask_str;
 
-                       in_check_mask_str = buf_to_str(in_check_mask, bits, 16);
+                       in_check_mask_str = buf_to_hex_str(in_check_mask, bits);
                        LOG_WARNING(" check_mask: 0x%s", in_check_mask_str);
                        free(in_check_mask_str);
                }
@@ -917,9 +919,9 @@ static int jtag_check_value_inner(uint8_t *captured, uint8_t *in_check_value,
 
 void jtag_check_value_mask(struct scan_field *field, uint8_t *value, uint8_t *mask)
 {
-       assert(field->in_value != NULL);
+       assert(field->in_value);
 
-       if (value == NULL) {
+       if (!value) {
                /* no checking to do */
                return;
        }
@@ -932,23 +934,30 @@ void jtag_check_value_mask(struct scan_field *field, uint8_t *value, uint8_t *ma
 
 int default_interface_jtag_execute_queue(void)
 {
-       if (NULL == jtag) {
+       if (!jtag) {
                LOG_ERROR("No JTAG interface configured yet.  "
                        "Issue 'init' command in startup scripts "
                        "before communicating with targets.");
                return ERROR_FAIL;
        }
 
-       int result = jtag->execute_queue();
+       if (!transport_is_jtag()) {
+               /*
+                * FIXME: This should not happen!
+                * There could be old code that queues jtag commands with non jtag interfaces so, for
+                * the moment simply highlight it by log an error and return on empty execute_queue.
+                * We should fix it quitting with assert(0) because it is an internal error.
+                * The fix can be applied immediately after next release (v0.11.0 ?)
+                */
+               LOG_ERROR("JTAG API jtag_execute_queue() called on non JTAG interface");
+               if (!jtag->jtag_ops || !jtag->jtag_ops->execute_queue)
+                       return ERROR_OK;
+       }
+
+       int result = jtag->jtag_ops->execute_queue();
 
-#if !BUILD_ZY1000
-       /* Only build this if we use a regular driver with a command queue.
-        * Otherwise jtag_command_queue won't be found at compile/link time. Its
-        * definition is in jtag/commands.c, which is only built/linked by
-        * jtag/Makefile.am if MINIDRIVER_DUMMY || !MINIDRIVER, but those variables
-        * aren't accessible here. */
        struct jtag_command *cmd = jtag_command_queue;
-       while (debug_level >= LOG_LVL_DEBUG && cmd) {
+       while (debug_level >= LOG_LVL_DEBUG_IO && cmd) {
                switch (cmd->type) {
                        case JTAG_SCAN:
                                LOG_DEBUG_IO("JTAG %s SCAN to %s",
@@ -957,12 +966,12 @@ int default_interface_jtag_execute_queue(void)
                                for (int i = 0; i < cmd->cmd.scan->num_fields; i++) {
                                        struct scan_field *field = cmd->cmd.scan->fields + i;
                                        if (field->out_value) {
-                                               char *str = buf_to_str(field->out_value, field->num_bits, 16);
+                                               char *str = buf_to_hex_str(field->out_value, field->num_bits);
                                                LOG_DEBUG_IO("  %db out: %s", field->num_bits, str);
                                                free(str);
                                        }
                                        if (field->in_value) {
-                                               char *str = buf_to_str(field->in_value, field->num_bits, 16);
+                                               char *str = buf_to_hex_str(field->in_value, field->num_bits);
                                                LOG_DEBUG_IO("  %db  in: %s", field->num_bits, str);
                                                free(str);
                                        }
@@ -1005,7 +1014,6 @@ int default_interface_jtag_execute_queue(void)
                }
                cmd = cmd->next;
        }
-#endif
 
        return result;
 }
@@ -1064,8 +1072,6 @@ void jtag_sleep(uint32_t us)
 
 #define JTAG_MAX_AUTO_TAPS 20
 
-#define EXTRACT_JEP106_BANK(X) (((X) & 0xf00) >> 8)
-#define EXTRACT_JEP106_ID(X)   (((X) & 0xfe) >> 1)
 #define EXTRACT_MFG(X)  (((X) & 0xffe) >> 1)
 #define EXTRACT_PART(X) (((X) & 0xffff000) >> 12)
 #define EXTRACT_VER(X)  (((X) & 0xf0000000) >> 28)
@@ -1133,7 +1139,7 @@ static void jtag_examine_chain_display(enum log_levels level, const char *msg,
                name, msg,
                (unsigned int)idcode,
                (unsigned int)EXTRACT_MFG(idcode),
-               jep106_manufacturer(EXTRACT_JEP106_BANK(idcode), EXTRACT_JEP106_ID(idcode)),
+               jep106_manufacturer(EXTRACT_MFG(idcode)),
                (unsigned int)EXTRACT_PART(idcode),
                (unsigned int)EXTRACT_VER(idcode));
 }
@@ -1189,7 +1195,7 @@ static bool jtag_examine_chain_match_tap(const struct jtag_tap *tap)
                        return true;
 
                /* treat "-expected-id 0" as a "don't-warn" wildcard */
-               if (0 == tap->expected_ids[ii])
+               if (tap->expected_ids[ii] == 0)
                        return true;
        }
 
@@ -1221,8 +1227,8 @@ static int jtag_examine_chain(void)
        /* Add room for end-of-chain marker. */
        max_taps++;
 
-       uint8_t *idcode_buffer = malloc(max_taps * 4);
-       if (idcode_buffer == NULL)
+       uint8_t *idcode_buffer = calloc(4, max_taps);
+       if (!idcode_buffer)
                return ERROR_JTAG_INIT_FAILED;
 
        /* DR scan to collect BYPASS or IDCODE register contents.
@@ -1247,7 +1253,7 @@ static int jtag_examine_chain(void)
                uint32_t idcode = buf_get_u32(idcode_buffer, bit_count, 32);
 
                /* No predefined TAP? Auto-probe. */
-               if (tap == NULL) {
+               if (!tap) {
                        /* Is there another TAP? */
                        if (jtag_idcode_is_final(idcode))
                                break;
@@ -1257,7 +1263,7 @@ static int jtag_examine_chain(void)
                         * REVISIT create a jtag_alloc(chip, tap) routine, and
                         * share it with jim_newtap_cmd().
                         */
-                       tap = calloc(1, sizeof *tap);
+                       tap = calloc(1, sizeof(*tap));
                        if (!tap) {
                                retval = ERROR_FAIL;
                                goto out;
@@ -1278,7 +1284,7 @@ static int jtag_examine_chain(void)
 
                if ((idcode & 1) == 0) {
                        /* Zero for LSB indicates a device in bypass */
-                       LOG_INFO("TAP %s does not have valid IDCODE (idcode=0x%x)",
+                       LOG_INFO("TAP %s does not have valid IDCODE (idcode=0x%" PRIx32 ")",
                                        tap->dotted_name, idcode);
                        tap->hasidcode = false;
                        tap->idcode = 0;
@@ -1328,26 +1334,26 @@ out:
 static int jtag_validate_ircapture(void)
 {
        struct jtag_tap *tap;
-       int total_ir_length = 0;
        uint8_t *ir_test = NULL;
        struct scan_field field;
        uint64_t val;
        int chain_pos = 0;
        int retval;
 
-       /* when autoprobing, accomodate huge IR lengths */
-       for (tap = NULL, total_ir_length = 0;
-                       (tap = jtag_tap_next_enabled(tap)) != NULL;
-                       total_ir_length += tap->ir_length) {
+       /* when autoprobing, accommodate huge IR lengths */
+       int total_ir_length = 0;
+       for (tap = jtag_tap_next_enabled(NULL); tap; tap = jtag_tap_next_enabled(tap)) {
                if (tap->ir_length == 0)
                        total_ir_length += JTAG_IRLEN_MAX;
+               else
+                       total_ir_length += tap->ir_length;
        }
 
        /* increase length to add 2 bit sentinel after scan */
        total_ir_length += 2;
 
        ir_test = malloc(DIV_ROUND_UP(total_ir_length, 8));
-       if (ir_test == NULL)
+       if (!ir_test)
                return ERROR_FAIL;
 
        /* after this scan, all TAPs will capture BYPASS instructions */
@@ -1369,7 +1375,7 @@ static int jtag_validate_ircapture(void)
 
        for (;; ) {
                tap = jtag_tap_next_enabled(tap);
-               if (tap == NULL)
+               if (!tap)
                        break;
 
                /* If we're autoprobing, guess IR lengths.  They must be at
@@ -1394,7 +1400,7 @@ static int jtag_validate_ircapture(void)
                                        && tap->ir_length < JTAG_IRLEN_MAX) {
                                tap->ir_length++;
                        }
-                       LOG_WARNING("AUTO %s - use \"jtag newtap " "%s %s -irlen %d "
+                       LOG_WARNING("AUTO %s - use \"jtag newtap %s %s -irlen %d "
                                        "-expected-id 0x%08" PRIx32 "\"",
                                        tap->dotted_name, tap->chip, tap->tapname, tap->ir_length, tap->idcode);
                }
@@ -1424,7 +1430,7 @@ static int jtag_validate_ircapture(void)
        /* verify the '11' sentinel we wrote is returned at the end */
        val = buf_get_u64(ir_test, chain_pos, 2);
        if (val != 0x3) {
-               char *cbuf = buf_to_str(ir_test, total_ir_length, 16);
+               char *cbuf = buf_to_hex_str(ir_test, total_ir_length);
 
                LOG_ERROR("IR capture error at bit %d, saw 0x%s not 0x...3",
                        chain_pos, cbuf);
@@ -1447,7 +1453,7 @@ void jtag_tap_init(struct jtag_tap *tap)
        unsigned ir_len_bytes;
 
        /* if we're autoprobing, cope with potentially huge ir_length */
-       ir_len_bits = tap->ir_length ? : JTAG_IRLEN_MAX;
+       ir_len_bits = tap->ir_length ? tap->ir_length : JTAG_IRLEN_MAX;
        ir_len_bytes = DIV_ROUND_UP(ir_len_bits, 8);
 
        tap->expected = calloc(1, ir_len_bytes);
@@ -1507,27 +1513,27 @@ int adapter_init(struct command_context *cmd_ctx)
        if (jtag)
                return ERROR_OK;
 
-       if (!jtag_interface) {
-               /* nothing was previously specified by "interface" command */
+       if (!adapter_driver) {
+               /* nothing was previously specified by "adapter driver" command */
                LOG_ERROR("Debug Adapter has to be specified, "
-                       "see \"interface\" command");
+                       "see \"adapter driver\" command");
                return ERROR_JTAG_INVALID_INTERFACE;
        }
 
        int retval;
-       retval = jtag_interface->init();
+       retval = adapter_driver->init();
        if (retval != ERROR_OK)
                return retval;
-       jtag = jtag_interface;
+       jtag = adapter_driver;
 
-       if (jtag->speed == NULL) {
+       if (!jtag->speed) {
                LOG_INFO("This adapter doesn't support configurable speed");
                return ERROR_OK;
        }
 
-       if (CLOCK_MODE_UNSELECTED == clock_mode) {
+       if (clock_mode == CLOCK_MODE_UNSELECTED) {
                LOG_ERROR("An adapter speed is not selected in the init script."
-                       " Insert a call to adapter_khz or jtag_rclk to proceed.");
+                       " Insert a call to \"adapter speed\" or \"jtag_rclk\" to proceed.");
                return ERROR_JTAG_INIT_FAILED;
        }
 
@@ -1541,12 +1547,12 @@ int adapter_init(struct command_context *cmd_ctx)
        if (retval != ERROR_OK)
                return retval;
        retval = jtag_get_speed_readable(&actual_khz);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                LOG_INFO("adapter-specific clock speed value %d", jtag_speed_var);
        else if (actual_khz) {
                /* Adaptive clocking -- JTAG-specific */
-               if ((CLOCK_MODE_RCLK == clock_mode)
-                               || ((CLOCK_MODE_KHZ == clock_mode) && !requested_khz)) {
+               if ((clock_mode == CLOCK_MODE_RCLK)
+                               || ((clock_mode == CLOCK_MODE_KHZ) && !requested_khz)) {
                        LOG_INFO("RCLK (adaptive clock speed) not supported - fallback to %d kHz"
                        , actual_khz);
                } else
@@ -1566,7 +1572,7 @@ int jtag_init_inner(struct command_context *cmd_ctx)
        LOG_DEBUG("Init JTAG chain");
 
        tap = jtag_tap_next_enabled(NULL);
-       if (tap == NULL) {
+       if (!tap) {
                /* Once JTAG itself is properly set up, and the scan chain
                 * isn't absurdly large, IDCODE autoprobe should work fine.
                 *
@@ -1642,7 +1648,7 @@ int adapter_quit(void)
        if (jtag && jtag->quit) {
                /* close the JTAG interface */
                int result = jtag->quit();
-               if (ERROR_OK != result)
+               if (result != ERROR_OK)
                        LOG_ERROR("failed: %d", result);
        }
 
@@ -1781,7 +1787,7 @@ static int adapter_khz_to_speed(unsigned khz, int *speed)
        }
        int speed_div1;
        int retval = jtag->khz(jtag_get_speed_khz(), &speed_div1);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
        *speed = speed_div1;
        return ERROR_OK;
@@ -1790,7 +1796,7 @@ static int adapter_khz_to_speed(unsigned khz, int *speed)
 static int jtag_rclk_to_speed(unsigned fallback_speed_khz, int *speed)
 {
        int retval = adapter_khz_to_speed(0, speed);
-       if ((ERROR_OK != retval) && fallback_speed_khz) {
+       if ((retval != ERROR_OK) && fallback_speed_khz) {
                LOG_DEBUG("trying fallback speed...");
                retval = adapter_khz_to_speed(fallback_speed_khz, speed);
        }
@@ -1811,7 +1817,7 @@ int jtag_config_khz(unsigned khz)
        clock_mode = CLOCK_MODE_KHZ;
        int speed = 0;
        int retval = adapter_khz_to_speed(khz, &speed);
-       return (ERROR_OK != retval) ? retval : jtag_set_speed(speed);
+       return (retval != ERROR_OK) ? retval : jtag_set_speed(speed);
 }
 
 int jtag_config_rclk(unsigned fallback_speed_khz)
@@ -1821,7 +1827,7 @@ int jtag_config_rclk(unsigned fallback_speed_khz)
        rclk_fallback_speed_khz = fallback_speed_khz;
        int speed = 0;
        int retval = jtag_rclk_to_speed(fallback_speed_khz, &speed);
-       return (ERROR_OK != retval) ? retval : jtag_set_speed(speed);
+       return (retval != ERROR_OK) ? retval : jtag_set_speed(speed);
 }
 
 int jtag_get_speed(int *speed)
@@ -1860,7 +1866,7 @@ void jtag_set_verify(bool enable)
        jtag_verify = enable;
 }
 
-bool jtag_will_verify()
+bool jtag_will_verify(void)
 {
        return jtag_verify;
 }
@@ -1870,14 +1876,14 @@ void jtag_set_verify_capture_ir(bool enable)
        jtag_verify_capture_ir = enable;
 }
 
-bool jtag_will_verify_capture_ir()
+bool jtag_will_verify_capture_ir(void)
 {
        return jtag_verify_capture_ir;
 }
 
 int jtag_power_dropout(int *dropout)
 {
-       if (jtag == NULL) {
+       if (!jtag) {
                /* TODO: as the jtag interface is not valid all
                 * we can do at the moment is exit OpenOCD */
                LOG_ERROR("No Valid JTAG Interface Configured.");
@@ -1970,7 +1976,12 @@ static int jtag_select(struct command_context *ctx)
        if (retval != ERROR_OK)
                return retval;
 
-       return xsvf_register_commands(ctx);
+       retval = xsvf_register_commands(ctx);
+
+       if (retval != ERROR_OK)
+               return retval;
+
+       return ipdbg_register_commands(ctx);
 }
 
 static struct transport jtag_transport = {
@@ -1995,7 +2006,7 @@ bool transport_is_jtag(void)
 
 int adapter_resets(int trst, int srst)
 {
-       if (get_current_transport() == NULL) {
+       if (!get_current_transport()) {
                LOG_ERROR("transport is not selected");
                return ERROR_FAIL;
        }
@@ -2008,20 +2019,15 @@ int adapter_resets(int trst, int srst)
 
                /* adapters without trst signal will eventually use tlr sequence */
                jtag_add_reset(trst, srst);
+               /*
+                * The jtag queue is still used for reset by some adapter. Flush it!
+                * FIXME: To be removed when all adapter drivers will be updated!
+                */
+               jtag_execute_queue();
                return ERROR_OK;
-       } else if (transport_is_swd()) {
-               if (trst == TRST_ASSERT) {
-                       LOG_ERROR("transport swd has no trst signal");
-                       return ERROR_FAIL;
-               }
-
-               if (srst == SRST_ASSERT && !(jtag_reset_config & RESET_HAS_SRST)) {
-                       LOG_ERROR("adapter has no srst signal");
-                       return ERROR_FAIL;
-               }
-               adapter_system_reset(srst);
-               return ERROR_OK;
-       } else if (transport_is_hla()) {
+       } else if (transport_is_swd() || transport_is_hla() ||
+                          transport_is_dapdirect_swd() || transport_is_dapdirect_jtag() ||
+                          transport_is_swim()) {
                if (trst == TRST_ASSERT) {
                        LOG_ERROR("transport %s has no trst signal",
                                get_current_transport()->name);
@@ -2032,7 +2038,8 @@ int adapter_resets(int trst, int srst)
                        LOG_ERROR("adapter has no srst signal");
                        return ERROR_FAIL;
                }
-               return hl_interface_reset(srst);
+               adapter_system_reset(srst);
+               return ERROR_OK;
        }
 
        if (trst == TRST_DEASSERT && srst == SRST_DEASSERT)
@@ -2044,33 +2051,41 @@ int adapter_resets(int trst, int srst)
        return ERROR_FAIL;
 }
 
-void adapter_assert_reset(void)
+int adapter_assert_reset(void)
 {
        if (transport_is_jtag()) {
                if (jtag_reset_config & RESET_SRST_PULLS_TRST)
                        jtag_add_reset(1, 1);
                else
                        jtag_add_reset(0, 1);
-       } else if (transport_is_swd())
-               adapter_system_reset(1);
-       else if (get_current_transport() != NULL)
+               return ERROR_OK;
+       } else if (transport_is_swd() || transport_is_hla() ||
+                          transport_is_dapdirect_jtag() || transport_is_dapdirect_swd() ||
+                          transport_is_swim())
+               return adapter_system_reset(1);
+       else if (get_current_transport())
                LOG_ERROR("reset is not supported on %s",
                        get_current_transport()->name);
        else
                LOG_ERROR("transport is not selected");
+       return ERROR_FAIL;
 }
 
-void adapter_deassert_reset(void)
+int adapter_deassert_reset(void)
 {
-       if (transport_is_jtag())
+       if (transport_is_jtag()) {
                jtag_add_reset(0, 0);
-       else if (transport_is_swd())
-               adapter_system_reset(0);
-       else if (get_current_transport() != NULL)
+               return ERROR_OK;
+       } else if (transport_is_swd() || transport_is_hla() ||
+                          transport_is_dapdirect_jtag() || transport_is_dapdirect_swd() ||
+                          transport_is_swim())
+               return adapter_system_reset(0);
+       else if (get_current_transport())
                LOG_ERROR("reset is not supported on %s",
                        get_current_transport()->name);
        else
                LOG_ERROR("transport is not selected");
+       return ERROR_FAIL;
 }
 
 int adapter_config_trace(bool enabled, enum tpiu_pin_protocol pin_protocol,