This series adds a new virtio-usb driver: a dual-role virtio device capable of acting as a USB host controller, a USB device controller, or both simultaneously with runtime role switching between the two (USB OTG-style role switching) on ports that support it.
The corresponding virtio-usb device specification has been posted to virtio-comment for review. This series matches the v2 revision of that spec, which reconciles a small number of protocol details (per-role virtqueue presentation, host-role vp_idx for hub/multi-VP support, and the device-role BIND/UNBIND event split) that were clarified while integrating and testing this driver against the spec: [RFC PATCH v2] virtio-usb: Add initial virtio-usb specification Igor Skalkin <[email protected]> [email protected] https://lore.kernel.org/virtio-comment/[email protected]/ This driver has been tested end-to-end against our own userspace virtio-usb device implementation (host-side backend) in two setups: - arm64 hardware with a type-1 hypervisor, exercising a real dwc3 USB controller on the host side. - x86 with a type-2 hypervisor (QEMU/KVM), using dummy_hcd/dummy_udc on the host side in place of real USB hardware. Host role and device role were exercised in both setups: testusb on the guest, over a virtualized host port, against g_zero running on a real hardware UDC or on dummy UDC on the host side (host role); and testusb on the host side, against g_zero running on a virtualized UDC on the guest (device role); plus real USB mass-storage hardware/gadgets and iperf3 over usbnet. Role switching was exercised in both setups as well, but not with a real OTG cable/ID-pin connection: on dwc3, role switching was driven through its "role-switch" sysfs configuration; on dummy_hcd, it was emulated by toggling between two simultaneously-configured dummy_hcd instances on the same port. Testing with a real OTG connection is planned as a follow-up. Known scope: this driver virtualizes an entire UDC per device-role port, with each port owned by a single guest. USB function-level virtualization - a single physical UDC exposing a composite gadget whose individual functions are routed to different guests - is a separate approach currently being explored, and is out of scope for this series. Patch summary: 1: protocol header and skeleton dual-role driver (probe/remove plumbing, no role support yet). 2: USB host controller (HCD) role support. 3: USB device controller (UDC) role support. 4-5: USB OTG-style role query and role-switching support. 6: endpoint-lifecycle robustness rework (async split-phase state machine, replacing an earlier out-of-tree gadget.nonatomic patch that didn't pass upstream review). 7: SuperSpeed device-role support. 8: guest UDC naming fix (name prefix from the bind event). Aiswarya Cyriac (3): virtio-usb: add protocol header and skeleton dual-role driver virtio-usb: add host role (USB Host Controller) support virtio-usb: add device role (USB Device Controller) support Igor Skalkin (5): virtio-usb: add OTG role query support virtio-usb: add USB On-The-Go role-switching support virtio-usb: rework endpoint lifecycle to an async split-phase state machine virtio-usb: add SuperSpeed device-role support virtio-usb: support a guest UDC name prefix from the bind event MAINTAINERS | 10 + drivers/usb/Kconfig | 2 + drivers/usb/Makefile | 1 + drivers/usb/virtio_usb/Kconfig | 21 + drivers/usb/virtio_usb/Makefile | 9 + drivers/usb/virtio_usb/controller.c | 422 ++++++++ drivers/usb/virtio_usb/controller.h | 152 +++ drivers/usb/virtio_usb/device.c | 1893 +++++++++++++++++++++++++++++++++++ drivers/usb/virtio_usb/device.h | 115 +++ drivers/usb/virtio_usb/host.c | 1368 +++++++++++++++++++++++++ drivers/usb/virtio_usb/host.h | 203 ++++ drivers/usb/virtio_usb/otg.c | 403 ++++++++ drivers/usb/virtio_usb/otg.h | 38 + drivers/usb/virtio_usb/vq_common.c | 740 ++++++++++++++ drivers/usb/virtio_usb/vq_common.h | 163 +++ include/uapi/linux/virtio_usb.h | 346 +++++++ 16 files changed, 5886 insertions(+) create mode 100644 drivers/usb/virtio_usb/Kconfig create mode 100644 drivers/usb/virtio_usb/Makefile create mode 100644 drivers/usb/virtio_usb/controller.c create mode 100644 drivers/usb/virtio_usb/controller.h create mode 100644 drivers/usb/virtio_usb/device.c create mode 100644 drivers/usb/virtio_usb/device.h create mode 100644 drivers/usb/virtio_usb/host.c create mode 100644 drivers/usb/virtio_usb/host.h create mode 100644 drivers/usb/virtio_usb/otg.c create mode 100644 drivers/usb/virtio_usb/otg.h create mode 100644 drivers/usb/virtio_usb/vq_common.c create mode 100644 drivers/usb/virtio_usb/vq_common.h create mode 100644 include/uapi/linux/virtio_usb.h -- 2.49.0
