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
[email protected]
http://lists.nongnu.org/mailman/listinfo/qemu-devel