aboutsummaryrefslogtreecommitdiff
path: root/src/jtag
diff options
context:
space:
mode:
authorAnders <anders@openpuma.org>2014-10-01 19:42:33 -0700
committerSpencer Oliver <spen@spen-soft.co.uk>2014-10-06 11:58:32 +0000
commitca8f8e7e77ec2263044288e540c7276155155a48 (patch)
treecc484497eae7710f93e237be7a772bd953d5dfaf /src/jtag
parent48a681c741993e61f2a9404b75b73d011b9e184e (diff)
jtag/drivers/libusb1_common: avoid device reset when reselecting configuration
According to [1], we shouldn't reselect an already active configuration to avoid needless device reset. This is known to cause issues with e.g. LPC Link2 with JLink firmware. [1] http://libusb.sourceforge.net/api-1.0/caveats.html#configsel Change-Id: I3568ada77780a521548c450090db7173f8d0b2dd Signed-off-by: Paul Fertser <fercerpav@gmail.com> Signed-off-by: Anders Oleson <anders@openpuma.org> Reviewed-on: http://openocd.zylin.com/2288 Tested-by: jenkins Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
Diffstat (limited to 'src/jtag')
-rw-r--r--src/jtag/drivers/libusb1_common.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/jtag/drivers/libusb1_common.c b/src/jtag/drivers/libusb1_common.c
index a29b2e91..07d9f951 100644
--- a/src/jtag/drivers/libusb1_common.c
+++ b/src/jtag/drivers/libusb1_common.c
@@ -165,9 +165,21 @@ int jtag_libusb_set_configuration(jtag_libusb_device_handle *devh,
int retCode = -99;
struct libusb_config_descriptor *config = NULL;
+ int current_config = -1;
- libusb_get_config_descriptor(udev, configuration, &config);
- retCode = libusb_set_configuration(devh, config->bConfigurationValue);
+ retCode = libusb_get_configuration(devh, &current_config);
+ if (retCode != 0)
+ return retCode;
+
+ retCode = libusb_get_config_descriptor(udev, configuration, &config);
+ if (retCode != 0 || config == NULL)
+ return retCode;
+
+ /* Only change the configuration if it is not already set to the
+ same one. Otherwise this issues a lightweight reset and hangs
+ LPC-Link2 with JLink firmware. */
+ if (current_config != config->bConfigurationValue)
+ retCode = libusb_set_configuration(devh, config->bConfigurationValue);
libusb_free_config_descriptor(config);