xref: /netbsd-src/sys/dev/usb/vhci.c (revision e6c7e151de239c49d2e38720a061ed9d1fa99309)
1 /*	$NetBSD: vhci.c,v 1.16 2020/03/31 16:34:25 maxv Exp $ */
2 
3 /*
4  * Copyright (c) 2019-2020 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Maxime Villard.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #include <sys/cdefs.h>
33 __KERNEL_RCSID(0, "$NetBSD: vhci.c,v 1.16 2020/03/31 16:34:25 maxv Exp $");
34 
35 #ifdef _KERNEL_OPT
36 #include "opt_usb.h"
37 #endif
38 
39 #include <sys/param.h>
40 
41 #include <sys/bus.h>
42 #include <sys/cpu.h>
43 #include <sys/conf.h>
44 #include <sys/device.h>
45 #include <sys/kernel.h>
46 #include <sys/kmem.h>
47 #include <sys/mutex.h>
48 #include <sys/proc.h>
49 #include <sys/queue.h>
50 #include <sys/systm.h>
51 #include <sys/mman.h>
52 #include <sys/file.h>
53 #include <sys/filedesc.h>
54 
55 #include <machine/endian.h>
56 
57 #include "ioconf.h"
58 
59 #include <dev/usb/usb.h>
60 #include <dev/usb/usbdi.h>
61 #include <dev/usb/usbdivar.h>
62 
63 #include <dev/usb/usbroothub.h>
64 #include <dev/usb/vhci.h>
65 
66 #ifdef VHCI_DEBUG
67 #define DPRINTF(fmt, ...)	printf(fmt, __VA_ARGS__)
68 #else
69 #define DPRINTF(fmt, ...)	__nothing
70 #endif
71 
72 static usbd_status vhci_open(struct usbd_pipe *);
73 static void vhci_softintr(void *);
74 
75 static struct usbd_xfer *vhci_allocx(struct usbd_bus *, unsigned int);
76 static void vhci_freex(struct usbd_bus *, struct usbd_xfer *);
77 static void vhci_get_lock(struct usbd_bus *, kmutex_t **);
78 static int vhci_roothub_ctrl(struct usbd_bus *, usb_device_request_t *,
79     void *, int);
80 
81 static const struct usbd_bus_methods vhci_bus_methods = {
82 	.ubm_open =	vhci_open,
83 	.ubm_softint =	vhci_softintr,
84 	.ubm_dopoll =	NULL,
85 	.ubm_allocx =	vhci_allocx,
86 	.ubm_freex =	vhci_freex,
87 	.ubm_getlock =	vhci_get_lock,
88 	.ubm_rhctrl =	vhci_roothub_ctrl,
89 };
90 
91 static usbd_status vhci_device_ctrl_transfer(struct usbd_xfer *);
92 static usbd_status vhci_device_ctrl_start(struct usbd_xfer *);
93 static void vhci_device_ctrl_abort(struct usbd_xfer *);
94 static void vhci_device_ctrl_close(struct usbd_pipe *);
95 static void vhci_device_ctrl_cleartoggle(struct usbd_pipe *);
96 static void vhci_device_ctrl_done(struct usbd_xfer *);
97 
98 static const struct usbd_pipe_methods vhci_device_ctrl_methods = {
99 	.upm_init =		NULL,
100 	.upm_fini =		NULL,
101 	.upm_transfer =		vhci_device_ctrl_transfer,
102 	.upm_start =		vhci_device_ctrl_start,
103 	.upm_abort =		vhci_device_ctrl_abort,
104 	.upm_close =		vhci_device_ctrl_close,
105 	.upm_cleartoggle =	vhci_device_ctrl_cleartoggle,
106 	.upm_done =		vhci_device_ctrl_done,
107 };
108 
109 static usbd_status vhci_root_intr_transfer(struct usbd_xfer *);
110 static usbd_status vhci_root_intr_start(struct usbd_xfer *);
111 static void vhci_root_intr_abort(struct usbd_xfer *);
112 static void vhci_root_intr_close(struct usbd_pipe *);
113 static void vhci_root_intr_cleartoggle(struct usbd_pipe *);
114 static void vhci_root_intr_done(struct usbd_xfer *);
115 
116 static const struct usbd_pipe_methods vhci_root_intr_methods = {
117 	.upm_init =		NULL,
118 	.upm_fini =		NULL,
119 	.upm_transfer =		vhci_root_intr_transfer,
120 	.upm_start =		vhci_root_intr_start,
121 	.upm_abort =		vhci_root_intr_abort,
122 	.upm_close =		vhci_root_intr_close,
123 	.upm_cleartoggle =	vhci_root_intr_cleartoggle,
124 	.upm_done =		vhci_root_intr_done,
125 };
126 
127 /*
128  * There are three structures to understand: vxfers, packets, and ports.
129  *
130  * Each xfer from the point of view of the USB stack is a vxfer from the point
131  * of view of vHCI.
132  *
133  * A vxfer has a linked list containing a maximum of two packets: a request
134  * packet and possibly a data packet. Packets basically contain data exchanged
135  * between the Host and the virtual USB device. A packet is linked to both a
136  * vxfer and a port.
137  *
138  * A port is an abstraction of an actual USB port. Each virtual USB device gets
139  * connected to a port. A port has two lists:
140  *  - The Usb-To-Host list, containing packets to be fetched from the USB
141  *    device and provided to the host.
142  *  - The Host-To-Usb list, containing packets to be sent from the Host to the
143  *    USB device.
144  * Request packets are always in the H->U direction. Data packets however can
145  * be in both the H->U and U->H directions.
146  *
147  * With read() and write() operations on /dev/vhci, userland respectively
148  * "fetches" and "sends" packets from or to the virtual USB device, which
149  * respectively means reading/inserting packets in the H->U and U->H lists on
150  * the port where the virtual USB device is connected.
151  *
152  *             +------------------------------------------------+
153  *             |                 USB Stack                      |
154  *             +---------------------^--------------------------+
155  *                                   |
156  *             +---------------------V--------------------------+
157  *             | +----------------+    +-------------+          |
158  *             | | Request Packet |    | Data Packet |     Xfer |
159  *             | +-------|--------+    +----|---^----+          |
160  *             +---------|------------------|---|---------------+
161  *                       |                  |   |
162  *                       |   +--------------+   |
163  *                       |   |                  |
164  *             +---------|---|------------------|---------------+
165  *             |     +---V---V---+    +---------|-+             |
166  *             |     | H->U List |    | U->H List |   vHCI Port |
167  *             |     +-----|-----+    +-----^-----+             |
168  *             +-----------|----------------|-------------------+
169  *                         |                |
170  *             +-----------|----------------|-------------------+
171  *             |     +-----V-----+    +-----|-----+             |
172  *             |     |   read()  |    |  write()  |     vHCI FD |
173  *             |     +-----------+    +-----------+             |
174  *             +------------------------------------------------+
175  */
176 
177 struct vhci_xfer;
178 
179 typedef struct vhci_packet {
180 	/* General. */
181 	TAILQ_ENTRY(vhci_packet) portlist;
182 	TAILQ_ENTRY(vhci_packet) xferlist;
183 	struct vhci_xfer *vxfer;
184 	bool utoh;
185 	uint8_t addr;
186 
187 	/* Type. */
188 	struct {
189 		bool req:1;
190 		bool res:1;
191 		bool dat:1;
192 	} type;
193 
194 	/* Exposed for FD operations. */
195 	uint8_t *buf;
196 	size_t size;
197 	size_t cursor;
198 } vhci_packet_t;
199 
200 typedef TAILQ_HEAD(, vhci_packet) vhci_packet_list_t;
201 
202 #define VHCI_NADDRS	16	/* maximum supported by USB */
203 
204 typedef struct {
205 	kmutex_t lock;
206 	int status;
207 	int change;
208 	struct {
209 		vhci_packet_list_t usb_to_host;
210 		vhci_packet_list_t host_to_usb;
211 	} endpoints[VHCI_NADDRS];
212 } vhci_port_t;
213 
214 typedef struct {
215 	struct usbd_pipe pipe;
216 } vhci_pipe_t;
217 
218 typedef struct vhci_xfer {
219 	/* General. */
220 	struct usbd_xfer xfer;
221 
222 	/* Port where the xfer occurs. */
223 	vhci_port_t *port;
224 
225 	/* Packets in the xfer. */
226 	size_t npkts;
227 	vhci_packet_list_t pkts;
228 
229 	/* Header storage. */
230 	vhci_request_t reqbuf;
231 	vhci_response_t resbuf;
232 
233 	/* Used for G/C. */
234 	TAILQ_ENTRY(vhci_xfer) freelist;
235 } vhci_xfer_t;
236 
237 typedef TAILQ_HEAD(, vhci_xfer) vhci_xfer_list_t;
238 
239 #define VHCI_INDEX2PORT(idx)	(idx)
240 #define VHCI_NPORTS		4
241 
242 typedef struct {
243 	device_t sc_dev;
244 
245 	struct usbd_bus sc_bus;
246 	bool sc_dying;
247 	kmutex_t sc_lock;
248 
249 	/*
250 	 * Intr Root. Used to attach the devices.
251 	 */
252 	struct usbd_xfer *sc_intrxfer;
253 
254 	/*
255 	 * The ports. Zero is for the roothub, one and beyond for the USB
256 	 * devices.
257 	 */
258 	size_t sc_nports;
259 	vhci_port_t sc_port[VHCI_NPORTS];
260 
261 	device_t sc_child; /* /dev/usb# device */
262 } vhci_softc_t;
263 
264 typedef struct {
265 	u_int port;
266 	uint8_t addr;
267 	vhci_softc_t *softc;
268 } vhci_fd_t;
269 
270 extern struct cfdriver vhci_cd;
271 
272 /* -------------------------------------------------------------------------- */
273 
274 static void
275 vhci_pkt_ctrl_create(vhci_port_t *port, struct usbd_xfer *xfer, bool utoh,
276     uint8_t addr)
277 {
278 	vhci_xfer_t *vxfer = (vhci_xfer_t *)xfer;
279 	vhci_packet_list_t *reqlist, *reslist, *datlist = NULL;
280 	vhci_packet_t *req, *res = NULL, *dat = NULL;
281 	size_t npkts = 0;
282 
283 	/* Request packet. */
284 	reqlist = &port->endpoints[addr].host_to_usb;
285 	req = kmem_zalloc(sizeof(*req), KM_SLEEP);
286 	req->vxfer = vxfer;
287 	req->utoh = false;
288 	req->addr = addr;
289 	req->type.req = true;
290 	req->buf = (uint8_t *)&vxfer->reqbuf;
291 	req->size = sizeof(vxfer->reqbuf);
292 	req->cursor = 0;
293 	npkts++;
294 
295 	/* Init the request buffer. */
296 	memset(&vxfer->reqbuf, 0, sizeof(vxfer->reqbuf));
297 	vxfer->reqbuf.type = VHCI_REQ_CTRL;
298 	memcpy(&vxfer->reqbuf.u.ctrl, &xfer->ux_request,
299 	    sizeof(xfer->ux_request));
300 
301 	/* Response packet. */
302 	if (utoh && (xfer->ux_length > 0)) {
303 		reslist = &port->endpoints[addr].usb_to_host;
304 		res = kmem_zalloc(sizeof(*res), KM_SLEEP);
305 		res->vxfer = vxfer;
306 		res->utoh = true;
307 		res->addr = addr;
308 		res->type.res = true;
309 		res->buf = (uint8_t *)&vxfer->resbuf;
310 		res->size = sizeof(vxfer->resbuf);
311 		res->cursor = 0;
312 		npkts++;
313 	}
314 
315 	/* Data packet. */
316 	if (xfer->ux_length > 0) {
317 		if (utoh) {
318 			datlist = &port->endpoints[addr].usb_to_host;
319 		} else {
320 			datlist = &port->endpoints[addr].host_to_usb;
321 		}
322 		dat = kmem_zalloc(sizeof(*dat), KM_SLEEP);
323 		dat->vxfer = vxfer;
324 		dat->utoh = utoh;
325 		dat->addr = addr;
326 		dat->type.dat = true;
327 		dat->buf = xfer->ux_buf;
328 		dat->size = xfer->ux_length;
329 		dat->cursor = 0;
330 		npkts++;
331 	}
332 
333 	/* Insert in the xfer. */
334 	vxfer->port = port;
335 	vxfer->npkts = npkts;
336 	TAILQ_INIT(&vxfer->pkts);
337 	TAILQ_INSERT_TAIL(&vxfer->pkts, req, xferlist);
338 	if (res != NULL)
339 		TAILQ_INSERT_TAIL(&vxfer->pkts, res, xferlist);
340 	if (dat != NULL)
341 		TAILQ_INSERT_TAIL(&vxfer->pkts, dat, xferlist);
342 
343 	/* Insert in the port. */
344 	KASSERT(mutex_owned(&port->lock));
345 	TAILQ_INSERT_TAIL(reqlist, req, portlist);
346 	if (res != NULL)
347 		TAILQ_INSERT_TAIL(reslist, res, portlist);
348 	if (dat != NULL)
349 		TAILQ_INSERT_TAIL(datlist, dat, portlist);
350 }
351 
352 static void
353 vhci_pkt_destroy(vhci_softc_t *sc, vhci_packet_t *pkt)
354 {
355 	vhci_xfer_t *vxfer = pkt->vxfer;
356 	vhci_port_t *port = vxfer->port;
357 	vhci_packet_list_t *pktlist;
358 
359 	KASSERT(mutex_owned(&port->lock));
360 
361 	/* Remove from the port. */
362 	if (pkt->utoh) {
363 		pktlist = &port->endpoints[pkt->addr].usb_to_host;
364 	} else {
365 		pktlist = &port->endpoints[pkt->addr].host_to_usb;
366 	}
367 	TAILQ_REMOVE(pktlist, pkt, portlist);
368 
369 	/* Remove from the xfer. */
370 	TAILQ_REMOVE(&vxfer->pkts, pkt, xferlist);
371 	kmem_free(pkt, sizeof(*pkt));
372 
373 	/* Unref. */
374 	KASSERT(vxfer->npkts > 0);
375 	vxfer->npkts--;
376 	if (vxfer->npkts > 0)
377 		return;
378 	KASSERT(TAILQ_FIRST(&vxfer->pkts) == NULL);
379 }
380 
381 /* -------------------------------------------------------------------------- */
382 
383 static usbd_status
384 vhci_open(struct usbd_pipe *pipe)
385 {
386 	struct usbd_device *dev = pipe->up_dev;
387 	struct usbd_bus *bus = dev->ud_bus;
388 	usb_endpoint_descriptor_t *ed = pipe->up_endpoint->ue_edesc;
389 	vhci_softc_t *sc = bus->ub_hcpriv;
390 	uint8_t addr = dev->ud_addr;
391 
392 	if (sc->sc_dying)
393 		return USBD_IOERROR;
394 
395 	DPRINTF("%s: called, type=%d\n", __func__,
396 	    UE_GET_XFERTYPE(ed->bmAttributes));
397 
398 	if (addr == bus->ub_rhaddr) {
399 		switch (ed->bEndpointAddress) {
400 		case USB_CONTROL_ENDPOINT:
401 			DPRINTF("%s: roothub_ctrl\n", __func__);
402 			pipe->up_methods = &roothub_ctrl_methods;
403 			break;
404 		case UE_DIR_IN | USBROOTHUB_INTR_ENDPT:
405 			DPRINTF("%s: root_intr\n", __func__);
406 			pipe->up_methods = &vhci_root_intr_methods;
407 			break;
408 		default:
409 			DPRINTF("%s: inval\n", __func__);
410 			return USBD_INVAL;
411 		}
412 	} else {
413 		switch (UE_GET_XFERTYPE(ed->bmAttributes)) {
414 		case UE_CONTROL:
415 			pipe->up_methods = &vhci_device_ctrl_methods;
416 			break;
417 		case UE_INTERRUPT:
418 		case UE_BULK:
419 		default:
420 			goto bad;
421 		}
422 	}
423 
424 	return USBD_NORMAL_COMPLETION;
425 
426 bad:
427 	return USBD_NOMEM;
428 }
429 
430 static void
431 vhci_softintr(void *v)
432 {
433 	DPRINTF("%s: called\n", __func__);
434 }
435 
436 static struct usbd_xfer *
437 vhci_allocx(struct usbd_bus *bus, unsigned int nframes)
438 {
439 	vhci_xfer_t *vxfer;
440 
441 	vxfer = kmem_zalloc(sizeof(*vxfer), KM_SLEEP);
442 #ifdef DIAGNOSTIC
443 	vxfer->xfer.ux_state = XFER_BUSY;
444 #endif
445 	return (struct usbd_xfer *)vxfer;
446 }
447 
448 static void
449 vhci_freex(struct usbd_bus *bus, struct usbd_xfer *xfer)
450 {
451 	vhci_xfer_t *vxfer = (vhci_xfer_t *)xfer;
452 
453 	KASSERT(vxfer->npkts == 0);
454 	KASSERT(TAILQ_FIRST(&vxfer->pkts) == NULL);
455 
456 #ifdef DIAGNOSTIC
457 	vxfer->xfer.ux_state = XFER_FREE;
458 #endif
459 	kmem_free(vxfer, sizeof(*vxfer));
460 }
461 
462 static void
463 vhci_get_lock(struct usbd_bus *bus, kmutex_t **lock)
464 {
465 	vhci_softc_t *sc = bus->ub_hcpriv;
466 
467 	*lock = &sc->sc_lock;
468 }
469 
470 static int
471 vhci_roothub_ctrl(struct usbd_bus *bus, usb_device_request_t *req,
472     void *buf, int buflen)
473 {
474 	vhci_softc_t *sc = bus->ub_hcpriv;
475 	vhci_port_t *port;
476 	usb_hub_descriptor_t hubd;
477 	uint16_t len, value, index;
478 	int totlen = 0;
479 
480 	len = UGETW(req->wLength);
481 	value = UGETW(req->wValue);
482 	index = UGETW(req->wIndex);
483 
484 #define C(x,y) ((x) | ((y) << 8))
485 	switch (C(req->bRequest, req->bmRequestType)) {
486 	case C(UR_GET_DESCRIPTOR, UT_READ_DEVICE):
487 		switch (value) {
488 		case C(0, UDESC_DEVICE): {
489 			usb_device_descriptor_t devd;
490 
491 			totlen = uimin(buflen, sizeof(devd));
492 			memcpy(&devd, buf, totlen);
493 			USETW(devd.idVendor, 0);
494 			USETW(devd.idProduct, 0);
495 			memcpy(buf, &devd, totlen);
496 			break;
497 		}
498 #define sd ((usb_string_descriptor_t *)buf)
499 		case C(1, UDESC_STRING):
500 			/* Vendor */
501 			totlen = usb_makestrdesc(sd, len, "NetBSD");
502 			break;
503 		case C(2, UDESC_STRING):
504 			/* Product */
505 			totlen = usb_makestrdesc(sd, len, "VHCI root hub");
506 			break;
507 #undef sd
508 		default:
509 			/* default from usbroothub */
510 			return buflen;
511 		}
512 		break;
513 
514 	case C(UR_SET_FEATURE, UT_WRITE_CLASS_OTHER):
515 		switch (value) {
516 		case UHF_PORT_RESET:
517 			if (index < 1 || index >= sc->sc_nports) {
518 				return -1;
519 			}
520 			port = &sc->sc_port[VHCI_INDEX2PORT(index)];
521 			port->status |= UPS_C_PORT_RESET;
522 			break;
523 		case UHF_PORT_POWER:
524 			break;
525 		default:
526 			return -1;
527 		}
528 		break;
529 
530 	/* Hub requests. */
531 	case C(UR_CLEAR_FEATURE, UT_WRITE_CLASS_DEVICE):
532 		break;
533 	case C(UR_CLEAR_FEATURE, UT_WRITE_CLASS_OTHER):
534 		if (index < 1 || index >= sc->sc_nports) {
535 			return -1;
536 		}
537 		port = &sc->sc_port[VHCI_INDEX2PORT(index)];
538 		switch (value) {
539 		case UHF_PORT_ENABLE:
540 			port->status &= ~UPS_PORT_ENABLED;
541 			break;
542 		case UHF_C_PORT_ENABLE:
543 			port->change |= UPS_C_PORT_ENABLED;
544 			break;
545 		default:
546 			return -1;
547 		}
548 		break;
549 
550 	case C(UR_GET_DESCRIPTOR, UT_READ_CLASS_DEVICE):
551 		totlen = uimin(buflen, sizeof(hubd));
552 		memcpy(&hubd, buf, totlen);
553 		hubd.bNbrPorts = sc->sc_nports - 1;
554 		hubd.bDescLength = USB_HUB_DESCRIPTOR_SIZE;
555 		totlen = uimin(totlen, hubd.bDescLength);
556 		memcpy(buf, &hubd, totlen);
557 		break;
558 
559 	case C(UR_GET_STATUS, UT_READ_CLASS_DEVICE):
560 		/* XXX The other HCs do this */
561 		memset(buf, 0, len);
562 		totlen = len;
563 		break;
564 
565 	case C(UR_GET_STATUS, UT_READ_CLASS_OTHER): {
566 		usb_port_status_t ps;
567 
568 		if (index < 1 || index >= sc->sc_nports) {
569 			return -1;
570 		}
571 		port = &sc->sc_port[VHCI_INDEX2PORT(index)];
572 		USETW(ps.wPortStatus, port->status);
573 		USETW(ps.wPortChange, port->change);
574 		totlen = uimin(len, sizeof(ps));
575 		memcpy(buf, &ps, totlen);
576 		break;
577 	}
578 	default:
579 		/* default from usbroothub */
580 		return buflen;
581 	}
582 
583 	return totlen;
584 }
585 
586 /* -------------------------------------------------------------------------- */
587 
588 static usbd_status
589 vhci_device_ctrl_transfer(struct usbd_xfer *xfer)
590 {
591 	vhci_softc_t *sc = xfer->ux_bus->ub_hcpriv;
592 	usbd_status err;
593 
594 	DPRINTF("%s: called\n", __func__);
595 
596 	/* Insert last in queue. */
597 	mutex_enter(&sc->sc_lock);
598 	err = usb_insert_transfer(xfer);
599 	mutex_exit(&sc->sc_lock);
600 	if (err)
601 		return err;
602 
603 	/* Pipe isn't running, start first */
604 	return vhci_device_ctrl_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue));
605 }
606 
607 static usbd_status
608 vhci_device_ctrl_start(struct usbd_xfer *xfer)
609 {
610 	usb_endpoint_descriptor_t *ed = xfer->ux_pipe->up_endpoint->ue_edesc;
611 	usb_device_request_t *req = &xfer->ux_request;
612 	struct usbd_device *dev = xfer->ux_pipe->up_dev;
613 	vhci_softc_t *sc = xfer->ux_bus->ub_hcpriv;
614 	vhci_port_t *port;
615 	bool polling = sc->sc_bus.ub_usepolling;
616 	bool isread = (req->bmRequestType & UT_READ) != 0;
617 	uint8_t addr = UE_GET_ADDR(ed->bEndpointAddress);
618 	int portno, ret;
619 
620 	KASSERT(addr == 0);
621 	KASSERT(xfer->ux_rqflags & URQ_REQUEST);
622 	KASSERT(dev->ud_myhsport != NULL);
623 	portno = dev->ud_myhsport->up_portno;
624 
625 	DPRINTF("%s: type=0x%02x, len=%d, isread=%d, portno=%d\n",
626 	    __func__, req->bmRequestType, UGETW(req->wLength), isread, portno);
627 
628 	if (sc->sc_dying)
629 		return USBD_IOERROR;
630 
631 	port = &sc->sc_port[portno];
632 
633 	if (!polling)
634 		mutex_enter(&sc->sc_lock);
635 
636 	mutex_enter(&port->lock);
637 	if (port->status & UPS_PORT_ENABLED) {
638 		xfer->ux_status = USBD_IN_PROGRESS;
639 		vhci_pkt_ctrl_create(port, xfer, isread, addr);
640 		ret = USBD_IN_PROGRESS;
641 	} else {
642 		ret = USBD_IOERROR;
643 	}
644 	mutex_exit(&port->lock);
645 
646 	if (!polling)
647 		mutex_exit(&sc->sc_lock);
648 
649 	return ret;
650 }
651 
652 static void
653 vhci_device_ctrl_abort(struct usbd_xfer *xfer)
654 {
655 	vhci_xfer_t *vxfer = (vhci_xfer_t *)xfer;
656 	vhci_softc_t *sc = xfer->ux_bus->ub_hcpriv;
657 	vhci_port_t *port = vxfer->port;
658 	vhci_packet_t *pkt;
659 
660 	DPRINTF("%s: called\n", __func__);
661 
662 	KASSERT(mutex_owned(&sc->sc_lock));
663 
664 	callout_halt(&xfer->ux_callout, &sc->sc_lock);
665 
666 	/* If anyone else beat us, we're done.  */
667 	KASSERT(xfer->ux_status != USBD_CANCELLED);
668 	if (xfer->ux_status != USBD_IN_PROGRESS)
669 		return;
670 
671 	mutex_enter(&port->lock);
672 	while (vxfer->npkts > 0) {
673 		pkt = TAILQ_FIRST(&vxfer->pkts);
674 		KASSERT(pkt != NULL);
675 		vhci_pkt_destroy(sc, pkt);
676 	}
677 	KASSERT(TAILQ_FIRST(&vxfer->pkts) == NULL);
678 	mutex_exit(&port->lock);
679 
680 	xfer->ux_status = USBD_CANCELLED;
681 	usb_transfer_complete(xfer);
682 	KASSERT(mutex_owned(&sc->sc_lock));
683 }
684 
685 static void
686 vhci_device_ctrl_close(struct usbd_pipe *pipe)
687 {
688 	DPRINTF("%s: called\n", __func__);
689 }
690 
691 static void
692 vhci_device_ctrl_cleartoggle(struct usbd_pipe *pipe)
693 {
694 	DPRINTF("%s: called\n", __func__);
695 }
696 
697 static void
698 vhci_device_ctrl_done(struct usbd_xfer *xfer)
699 {
700 	DPRINTF("%s: called\n", __func__);
701 }
702 
703 /* -------------------------------------------------------------------------- */
704 
705 static usbd_status
706 vhci_root_intr_transfer(struct usbd_xfer *xfer)
707 {
708 	vhci_softc_t *sc = xfer->ux_bus->ub_hcpriv;
709 	usbd_status err;
710 
711 	DPRINTF("%s: called\n", __func__);
712 
713 	/* Insert last in queue. */
714 	mutex_enter(&sc->sc_lock);
715 	err = usb_insert_transfer(xfer);
716 	mutex_exit(&sc->sc_lock);
717 	if (err)
718 		return err;
719 
720 	/* Pipe isn't running, start first */
721 	return vhci_root_intr_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue));
722 }
723 
724 static usbd_status
725 vhci_root_intr_start(struct usbd_xfer *xfer)
726 {
727 	vhci_softc_t *sc = xfer->ux_bus->ub_hcpriv;
728 	const bool polling = sc->sc_bus.ub_usepolling;
729 
730 	DPRINTF("%s: called, len=%zu\n", __func__, (size_t)xfer->ux_length);
731 
732 	if (sc->sc_dying)
733 		return USBD_IOERROR;
734 
735 	if (!polling)
736 		mutex_enter(&sc->sc_lock);
737 	KASSERT(sc->sc_intrxfer == NULL);
738 	sc->sc_intrxfer = xfer;
739 	xfer->ux_status = USBD_IN_PROGRESS;
740 	if (!polling)
741 		mutex_exit(&sc->sc_lock);
742 
743 	return USBD_IN_PROGRESS;
744 }
745 
746 static void
747 vhci_root_intr_abort(struct usbd_xfer *xfer)
748 {
749 	vhci_softc_t *sc = xfer->ux_bus->ub_hcpriv;
750 
751 	DPRINTF("%s: called\n", __func__);
752 
753 	KASSERT(mutex_owned(&sc->sc_lock));
754 	KASSERT(xfer->ux_pipe->up_intrxfer == xfer);
755 
756 	/* If xfer has already completed, nothing to do here.  */
757 	if (sc->sc_intrxfer == NULL)
758 		return;
759 
760 	/*
761 	 * Otherwise, sc->sc_intrxfer had better be this transfer.
762 	 * Cancel it.
763 	 */
764 	KASSERT(sc->sc_intrxfer == xfer);
765 	KASSERT(xfer->ux_status == USBD_IN_PROGRESS);
766 	xfer->ux_status = USBD_CANCELLED;
767 	usb_transfer_complete(xfer);
768 }
769 
770 static void
771 vhci_root_intr_close(struct usbd_pipe *pipe)
772 {
773 	vhci_softc_t *sc __diagused = pipe->up_dev->ud_bus->ub_hcpriv;
774 
775 	DPRINTF("%s: called\n", __func__);
776 
777 	KASSERT(mutex_owned(&sc->sc_lock));
778 
779 	/*
780 	 * Caller must guarantee the xfer has completed first, by
781 	 * closing the pipe only after normal completion or an abort.
782 	 */
783 	KASSERT(sc->sc_intrxfer == NULL);
784 }
785 
786 static void
787 vhci_root_intr_cleartoggle(struct usbd_pipe *pipe)
788 {
789 	DPRINTF("%s: called\n", __func__);
790 }
791 
792 static void
793 vhci_root_intr_done(struct usbd_xfer *xfer)
794 {
795 	vhci_softc_t *sc = xfer->ux_bus->ub_hcpriv;
796 
797 	KASSERT(mutex_owned(&sc->sc_lock));
798 
799 	/* Claim the xfer so it doesn't get completed again.  */
800 	KASSERT(sc->sc_intrxfer == xfer);
801 	KASSERT(xfer->ux_status != USBD_IN_PROGRESS);
802 	sc->sc_intrxfer = NULL;
803 }
804 
805 /* -------------------------------------------------------------------------- */
806 
807 static int
808 vhci_usb_attach(vhci_fd_t *vfd)
809 {
810 	vhci_softc_t *sc = vfd->softc;
811 	vhci_port_t *port;
812 	struct usbd_xfer *xfer;
813 	u_char *p;
814 	int ret = 0;
815 
816 	port = &sc->sc_port[vfd->port];
817 
818 	mutex_enter(&sc->sc_lock);
819 
820 	mutex_enter(&port->lock);
821 	port->status = UPS_CURRENT_CONNECT_STATUS | UPS_PORT_ENABLED |
822 	    UPS_PORT_POWER;
823 	port->change = UPS_C_CONNECT_STATUS | UPS_C_PORT_RESET;
824 	mutex_exit(&port->lock);
825 
826 	xfer = sc->sc_intrxfer;
827 
828 	if (xfer == NULL) {
829 		ret = ENOBUFS;
830 		goto done;
831 	}
832 	KASSERT(xfer->ux_status == USBD_IN_PROGRESS);
833 
834 	p = xfer->ux_buf;
835 	memset(p, 0, xfer->ux_length);
836 	p[0] = __BIT(vfd->port);
837 	xfer->ux_actlen = xfer->ux_length;
838 	xfer->ux_status = USBD_NORMAL_COMPLETION;
839 
840 	usb_transfer_complete(xfer);
841 
842 done:
843 	mutex_exit(&sc->sc_lock);
844 	return ret;
845 }
846 
847 static void
848 vhci_port_flush(vhci_softc_t *sc, vhci_port_t *port)
849 {
850 	vhci_packet_list_t *pktlist;
851 	vhci_packet_t *pkt, *nxt;
852 	vhci_xfer_list_t vxferlist;
853 	vhci_xfer_t *vxfer;
854 	uint8_t addr;
855 
856 	KASSERT(mutex_owned(&sc->sc_lock));
857 	KASSERT(mutex_owned(&port->lock));
858 
859 	TAILQ_INIT(&vxferlist);
860 
861 	for (addr = 0; addr < VHCI_NADDRS; addr++) {
862 		/* Drop all the packets in the H->U direction. */
863 		pktlist = &port->endpoints[addr].host_to_usb;
864 		TAILQ_FOREACH_SAFE(pkt, pktlist, portlist, nxt) {
865 			vxfer = pkt->vxfer;
866 			KASSERT(vxfer->xfer.ux_status == USBD_IN_PROGRESS);
867 			vhci_pkt_destroy(sc, pkt);
868 			if (vxfer->npkts == 0)
869 				TAILQ_INSERT_TAIL(&vxferlist, vxfer, freelist);
870 		}
871 		KASSERT(TAILQ_FIRST(pktlist) == NULL);
872 
873 		/* Drop all the packets in the U->H direction. */
874 		pktlist = &port->endpoints[addr].usb_to_host;
875 		TAILQ_FOREACH_SAFE(pkt, pktlist, portlist, nxt) {
876 			vxfer = pkt->vxfer;
877 			KASSERT(vxfer->xfer.ux_status == USBD_IN_PROGRESS);
878 			vhci_pkt_destroy(sc, pkt);
879 			if (vxfer->npkts == 0)
880 				TAILQ_INSERT_TAIL(&vxferlist, vxfer, freelist);
881 		}
882 		KASSERT(TAILQ_FIRST(pktlist) == NULL);
883 
884 		/* Terminate all the xfers collected. */
885 		while ((vxfer = TAILQ_FIRST(&vxferlist)) != NULL) {
886 			struct usbd_xfer *xfer = &vxfer->xfer;
887 			TAILQ_REMOVE(&vxferlist, vxfer, freelist);
888 
889 			xfer->ux_status = USBD_TIMEOUT;
890 			usb_transfer_complete(xfer);
891 		}
892 	}
893 }
894 
895 static int
896 vhci_usb_detach(vhci_fd_t *vfd)
897 {
898 	vhci_softc_t *sc = vfd->softc;
899 	vhci_port_t *port;
900 	struct usbd_xfer *xfer;
901 	u_char *p;
902 
903 	port = &sc->sc_port[vfd->port];
904 
905 	mutex_enter(&sc->sc_lock);
906 
907 	xfer = sc->sc_intrxfer;
908 	if (xfer == NULL) {
909 		mutex_exit(&sc->sc_lock);
910 		return ENOBUFS;
911 	}
912 	KASSERT(xfer->ux_status == USBD_IN_PROGRESS);
913 
914 	mutex_enter(&port->lock);
915 
916 	port->status = 0;
917 	port->change = UPS_C_CONNECT_STATUS | UPS_C_PORT_RESET;
918 
919 	p = xfer->ux_buf;
920 	memset(p, 0, xfer->ux_length);
921 	p[0] = __BIT(vfd->port);
922 	xfer->ux_actlen = xfer->ux_length;
923 	xfer->ux_status = USBD_NORMAL_COMPLETION;
924 
925 	usb_transfer_complete(xfer);
926 	vhci_port_flush(sc, port);
927 
928 	mutex_exit(&port->lock);
929 	mutex_exit(&sc->sc_lock);
930 	return 0;
931 }
932 
933 static int
934 vhci_get_info(vhci_fd_t *vfd, struct vhci_ioc_get_info *args)
935 {
936 	vhci_softc_t *sc = vfd->softc;
937 	vhci_port_t *port;
938 
939 	port = &sc->sc_port[vfd->port];
940 
941 	args->nports = VHCI_NPORTS;
942 	args->port = vfd->port;
943 	mutex_enter(&port->lock);
944 	args->status = port->status;
945 	mutex_exit(&port->lock);
946 	args->addr = vfd->addr;
947 
948 	return 0;
949 }
950 
951 static int
952 vhci_set_port(vhci_fd_t *vfd, struct vhci_ioc_set_port *args)
953 {
954 	vhci_softc_t *sc = vfd->softc;
955 
956 	if (args->port == 0 || args->port >= sc->sc_nports)
957 		return EINVAL;
958 
959 	vfd->port = args->port;
960 
961 	return 0;
962 }
963 
964 static int
965 vhci_set_addr(vhci_fd_t *vfd, struct vhci_ioc_set_addr *args)
966 {
967 	if (args->addr >= VHCI_NADDRS)
968 		return EINVAL;
969 
970 	vfd->addr = args->addr;
971 
972 	return 0;
973 }
974 
975 /* -------------------------------------------------------------------------- */
976 
977 static dev_type_open(vhci_fd_open);
978 
979 const struct cdevsw vhci_cdevsw = {
980 	.d_open = vhci_fd_open,
981 	.d_close = noclose,
982 	.d_read = noread,
983 	.d_write = nowrite,
984 	.d_ioctl = noioctl,
985 	.d_stop = nostop,
986 	.d_tty = notty,
987 	.d_poll = nopoll,
988 	.d_mmap = nommap,
989 	.d_kqfilter = nokqfilter,
990 	.d_discard = nodiscard,
991 	.d_flag = D_OTHER | D_MPSAFE
992 };
993 
994 static int vhci_fd_ioctl(file_t *, u_long, void *);
995 static int vhci_fd_close(file_t *);
996 static int vhci_fd_read(struct file *, off_t *, struct uio *, kauth_cred_t, int);
997 static int vhci_fd_write(struct file *, off_t *, struct uio *, kauth_cred_t, int);
998 
999 const struct fileops vhci_fileops = {
1000 	.fo_read = vhci_fd_read,
1001 	.fo_write = vhci_fd_write,
1002 	.fo_ioctl = vhci_fd_ioctl,
1003 	.fo_fcntl = fnullop_fcntl,
1004 	.fo_poll = fnullop_poll,
1005 	.fo_stat = fbadop_stat,
1006 	.fo_close = vhci_fd_close,
1007 	.fo_kqfilter = fnullop_kqfilter,
1008 	.fo_restart = fnullop_restart,
1009 	.fo_mmap = NULL,
1010 };
1011 
1012 static int
1013 vhci_fd_open(dev_t dev, int flags, int type, struct lwp *l)
1014 {
1015 	vhci_fd_t *vfd;
1016 	struct file *fp;
1017 	int error, fd;
1018 
1019 	if (minor(dev) != 0)
1020 		return EXDEV;
1021 	error = fd_allocfile(&fp, &fd);
1022 	if (error)
1023 		return error;
1024 
1025 	vfd = kmem_alloc(sizeof(*vfd), KM_SLEEP);
1026 	vfd->port = 1;
1027 	vfd->addr = 0;
1028 	vfd->softc = device_lookup_private(&vhci_cd, minor(dev));
1029 
1030 	return fd_clone(fp, fd, flags, &vhci_fileops, vfd);
1031 }
1032 
1033 static int
1034 vhci_fd_close(file_t *fp)
1035 {
1036 	vhci_fd_t *vfd = fp->f_data;
1037 	int ret __diagused;
1038 
1039 	KASSERT(vfd != NULL);
1040 	ret = vhci_usb_detach(vfd);
1041 	KASSERT(ret == 0);
1042 
1043 	kmem_free(vfd, sizeof(*vfd));
1044 	fp->f_data = NULL;
1045 
1046 	return 0;
1047 }
1048 
1049 static int
1050 vhci_fd_read(struct file *fp, off_t *offp, struct uio *uio, kauth_cred_t cred,
1051     int flags)
1052 {
1053 	vhci_fd_t *vfd = fp->f_data;
1054 	vhci_softc_t *sc = vfd->softc;
1055 	vhci_packet_list_t *pktlist;
1056 	vhci_packet_t *pkt, *nxt;
1057 	vhci_xfer_list_t vxferlist;
1058 	vhci_xfer_t *vxfer;
1059 	vhci_port_t *port;
1060 	int error = 0;
1061 	uint8_t *buf;
1062 	size_t size;
1063 
1064 	if (uio->uio_resid == 0)
1065 		return 0;
1066 	port = &sc->sc_port[vfd->port];
1067 	pktlist = &port->endpoints[vfd->addr].host_to_usb;
1068 
1069 	TAILQ_INIT(&vxferlist);
1070 
1071 	mutex_enter(&port->lock);
1072 
1073 	if (!(port->status & UPS_PORT_ENABLED)) {
1074 		error = ENOBUFS;
1075 		goto out;
1076 	}
1077 
1078 	TAILQ_FOREACH_SAFE(pkt, pktlist, portlist, nxt) {
1079 		vxfer = pkt->vxfer;
1080 		buf = pkt->buf + pkt->cursor;
1081 
1082 		KASSERT(pkt->size >= pkt->cursor);
1083 		size = uimin(uio->uio_resid, pkt->size - pkt->cursor);
1084 
1085 		KASSERT(vxfer->xfer.ux_status == USBD_IN_PROGRESS);
1086 
1087 		error = uiomove(buf, size, uio);
1088 		if (error) {
1089 			DPRINTF("%s: error = %d\n", __func__, error);
1090 			goto out;
1091 		}
1092 
1093 		pkt->cursor += size;
1094 
1095 		if (pkt->cursor == pkt->size) {
1096 			vhci_pkt_destroy(sc, pkt);
1097 			if (vxfer->npkts == 0) {
1098 				TAILQ_INSERT_TAIL(&vxferlist, vxfer, freelist);
1099 			}
1100 		}
1101 		if (uio->uio_resid == 0) {
1102 			break;
1103 		}
1104 	}
1105 
1106 out:
1107 	mutex_exit(&port->lock);
1108 
1109 	while ((vxfer = TAILQ_FIRST(&vxferlist)) != NULL) {
1110 		struct usbd_xfer *xfer = &vxfer->xfer;
1111 		TAILQ_REMOVE(&vxferlist, vxfer, freelist);
1112 
1113 		mutex_enter(&sc->sc_lock);
1114 		xfer->ux_actlen = xfer->ux_length;
1115 		xfer->ux_status = USBD_NORMAL_COMPLETION;
1116 		usb_transfer_complete(xfer);
1117 		mutex_exit(&sc->sc_lock);
1118 	}
1119 
1120 	return error;
1121 }
1122 
1123 static int
1124 vhci_fd_write(struct file *fp, off_t *offp, struct uio *uio, kauth_cred_t cred,
1125     int flags)
1126 {
1127 	vhci_fd_t *vfd = fp->f_data;
1128 	vhci_softc_t *sc = vfd->softc;
1129 	vhci_packet_list_t *pktlist;
1130 	vhci_packet_t *pkt, *nxt;
1131 	vhci_xfer_list_t vxferlist;
1132 	vhci_xfer_t *vxfer;
1133 	vhci_port_t *port;
1134 	int error = 0;
1135 	uint8_t *buf;
1136 	size_t pktsize, size;
1137 
1138 	if (uio->uio_resid == 0)
1139 		return 0;
1140 	port = &sc->sc_port[vfd->port];
1141 	pktlist = &port->endpoints[vfd->addr].usb_to_host;
1142 
1143 	TAILQ_INIT(&vxferlist);
1144 
1145 	mutex_enter(&port->lock);
1146 
1147 	if (!(port->status & UPS_PORT_ENABLED)) {
1148 		error = ENOBUFS;
1149 		goto out;
1150 	}
1151 
1152 	TAILQ_FOREACH_SAFE(pkt, pktlist, portlist, nxt) {
1153 		vxfer = pkt->vxfer;
1154 		buf = pkt->buf + pkt->cursor;
1155 
1156 		pktsize = pkt->size;
1157 		if (pkt->type.dat)
1158 			pktsize = ulmin(vxfer->resbuf.size, pktsize);
1159 
1160 		KASSERT(pktsize >= pkt->cursor);
1161 		size = uimin(uio->uio_resid, pktsize - pkt->cursor);
1162 
1163 		KASSERT(vxfer->xfer.ux_status == USBD_IN_PROGRESS);
1164 
1165 		error = uiomove(buf, size, uio);
1166 		if (error) {
1167 			DPRINTF("%s: error = %d\n", __func__, error);
1168 			goto out;
1169 		}
1170 
1171 		pkt->cursor += size;
1172 
1173 		if (pkt->cursor == pktsize) {
1174 			vhci_pkt_destroy(sc, pkt);
1175 			if (vxfer->npkts == 0) {
1176 				TAILQ_INSERT_TAIL(&vxferlist, vxfer, freelist);
1177 			}
1178 		}
1179 		if (uio->uio_resid == 0) {
1180 			break;
1181 		}
1182 	}
1183 
1184 out:
1185 	mutex_exit(&port->lock);
1186 
1187 	while ((vxfer = TAILQ_FIRST(&vxferlist)) != NULL) {
1188 		struct usbd_xfer *xfer = &vxfer->xfer;
1189 		TAILQ_REMOVE(&vxferlist, vxfer, freelist);
1190 
1191 		mutex_enter(&sc->sc_lock);
1192 		xfer->ux_actlen = ulmin(vxfer->resbuf.size, xfer->ux_length);
1193 		xfer->ux_status = USBD_NORMAL_COMPLETION;
1194 		usb_transfer_complete(xfer);
1195 		mutex_exit(&sc->sc_lock);
1196 	}
1197 
1198 	return error;
1199 }
1200 
1201 static int
1202 vhci_fd_ioctl(file_t *fp, u_long cmd, void *data)
1203 {
1204 	vhci_fd_t *vfd = fp->f_data;
1205 
1206 	KASSERT(vfd != NULL);
1207 
1208 	switch (cmd) {
1209 	case VHCI_IOC_GET_INFO:
1210 		return vhci_get_info(vfd, data);
1211 	case VHCI_IOC_SET_PORT:
1212 		return vhci_set_port(vfd, data);
1213 	case VHCI_IOC_SET_ADDR:
1214 		return vhci_set_addr(vfd, data);
1215 	case VHCI_IOC_USB_ATTACH:
1216 		return vhci_usb_attach(vfd);
1217 	case VHCI_IOC_USB_DETACH:
1218 		return vhci_usb_detach(vfd);
1219 	default:
1220 		return EINVAL;
1221 	}
1222 }
1223 
1224 /* -------------------------------------------------------------------------- */
1225 
1226 static int vhci_match(device_t, cfdata_t, void *);
1227 static void vhci_attach(device_t, device_t, void *);
1228 static int vhci_activate(device_t, enum devact);
1229 
1230 CFATTACH_DECL_NEW(vhci, sizeof(vhci_softc_t), vhci_match, vhci_attach,
1231     NULL, vhci_activate);
1232 
1233 void
1234 vhciattach(int nunits)
1235 {
1236 	static struct cfdata vhci_cfdata = {
1237 		.cf_name = "vhci",
1238 		.cf_atname = "vhci",
1239 		.cf_unit = 0,
1240 		.cf_fstate = FSTATE_STAR,
1241 	};
1242 	int error;
1243 
1244 	error = config_cfattach_attach(vhci_cd.cd_name, &vhci_ca);
1245 	if (error) {
1246 		aprint_error("%s: unable to register cfattach\n",
1247 		    vhci_cd.cd_name);
1248 		(void)config_cfdriver_detach(&vhci_cd);
1249 		return;
1250 	}
1251 
1252 	config_attach_pseudo(&vhci_cfdata);
1253 }
1254 
1255 static int
1256 vhci_activate(device_t self, enum devact act)
1257 {
1258 	vhci_softc_t *sc = device_private(self);
1259 
1260 	switch (act) {
1261 	case DVACT_DEACTIVATE:
1262 		sc->sc_dying = 1;
1263 		return 0;
1264 	default:
1265 		return EOPNOTSUPP;
1266 	}
1267 }
1268 
1269 static int
1270 vhci_match(device_t parent, cfdata_t match, void *aux)
1271 {
1272 	return 1;
1273 }
1274 
1275 static void
1276 vhci_attach(device_t parent, device_t self, void *aux)
1277 {
1278 	vhci_softc_t *sc = device_private(self);
1279 	vhci_port_t *port;
1280 	uint8_t addr;
1281 	size_t i;
1282 
1283 	sc->sc_dev = self;
1284 	sc->sc_bus.ub_revision = USBREV_2_0;
1285 	sc->sc_bus.ub_usedma = false;
1286 	sc->sc_bus.ub_methods = &vhci_bus_methods;
1287 	sc->sc_bus.ub_pipesize = sizeof(vhci_pipe_t);
1288 	sc->sc_bus.ub_hcpriv = sc;
1289 	sc->sc_dying = false;
1290 	mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTUSB);
1291 
1292 	sc->sc_nports = VHCI_NPORTS;
1293 	for (i = 0; i < sc->sc_nports; i++) {
1294 		port = &sc->sc_port[i];
1295 		mutex_init(&port->lock, MUTEX_DEFAULT, IPL_SOFTUSB);
1296 		for (addr = 0; addr < VHCI_NADDRS; addr++) {
1297 			TAILQ_INIT(&port->endpoints[addr].usb_to_host);
1298 			TAILQ_INIT(&port->endpoints[addr].host_to_usb);
1299 		}
1300 	}
1301 
1302 	sc->sc_child = config_found(self, &sc->sc_bus, usbctlprint);
1303 }
1304