Lines Matching refs:usbif

79     struct usbback_info      *usbif;  member
120 static struct usbback_req *usbback_get_req(struct usbback_info *usbif) in usbback_get_req() argument
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()
135 struct usbback_info *usbif; in usbback_put_req() local
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() local
147 struct XenLegacyDevice *xendev = &usbif->xendev; in usbback_gnttab_map()
225 struct XenLegacyDevice *xendev = &usbback_req->usbif->xendev; in usbback_init_packet()
283 struct usbback_info *usbif; in usbback_do_response() local
288 usbif = usbback_req->usbif; in usbback_do_response()
289 xendev = &usbif->xendev; 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()
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()
370 static void usbback_set_address(struct usbback_info *usbif, in usbback_set_address() argument
375 usbif->addr_table[cur_addr] = NULL; in usbback_set_address()
378 usbif->addr_table[new_addr] = stub; in usbback_set_address()
394 struct usbback_info *usbif; in usbback_process_unlink_req() local
399 usbif = usbback_req->usbif; in usbback_process_unlink_req()
402 TR_REQ(&usbif->xendev, "unlink id %d\n", id); in usbback_process_unlink_req()
405 usbback_req->stub = usbif->ports + in usbback_process_unlink_req()
412 if (unlikely(!usbif->addr_table[devnum])) { in usbback_process_unlink_req()
416 usbback_req->stub = usbif->addr_table[devnum]; in usbback_process_unlink_req()
440 struct usbback_info *usbif; in usbback_check_and_submit() local
447 usbif = usbback_req->usbif; in usbback_check_and_submit()
467 stub = usbif->ports + usbif_pipeportnum(usbback_req->req.pipe) - 1; in usbback_check_and_submit()
479 TR_REQ(&usbif->xendev, "devnum 0 GET_DESCRIPTOR\n"); in usbback_check_and_submit()
487 TR_REQ(&usbif->xendev, "devnum 0 SET_ADDRESS\n"); in usbback_check_and_submit()
488 usbback_set_address(usbif, stub, 0, wValue); in usbback_check_and_submit()
498 if (unlikely(!usbif->addr_table[devnum])) { in usbback_check_and_submit()
502 usbback_req->stub = usbif->addr_table[devnum]; in usbback_check_and_submit()
515 usbback_set_address(usbif, usbback_req->stub, devnum, wValue); in usbback_check_and_submit()
527 struct usbback_info *usbif; in usbback_dispatch() local
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()
546 usbback_req->stub = usbif->addr_table[devnum]; in usbback_dispatch()
562 xen_pv_printf(&usbif->xendev, 0, "invalid request\n"); in usbback_dispatch()
569 xen_pv_printf(&usbif->xendev, 0, "invalid buffer, ret=%d\n", ret); in usbback_dispatch()
587 static void usbback_hotplug_notify(struct usbback_info *usbif) in usbback_hotplug_notify() argument
589 struct usbif_conn_back_ring *ring = &usbif->conn_ring; in usbback_hotplug_notify()
595 if (!usbif->conn_sring) { 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()
615 res->speed = usbif->ports[usb_hp->port - 1].speed; 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()
628 if (!QSIMPLEQ_EMPTY(&usbif->hotplug_q)) { in usbback_hotplug_notify()
629 qemu_bh_schedule(usbif->bh); in usbback_hotplug_notify()
635 struct usbback_info *usbif; in usbback_bh() local
641 usbif = opaque; in usbback_bh()
642 if (usbif->ring_error) { in usbback_bh()
646 if (!QSIMPLEQ_EMPTY(&usbif->hotplug_q)) { in usbback_bh()
647 usbback_hotplug_notify(usbif); in usbback_bh()
650 urb_ring = &usbif->urb_ring; in usbback_bh()
657 xen_pv_printf(&usbif->xendev, 0, "domU provided bogus ring requests " in usbback_bh()
660 usbif->ring_error = true; in usbback_bh()
668 usbback_req = usbback_get_req(usbif); in usbback_bh()
671 usbback_req->usbif = usbif; in usbback_bh()
680 qemu_bh_schedule(usbif->bh); in usbback_bh()
684 static void usbback_hotplug_enq(struct usbback_info *usbif, unsigned port) in usbback_hotplug_enq() argument
690 QSIMPLEQ_INSERT_TAIL(&usbif->hotplug_q, usb_hp, q); in usbback_hotplug_enq()
691 usbback_hotplug_notify(usbif); in usbback_hotplug_enq()
694 static void usbback_portid_drain(struct usbback_info *usbif, unsigned port) in usbback_portid_drain() argument
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()
709 static void usbback_portid_detach(struct usbback_info *usbif, unsigned port) in usbback_portid_detach() argument
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()
717 usbback_portid_drain(usbif, port); in usbback_portid_detach()
718 usbback_hotplug_enq(usbif, port); in usbback_portid_detach()
721 static void usbback_portid_remove(struct usbback_info *usbif, unsigned port) in usbback_portid_remove() argument
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()
729 usbback_portid_detach(usbif, port); in usbback_portid_remove()
731 TR_BUS(&usbif->xendev, "port %d removed\n", port); in usbback_portid_remove()
734 static void usbback_portid_add(struct usbback_info *usbif, unsigned port, in usbback_portid_add() argument
744 if (usbif->ports[port - 1].dev) { in usbback_portid_add()
750 xen_pv_printf(&usbif->xendev, 0, "device %s illegal specification\n", in usbback_portid_add()
758 tmp = g_strdup_printf("%s.0", usbif->xendev.qdev.id); in usbback_portid_add()
761 tmp = g_strdup_printf("%s-%u", usbif->xendev.qdev.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()
805 usbback_hotplug_enq(usbif, port); in usbback_portid_add()
807 TR_BUS(&usbif->xendev, "port %d attached\n", port); in usbback_portid_add()
810 static void usbback_process_port(struct usbback_info *usbif, unsigned port) in usbback_process_port() argument
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()
824 usbback_portid_remove(usbif, port); in usbback_process_port()
826 usbback_portid_add(usbif, port, busid); in usbback_process_port()
834 struct usbback_info *usbif; in usbback_disconnect() local
839 usbif = container_of(xendev, struct usbback_info, xendev); in usbback_disconnect()
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()
854 usbback_portid_drain(usbif, i + 1); in usbback_disconnect()
863 struct usbback_info *usbif; in usbback_connect() local
876 usbif = container_of(xendev, struct usbback_info, xendev); 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()
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()
914 for (i = 1; i <= usbif->num_ports; i++) { in usbback_connect()
915 if (usbif->ports[i - 1].dev) { in usbback_connect()
916 usbback_hotplug_enq(usbif, i); in usbback_connect()
926 struct usbback_info *usbif; in usbback_backend_changed() local
931 usbif = container_of(xendev, struct usbback_info, xendev); in usbback_backend_changed()
932 for (i = 1; i <= usbif->num_ports; i++) { in usbback_backend_changed()
933 usbback_process_port(usbif, i); in usbback_backend_changed()
939 struct usbback_info *usbif; in usbback_init() local
943 usbif = container_of(xendev, struct usbback_info, xendev); in usbback_init()
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()
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()
965 struct usbback_info *usbif; in xen_bus_attach() local
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()
975 struct usbback_info *usbif; in xen_bus_detach() local
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()
984 struct usbback_info *usbif; in xen_bus_child_detach() local
986 usbif = port->opaque; in xen_bus_child_detach()
987 TR_BUS(&usbif->xendev, "\n"); in xen_bus_child_detach()
993 struct usbback_info *usbif; in xen_bus_complete() local
1001 usbif = usbback_req->usbif; in xen_bus_complete()
1002 TR_REQ(&usbif->xendev, "\n"); in xen_bus_complete()
1018 struct usbback_info *usbif; in usbback_alloc() local
1022 usbif = container_of(xendev, struct usbback_info, xendev); in usbback_alloc()
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()
1041 struct usbback_info *usbif; in usbback_free() local
1049 usbif = container_of(xendev, struct usbback_info, xendev); in usbback_free()
1050 for (i = 1; i <= usbif->num_ports; i++) { in usbback_free()
1051 usbback_portid_remove(usbif, 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()
1080 struct usbback_info *usbif; in usbback_event() local
1082 usbif = container_of(xendev, struct usbback_info, xendev); in usbback_event()
1083 qemu_bh_schedule(usbif->bh); in usbback_event()