]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/fx2lafw/protocol.c
fx2lafw: Fix segfault wrt libusb_detach_kernel_driver().
[libsigrok.git] / src / hardware / fx2lafw / protocol.c
index 6681b9efd67885009973fc7dcfad9a9e954b21ff..b1c20a7159b2f3794dc29047c49b041bb325ca5c 100644 (file)
@@ -244,6 +244,16 @@ SR_PRIV int fx2lafw_dev_open(struct sr_dev_inst *sdi, struct sr_dev_driver *di)
                        break;
                }
 
+               if (libusb_has_capability(LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER)) {
+                       if (libusb_kernel_driver_active(usb->devhdl, 0) == 1) {
+                               if ((ret = libusb_detach_kernel_driver(usb->devhdl, 0)) < 0) {
+                                       sr_err("Failed to detach kernel driver: %s.",
+                                               libusb_error_name(ret));
+                                       return SR_ERR;
+                               }
+                       }
+               }
+
                ret = command_get_fw_version(usb->devhdl, &vi);
                if (ret != SR_OK) {
                        sr_err("Failed to get firmware version.");
@@ -375,7 +385,7 @@ static void resubmit_transfer(struct libusb_transfer *transfer)
 
 }
 
-SR_PRIV void fx2lafw_receive_transfer(struct libusb_transfer *transfer)
+SR_PRIV void LIBUSB_CALL fx2lafw_receive_transfer(struct libusb_transfer *transfer)
 {
        struct sr_dev_inst *sdi;
        struct dev_context *devc;