Patchwork Implement the function usb_hub_handle_reset

login
register
mail settings
Submitter hkran
Date Nov. 22, 2011, 8:58 a.m.
Message ID <4ECB643D.10308@linux.vnet.ibm.com>
Download mbox | patch
Permalink /patch/127020/
State New
Headers show

Comments

hkran - Nov. 22, 2011, 8:58 a.m.
Implement the function usb_hub_handle_reset. without it the guest 
propablly fail to configure the usb device attached to the virtulized 
hub with a correct address.

Typically, attaching more than one usb devices when lauch qemu may lead 
to the problem.


Signed-off-by: hkran <hkran@linux.vnet.ibm.com>
---
  hw/usb-hub.c |   13 ++++++++++++-
  1 files changed, 12 insertions(+), 1 deletions(-)

  static int usb_hub_handle_control(USBDevice *dev, USBPacket *p,
Gerd Hoffmann - Nov. 22, 2011, 12:36 p.m.
On 11/22/11 09:58, hkran wrote:
> Implement the function usb_hub_handle_reset. without it the guest
> propablly fail to configure the usb device attached to the virtulized
> hub with a correct address.
> 
> Typically, attaching more than one usb devices when lauch qemu may lead
> to the problem.

What is the exact problem you are trying to fix?

cheers,
  Gerd
hkran - Nov. 23, 2011, 3:16 a.m.
On 11/22/2011 08:36 PM, Gerd Hoffmann wrote:
> On 11/22/11 09:58, hkran wrote:
>> Implement the function usb_hub_handle_reset. without it the guest
>> propablly fail to configure the usb device attached to the virtulized
>> hub with a correct address.
>>
>> Typically, attaching more than one usb devices when lauch qemu may lead
>> to the problem.
> What is the exact problem you are trying to fix?
>
> cheers,
>    Gerd
>
>
For example, I use the following command line to lautch qemu to play win7

  /home/huikai/qemu10/bin/qemu-system-x86_64 -enable-kvm -m 1024 -drive  
file=/root/win7_86.img,if=ide  -net user  -net  nic,model=rtl8139 
-localtime -chardev stdio,id=muxstdio -mon  chardev=muxstdio -usb 
-usbdevice tablet -spice port=2345,disable-ticketing -cdrom 
/home/guest/Fedora-15-i686-Live-Desktop.iso -boot once=d -usbdevice 
host:0000:7777

Here, I attatched two usbdevice tablet and a usb storage device 
"host:0000:7777" on the host side. After guest have booted.there will 
not see the usb storage device.
using monitor cmd "info usb" found the below:

  (qemu) info usb
   Device 0.1, Port 1, Speed 12 Mb/s, Product QEMU USB Tablet
   Device 0.3, Port 2, Speed 12 Mb/s, Product QEMU USB Hub
   Device 0.3, Port 2.1, Speed 480 Mb/s, Product host:2.4

the device "host:0000:7777" have not been configured successfully, guest 
OS can not to see it.

I traced qemu and found that there will be several reset cmd issued by 
the guest usb protocol stack during win7 booting, if we left the 
hub_reset to do nothing, the usbdevice attached to it will fail to be 
configured just in above case.
(If we "hot plug-in " a usb device via qemu's monitor, the problem is 
not so easy to be reproduced because the reset cmd only be issued only 
once or none)

(the problem is not always reproduced, but high possibility).

Patch

diff --git a/hw/usb-hub.c b/hw/usb-hub.c
index 3eb0f1a..6731075 100644
--- a/hw/usb-hub.c
+++ b/hw/usb-hub.c
@@ -220,7 +220,18 @@  static void usb_hub_complete(USBPort *port, 
USBPacket *packet)

  static void usb_hub_handle_reset(USBDevice *dev)
  {
-    /* XXX: do it */
+    USBHubPort *port = NULL;
+    USBHubState *s = (USBHubState *)dev;
+    int i;
+
+    for(i = 0; i < NUM_PORTS; i++) {
+        port = &(s->ports[i]);
+        if(port->wPortStatus & PORT_STAT_CONNECTION) {
+            usb_reset(&port->port);
+            port->wPortStatus = PORT_STAT_CONNECTION | PORT_STAT_POWER;
+            port->wPortChange = PORT_STAT_C_CONNECTION;
+        }
+    }
  }