diff --git a/src/jtag/drivers/stlink_usb.c b/src/jtag/drivers/stlink_usb.c
index ce7ff413277282bda881dccf5b2fac7f7fae05ca..72b31c96a6e65a7a0bc1fed6b7ba6e4dd5eb34ee 100644
--- a/src/jtag/drivers/stlink_usb.c
+++ b/src/jtag/drivers/stlink_usb.c
@@ -579,8 +579,10 @@ static int stlink_usb_mode_leave(void *handle, enum stlink_mode type)
 	return ERROR_OK;
 }
 
+static int stlink_usb_assert_srst(void *handle, int srst);
+
 /** */
-static int stlink_usb_init_mode(void *handle)
+static int stlink_usb_init_mode(void *handle, bool connect_under_reset)
 {
 	int res;
 	uint8_t mode;
@@ -674,6 +676,12 @@ static int stlink_usb_init_mode(void *handle)
 		return ERROR_FAIL;
 	}
 
+	if (connect_under_reset) {
+		res = stlink_usb_assert_srst(handle, 0);
+		if (res != ERROR_OK)
+			return res;
+	}
+
 	res = stlink_usb_mode_enter(handle, emode);
 
 	if (res != ERROR_OK)
@@ -1314,7 +1322,7 @@ static int stlink_usb_open(struct hl_interface_param_s *param, void **fd)
 	h->jtag_api = api;
 
 	/* initialize the debug hardware */
-	err = stlink_usb_init_mode(h);
+	err = stlink_usb_init_mode(h, param->connect_under_reset);
 
 	if (err != ERROR_OK) {
 		LOG_ERROR("init mode failed");
diff --git a/src/jtag/hla/hla_interface.c b/src/jtag/hla/hla_interface.c
index 53ad8e71739fbbdfbbecf092973993806f542ca7..8453a6ff5395dedab8e2b2bd60bc9e45a528ebfb 100644
--- a/src/jtag/hla/hla_interface.c
+++ b/src/jtag/hla/hla_interface.c
@@ -37,12 +37,21 @@
 
 #include <target/target.h>
 
-static struct hl_interface_s hl_if = { {0, 0, 0, 0, 0, 0, 0}, 0, 0 };
+static struct hl_interface_s hl_if = { {0, 0, 0, 0, 0, HL_TRANSPORT_UNKNOWN, 0, false}, 0, 0 };
 
 int hl_interface_open(enum hl_transports tr)
 {
 	LOG_DEBUG("hl_interface_open");
 
+	enum reset_types jtag_reset_config = jtag_get_reset_config();
+
+	if (jtag_reset_config & RESET_CNCT_UNDER_SRST) {
+		if (jtag_reset_config & RESET_SRST_NO_GATING)
+			hl_if.param.connect_under_reset = true;
+		else
+			LOG_WARNING("\'srst_nogate\' reset_config option is required");
+	}
+
 	/* set transport mode */
 	hl_if.param.transport = tr;
 
@@ -117,14 +126,11 @@ static int hl_interface_execute_queue(void)
 
 int hl_interface_init_reset(void)
 {
-	enum reset_types jtag_reset_config = jtag_get_reset_config();
-
-	if (jtag_reset_config & RESET_CNCT_UNDER_SRST) {
-		if (jtag_reset_config & RESET_SRST_NO_GATING) {
-			jtag_add_reset(0, 1);
-			hl_if.layout->api->assert_srst(hl_if.fd, 0);
-		} else
-			LOG_WARNING("\'srst_nogate\' reset_config option is required");
+	/* incase the adapter has not already handled asserting srst
+	 * we will attempt it again */
+	if (hl_if.param.connect_under_reset) {
+		jtag_add_reset(0, 1);
+		hl_if.layout->api->assert_srst(hl_if.fd, 0);
 	}
 
 	return ERROR_OK;
diff --git a/src/jtag/hla/hla_interface.h b/src/jtag/hla/hla_interface.h
index 5b63ab855cbf3dcf94efd0352989915ca9c5c654..980c6d9c097ed7dcf05290d9a58ea5ffd098d317 100644
--- a/src/jtag/hla/hla_interface.h
+++ b/src/jtag/hla/hla_interface.h
@@ -46,6 +46,8 @@ struct hl_interface_param_s {
 	enum hl_transports transport;
 	/** */
 	int max_buffer;
+	/** */
+	bool connect_under_reset;
 };
 
 struct hl_interface_s {