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