qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 03/13] usb-host-libusb: Detach kernel drivers ea


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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]