|
From: | Hans de Goede |
Subject: | Re: [Qemu-devel] [PATCH 03/13] usb-host-libusb: Detach kernel drivers earlier |
Date: | Wed, 09 Oct 2013 15:08:24 +0200 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.0 |
Hi, On 10/09/2013 10:55 AM, Gerd Hoffmann wrote:
On Di, 2013-10-08 at 21:58 +0200, Hans de Goede wrote:If we detach the kernel drivers on the first set_config, then they will be still attached when the device gets its initial reset. Causing the drivers to re-initialize the device after the reset, dirtying the device state.@@ -1051,7 +1055,6 @@ static void usb_host_set_config(USBHostDevice *s, int config, USBPacket *p) trace_usb_host_set_config(s->bus_num, s->addr, config); usb_host_release_interfaces(s); - usb_host_detach_kernel(s); rc = libusb_set_configuration(s->dh, config); if (rc != 0) { usb_host_libusb_error("libusb_set_configuration", rc);Sure we can safely remove the detach_kernel here?
Yes.
Assuming we have a device with multiple configurations, each configuration has a different set of interfaces, guest switches from one config to another. Do we correctly unbind kernel / claim interfaces then?
Yes we still have a usb_host_detach_kernel() call in the beginning of usb_host_claim_interfaces(), which gets run on the new interfaces immediately after the libusb_set_configuration call. Doing a detach_kernel after a set_config has always been necessary, since the kernel will automatically bind drivers to the new interfaces if the set_config succeeds. Doing detach_kernel before set_config is necessary if kernel drivers are attached, because the kernel will not allow a set_config if any drivers are bound. But we already do a set_config for the current config on usb_host_open() now, and if a new config gets installed we immediately detach the kernel drivers again from usb_host_claim_interfaces() so when we enter usb_host_set_config no kernel drivers, other then usbfs (the userspace access driver) will be attached, and usbfs is detached by releasing the interfaces (*). Regards, Hans *) In recent libusb versions libusb will even disallow using libusb_detach_kernel_driver to detach usbfs, so as to stop a user space program from breaking anothers userspaces program claim on the interface by completelty detaching usbfs from the interface.
[Prev in Thread] | Current Thread | [Next in Thread] |