On Thu, 2007-02-15 at 15:44 +0800, Yu, Xiaoyang wrote:
> Hi Lonnie,
> 
> Thanks a lot for the information.
> 
> In our use case, we do not know the USB disk information before it is plugged 
> by customer, so we cannot start qemu with -usbdevice.
> 
> For Linux, reload the uhci_hcd driver works. If we use this solution in our 
> use case, then we need to issue an interrupt (maybe by pic_set_irq_new?) to 
> the guest OS when QEMU detect a USB device is attached, and then the guest OS 
> will reload the uhci_hcd driver. Is that right? Currently there is something 
> wrong with the list archive server, so I haven't search out any example code 
> from it :-(
> 
> I found that there is a patch to add the UHCI suspend/resume support in the 
> archive posted by you, but it cannot be applied to QEMU-DM 0.8.2 directly:
> http://lists.gnu.org/archive/html/qemu-devel/2006-04/msg00576.html
> 
> I wonder why there is no official UHCI suspend/resume support in QEMU. To 
> reload the uhci_hcd driver seems to be only a work around. Sometimes it even 
> cause kernel oops. 
> 
> I also wonder why the kernel 2.6.11-1.1369_FC4 can recognize USB storage 
> without UHCI suspend/resume support.

The attached patch is enough to have a device on linux recognized after
usb_add.  However, the device must be attached to the uhci controller's
root hub.  If a device is attached to an emulated usb hub device it will
not be detected.
? qemu-uhci-resume.diff
Index: hw/usb-uhci.c
===================================================================
RCS file: /sources/qemu/qemu/hw/usb-uhci.c,v
retrieving revision 1.13
diff -u -r1.13 usb-uhci.c
--- hw/usb-uhci.c	17 Jan 2007 23:08:17 -0000	1.13
+++ hw/usb-uhci.c	15 Feb 2007 14:44:40 -0000
@@ -26,6 +26,8 @@
 //#define DEBUG
 //#define DEBUG_PACKET
 
+#define UHCI_CMD_FGR      (1 << 4)
+#define UHCI_CMD_EGSM     (1 << 3)
 #define UHCI_CMD_GRESET   (1 << 2)
 #define UHCI_CMD_HCRESET  (1 << 1)
 #define UHCI_CMD_RS       (1 << 0)
@@ -327,6 +329,21 @@
     return val;
 }
 
+/* signal resume if controller suspended */
+static void uhci_resume (void *opaque)
+{
+    UHCIState *s = (UHCIState *)opaque;
+
+    if (!s)
+        return;
+
+    if (s->cmd & UHCI_CMD_EGSM) {
+        s->cmd |= UHCI_CMD_FGR;
+        s->status |= UHCI_STS_RD;
+        uhci_update_irq(s);
+    }
+}
+
 static void uhci_attach(USBPort *port1, USBDevice *dev)
 {
     UHCIState *s = port1->opaque;
@@ -344,6 +361,9 @@
             port->ctrl |= UHCI_PORT_LSDA;
         else
             port->ctrl &= ~UHCI_PORT_LSDA;
+
+        uhci_resume(s);
+
         port->port.dev = dev;
         /* send the attach message */
         usb_send_msg(dev, USB_MSG_ATTACH);
@@ -358,6 +378,9 @@
             port->ctrl &= ~UHCI_PORT_EN;
             port->ctrl |= UHCI_PORT_ENC;
         }
+
+        uhci_resume(s);
+
         dev = port->port.dev;
         if (dev) {
             /* send the detach message */
_______________________________________________
Qemu-devel mailing list
Qemu-devel@nongnu.org
http://lists.nongnu.org/mailman/listinfo/qemu-devel

Reply via email to