From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=43173 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PLfJX-0003wi-1Q for qemu-devel@nongnu.org; Thu, 25 Nov 2010 12:08:57 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PLfJU-00083P-KX for qemu-devel@nongnu.org; Thu, 25 Nov 2010 12:08:54 -0500 Received: from mx1.redhat.com ([209.132.183.28]:31388) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PLfJU-00082x-DR for qemu-devel@nongnu.org; Thu, 25 Nov 2010 12:08:52 -0500 Message-Id: <20101125170602.629085075@redhat.com> Date: Thu, 25 Nov 2010 15:04:40 -0200 From: Marcelo Tosatti References: <20101125170439.548474575@redhat.com> Content-Disposition: inline; filename=usb-bus-ops Subject: [Qemu-devel] [patch 1/2] add USBBusOps to USBBus List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, kvm Cc: Matthew Garrett , Marcelo Tosatti , Adam Jackson , Gerd Hoffmann , Glauber de Oliveira Costa Needed for remote wakeup notification. Signed-off-by: Marcelo Tosatti Index: qemu-kvm/hw/usb-bus.c =================================================================== --- qemu-kvm.orig/hw/usb-bus.c +++ qemu-kvm/hw/usb-bus.c @@ -14,11 +14,12 @@ static struct BusInfo usb_bus_info = { static int next_usb_bus = 0; static QTAILQ_HEAD(, USBBus) busses = QTAILQ_HEAD_INITIALIZER(busses); -void usb_bus_new(USBBus *bus, DeviceState *host) +void usb_bus_new(USBBus *bus, DeviceState *host, USBBusOps *ops) { qbus_create_inplace(&bus->qbus, &usb_bus_info, host, NULL); bus->busnr = next_usb_bus++; bus->qbus.allow_hotplug = 1; /* Yes, we can */ + bus->ops = ops; QTAILQ_INIT(&bus->free); QTAILQ_INIT(&bus->used); QTAILQ_INSERT_TAIL(&busses, bus, next); Index: qemu-kvm/hw/usb.c =================================================================== --- qemu-kvm.orig/hw/usb.c +++ qemu-kvm/hw/usb.c @@ -229,3 +229,12 @@ void usb_send_msg(USBDevice *dev, int ms /* This _must_ be synchronous */ } + +void usb_remote_wakeup(USBDevice *dev) +{ + USBBus *bus = usb_bus_from_device(dev); + + if (bus->ops && bus->ops->remote_wakeup_cb) { + bus->ops->remote_wakeup_cb(bus, dev); + } +} Index: qemu-kvm/hw/usb.h =================================================================== --- qemu-kvm.orig/hw/usb.h +++ qemu-kvm/hw/usb.h @@ -123,6 +123,7 @@ #define USB_ENDPOINT_XFER_INT 3 typedef struct USBBus USBBus; +typedef struct USBBusOps USBBusOps; typedef struct USBPort USBPort; typedef struct USBDevice USBDevice; typedef struct USBDeviceInfo USBDeviceInfo; @@ -294,8 +295,16 @@ void musb_set_size(MUSBState *s, int epn /* usb-bus.c */ +struct USBBusOps { + /* + * Process remote wakeup request. + */ + void (*remote_wakeup_cb)(USBBus *bus, USBDevice *dev); +}; + struct USBBus { BusState qbus; + USBBusOps *ops; int busnr; int nfree; int nused; @@ -304,7 +313,7 @@ struct USBBus { QTAILQ_ENTRY(USBBus) next; }; -void usb_bus_new(USBBus *bus, DeviceState *host); +void usb_bus_new(USBBus *bus, DeviceState *host, USBBusOps *ops); USBBus *usb_bus_find(int busnr); void usb_qdev_register(USBDeviceInfo *info); void usb_qdev_register_many(USBDeviceInfo *info); @@ -317,6 +326,7 @@ void usb_unregister_port(USBBus *bus, US int usb_device_attach(USBDevice *dev); int usb_device_detach(USBDevice *dev); int usb_device_delete_addr(int busnr, int addr); +void usb_remote_wakeup(USBDevice *dev); static inline USBBus *usb_bus_from_device(USBDevice *d) { Index: qemu-kvm/hw/usb-musb.c =================================================================== --- qemu-kvm.orig/hw/usb-musb.c +++ qemu-kvm/hw/usb-musb.c @@ -342,7 +342,7 @@ struct MUSBState { s->ep[i].epnum = i; } - usb_bus_new(&s->bus, NULL /* FIXME */); + usb_bus_new(&s->bus, NULL /* FIXME */, NULL); usb_register_port(&s->bus, &s->port, s, 0, musb_attach); return s; Index: qemu-kvm/hw/usb-ohci.c =================================================================== --- qemu-kvm.orig/hw/usb-ohci.c +++ qemu-kvm/hw/usb-ohci.c @@ -1702,7 +1702,7 @@ static void usb_ohci_init(OHCIState *ohc ohci->name = dev->info->name; - usb_bus_new(&ohci->bus, dev); + usb_bus_new(&ohci->bus, dev, NULL); ohci->num_ports = num_ports; for (i = 0; i < num_ports; i++) { usb_register_port(&ohci->bus, &ohci->rhport[i].port, ohci, i, ohci_attach); Index: qemu-kvm/hw/usb-uhci.c =================================================================== --- qemu-kvm.orig/hw/usb-uhci.c +++ qemu-kvm/hw/usb-uhci.c @@ -1113,7 +1113,7 @@ static int usb_uhci_common_initfn(UHCISt pci_conf[PCI_INTERRUPT_PIN] = 4; // interrupt pin 3 pci_conf[0x60] = 0x10; // release number - usb_bus_new(&s->bus, &s->dev.qdev); + usb_bus_new(&s->bus, &s->dev.qdev, NULL); for(i = 0; i < NB_PORTS; i++) { usb_register_port(&s->bus, &s->ports[i].port, s, i, uhci_attach); }