From ca8f8e7e77ec2263044288e540c7276155155a48 Mon Sep 17 00:00:00 2001 From: Anders Date: Wed, 1 Oct 2014 19:42:33 -0700 Subject: [PATCH] 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 Signed-off-by: Anders Oleson Reviewed-on: http://openocd.zylin.com/2288 Tested-by: jenkins Reviewed-by: Spencer Oliver --- src/jtag/drivers/libusb1_common.c | 16 ++++++++++++++-- 1 file 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, ¤t_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); -- 2.39.5