am7xxx_device **dev)
{
int ret;
+ int current_configuration;
*dev = find_device(ctx, device_index);
if (*dev == NULL) {
* to close it again before bailing out.
*/
- ret = libusb_set_configuration((*dev)->usb_device,
- (*dev)->desc->configuration);
- if (ret < 0) {
- debug(ctx, "libusb_set_configuration failed\n");
- debug(ctx, "Cannot set configuration %hhu\n",
- (*dev)->desc->configuration);
- goto out_libusb_close;
+ current_configuration = -1;
+ libusb_get_configuration((*dev)->usb_device, ¤t_configuration);
+ if (current_configuration != (*dev)->desc->configuration) {
+ ret = libusb_set_configuration((*dev)->usb_device,
+ (*dev)->desc->configuration);
+ if (ret < 0) {
+ debug(ctx, "libusb_set_configuration failed\n");
+ debug(ctx, "Cannot set configuration %hhu\n",
+ (*dev)->desc->configuration);
+ goto out_libusb_close;
+ }
}
+ libusb_set_auto_detach_kernel_driver((*dev)->usb_device, 1);
+
ret = libusb_claim_interface((*dev)->usb_device,
(*dev)->desc->interface_number);
if (ret < 0) {
(*dev)->desc->interface_number);
goto out_libusb_close;
}
+
+ /* Checking that the configuration has not changed, as suggested in
+ * http://libusb.sourceforge.net/api-1.0/caveats.html
+ */
+ current_configuration = -1;
+ libusb_get_configuration((*dev)->usb_device, ¤t_configuration);
+ if (current_configuration != (*dev)->desc->configuration) {
+ debug(ctx, "libusb configuration changed\n");
+ debug(ctx, "Cannot claim interface %hhu\n",
+ (*dev)->desc->interface_number);
+ goto out_libusb_close;
+ }
out:
return ret;
* This is where the central logic of multi-device support is.
*
* When 'op' == SCAN_OP_BUILD_DEVLIST the parameters 'open_device_index' and
- * 'dev' are ignored; the function returns 0 on success and a negative value
+ * 'dev' are ignored; the function returns 0 on success or a negative value
* on error.
*
* When 'op' == SCAN_OP_OPEN_DEVICE the function opens the supported USB
* device with index 'open_device_index' and returns the correspondent
* am7xxx_device in the 'dev' parameter; the function returns the value from
- * open_device(), which is 0 on success, 1 if the device was already open and
+ * open_device(), which is 0 on success, 1 if the device was already open or
* a negative value on error.
*
* NOTES: