libftdi: (gerd) tolerate EBUSY when setting configuration (EBUSY will be returned...
authorGerd von Egidy <opensource@intra2net.com>
Mon, 2 Jun 2008 10:57:20 +0000 (10:57 +0000)
committerGerd von Egidy <opensource@intra2net.com>
Mon, 2 Jun 2008 10:57:20 +0000 (10:57 +0000)
                compile with async mode

libftdi.spec
src/ftdi.c

index 52ba933..18a9b50 100644 (file)
@@ -26,7 +26,7 @@ Header files and static libraries for libftdi
 %setup -q
 
 %build
-./configure --prefix=%{prefix}
+./configure --prefix=%{prefix} --with-async-mode
 make
 
 %install
index 56fea0c..e269021 100644 (file)
@@ -360,7 +360,13 @@ int ftdi_usb_open_dev(struct ftdi_context *ftdi, struct usb_device *dev)
         detach_errno = errno;
 #endif
 
-    if (usb_set_configuration(ftdi->usb_dev, dev->config[0].bConfigurationValue)) {
+    // set configuration (needed especially for windows)
+    // tolerate EBUSY: one device with one configuration, but two interfaces
+    //    and libftdi sessions to both interfaces (e.g. FT2232)
+    if (dev->descriptor.bNumConfigurations > 0 && 
+        usb_set_configuration(ftdi->usb_dev, dev->config[0].bConfigurationValue) &&
+        errno != EBUSY)
+    {
         usb_close (ftdi->usb_dev);
         if (detach_errno == EPERM) {
             ftdi_error_return(-8, "inappropriate permissions on device!");