From 05a36991c54e32a95d096337fa008938340878d3 Mon Sep 17 00:00:00 2001 From: Gonglei Date: Wed, 4 Jun 2014 16:31:50 +0800 Subject: usb-ehci: add vmstate properity for EHCIState since hotunplug the ehci host adapter, we should delete vm_change_state_handler also, so the VMChangeStateEntry should be saved in EHCIState. Signed-off-by: Gonglei Signed-off-by: Gerd Hoffmann --- hw/usb/hcd-ehci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'hw/usb/hcd-ehci.c') diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c index 448e0073dd..ef26f36d33 100644 --- a/hw/usb/hcd-ehci.c +++ b/hw/usb/hcd-ehci.c @@ -2468,7 +2468,7 @@ void usb_ehci_realize(EHCIState *s, DeviceState *dev, Error **errp) s->device = dev; qemu_register_reset(ehci_reset, s); - qemu_add_vm_change_state_handler(usb_ehci_vm_state_change, s); + s->vmstate = qemu_add_vm_change_state_handler(usb_ehci_vm_state_change, s); } void usb_ehci_init(EHCIState *s, DeviceState *dev) -- cgit 1.4.1 From 4e130cf6a83193218e357e6db49a7ade24ab9675 Mon Sep 17 00:00:00 2001 From: Gonglei Date: Wed, 4 Jun 2014 16:31:51 +0800 Subject: usb-ehci: add ehci unrealize funciton cleanup ehci controller resource, both pci and sysbus if they're necessary. Signed-off-by: Gonglei Signed-off-by: Gerd Hoffmann --- hw/usb/hcd-ehci.c | 25 +++++++++++++++++++++++++ hw/usb/hcd-ehci.h | 1 + 2 files changed, 26 insertions(+) (limited to 'hw/usb/hcd-ehci.c') diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c index ef26f36d33..2aa06bb18b 100644 --- a/hw/usb/hcd-ehci.c +++ b/hw/usb/hcd-ehci.c @@ -2471,6 +2471,31 @@ void usb_ehci_realize(EHCIState *s, DeviceState *dev, Error **errp) s->vmstate = qemu_add_vm_change_state_handler(usb_ehci_vm_state_change, s); } +void usb_ehci_unrealize(EHCIState *s, DeviceState *dev, Error **errp) +{ + if (s->frame_timer) { + timer_del(s->frame_timer); + timer_free(s->frame_timer); + s->frame_timer = NULL; + } + if (s->async_bh) { + qemu_bh_delete(s->async_bh); + } + + ehci_queues_rip_all(s, 0); + ehci_queues_rip_all(s, 1); + + memory_region_del_subregion(&s->mem, &s->mem_caps); + memory_region_del_subregion(&s->mem, &s->mem_opreg); + memory_region_del_subregion(&s->mem, &s->mem_ports); + + usb_bus_release(&s->bus); + + if (s->vmstate) { + qemu_del_vm_change_state_handler(s->vmstate); + } +} + void usb_ehci_init(EHCIState *s, DeviceState *dev) { /* 2.2 host controller interface version */ diff --git a/hw/usb/hcd-ehci.h b/hw/usb/hcd-ehci.h index 594d9d30e9..4858b7e80c 100644 --- a/hw/usb/hcd-ehci.h +++ b/hw/usb/hcd-ehci.h @@ -323,6 +323,7 @@ extern const VMStateDescription vmstate_ehci; void usb_ehci_init(EHCIState *s, DeviceState *dev); void usb_ehci_realize(EHCIState *s, DeviceState *dev, Error **errp); +void usb_ehci_unrealize(EHCIState *s, DeviceState *dev, Error **errp); #define TYPE_PCI_EHCI "pci-ehci-usb" #define PCI_EHCI(obj) OBJECT_CHECK(EHCIPCIState, (obj), TYPE_PCI_EHCI) -- cgit 1.4.1 From d733f74c333184179770e4d5017366da4b449cce Mon Sep 17 00:00:00 2001 From: Gonglei Date: Wed, 4 Jun 2014 16:31:55 +0800 Subject: usb: add usb host adapters exit trace Signed-off-by: Gonglei Signed-off-by: Gerd Hoffmann --- hw/usb/hcd-ehci.c | 2 ++ hw/usb/hcd-uhci.c | 2 ++ hw/usb/hcd-xhci.c | 2 ++ trace-events | 3 +++ 4 files changed, 9 insertions(+) (limited to 'hw/usb/hcd-ehci.c') diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c index 2aa06bb18b..bacb7ceac9 100644 --- a/hw/usb/hcd-ehci.c +++ b/hw/usb/hcd-ehci.c @@ -2473,6 +2473,8 @@ void usb_ehci_realize(EHCIState *s, DeviceState *dev, Error **errp) void usb_ehci_unrealize(EHCIState *s, DeviceState *dev, Error **errp) { + trace_usb_ehci_unrealize(); + if (s->frame_timer) { timer_del(s->frame_timer); timer_free(s->frame_timer); diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c index 220115bc5a..3b3ebcda8b 100644 --- a/hw/usb/hcd-uhci.c +++ b/hw/usb/hcd-uhci.c @@ -1260,6 +1260,8 @@ static void usb_uhci_exit(PCIDevice *dev) { UHCIState *s = DO_UPCAST(UHCIState, dev, dev); + trace_usb_uhci_exit(); + if (s->frame_timer) { timer_del(s->frame_timer); timer_free(s->frame_timer); diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c index a9245d8c2a..bbe4c5fb85 100644 --- a/hw/usb/hcd-xhci.c +++ b/hw/usb/hcd-xhci.c @@ -3649,6 +3649,8 @@ static void usb_xhci_exit(PCIDevice *dev) int i; XHCIState *xhci = XHCI(dev); + trace_usb_xhci_exit(); + for (i = 0; i < xhci->numslots; i++) { xhci_disable_slot(xhci, i + 1); } diff --git a/trace-events b/trace-events index 81bc915edd..03ac5d205c 100644 --- a/trace-events +++ b/trace-events @@ -297,6 +297,7 @@ usb_port_release(int bus, const char *port) "bus %d, port %s" # hw/usb/hcd-ehci.c usb_ehci_reset(void) "=== RESET ===" +usb_ehci_unrealize(void) "=== UNREALIZE ===" usb_ehci_opreg_read(uint32_t addr, const char *str, uint32_t val) "rd mmio %04x [%s] = %x" usb_ehci_opreg_write(uint32_t addr, const char *str, uint32_t val) "wr mmio %04x [%s] = %x" usb_ehci_opreg_change(uint32_t addr, const char *str, uint32_t new, uint32_t old) "ch mmio %04x [%s] = %x (old: %x)" @@ -329,6 +330,7 @@ usb_ehci_dma_error(void) "" # hw/usb/hcd-uhci.c usb_uhci_reset(void) "=== RESET ===" +usb_uhci_exit(void) "=== EXIT ===" usb_uhci_schedule_start(void) "" usb_uhci_schedule_stop(void) "" usb_uhci_frame_start(uint32_t num) "nr %d" @@ -358,6 +360,7 @@ usb_uhci_td_complete(uint32_t qh, uint32_t td) "qh 0x%x, td 0x%x" # hw/usb/hcd-xhci.c usb_xhci_reset(void) "=== RESET ===" +usb_xhci_exit(void) "=== EXIT ===" usb_xhci_run(void) "" usb_xhci_stop(void) "" usb_xhci_cap_read(uint32_t off, uint32_t val) "off 0x%04x, ret 0x%08x" -- cgit 1.4.1