From 313d4a702aefeac3c8360141ae9037a8fdd47746 Mon Sep 17 00:00:00 2001
From: Antonio Ospite <ao2@ao2.it>
Date: Mon, 26 Jan 2015 00:00:25 +0100
Subject: [PATCH] am7xxx: use a saner approach when setting the USB
 configuration

Follow the advices from
http://libusb.sourceforge.net/api-1.0/caveats.html
---
 src/am7xxx.c | 31 ++++++++++++++++++++++++-------
 1 file changed, 24 insertions(+), 7 deletions(-)

diff --git a/src/am7xxx.c b/src/am7xxx.c
index db7ca9a..321a193 100644
--- a/src/am7xxx.c
+++ b/src/am7xxx.c
@@ -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;
 
-- 
2.1.4