diff options
author | Thomas Heijligen <thomas.heijligen@secunet.com> | 2022-08-25 13:41:14 +0200 |
---|---|---|
committer | Anastasia Klimchuk <aklm@chromium.org> | 2023-04-12 09:32:25 +0000 |
commit | cb85aec5cec75e5750a1d846411d8a42bf1b9f7b (patch) | |
tree | d1e67f23c4b06572dd958f275e20a584e878e0e2 | |
parent | 3eaef7528b622955a48611fdc0801ca853665efd (diff) | |
download | flashrom-git-cb85aec5cec75e5750a1d846411d8a42bf1b9f7b.tar.gz |
usb_device.c: detach/attach usb kernel driver explicitly
Use `libusb_detach_kernel_driver` and `libusb_attach_kernel_driver`
instead of `libusb_auto_detach_kernel_driver` to be compatible with
older libusb versions without changing the behavior.
TEST=Build with libusb >= 1.0.9
Change-Id: I1363fea13368b7ac1e9a3829864d06d123c4e157
Signed-off-by: Thomas Heijligen <thomas.heijligen@secunet.com>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/67073
Reviewed-by: Peter Marheine <pmarheine@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Edward O'Callaghan <quasisec@chromium.org>
Reviewed-by: Anastasia Klimchuk <aklm@chromium.org>
-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); } |