am7xxx: fix the coding style used to represent pointers
[libam7xxx.git] / src / am7xxx.c
index db7ca9a..89eaab4 100644 (file)
@@ -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,10 +704,11 @@ 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;
+       int current_configuration;
 
        *dev = find_device(ctx, device_index);
        if (*dev == NULL) {
@@ -724,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;
        }
 
@@ -732,19 +733,39 @@ 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: %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;
+       }
+
+       /* 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;
@@ -785,7 +806,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;