am7xxx: fix the error path of the second configuration check
[libam7xxx.git] / src / am7xxx.c
index 321a193..1c3f704 100644 (file)
@@ -34,7 +34,7 @@
  * taken from: http://unixwiz.net/techtips/gnu-c-attributes.html)
  */
 #ifndef __GNUC__
-#  define  __attribute__(x)  /*NOTHING*/
+#  define  __attribute__(x)  /* NOTHING */
 #endif
 
 /* Control shared library symbols visibility */
@@ -385,8 +385,8 @@ static int read_data(am7xxx_device *dev, uint8_t *buffer, unsigned int len)
 
        ret = libusb_bulk_transfer(dev->usb_device, 0x81, buffer, len, &transferred, 0);
        if (ret != 0 || (unsigned int)transferred != len) {
-               error(dev->ctx, "ret: %d\ttransferred: %d (expected %u)\n",
-                     ret, transferred, len);
+               error(dev->ctx, "%s. Transferred: %d (expected %u)\n",
+                     libusb_error_name(ret), transferred, len);
                return ret;
        }
 
@@ -404,8 +404,8 @@ static int send_data(am7xxx_device *dev, uint8_t *buffer, unsigned int len)
 
        ret = libusb_bulk_transfer(dev->usb_device, 0x1, buffer, len, &transferred, 0);
        if (ret != 0 || (unsigned int)transferred != len) {
-               error(dev->ctx, "ret: %d\ttransferred: %d (expected %u)\n",
-                     ret, transferred, len);
+               error(dev->ctx, "%s. Transferred: %d (expected %u)\n",
+                     libusb_error_name(ret), transferred, len);
                return ret;
        }
 
@@ -704,7 +704,7 @@ static am7xxx_device *find_device(am7xxx_context *ctx,
 
 static int open_device(am7xxx_context *ctx,
                       unsigned int device_index,
-                      libusb_deviceusb_dev,
+                      libusb_device *usb_dev,
                       am7xxx_device **dev)
 {
        int ret;
@@ -725,7 +725,7 @@ static int open_device(am7xxx_context *ctx,
 
        ret = libusb_open(usb_dev, &((*dev)->usb_device));
        if (ret < 0) {
-               debug(ctx, "libusb_open failed\n");
+               debug(ctx, "libusb_open failed: %s\n", libusb_error_name(ret));
                goto out;
        }
 
@@ -736,20 +736,33 @@ static int open_device(am7xxx_context *ctx,
        current_configuration = -1;
        libusb_get_configuration((*dev)->usb_device, &current_configuration);
        if (current_configuration != (*dev)->desc->configuration) {
+               /*
+                * In principle kernel drivers bound to each interface should
+                * be detached before setting the configuration, but in
+                * practice this is not necessary for most devices.
+                *
+                * For example something like the following function would be
+                * called:
+                *      libusb_detach_all_kernel_drivers((*dev)->usb_device);
+                */
                ret = libusb_set_configuration((*dev)->usb_device,
                                               (*dev)->desc->configuration);
                if (ret < 0) {
-                       debug(ctx, "libusb_set_configuration failed\n");
+                       debug(ctx, "libusb_set_configuration failed: %s\n",
+                             libusb_error_name(ret));
                        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) {
-               debug(ctx, "libusb_claim_interface failed\n");
+               debug(ctx, "libusb_claim_interface failed: %s\n",
+                     libusb_error_name(ret));
                debug(ctx, "Cannot claim interface %hhu\n",
                      (*dev)->desc->interface_number);
                goto out_libusb_close;
@@ -761,9 +774,9 @@ static int open_device(am7xxx_context *ctx,
        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);
+               debug(ctx, "libusb configuration changed (expected: %hhu, current: %hhu\n",
+                     (*dev)->desc->configuration, current_configuration);
+               ret = -EINVAL;
                goto out_libusb_close;
        }
 out:
@@ -802,7 +815,7 @@ static int scan_devices(am7xxx_context *ctx, scan_op op,
                        unsigned int open_device_index, am7xxx_device **dev)
 {
        ssize_t num_devices;
-       libusb_device** list;
+       libusb_device **list;
        unsigned int current_index;
        int i;
        int ret;