diff options
Diffstat (limited to 'usb_device.c')
-rw-r--r-- | usb_device.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/usb_device.c b/usb_device.c index b3c966cc..c9c8d92a 100644 --- a/usb_device.c +++ b/usb_device.c @@ -342,9 +342,11 @@ int usb_device_claim(struct usb_device *device) } } - ret = LIBUSB(libusb_set_auto_detach_kernel_driver(device->handle, 1)); - if (ret != 0) { - msg_perr("USB: Failed to enable auto kernel driver detach\n"); + ret = LIBUSB(libusb_detach_kernel_driver(device->handle, + device->interface_descriptor->bInterfaceNumber)); + if (ret != 0 && ret != LIBUSB_ERROR_NOT_FOUND && ret != LIBUSB_ERROR_NOT_SUPPORTED) { + msg_perr("Cannot detach the existing usb driver. %s\n", + libusb_error_name(ret)); return ret; } @@ -355,6 +357,8 @@ int usb_device_claim(struct usb_device *device) if (ret != 0) { msg_perr("USB: Could not claim device interface %d\n", device->interface_descriptor->bInterfaceNumber); + libusb_attach_kernel_driver(device->handle, + device->interface_descriptor->bInterfaceNumber); return ret; } @@ -384,6 +388,8 @@ struct usb_device *usb_device_free(struct usb_device *device) if (device->handle != NULL) { libusb_release_interface(device->handle, device->interface_descriptor->bInterfaceNumber); + libusb_attach_kernel_driver(device->handle, + device->interface_descriptor->bInterfaceNumber); libusb_close(device->handle); } |