jtag/drivers/libusb1_common: avoid device reset when reselecting configuration
authorAnders <anders@openpuma.org>
Thu, 2 Oct 2014 02:42:33 +0000 (19:42 -0700)
committerSpencer Oliver <spen@spen-soft.co.uk>
Mon, 6 Oct 2014 11:58:32 +0000 (11:58 +0000)
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>
src/jtag/drivers/libusb1_common.c

index a29b2e9105e56eaf51f645cc2ac515d2f204384f..07d9f9512ce9aed6f3947198591f2586e2fdc2d7 100644 (file)
@@ -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);