am7xxx: use a saner approach when setting the USB configuration
authorAntonio Ospite <ao2@ao2.it>
Sun, 25 Jan 2015 23:00:25 +0000 (00:00 +0100)
committerAntonio Ospite <ao2@ao2.it>
Sun, 25 Jan 2015 23:00:25 +0000 (00:00 +0100)
Follow the advices from
http://libusb.sourceforge.net/api-1.0/caveats.html

src/am7xxx.c

index db7ca9a..321a193 100644 (file)
@@ -708,6 +708,7 @@ static int open_device(am7xxx_context *ctx,
                       am7xxx_device **dev)
 {
        int ret;
+       int current_configuration;
 
        *dev = find_device(ctx, device_index);
        if (*dev == NULL) {
@@ -732,13 +733,17 @@ static int open_device(am7xxx_context *ctx,
         * 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, &current_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;
+               }
        }
 
        ret = libusb_claim_interface((*dev)->usb_device,
@@ -749,6 +754,18 @@ static int open_device(am7xxx_context *ctx,
                      (*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, &current_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;