Lines Matching +full:libusb +full:- +full:dev

18  *  Contributions after 2012-01-13 are licensed under the terms of the
23 #include <libusb.h>
26 #include "qemu/config-file.h"
27 #include "qemu/main-loop.h"
30 #include "hw/xen/xen-legacy-backend.h"
49 xen_pv_printf(xendev, lvl, "%8ld.%06ld xen-usb(%s):" fmt, \
71 USBDevice *dev; member
124 if (QTAILQ_EMPTY(&usbif->req_free_q)) { in usbback_get_req()
127 usbback_req = QTAILQ_FIRST(&usbif->req_free_q); in usbback_get_req()
128 QTAILQ_REMOVE(&usbif->req_free_q, usbback_req, q); in usbback_get_req()
137 usbif = usbback_req->usbif; in usbback_put_req()
139 QTAILQ_INSERT_HEAD(&usbif->req_free_q, usbback_req, q); in usbback_put_req()
146 struct usbback_info *usbif = usbback_req->usbif; in usbback_gnttab_map()
147 struct XenLegacyDevice *xendev = &usbif->xendev; in usbback_gnttab_map()
151 nr_segs = usbback_req->nr_buffer_segs + usbback_req->nr_extra_segs; in usbback_gnttab_map()
159 return -EINVAL; in usbback_gnttab_map()
163 if ((unsigned)usbback_req->req.seg[i].offset + in usbback_gnttab_map()
164 (unsigned)usbback_req->req.seg[i].length > XEN_PAGE_SIZE) { in usbback_gnttab_map()
166 return -EINVAL; in usbback_gnttab_map()
170 if (usbback_req->nr_buffer_segs) { in usbback_gnttab_map()
172 if (usbif_pipein(usbback_req->req.pipe)) { in usbback_gnttab_map()
175 for (i = 0; i < usbback_req->nr_buffer_segs; i++) { in usbback_gnttab_map()
176 ref[i] = usbback_req->req.seg[i].gref; in usbback_gnttab_map()
178 usbback_req->buffer = in usbback_gnttab_map()
179 xen_be_map_grant_refs(xendev, ref, usbback_req->nr_buffer_segs, in usbback_gnttab_map()
182 if (!usbback_req->buffer) { in usbback_gnttab_map()
183 return -ENOMEM; in usbback_gnttab_map()
186 for (i = 0; i < usbback_req->nr_buffer_segs; i++) { in usbback_gnttab_map()
187 seg = usbback_req->req.seg + i; in usbback_gnttab_map()
188 addr = usbback_req->buffer + i * XEN_PAGE_SIZE + seg->offset; in usbback_gnttab_map()
189 qemu_iovec_add(&usbback_req->packet.iov, addr, seg->length); in usbback_gnttab_map()
193 if (!usbif_pipeisoc(usbback_req->req.pipe)) { in usbback_gnttab_map()
203 if (!usbback_req->nr_extra_segs) { in usbback_gnttab_map()
205 return -EINVAL; in usbback_gnttab_map()
209 for (i = 0; i < usbback_req->nr_extra_segs; i++) { in usbback_gnttab_map()
210 ref[i] = usbback_req->req.seg[i + usbback_req->req.nr_buffer_segs].gref; in usbback_gnttab_map()
212 usbback_req->isoc_buffer = in usbback_gnttab_map()
213 xen_be_map_grant_refs(xendev, ref, usbback_req->nr_extra_segs, in usbback_gnttab_map()
216 if (!usbback_req->isoc_buffer) { in usbback_gnttab_map()
217 return -ENOMEM; in usbback_gnttab_map()
225 struct XenLegacyDevice *xendev = &usbback_req->usbif->xendev; in usbback_init_packet()
226 USBPacket *packet = &usbback_req->packet; in usbback_init_packet()
227 USBDevice *dev = usbback_req->stub->dev; in usbback_init_packet() local
233 qemu_iovec_init(&packet->iov, USBIF_MAX_SEGMENTS_PER_REQUEST); in usbback_init_packet()
234 pid = usbif_pipein(usbback_req->req.pipe) ? USB_TOKEN_IN : USB_TOKEN_OUT; in usbback_init_packet()
235 ep_nr = usbif_pipeendpoint(usbback_req->req.pipe); in usbback_init_packet()
236 sok = !!(usbback_req->req.transfer_flags & USBIF_SHORT_NOT_OK); in usbback_init_packet()
237 if (usbif_pipectrl(usbback_req->req.pipe)) { in usbback_init_packet()
241 ep = usb_ep_get(dev, pid, ep_nr); in usbback_init_packet()
244 switch (usbif_pipetype(usbback_req->req.pipe)) { in usbback_init_packet()
248 usbback_req->req.buffer_length, in usbback_init_packet()
249 usbback_req->req.u.isoc.nr_frame_desc_segs); in usbback_init_packet()
250 ret = -EINVAL; /* isoc not implemented yet */ in usbback_init_packet()
256 usbback_req->req.buffer_length); in usbback_init_packet()
260 packet->parameter = *(uint64_t *)usbback_req->req.u.ctrl; in usbback_init_packet()
262 packet->parameter, in usbback_init_packet()
263 usbback_req->req.buffer_length); in usbback_init_packet()
269 usbback_req->req.buffer_length); in usbback_init_packet()
272 ret = -EINVAL; in usbback_init_packet()
288 usbif = usbback_req->usbif; in usbback_do_response()
289 xendev = &usbif->xendev; in usbback_do_response()
292 usbback_req->req.id, status, actual_length, error_count); in usbback_do_response()
294 if (usbback_req->packet.iov.iov) { in usbback_do_response()
295 qemu_iovec_destroy(&usbback_req->packet.iov); in usbback_do_response()
298 if (usbback_req->buffer) { in usbback_do_response()
299 for (i = 0; i < usbback_req->nr_buffer_segs; i++) { in usbback_do_response()
300 ref[i] = usbback_req->req.seg[i].gref; in usbback_do_response()
302 xen_be_unmap_grant_refs(xendev, usbback_req->buffer, ref, in usbback_do_response()
303 usbback_req->nr_buffer_segs); in usbback_do_response()
304 usbback_req->buffer = NULL; in usbback_do_response()
307 if (usbback_req->isoc_buffer) { in usbback_do_response()
308 for (i = 0; i < usbback_req->nr_extra_segs; i++) { in usbback_do_response()
309 ref[i] = usbback_req->req.seg[i + usbback_req->req.nr_buffer_segs].gref; in usbback_do_response()
311 xen_be_unmap_grant_refs(xendev, usbback_req->isoc_buffer, ref, in usbback_do_response()
312 usbback_req->nr_extra_segs); in usbback_do_response()
313 usbback_req->isoc_buffer = NULL; in usbback_do_response()
316 if (usbif->urb_sring) { in usbback_do_response()
317 res = RING_GET_RESPONSE(&usbif->urb_ring, usbif->urb_ring.rsp_prod_pvt); in usbback_do_response()
318 res->id = usbback_req->req.id; in usbback_do_response()
319 res->status = status; in usbback_do_response()
320 res->actual_length = actual_length; in usbback_do_response()
321 res->error_count = error_count; in usbback_do_response()
322 res->start_frame = 0; in usbback_do_response()
323 usbif->urb_ring.rsp_prod_pvt++; in usbback_do_response()
324 RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&usbif->urb_ring, notify); in usbback_do_response()
331 if (!usbback_req->cancelled) in usbback_do_response()
347 return -ENODEV; in usbback_xlat_status()
349 return -EPIPE; in usbback_xlat_status()
351 return -EOVERFLOW; in usbback_xlat_status()
353 return -EPROTO; in usbback_xlat_status()
356 return -ESHUTDOWN; in usbback_xlat_status()
361 USBPacket *packet = &usbback_req->packet; in usbback_packet_complete()
364 QTAILQ_REMOVE(&usbback_req->stub->submit_q, usbback_req, q); in usbback_packet_complete()
366 status = usbback_xlat_status(packet->status); in usbback_packet_complete()
367 usbback_do_response(usbback_req, status, packet->actual_length, 0); in usbback_packet_complete()
375 usbif->addr_table[cur_addr] = NULL; in usbback_set_address()
378 usbif->addr_table[new_addr] = stub; in usbback_set_address()
384 if (usb_packet_is_inflight(&usbback_req->packet)) { in usbback_cancel_req()
385 usb_cancel_packet(&usbback_req->packet); in usbback_cancel_req()
386 QTAILQ_REMOVE(&usbback_req->stub->submit_q, usbback_req, q); in usbback_cancel_req()
387 usbback_req->cancelled = true; in usbback_cancel_req()
388 usbback_do_response_ret(usbback_req, -EPROTO); in usbback_cancel_req()
399 usbif = usbback_req->usbif; in usbback_process_unlink_req()
401 id = usbback_req->req.u.unlink.unlink_id; in usbback_process_unlink_req()
402 TR_REQ(&usbif->xendev, "unlink id %d\n", id); in usbback_process_unlink_req()
403 devnum = usbif_pipedevice(usbback_req->req.pipe); in usbback_process_unlink_req()
405 usbback_req->stub = usbif->ports + in usbback_process_unlink_req()
406 usbif_pipeportnum(usbback_req->req.pipe) - 1; in usbback_process_unlink_req()
407 if (unlikely(!usbback_req->stub)) { in usbback_process_unlink_req()
408 ret = -ENODEV; in usbback_process_unlink_req()
412 if (unlikely(!usbif->addr_table[devnum])) { in usbback_process_unlink_req()
413 ret = -ENODEV; in usbback_process_unlink_req()
416 usbback_req->stub = usbif->addr_table[devnum]; in usbback_process_unlink_req()
419 QTAILQ_FOREACH(unlink_req, &usbback_req->stub->submit_q, q) { in usbback_process_unlink_req()
420 if (unlink_req->req.id == id) { in usbback_process_unlink_req()
447 usbif = usbback_req->usbif; in usbback_check_and_submit()
449 devnum = usbif_pipedevice(usbback_req->req.pipe); in usbback_check_and_submit()
450 ctrl = (struct usbif_ctrlrequest *)usbback_req->req.u.ctrl; in usbback_check_and_submit()
451 wValue = le16_to_cpu(ctrl->wValue); in usbback_check_and_submit()
467 stub = usbif->ports + usbif_pipeportnum(usbback_req->req.pipe) - 1; in usbback_check_and_submit()
468 if (!stub->dev || !stub->attached) { in usbback_check_and_submit()
469 ret = -ENODEV; in usbback_check_and_submit()
473 switch (ctrl->bRequest) { in usbback_check_and_submit()
479 TR_REQ(&usbif->xendev, "devnum 0 GET_DESCRIPTOR\n"); in usbback_check_and_submit()
480 usbback_req->stub = stub; in usbback_check_and_submit()
487 TR_REQ(&usbif->xendev, "devnum 0 SET_ADDRESS\n"); in usbback_check_and_submit()
492 ret = -EINVAL; in usbback_check_and_submit()
498 if (unlikely(!usbif->addr_table[devnum])) { in usbback_check_and_submit()
499 ret = -ENODEV; in usbback_check_and_submit()
502 usbback_req->stub = usbif->addr_table[devnum]; in usbback_check_and_submit()
507 if (ctrl->bRequest != USB_REQ_SET_ADDRESS) { in usbback_check_and_submit()
515 usbback_set_address(usbif, usbback_req->stub, devnum, wValue); in usbback_check_and_submit()
529 usbif = usbback_req->usbif; in usbback_dispatch()
531 TR_REQ(&usbif->xendev, "start req_id %d pipe %08x\n", usbback_req->req.id, in usbback_dispatch()
532 usbback_req->req.pipe); in usbback_dispatch()
535 if (unlikely(usbif_pipeunlink(usbback_req->req.pipe))) { in usbback_dispatch()
540 if (usbif_pipectrl(usbback_req->req.pipe)) { in usbback_dispatch()
545 devnum = usbif_pipedevice(usbback_req->req.pipe); in usbback_dispatch()
546 usbback_req->stub = usbif->addr_table[devnum]; in usbback_dispatch()
548 if (!usbback_req->stub || !usbback_req->stub->attached) { in usbback_dispatch()
549 ret = -ENODEV; in usbback_dispatch()
554 QTAILQ_INSERT_TAIL(&usbback_req->stub->submit_q, usbback_req, q); in usbback_dispatch()
556 usbback_req->nr_buffer_segs = usbback_req->req.nr_buffer_segs; in usbback_dispatch()
557 usbback_req->nr_extra_segs = usbif_pipeisoc(usbback_req->req.pipe) ? in usbback_dispatch()
558 usbback_req->req.u.isoc.nr_frame_desc_segs : 0; in usbback_dispatch()
562 xen_pv_printf(&usbif->xendev, 0, "invalid request\n"); in usbback_dispatch()
563 ret = -ESHUTDOWN; in usbback_dispatch()
569 xen_pv_printf(&usbif->xendev, 0, "invalid buffer, ret=%d\n", ret); in usbback_dispatch()
570 ret = -ESHUTDOWN; in usbback_dispatch()
574 usb_handle_packet(usbback_req->stub->dev, &usbback_req->packet); in usbback_dispatch()
575 if (usbback_req->packet.status != USB_RET_ASYNC) { in usbback_dispatch()
581 QTAILQ_REMOVE(&usbback_req->stub->submit_q, usbback_req, q); in usbback_dispatch()
589 struct usbif_conn_back_ring *ring = &usbif->conn_ring; in usbback_hotplug_notify()
595 if (!usbif->conn_sring) { in usbback_hotplug_notify()
600 if ((RING_SIZE(ring) - ring->rsp_prod_pvt - ring->req_cons) == 0) { in usbback_hotplug_notify()
601 xen_pv_send_notify(&usbif->xendev); in usbback_hotplug_notify()
605 usb_hp = QSIMPLEQ_FIRST(&usbif->hotplug_q); in usbback_hotplug_notify()
606 QSIMPLEQ_REMOVE_HEAD(&usbif->hotplug_q, q); in usbback_hotplug_notify()
608 RING_COPY_REQUEST(ring, ring->req_cons, &req); in usbback_hotplug_notify()
609 ring->req_cons++; in usbback_hotplug_notify()
610 ring->sring->req_event = ring->req_cons + 1; in usbback_hotplug_notify()
612 res = RING_GET_RESPONSE(ring, ring->rsp_prod_pvt); in usbback_hotplug_notify()
613 res->id = req.id; in usbback_hotplug_notify()
614 res->portnum = usb_hp->port; in usbback_hotplug_notify()
615 res->speed = usbif->ports[usb_hp->port - 1].speed; in usbback_hotplug_notify()
616 ring->rsp_prod_pvt++; in usbback_hotplug_notify()
620 xen_pv_send_notify(&usbif->xendev); in usbback_hotplug_notify()
623 TR_BUS(&usbif->xendev, "hotplug port %d speed %d\n", usb_hp->port, in usbback_hotplug_notify()
624 res->speed); in usbback_hotplug_notify()
628 if (!QSIMPLEQ_EMPTY(&usbif->hotplug_q)) { in usbback_hotplug_notify()
629 qemu_bh_schedule(usbif->bh); in usbback_hotplug_notify()
642 if (usbif->ring_error) { in usbback_bh()
646 if (!QSIMPLEQ_EMPTY(&usbif->hotplug_q)) { in usbback_bh()
650 urb_ring = &usbif->urb_ring; in usbback_bh()
651 rc = urb_ring->req_cons; in usbback_bh()
652 rp = urb_ring->sring->req_prod; in usbback_bh()
656 rc = urb_ring->rsp_prod_pvt; in usbback_bh()
657 xen_pv_printf(&usbif->xendev, 0, "domU provided bogus ring requests " in usbback_bh()
658 "(%#x - %#x = %u). Halting ring processing.\n", in usbback_bh()
659 rp, rc, rp - rc); in usbback_bh()
660 usbif->ring_error = true; in usbback_bh()
670 RING_COPY_REQUEST(urb_ring, rc, &usbback_req->req); in usbback_bh()
671 usbback_req->usbif = usbif; in usbback_bh()
675 urb_ring->req_cons = ++rc; in usbback_bh()
680 qemu_bh_schedule(usbif->bh); in usbback_bh()
689 usb_hp->port = port; in usbback_hotplug_enq()
690 QSIMPLEQ_INSERT_TAIL(&usbif->hotplug_q, usb_hp, q); in usbback_hotplug_enq()
699 QTAILQ_FOREACH_SAFE(req, &usbif->ports[port - 1].submit_q, q, tmp) { in usbback_portid_drain()
705 qemu_bh_schedule(usbif->bh); in usbback_portid_drain()
711 if (!usbif->ports[port - 1].attached) { in usbback_portid_detach()
715 usbif->ports[port - 1].speed = USBIF_SPEED_NONE; in usbback_portid_detach()
716 usbif->ports[port - 1].attached = false; in usbback_portid_detach()
723 if (!usbif->ports[port - 1].dev) { in usbback_portid_remove()
727 object_unparent(OBJECT(usbif->ports[port - 1].dev)); in usbback_portid_remove()
728 usbif->ports[port - 1].dev = NULL; in usbback_portid_remove()
731 TR_BUS(&usbif->xendev, "port %d removed\n", port); in usbback_portid_remove()
744 if (usbif->ports[port - 1].dev) { in usbback_portid_add()
748 portname = strchr(busid, '-'); in usbback_portid_add()
750 xen_pv_printf(&usbif->xendev, 0, "device %s illegal specification\n", in usbback_portid_add()
757 qdict_put_str(qdict, "driver", "usb-host"); in usbback_portid_add()
758 tmp = g_strdup_printf("%s.0", DEVICE(&usbif->xendev)->id); in usbback_portid_add()
761 tmp = g_strdup_printf("%s-%u", DEVICE(&usbif->xendev)->id, port); in usbback_portid_add()
769 usbif->ports[port - 1].dev = USB_DEVICE(qdev_device_add(opts, &local_err)); in usbback_portid_add()
770 if (!usbif->ports[port - 1].dev) { in usbback_portid_add()
772 xen_pv_printf(&usbif->xendev, 0, in usbback_portid_add()
779 speed = usbif->ports[port - 1].dev->speed; in usbback_portid_add()
788 speed = (usbif->usb_ver < USB_VER_USB20) ? in usbback_portid_add()
796 xen_pv_printf(&usbif->xendev, 0, "device %s wrong speed\n", busid); in usbback_portid_add()
797 object_unparent(OBJECT(usbif->ports[port - 1].dev)); in usbback_portid_add()
798 usbif->ports[port - 1].dev = NULL; in usbback_portid_add()
801 usb_device_reset(usbif->ports[port - 1].dev); in usbback_portid_add()
802 usbif->ports[port - 1].speed = speed; in usbback_portid_add()
803 usbif->ports[port - 1].attached = true; in usbback_portid_add()
804 QTAILQ_INIT(&usbif->ports[port - 1].submit_q); in usbback_portid_add()
807 TR_BUS(&usbif->xendev, "port %d attached\n", port); in usbback_portid_add()
816 busid = xenstore_read_be_str(&usbif->xendev, node); in usbback_process_port()
818 xen_pv_printf(&usbif->xendev, 0, "xenstore_read %s failed\n", node); in usbback_process_port()
843 if (usbif->urb_sring) { in usbback_disconnect()
844 xen_be_unmap_grant_ref(xendev, usbif->urb_sring, usbif->urb_ring_ref); in usbback_disconnect()
845 usbif->urb_sring = NULL; in usbback_disconnect()
847 if (usbif->conn_sring) { in usbback_disconnect()
848 xen_be_unmap_grant_ref(xendev, usbif->conn_sring, usbif->conn_ring_ref); in usbback_disconnect()
849 usbif->conn_sring = NULL; in usbback_disconnect()
852 for (i = 0; i < usbif->num_ports; i++) { in usbback_disconnect()
853 if (usbif->ports[i].dev) { in usbback_disconnect()
878 if (xenstore_read_fe_int(xendev, "urb-ring-ref", &urb_ring_ref)) { in usbback_connect()
879 xen_pv_printf(xendev, 0, "error reading urb-ring-ref\n"); in usbback_connect()
880 return -1; in usbback_connect()
882 if (xenstore_read_fe_int(xendev, "conn-ring-ref", &conn_ring_ref)) { in usbback_connect()
883 xen_pv_printf(xendev, 0, "error reading conn-ring-ref\n"); in usbback_connect()
884 return -1; in usbback_connect()
886 if (xenstore_read_fe_int(xendev, "event-channel", &xendev->remote_port)) { in usbback_connect()
887 xen_pv_printf(xendev, 0, "error reading event-channel\n"); in usbback_connect()
888 return -1; in usbback_connect()
891 usbif->urb_sring = xen_be_map_grant_ref(xendev, urb_ring_ref, in usbback_connect()
893 usbif->conn_sring = xen_be_map_grant_ref(xendev, conn_ring_ref, in usbback_connect()
895 if (!usbif->urb_sring || !usbif->conn_sring) { in usbback_connect()
898 return -1; in usbback_connect()
901 usbif->urb_ring_ref = urb_ring_ref; in usbback_connect()
902 usbif->conn_ring_ref = conn_ring_ref; in usbback_connect()
903 urb_sring = usbif->urb_sring; in usbback_connect()
904 conn_sring = usbif->conn_sring; in usbback_connect()
905 BACK_RING_INIT(&usbif->urb_ring, urb_sring, XEN_PAGE_SIZE); in usbback_connect()
906 BACK_RING_INIT(&usbif->conn_ring, conn_sring, XEN_PAGE_SIZE); in usbback_connect()
910 xen_pv_printf(xendev, 1, "urb-ring-ref %d, conn-ring-ref %d, " in usbback_connect()
912 conn_ring_ref, xendev->remote_port, xendev->local_port); in usbback_connect()
914 for (i = 1; i <= usbif->num_ports; i++) { in usbback_connect()
915 if (usbif->ports[i - 1].dev) { in usbback_connect()
932 for (i = 1; i <= usbif->num_ports; i++) { in usbback_backend_changed()
945 if (xenstore_read_be_int(xendev, "num-ports", &usbif->num_ports) || in usbback_init()
946 usbif->num_ports < 1 || usbif->num_ports > USBBACK_MAXPORTS) { in usbback_init()
947 xen_pv_printf(xendev, 0, "num-ports not readable or out of bounds\n"); in usbback_init()
948 return -1; in usbback_init()
950 if (xenstore_read_be_int(xendev, "usb-ver", &usbif->usb_ver) || in usbback_init()
951 (usbif->usb_ver != USB_VER_USB11 && usbif->usb_ver != USB_VER_USB20)) { in usbback_init()
952 xen_pv_printf(xendev, 0, "usb-ver not readable or out of bounds\n"); in usbback_init()
953 return -1; in usbback_init()
967 usbif = port->opaque; in xen_bus_attach()
968 TR_BUS(&usbif->xendev, "\n"); in xen_bus_attach()
969 usbif->ports[port->index].attached = true; in xen_bus_attach()
970 usbback_hotplug_enq(usbif, port->index + 1); in xen_bus_attach()
977 usbif = port->opaque; in xen_bus_detach()
978 TR_BUS(&usbif->xendev, "\n"); in xen_bus_detach()
979 usbback_portid_detach(usbif, port->index + 1); in xen_bus_detach()
986 usbif = port->opaque; in xen_bus_child_detach()
987 TR_BUS(&usbif->xendev, "\n"); in xen_bus_child_detach()
996 if (usbback_req->cancelled) { in xen_bus_complete()
1001 usbif = usbback_req->usbif; in xen_bus_complete()
1002 TR_REQ(&usbif->xendev, "\n"); in xen_bus_complete()
1024 usb_bus_new(&usbif->bus, sizeof(usbif->bus), &xen_usb_bus_ops, in usbback_alloc()
1027 p = &(usbif->ports[i].port); in usbback_alloc()
1028 usb_register_port(&usbif->bus, p, usbif, i, &xen_usb_port_ops, in usbback_alloc()
1033 QTAILQ_INIT(&usbif->req_free_q); in usbback_alloc()
1034 QSIMPLEQ_INIT(&usbif->hotplug_q); in usbback_alloc()
1035 usbif->bh = qemu_bh_new_guarded(usbback_bh, usbif, in usbback_alloc()
1036 &DEVICE(xendev)->mem_reentrancy_guard); in usbback_alloc()
1050 for (i = 1; i <= usbif->num_ports; i++) { in usbback_free()
1054 while (!QTAILQ_EMPTY(&usbif->req_free_q)) { in usbback_free()
1055 usbback_req = QTAILQ_FIRST(&usbif->req_free_q); in usbback_free()
1056 QTAILQ_REMOVE(&usbif->req_free_q, usbback_req, q); in usbback_free()
1059 while (!QSIMPLEQ_EMPTY(&usbif->hotplug_q)) { in usbback_free()
1060 usb_hp = QSIMPLEQ_FIRST(&usbif->hotplug_q); in usbback_free()
1061 QSIMPLEQ_REMOVE_HEAD(&usbif->hotplug_q, q); in usbback_free()
1065 qemu_bh_delete(usbif->bh); in usbback_free()
1068 usb_unregister_port(&usbif->bus, &(usbif->ports[i].port)); in usbback_free()
1071 usb_bus_release(&usbif->bus); in usbback_free()
1083 qemu_bh_schedule(usbif->bh); in usbback_event()