From c6dba62cf04bc607fba7291ed79a87ba46848b09 Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Mon, 5 Aug 2019 09:24:25 +0100 Subject: [PATCH] solokey: Release the interface and rebind the kernel driver on close --- plugins/solokey/fu-solokey-device.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/plugins/solokey/fu-solokey-device.c b/plugins/solokey/fu-solokey-device.c index 599c13758..0fcb7ca5c 100644 --- a/plugins/solokey/fu-solokey-device.c +++ b/plugins/solokey/fu-solokey-device.c @@ -133,6 +133,23 @@ fu_solokey_device_open (FuUsbDevice *device, GError **error) return TRUE; } +static gboolean +fu_solokey_device_close (FuUsbDevice *device, GError **error) +{ + GUsbDevice *usb_device = fu_usb_device_get_dev (device); + + /* rebind kernel driver so it works as a security key again... */ + if (!g_usb_device_release_interface (usb_device, 0x0000, + G_USB_DEVICE_CLAIM_INTERFACE_BIND_KERNEL_DRIVER, + error)) { + g_prefix_error (error, "failed to release interface: "); + return FALSE; + } + + /* success */ + return TRUE; +} + static gboolean fu_solokey_device_packet_tx (FuSolokeyDevice *self, GByteArray *req, GError **error) { @@ -534,6 +551,7 @@ fu_solokey_device_class_init (FuSolokeyDeviceClass *klass) klass_device->write_firmware = fu_solokey_device_write_firmware; klass_device->setup = fu_solokey_device_setup; klass_usb_device->open = fu_solokey_device_open; + klass_usb_device->close = fu_solokey_device_close; klass_usb_device->probe = fu_solokey_device_probe; }