usb_hub.c revision 287274
1/* $FreeBSD: stable/10/sys/dev/usb/usb_hub.c 287274 2015-08-29 06:23:40Z hselasky $ */
2/*-
3 * Copyright (c) 1998 The NetBSD Foundation, Inc. All rights reserved.
4 * Copyright (c) 1998 Lennart Augustsson. All rights reserved.
5 * Copyright (c) 2008-2010 Hans Petter Selasky. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29/*
30 * USB spec: http://www.usb.org/developers/docs/usbspec.zip
31 */
32
33#ifdef USB_GLOBAL_INCLUDE_FILE
34#include USB_GLOBAL_INCLUDE_FILE
35#else
36#include <sys/stdint.h>
37#include <sys/stddef.h>
38#include <sys/param.h>
39#include <sys/queue.h>
40#include <sys/types.h>
41#include <sys/systm.h>
42#include <sys/kernel.h>
43#include <sys/bus.h>
44#include <sys/module.h>
45#include <sys/lock.h>
46#include <sys/mutex.h>
47#include <sys/condvar.h>
48#include <sys/sysctl.h>
49#include <sys/sx.h>
50#include <sys/unistd.h>
51#include <sys/callout.h>
52#include <sys/malloc.h>
53#include <sys/priv.h>
54
55#include <dev/usb/usb.h>
56#include <dev/usb/usbdi.h>
57#include <dev/usb/usbdi_util.h>
58
59#define	USB_DEBUG_VAR uhub_debug
60
61#include <dev/usb/usb_core.h>
62#include <dev/usb/usb_process.h>
63#include <dev/usb/usb_device.h>
64#include <dev/usb/usb_request.h>
65#include <dev/usb/usb_debug.h>
66#include <dev/usb/usb_hub.h>
67#include <dev/usb/usb_util.h>
68#include <dev/usb/usb_busdma.h>
69#include <dev/usb/usb_transfer.h>
70#include <dev/usb/usb_dynamic.h>
71
72#include <dev/usb/usb_controller.h>
73#include <dev/usb/usb_bus.h>
74#endif			/* USB_GLOBAL_INCLUDE_FILE */
75
76#define	UHUB_INTR_INTERVAL 250		/* ms */
77enum {
78	UHUB_INTR_TRANSFER,
79#if USB_HAVE_TT_SUPPORT
80	UHUB_RESET_TT_TRANSFER,
81#endif
82	UHUB_N_TRANSFER,
83};
84
85#ifdef USB_DEBUG
86static int uhub_debug = 0;
87
88static SYSCTL_NODE(_hw_usb, OID_AUTO, uhub, CTLFLAG_RW, 0, "USB HUB");
89SYSCTL_INT(_hw_usb_uhub, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN, &uhub_debug, 0,
90    "Debug level");
91TUNABLE_INT("hw.usb.uhub.debug", &uhub_debug);
92#endif
93
94#if USB_HAVE_POWERD
95static int usb_power_timeout = 30;	/* seconds */
96
97SYSCTL_INT(_hw_usb, OID_AUTO, power_timeout, CTLFLAG_RW,
98    &usb_power_timeout, 0, "USB power timeout");
99#endif
100
101#if USB_HAVE_DISABLE_ENUM
102static int usb_disable_enumeration = 0;
103SYSCTL_INT(_hw_usb, OID_AUTO, disable_enumeration, CTLFLAG_RWTUN,
104    &usb_disable_enumeration, 0, "Set to disable all USB device enumeration.");
105TUNABLE_INT("hw.usb.disable_enumeration", &usb_disable_enumeration);
106
107static int usb_disable_port_power = 0;
108SYSCTL_INT(_hw_usb, OID_AUTO, disable_port_power, CTLFLAG_RWTUN,
109    &usb_disable_port_power, 0, "Set to disable all USB port power.");
110TUNABLE_INT("hw.usb.disable_port_power", &usb_disable_port_power);
111#endif
112
113struct uhub_current_state {
114	uint16_t port_change;
115	uint16_t port_status;
116};
117
118struct uhub_softc {
119	struct uhub_current_state sc_st;/* current state */
120#if (USB_HAVE_FIXED_PORT != 0)
121	struct usb_hub sc_hub;
122#endif
123	device_t sc_dev;		/* base device */
124	struct mtx sc_mtx;		/* our mutex */
125	struct usb_device *sc_udev;	/* USB device */
126	struct usb_xfer *sc_xfer[UHUB_N_TRANSFER];	/* interrupt xfer */
127#if USB_HAVE_DISABLE_ENUM
128	int sc_disable_enumeration;
129	int sc_disable_port_power;
130#endif
131	uint8_t	sc_flags;
132#define	UHUB_FLAG_DID_EXPLORE 0x01
133};
134
135#define	UHUB_PROTO(sc) ((sc)->sc_udev->ddesc.bDeviceProtocol)
136#define	UHUB_IS_HIGH_SPEED(sc) (UHUB_PROTO(sc) != UDPROTO_FSHUB)
137#define	UHUB_IS_SINGLE_TT(sc) (UHUB_PROTO(sc) == UDPROTO_HSHUBSTT)
138#define	UHUB_IS_MULTI_TT(sc) (UHUB_PROTO(sc) == UDPROTO_HSHUBMTT)
139#define	UHUB_IS_SUPER_SPEED(sc) (UHUB_PROTO(sc) == UDPROTO_SSHUB)
140
141/* prototypes for type checking: */
142
143static device_probe_t uhub_probe;
144static device_attach_t uhub_attach;
145static device_detach_t uhub_detach;
146static device_suspend_t uhub_suspend;
147static device_resume_t uhub_resume;
148
149static bus_driver_added_t uhub_driver_added;
150static bus_child_location_str_t uhub_child_location_string;
151static bus_child_pnpinfo_str_t uhub_child_pnpinfo_string;
152
153static usb_callback_t uhub_intr_callback;
154#if USB_HAVE_TT_SUPPORT
155static usb_callback_t uhub_reset_tt_callback;
156#endif
157
158static void usb_dev_resume_peer(struct usb_device *udev);
159static void usb_dev_suspend_peer(struct usb_device *udev);
160static uint8_t usb_peer_should_wakeup(struct usb_device *udev);
161
162static const struct usb_config uhub_config[UHUB_N_TRANSFER] = {
163
164	[UHUB_INTR_TRANSFER] = {
165		.type = UE_INTERRUPT,
166		.endpoint = UE_ADDR_ANY,
167		.direction = UE_DIR_ANY,
168		.timeout = 0,
169		.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
170		.bufsize = 0,	/* use wMaxPacketSize */
171		.callback = &uhub_intr_callback,
172		.interval = UHUB_INTR_INTERVAL,
173	},
174#if USB_HAVE_TT_SUPPORT
175	[UHUB_RESET_TT_TRANSFER] = {
176		.type = UE_CONTROL,
177		.endpoint = 0x00,	/* Control pipe */
178		.direction = UE_DIR_ANY,
179		.bufsize = sizeof(struct usb_device_request),
180		.callback = &uhub_reset_tt_callback,
181		.timeout = 1000,	/* 1 second */
182		.usb_mode = USB_MODE_HOST,
183	},
184#endif
185};
186
187/*
188 * driver instance for "hub" connected to "usb"
189 * and "hub" connected to "hub"
190 */
191static devclass_t uhub_devclass;
192
193static device_method_t uhub_methods[] = {
194	DEVMETHOD(device_probe, uhub_probe),
195	DEVMETHOD(device_attach, uhub_attach),
196	DEVMETHOD(device_detach, uhub_detach),
197
198	DEVMETHOD(device_suspend, uhub_suspend),
199	DEVMETHOD(device_resume, uhub_resume),
200
201	DEVMETHOD(bus_child_location_str, uhub_child_location_string),
202	DEVMETHOD(bus_child_pnpinfo_str, uhub_child_pnpinfo_string),
203	DEVMETHOD(bus_driver_added, uhub_driver_added),
204	DEVMETHOD_END
205};
206
207static driver_t uhub_driver = {
208	.name = "uhub",
209	.methods = uhub_methods,
210	.size = sizeof(struct uhub_softc)
211};
212
213DRIVER_MODULE(uhub, usbus, uhub_driver, uhub_devclass, 0, 0);
214DRIVER_MODULE(uhub, uhub, uhub_driver, uhub_devclass, NULL, 0);
215MODULE_VERSION(uhub, 1);
216
217static void
218uhub_intr_callback(struct usb_xfer *xfer, usb_error_t error)
219{
220	struct uhub_softc *sc = usbd_xfer_softc(xfer);
221
222	switch (USB_GET_STATE(xfer)) {
223	case USB_ST_TRANSFERRED:
224		DPRINTFN(2, "\n");
225		/*
226		 * This is an indication that some port
227		 * has changed status. Notify the bus
228		 * event handler thread that we need
229		 * to be explored again:
230		 */
231		usb_needs_explore(sc->sc_udev->bus, 0);
232
233	case USB_ST_SETUP:
234		usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
235		usbd_transfer_submit(xfer);
236		break;
237
238	default:			/* Error */
239		if (xfer->error != USB_ERR_CANCELLED) {
240			/*
241			 * Do a clear-stall. The "stall_pipe" flag
242			 * will get cleared before next callback by
243			 * the USB stack.
244			 */
245			usbd_xfer_set_stall(xfer);
246			usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
247			usbd_transfer_submit(xfer);
248		}
249		break;
250	}
251}
252
253/*------------------------------------------------------------------------*
254 *      uhub_reset_tt_proc
255 *
256 * This function starts the TT reset USB request
257 *------------------------------------------------------------------------*/
258#if USB_HAVE_TT_SUPPORT
259static void
260uhub_reset_tt_proc(struct usb_proc_msg *_pm)
261{
262	struct usb_udev_msg *pm = (void *)_pm;
263	struct usb_device *udev = pm->udev;
264	struct usb_hub *hub;
265	struct uhub_softc *sc;
266
267	hub = udev->hub;
268	if (hub == NULL)
269		return;
270	sc = hub->hubsoftc;
271	if (sc == NULL)
272		return;
273
274	/* Change lock */
275	USB_BUS_UNLOCK(udev->bus);
276	mtx_lock(&sc->sc_mtx);
277	/* Start transfer */
278	usbd_transfer_start(sc->sc_xfer[UHUB_RESET_TT_TRANSFER]);
279	/* Change lock */
280	mtx_unlock(&sc->sc_mtx);
281	USB_BUS_LOCK(udev->bus);
282}
283#endif
284
285/*------------------------------------------------------------------------*
286 *      uhub_tt_buffer_reset_async_locked
287 *
288 * This function queues a TT reset for the given USB device and endpoint.
289 *------------------------------------------------------------------------*/
290#if USB_HAVE_TT_SUPPORT
291void
292uhub_tt_buffer_reset_async_locked(struct usb_device *child, struct usb_endpoint *ep)
293{
294	struct usb_device_request req;
295	struct usb_device *udev;
296	struct usb_hub *hub;
297	struct usb_port *up;
298	uint16_t wValue;
299	uint8_t port;
300
301	if (child == NULL || ep == NULL)
302		return;
303
304	udev = child->parent_hs_hub;
305	port = child->hs_port_no;
306
307	if (udev == NULL)
308		return;
309
310	hub = udev->hub;
311	if ((hub == NULL) ||
312	    (udev->speed != USB_SPEED_HIGH) ||
313	    (child->speed != USB_SPEED_LOW &&
314	     child->speed != USB_SPEED_FULL) ||
315	    (child->flags.usb_mode != USB_MODE_HOST) ||
316	    (port == 0) || (ep->edesc == NULL)) {
317		/* not applicable */
318		return;
319	}
320
321	USB_BUS_LOCK_ASSERT(udev->bus, MA_OWNED);
322
323	up = hub->ports + port - 1;
324
325	if (udev->ddesc.bDeviceClass == UDCLASS_HUB &&
326	    udev->ddesc.bDeviceProtocol == UDPROTO_HSHUBSTT)
327		port = 1;
328
329	/* if we already received a clear buffer request, reset the whole TT */
330	if (up->req_reset_tt.bRequest != 0) {
331		req.bmRequestType = UT_WRITE_CLASS_OTHER;
332		req.bRequest = UR_RESET_TT;
333		USETW(req.wValue, 0);
334		req.wIndex[0] = port;
335		req.wIndex[1] = 0;
336		USETW(req.wLength, 0);
337	} else {
338		wValue = (ep->edesc->bEndpointAddress & 0xF) |
339		      ((child->address & 0x7F) << 4) |
340		      ((ep->edesc->bEndpointAddress & 0x80) << 8) |
341		      ((ep->edesc->bmAttributes & 3) << 12);
342
343		req.bmRequestType = UT_WRITE_CLASS_OTHER;
344		req.bRequest = UR_CLEAR_TT_BUFFER;
345		USETW(req.wValue, wValue);
346		req.wIndex[0] = port;
347		req.wIndex[1] = 0;
348		USETW(req.wLength, 0);
349	}
350	up->req_reset_tt = req;
351	/* get reset transfer started */
352	usb_proc_msignal(USB_BUS_TT_PROC(udev->bus),
353	    &hub->tt_msg[0], &hub->tt_msg[1]);
354}
355#endif
356
357#if USB_HAVE_TT_SUPPORT
358static void
359uhub_reset_tt_callback(struct usb_xfer *xfer, usb_error_t error)
360{
361	struct uhub_softc *sc;
362	struct usb_device *udev;
363	struct usb_port *up;
364	uint8_t x;
365
366	DPRINTF("TT buffer reset\n");
367
368	sc = usbd_xfer_softc(xfer);
369	udev = sc->sc_udev;
370
371	switch (USB_GET_STATE(xfer)) {
372	case USB_ST_TRANSFERRED:
373	case USB_ST_SETUP:
374tr_setup:
375		USB_BUS_LOCK(udev->bus);
376		/* find first port which needs a TT reset */
377		for (x = 0; x != udev->hub->nports; x++) {
378			up = udev->hub->ports + x;
379
380			if (up->req_reset_tt.bRequest == 0)
381				continue;
382
383			/* copy in the transfer */
384			usbd_copy_in(xfer->frbuffers, 0, &up->req_reset_tt,
385			    sizeof(up->req_reset_tt));
386			/* reset buffer */
387			memset(&up->req_reset_tt, 0, sizeof(up->req_reset_tt));
388
389			/* set length */
390			usbd_xfer_set_frame_len(xfer, 0, sizeof(up->req_reset_tt));
391			xfer->nframes = 1;
392			USB_BUS_UNLOCK(udev->bus);
393
394			usbd_transfer_submit(xfer);
395			return;
396		}
397		USB_BUS_UNLOCK(udev->bus);
398		break;
399
400	default:
401		if (error == USB_ERR_CANCELLED)
402			break;
403
404		DPRINTF("TT buffer reset failed (%s)\n", usbd_errstr(error));
405		goto tr_setup;
406	}
407}
408#endif
409
410/*------------------------------------------------------------------------*
411 *      uhub_count_active_host_ports
412 *
413 * This function counts the number of active ports at the given speed.
414 *------------------------------------------------------------------------*/
415uint8_t
416uhub_count_active_host_ports(struct usb_device *udev, enum usb_dev_speed speed)
417{
418	struct uhub_softc *sc;
419	struct usb_device *child;
420	struct usb_hub *hub;
421	struct usb_port *up;
422	uint8_t retval = 0;
423	uint8_t x;
424
425	if (udev == NULL)
426		goto done;
427	hub = udev->hub;
428	if (hub == NULL)
429		goto done;
430	sc = hub->hubsoftc;
431	if (sc == NULL)
432		goto done;
433
434	for (x = 0; x != hub->nports; x++) {
435		up = hub->ports + x;
436		child = usb_bus_port_get_device(udev->bus, up);
437		if (child != NULL &&
438		    child->flags.usb_mode == USB_MODE_HOST &&
439		    child->speed == speed)
440			retval++;
441	}
442done:
443	return (retval);
444}
445
446void
447uhub_explore_handle_re_enumerate(struct usb_device *child)
448{
449	uint8_t do_unlock;
450	usb_error_t err;
451
452	/* check if device should be re-enumerated */
453	if (child->flags.usb_mode != USB_MODE_HOST)
454		return;
455
456	do_unlock = usbd_enum_lock(child);
457	switch (child->re_enumerate_wait) {
458	case USB_RE_ENUM_START:
459		err = usbd_set_config_index(child,
460		    USB_UNCONFIG_INDEX);
461		if (err != 0) {
462			DPRINTF("Unconfigure failed: %s: Ignored.\n",
463			    usbd_errstr(err));
464		}
465		if (child->parent_hub == NULL) {
466			/* the root HUB cannot be re-enumerated */
467			DPRINTFN(6, "cannot reset root HUB\n");
468			err = 0;
469		} else {
470			err = usbd_req_re_enumerate(child, NULL);
471		}
472		if (err == 0)
473			err = usbd_set_config_index(child, 0);
474		if (err == 0) {
475			err = usb_probe_and_attach(child,
476			    USB_IFACE_INDEX_ANY);
477		}
478		child->re_enumerate_wait = USB_RE_ENUM_DONE;
479		break;
480
481	case USB_RE_ENUM_PWR_OFF:
482		/* get the device unconfigured */
483		err = usbd_set_config_index(child,
484		    USB_UNCONFIG_INDEX);
485		if (err) {
486			DPRINTFN(0, "Could not unconfigure "
487			    "device (ignored)\n");
488		}
489		if (child->parent_hub == NULL) {
490			/* the root HUB cannot be re-enumerated */
491			DPRINTFN(6, "cannot set port feature\n");
492			err = 0;
493		} else {
494			/* clear port enable */
495			err = usbd_req_clear_port_feature(child->parent_hub,
496			    NULL, child->port_no, UHF_PORT_ENABLE);
497			if (err) {
498				DPRINTFN(0, "Could not disable port "
499				    "(ignored)\n");
500			}
501		}
502		child->re_enumerate_wait = USB_RE_ENUM_DONE;
503		break;
504
505	case USB_RE_ENUM_SET_CONFIG:
506		err = usbd_set_config_index(child,
507		    child->next_config_index);
508		if (err != 0) {
509			DPRINTF("Configure failed: %s: Ignored.\n",
510			    usbd_errstr(err));
511		} else {
512			err = usb_probe_and_attach(child,
513			    USB_IFACE_INDEX_ANY);
514		}
515		child->re_enumerate_wait = USB_RE_ENUM_DONE;
516		break;
517
518	default:
519		child->re_enumerate_wait = USB_RE_ENUM_DONE;
520		break;
521	}
522	if (do_unlock)
523		usbd_enum_unlock(child);
524}
525
526/*------------------------------------------------------------------------*
527 *	uhub_explore_sub - subroutine
528 *
529 * Return values:
530 *    0: Success
531 * Else: A control transaction failed
532 *------------------------------------------------------------------------*/
533static usb_error_t
534uhub_explore_sub(struct uhub_softc *sc, struct usb_port *up)
535{
536	struct usb_bus *bus;
537	struct usb_device *child;
538	uint8_t refcount;
539	usb_error_t err;
540
541	bus = sc->sc_udev->bus;
542	err = 0;
543
544	/* get driver added refcount from USB bus */
545	refcount = bus->driver_added_refcount;
546
547	/* get device assosiated with the given port */
548	child = usb_bus_port_get_device(bus, up);
549	if (child == NULL) {
550		/* nothing to do */
551		goto done;
552	}
553
554	uhub_explore_handle_re_enumerate(child);
555
556	/* check if probe and attach should be done */
557
558	if (child->driver_added_refcount != refcount) {
559		child->driver_added_refcount = refcount;
560		err = usb_probe_and_attach(child,
561		    USB_IFACE_INDEX_ANY);
562		if (err) {
563			goto done;
564		}
565	}
566	/* start control transfer, if device mode */
567
568	if (child->flags.usb_mode == USB_MODE_DEVICE)
569		usbd_ctrl_transfer_setup(child);
570
571	/* if a HUB becomes present, do a recursive HUB explore */
572
573	if (child->hub)
574		err = (child->hub->explore) (child);
575
576done:
577	return (err);
578}
579
580/*------------------------------------------------------------------------*
581 *	uhub_read_port_status - factored out code
582 *------------------------------------------------------------------------*/
583static usb_error_t
584uhub_read_port_status(struct uhub_softc *sc, uint8_t portno)
585{
586	struct usb_port_status ps;
587	usb_error_t err;
588
589	err = usbd_req_get_port_status(
590	    sc->sc_udev, NULL, &ps, portno);
591
592	/* update status regardless of error */
593
594	sc->sc_st.port_status = UGETW(ps.wPortStatus);
595	sc->sc_st.port_change = UGETW(ps.wPortChange);
596
597	/* debugging print */
598
599	DPRINTFN(4, "port %d, wPortStatus=0x%04x, "
600	    "wPortChange=0x%04x, err=%s\n",
601	    portno, sc->sc_st.port_status,
602	    sc->sc_st.port_change, usbd_errstr(err));
603	return (err);
604}
605
606/*------------------------------------------------------------------------*
607 *	uhub_reattach_port
608 *
609 * Returns:
610 *    0: Success
611 * Else: A control transaction failed
612 *------------------------------------------------------------------------*/
613static usb_error_t
614uhub_reattach_port(struct uhub_softc *sc, uint8_t portno)
615{
616	struct usb_device *child;
617	struct usb_device *udev;
618	enum usb_dev_speed speed;
619	enum usb_hc_mode mode;
620	usb_error_t err;
621	uint16_t power_mask;
622	uint8_t timeout;
623
624	DPRINTF("reattaching port %d\n", portno);
625
626	timeout = 0;
627	udev = sc->sc_udev;
628	child = usb_bus_port_get_device(udev->bus,
629	    udev->hub->ports + portno - 1);
630
631repeat:
632
633	/* first clear the port connection change bit */
634
635	err = usbd_req_clear_port_feature(udev, NULL,
636	    portno, UHF_C_PORT_CONNECTION);
637
638	if (err)
639		goto error;
640
641	/* check if there is a child */
642
643	if (child != NULL) {
644		/*
645		 * Free USB device and all subdevices, if any.
646		 */
647		usb_free_device(child, 0);
648		child = NULL;
649	}
650	/* get fresh status */
651
652	err = uhub_read_port_status(sc, portno);
653	if (err)
654		goto error;
655
656#if USB_HAVE_DISABLE_ENUM
657	/* check if we should skip enumeration from this USB HUB */
658	if (usb_disable_enumeration != 0 ||
659	    sc->sc_disable_enumeration != 0) {
660		DPRINTF("Enumeration is disabled!\n");
661		goto error;
662	}
663#endif
664	/* check if nothing is connected to the port */
665
666	if (!(sc->sc_st.port_status & UPS_CURRENT_CONNECT_STATUS))
667		goto error;
668
669	/* check if there is no power on the port and print a warning */
670
671	switch (udev->speed) {
672	case USB_SPEED_HIGH:
673	case USB_SPEED_FULL:
674	case USB_SPEED_LOW:
675		power_mask = UPS_PORT_POWER;
676		break;
677	case USB_SPEED_SUPER:
678		if (udev->parent_hub == NULL)
679			power_mask = UPS_PORT_POWER;
680		else
681			power_mask = UPS_PORT_POWER_SS;
682		break;
683	default:
684		power_mask = 0;
685		break;
686	}
687	if (!(sc->sc_st.port_status & power_mask)) {
688		DPRINTF("WARNING: strange, connected port %d "
689		    "has no power\n", portno);
690	}
691
692	/* check if the device is in Host Mode */
693
694	if (!(sc->sc_st.port_status & UPS_PORT_MODE_DEVICE)) {
695
696		DPRINTF("Port %d is in Host Mode\n", portno);
697
698		if (sc->sc_st.port_status & UPS_SUSPEND) {
699			/*
700			 * NOTE: Should not get here in SuperSpeed
701			 * mode, because the HUB should report this
702			 * bit as zero.
703			 */
704			DPRINTF("Port %d was still "
705			    "suspended, clearing.\n", portno);
706			err = usbd_req_clear_port_feature(udev,
707			    NULL, portno, UHF_PORT_SUSPEND);
708		}
709
710		/* USB Host Mode */
711
712		/* wait for maximum device power up time */
713
714		usb_pause_mtx(NULL,
715		    USB_MS_TO_TICKS(usb_port_powerup_delay));
716
717		/* reset port, which implies enabling it */
718
719		err = usbd_req_reset_port(udev, NULL, portno);
720
721		if (err) {
722			DPRINTFN(0, "port %d reset "
723			    "failed, error=%s\n",
724			    portno, usbd_errstr(err));
725			goto error;
726		}
727		/* get port status again, it might have changed during reset */
728
729		err = uhub_read_port_status(sc, portno);
730		if (err) {
731			goto error;
732		}
733		/* check if something changed during port reset */
734
735		if ((sc->sc_st.port_change & UPS_C_CONNECT_STATUS) ||
736		    (!(sc->sc_st.port_status & UPS_CURRENT_CONNECT_STATUS))) {
737			if (timeout) {
738				DPRINTFN(0, "giving up port reset "
739				    "- device vanished\n");
740				goto error;
741			}
742			timeout = 1;
743			goto repeat;
744		}
745	} else {
746		DPRINTF("Port %d is in Device Mode\n", portno);
747	}
748
749	/*
750	 * Figure out the device speed
751	 */
752	switch (udev->speed) {
753	case USB_SPEED_HIGH:
754		if (sc->sc_st.port_status & UPS_HIGH_SPEED)
755			speed = USB_SPEED_HIGH;
756		else if (sc->sc_st.port_status & UPS_LOW_SPEED)
757			speed = USB_SPEED_LOW;
758		else
759			speed = USB_SPEED_FULL;
760		break;
761	case USB_SPEED_FULL:
762		if (sc->sc_st.port_status & UPS_LOW_SPEED)
763			speed = USB_SPEED_LOW;
764		else
765			speed = USB_SPEED_FULL;
766		break;
767	case USB_SPEED_LOW:
768		speed = USB_SPEED_LOW;
769		break;
770	case USB_SPEED_SUPER:
771		if (udev->parent_hub == NULL) {
772			/* Root HUB - special case */
773			switch (sc->sc_st.port_status & UPS_OTHER_SPEED) {
774			case 0:
775				speed = USB_SPEED_FULL;
776				break;
777			case UPS_LOW_SPEED:
778				speed = USB_SPEED_LOW;
779				break;
780			case UPS_HIGH_SPEED:
781				speed = USB_SPEED_HIGH;
782				break;
783			default:
784				speed = USB_SPEED_SUPER;
785				break;
786			}
787		} else {
788			speed = USB_SPEED_SUPER;
789		}
790		break;
791	default:
792		/* same speed like parent */
793		speed = udev->speed;
794		break;
795	}
796	if (speed == USB_SPEED_SUPER) {
797		err = usbd_req_set_hub_u1_timeout(udev, NULL,
798		    portno, 128 - (2 * udev->depth));
799		if (err) {
800			DPRINTFN(0, "port %d U1 timeout "
801			    "failed, error=%s\n",
802			    portno, usbd_errstr(err));
803		}
804		err = usbd_req_set_hub_u2_timeout(udev, NULL,
805		    portno, 128 - (2 * udev->depth));
806		if (err) {
807			DPRINTFN(0, "port %d U2 timeout "
808			    "failed, error=%s\n",
809			    portno, usbd_errstr(err));
810		}
811	}
812
813	/*
814	 * Figure out the device mode
815	 *
816	 * NOTE: This part is currently FreeBSD specific.
817	 */
818	if (udev->parent_hub != NULL) {
819		/* inherit mode from the parent HUB */
820		mode = udev->parent_hub->flags.usb_mode;
821	} else if (sc->sc_st.port_status & UPS_PORT_MODE_DEVICE)
822		mode = USB_MODE_DEVICE;
823	else
824		mode = USB_MODE_HOST;
825
826	/* need to create a new child */
827	child = usb_alloc_device(sc->sc_dev, udev->bus, udev,
828	    udev->depth + 1, portno - 1, portno, speed, mode);
829	if (child == NULL) {
830		DPRINTFN(0, "could not allocate new device\n");
831		goto error;
832	}
833	return (0);			/* success */
834
835error:
836	if (child != NULL) {
837		/*
838		 * Free USB device and all subdevices, if any.
839		 */
840		usb_free_device(child, 0);
841		child = NULL;
842	}
843	if (err == 0) {
844		if (sc->sc_st.port_status & UPS_PORT_ENABLED) {
845			err = usbd_req_clear_port_feature(
846			    sc->sc_udev, NULL,
847			    portno, UHF_PORT_ENABLE);
848		}
849	}
850	if (err) {
851		DPRINTFN(0, "device problem (%s), "
852		    "disabling port %d\n", usbd_errstr(err), portno);
853	}
854	return (err);
855}
856
857/*------------------------------------------------------------------------*
858 *	usb_device_20_compatible
859 *
860 * Returns:
861 *    0: HUB does not support suspend and resume
862 * Else: HUB supports suspend and resume
863 *------------------------------------------------------------------------*/
864static uint8_t
865usb_device_20_compatible(struct usb_device *udev)
866{
867	if (udev == NULL)
868		return (0);
869	switch (udev->speed) {
870	case USB_SPEED_LOW:
871	case USB_SPEED_FULL:
872	case USB_SPEED_HIGH:
873		return (1);
874	default:
875		return (0);
876	}
877}
878
879/*------------------------------------------------------------------------*
880 *	uhub_suspend_resume_port
881 *
882 * Returns:
883 *    0: Success
884 * Else: A control transaction failed
885 *------------------------------------------------------------------------*/
886static usb_error_t
887uhub_suspend_resume_port(struct uhub_softc *sc, uint8_t portno)
888{
889	struct usb_device *child;
890	struct usb_device *udev;
891	uint8_t is_suspend;
892	usb_error_t err;
893
894	DPRINTF("port %d\n", portno);
895
896	udev = sc->sc_udev;
897	child = usb_bus_port_get_device(udev->bus,
898	    udev->hub->ports + portno - 1);
899
900	/* first clear the port suspend change bit */
901
902	if (usb_device_20_compatible(udev)) {
903		err = usbd_req_clear_port_feature(udev, NULL,
904		    portno, UHF_C_PORT_SUSPEND);
905	} else {
906		err = usbd_req_clear_port_feature(udev, NULL,
907		    portno, UHF_C_PORT_LINK_STATE);
908	}
909
910	if (err) {
911		DPRINTF("clearing suspend failed.\n");
912		goto done;
913	}
914	/* get fresh status */
915
916	err = uhub_read_port_status(sc, portno);
917	if (err) {
918		DPRINTF("reading port status failed.\n");
919		goto done;
920	}
921	/* convert current state */
922
923	if (usb_device_20_compatible(udev)) {
924		if (sc->sc_st.port_status & UPS_SUSPEND) {
925			is_suspend = 1;
926		} else {
927			is_suspend = 0;
928		}
929	} else {
930		switch (UPS_PORT_LINK_STATE_GET(sc->sc_st.port_status)) {
931		case UPS_PORT_LS_U3:
932			is_suspend = 1;
933			break;
934		case UPS_PORT_LS_SS_INA:
935			usbd_req_warm_reset_port(udev, NULL, portno);
936			is_suspend = 0;
937			break;
938		default:
939			is_suspend = 0;
940			break;
941		}
942	}
943
944	DPRINTF("suspended=%u\n", is_suspend);
945
946	/* do the suspend or resume */
947
948	if (child) {
949		/*
950		 * This code handle two cases: 1) Host Mode - we can only
951		 * receive resume here 2) Device Mode - we can receive
952		 * suspend and resume here
953		 */
954		if (is_suspend == 0)
955			usb_dev_resume_peer(child);
956		else if (child->flags.usb_mode == USB_MODE_DEVICE)
957			usb_dev_suspend_peer(child);
958	}
959done:
960	return (err);
961}
962
963/*------------------------------------------------------------------------*
964 *	uhub_root_interrupt
965 *
966 * This function is called when a Root HUB interrupt has
967 * happened. "ptr" and "len" makes up the Root HUB interrupt
968 * packet. This function is called having the "bus_mtx" locked.
969 *------------------------------------------------------------------------*/
970void
971uhub_root_intr(struct usb_bus *bus, const uint8_t *ptr, uint8_t len)
972{
973	USB_BUS_LOCK_ASSERT(bus, MA_OWNED);
974
975	usb_needs_explore(bus, 0);
976}
977
978static uint8_t
979uhub_is_too_deep(struct usb_device *udev)
980{
981	switch (udev->speed) {
982	case USB_SPEED_FULL:
983	case USB_SPEED_LOW:
984	case USB_SPEED_HIGH:
985		if (udev->depth > USB_HUB_MAX_DEPTH)
986			return (1);
987		break;
988	case USB_SPEED_SUPER:
989		if (udev->depth > USB_SS_HUB_DEPTH_MAX)
990			return (1);
991		break;
992	default:
993		break;
994	}
995	return (0);
996}
997
998/*------------------------------------------------------------------------*
999 *	uhub_explore
1000 *
1001 * Returns:
1002 *     0: Success
1003 *  Else: Failure
1004 *------------------------------------------------------------------------*/
1005static usb_error_t
1006uhub_explore(struct usb_device *udev)
1007{
1008	struct usb_hub *hub;
1009	struct uhub_softc *sc;
1010	struct usb_port *up;
1011	usb_error_t err;
1012	uint8_t portno;
1013	uint8_t x;
1014	uint8_t do_unlock;
1015
1016	hub = udev->hub;
1017	sc = hub->hubsoftc;
1018
1019	DPRINTFN(11, "udev=%p addr=%d\n", udev, udev->address);
1020
1021	/* ignore devices that are too deep */
1022	if (uhub_is_too_deep(udev))
1023		return (USB_ERR_TOO_DEEP);
1024
1025	/* check if device is suspended */
1026	if (udev->flags.self_suspended) {
1027		/* need to wait until the child signals resume */
1028		DPRINTF("Device is suspended!\n");
1029		return (0);
1030	}
1031
1032	/*
1033	 * Make sure we don't race against user-space applications
1034	 * like LibUSB:
1035	 */
1036	do_unlock = usbd_enum_lock(udev);
1037
1038	for (x = 0; x != hub->nports; x++) {
1039		up = hub->ports + x;
1040		portno = x + 1;
1041
1042		err = uhub_read_port_status(sc, portno);
1043		if (err) {
1044			/* most likely the HUB is gone */
1045			break;
1046		}
1047		if (sc->sc_st.port_change & UPS_C_OVERCURRENT_INDICATOR) {
1048			DPRINTF("Overcurrent on port %u.\n", portno);
1049			err = usbd_req_clear_port_feature(
1050			    udev, NULL, portno, UHF_C_PORT_OVER_CURRENT);
1051			if (err) {
1052				/* most likely the HUB is gone */
1053				break;
1054			}
1055		}
1056		if (!(sc->sc_flags & UHUB_FLAG_DID_EXPLORE)) {
1057			/*
1058			 * Fake a connect status change so that the
1059			 * status gets checked initially!
1060			 */
1061			sc->sc_st.port_change |=
1062			    UPS_C_CONNECT_STATUS;
1063		}
1064		if (sc->sc_st.port_change & UPS_C_PORT_ENABLED) {
1065			err = usbd_req_clear_port_feature(
1066			    udev, NULL, portno, UHF_C_PORT_ENABLE);
1067			if (err) {
1068				/* most likely the HUB is gone */
1069				break;
1070			}
1071			if (sc->sc_st.port_change & UPS_C_CONNECT_STATUS) {
1072				/*
1073				 * Ignore the port error if the device
1074				 * has vanished !
1075				 */
1076			} else if (sc->sc_st.port_status & UPS_PORT_ENABLED) {
1077				DPRINTFN(0, "illegal enable change, "
1078				    "port %d\n", portno);
1079			} else {
1080
1081				if (up->restartcnt == USB_RESTART_MAX) {
1082					/* XXX could try another speed ? */
1083					DPRINTFN(0, "port error, giving up "
1084					    "port %d\n", portno);
1085				} else {
1086					sc->sc_st.port_change |=
1087					    UPS_C_CONNECT_STATUS;
1088					up->restartcnt++;
1089				}
1090			}
1091		}
1092		if (sc->sc_st.port_change & UPS_C_CONNECT_STATUS) {
1093			err = uhub_reattach_port(sc, portno);
1094			if (err) {
1095				/* most likely the HUB is gone */
1096				break;
1097			}
1098		}
1099		if (sc->sc_st.port_change & (UPS_C_SUSPEND |
1100		    UPS_C_PORT_LINK_STATE)) {
1101			err = uhub_suspend_resume_port(sc, portno);
1102			if (err) {
1103				/* most likely the HUB is gone */
1104				break;
1105			}
1106		}
1107		err = uhub_explore_sub(sc, up);
1108		if (err) {
1109			/* no device(s) present */
1110			continue;
1111		}
1112		/* explore succeeded - reset restart counter */
1113		up->restartcnt = 0;
1114	}
1115
1116	if (do_unlock)
1117		usbd_enum_unlock(udev);
1118
1119	/* initial status checked */
1120	sc->sc_flags |= UHUB_FLAG_DID_EXPLORE;
1121
1122	/* return success */
1123	return (USB_ERR_NORMAL_COMPLETION);
1124}
1125
1126static int
1127uhub_probe(device_t dev)
1128{
1129	struct usb_attach_arg *uaa = device_get_ivars(dev);
1130
1131	if (uaa->usb_mode != USB_MODE_HOST)
1132		return (ENXIO);
1133
1134	/*
1135	 * The subclass for USB HUBs is currently ignored because it
1136	 * is 0 for some and 1 for others.
1137	 */
1138	if (uaa->info.bConfigIndex == 0 &&
1139	    uaa->info.bDeviceClass == UDCLASS_HUB)
1140		return (0);
1141
1142	return (ENXIO);
1143}
1144
1145/* NOTE: The information returned by this function can be wrong. */
1146usb_error_t
1147uhub_query_info(struct usb_device *udev, uint8_t *pnports, uint8_t *ptt)
1148{
1149	struct usb_hub_descriptor hubdesc20;
1150	struct usb_hub_ss_descriptor hubdesc30;
1151	usb_error_t err;
1152	uint8_t nports;
1153	uint8_t tt;
1154
1155	if (udev->ddesc.bDeviceClass != UDCLASS_HUB)
1156		return (USB_ERR_INVAL);
1157
1158	nports = 0;
1159	tt = 0;
1160
1161	switch (udev->speed) {
1162	case USB_SPEED_LOW:
1163	case USB_SPEED_FULL:
1164	case USB_SPEED_HIGH:
1165		/* assuming that there is one port */
1166		err = usbd_req_get_hub_descriptor(udev, NULL, &hubdesc20, 1);
1167		if (err) {
1168			DPRINTFN(0, "getting USB 2.0 HUB descriptor failed,"
1169			    "error=%s\n", usbd_errstr(err));
1170			break;
1171		}
1172		nports = hubdesc20.bNbrPorts;
1173		if (nports > 127)
1174			nports = 127;
1175
1176		if (udev->speed == USB_SPEED_HIGH)
1177			tt = (UGETW(hubdesc20.wHubCharacteristics) >> 5) & 3;
1178		break;
1179
1180	case USB_SPEED_SUPER:
1181		err = usbd_req_get_ss_hub_descriptor(udev, NULL, &hubdesc30, 1);
1182		if (err) {
1183			DPRINTFN(0, "Getting USB 3.0 HUB descriptor failed,"
1184			    "error=%s\n", usbd_errstr(err));
1185			break;
1186		}
1187		nports = hubdesc30.bNbrPorts;
1188		if (nports > 16)
1189			nports = 16;
1190		break;
1191
1192	default:
1193		err = USB_ERR_INVAL;
1194		break;
1195	}
1196
1197	if (pnports != NULL)
1198		*pnports = nports;
1199
1200	if (ptt != NULL)
1201		*ptt = tt;
1202
1203	return (err);
1204}
1205
1206static int
1207uhub_attach(device_t dev)
1208{
1209	struct uhub_softc *sc = device_get_softc(dev);
1210	struct usb_attach_arg *uaa = device_get_ivars(dev);
1211	struct usb_device *udev = uaa->device;
1212	struct usb_device *parent_hub = udev->parent_hub;
1213	struct usb_hub *hub;
1214	struct usb_hub_descriptor hubdesc20;
1215	struct usb_hub_ss_descriptor hubdesc30;
1216#if USB_HAVE_DISABLE_ENUM
1217	struct sysctl_ctx_list *sysctl_ctx;
1218	struct sysctl_oid *sysctl_tree;
1219#endif
1220	uint16_t pwrdly;
1221	uint16_t nports;
1222	uint8_t x;
1223	uint8_t portno;
1224	uint8_t removable;
1225	uint8_t iface_index;
1226	usb_error_t err;
1227
1228	sc->sc_udev = udev;
1229	sc->sc_dev = dev;
1230
1231	mtx_init(&sc->sc_mtx, "USB HUB mutex", NULL, MTX_DEF);
1232
1233	device_set_usb_desc(dev);
1234
1235	DPRINTFN(2, "depth=%d selfpowered=%d, parent=%p, "
1236	    "parent->selfpowered=%d\n",
1237	    udev->depth,
1238	    udev->flags.self_powered,
1239	    parent_hub,
1240	    parent_hub ?
1241	    parent_hub->flags.self_powered : 0);
1242
1243	if (uhub_is_too_deep(udev)) {
1244		DPRINTFN(0, "HUB at depth %d, "
1245		    "exceeds maximum. HUB ignored\n", (int)udev->depth);
1246		goto error;
1247	}
1248
1249	if (!udev->flags.self_powered && parent_hub &&
1250	    !parent_hub->flags.self_powered) {
1251		DPRINTFN(0, "Bus powered HUB connected to "
1252		    "bus powered HUB. HUB ignored\n");
1253		goto error;
1254	}
1255
1256	if (UHUB_IS_MULTI_TT(sc)) {
1257		err = usbd_set_alt_interface_index(udev, 0, 1);
1258		if (err) {
1259			device_printf(dev, "MTT could not be enabled\n");
1260			goto error;
1261		}
1262		device_printf(dev, "MTT enabled\n");
1263	}
1264
1265	/* get HUB descriptor */
1266
1267	DPRINTFN(2, "Getting HUB descriptor\n");
1268
1269	switch (udev->speed) {
1270	case USB_SPEED_LOW:
1271	case USB_SPEED_FULL:
1272	case USB_SPEED_HIGH:
1273		/* assuming that there is one port */
1274		err = usbd_req_get_hub_descriptor(udev, NULL, &hubdesc20, 1);
1275		if (err) {
1276			DPRINTFN(0, "getting USB 2.0 HUB descriptor failed,"
1277			    "error=%s\n", usbd_errstr(err));
1278			goto error;
1279		}
1280		/* get number of ports */
1281		nports = hubdesc20.bNbrPorts;
1282
1283		/* get power delay */
1284		pwrdly = ((hubdesc20.bPwrOn2PwrGood * UHD_PWRON_FACTOR) +
1285		    usb_extra_power_up_time);
1286
1287		/* get complete HUB descriptor */
1288		if (nports >= 8) {
1289			/* check number of ports */
1290			if (nports > 127) {
1291				DPRINTFN(0, "Invalid number of USB 2.0 ports,"
1292				    "error=%s\n", usbd_errstr(err));
1293				goto error;
1294			}
1295			/* get complete HUB descriptor */
1296			err = usbd_req_get_hub_descriptor(udev, NULL, &hubdesc20, nports);
1297
1298			if (err) {
1299				DPRINTFN(0, "Getting USB 2.0 HUB descriptor failed,"
1300				    "error=%s\n", usbd_errstr(err));
1301				goto error;
1302			}
1303			if (hubdesc20.bNbrPorts != nports) {
1304				DPRINTFN(0, "Number of ports changed\n");
1305				goto error;
1306			}
1307		}
1308		break;
1309	case USB_SPEED_SUPER:
1310		if (udev->parent_hub != NULL) {
1311			err = usbd_req_set_hub_depth(udev, NULL,
1312			    udev->depth - 1);
1313			if (err) {
1314				DPRINTFN(0, "Setting USB 3.0 HUB depth failed,"
1315				    "error=%s\n", usbd_errstr(err));
1316				goto error;
1317			}
1318		}
1319		err = usbd_req_get_ss_hub_descriptor(udev, NULL, &hubdesc30, 1);
1320		if (err) {
1321			DPRINTFN(0, "Getting USB 3.0 HUB descriptor failed,"
1322			    "error=%s\n", usbd_errstr(err));
1323			goto error;
1324		}
1325		/* get number of ports */
1326		nports = hubdesc30.bNbrPorts;
1327
1328		/* get power delay */
1329		pwrdly = ((hubdesc30.bPwrOn2PwrGood * UHD_PWRON_FACTOR) +
1330		    usb_extra_power_up_time);
1331
1332		/* get complete HUB descriptor */
1333		if (nports >= 8) {
1334			/* check number of ports */
1335			if (nports > ((udev->parent_hub != NULL) ? 15 : 127)) {
1336				DPRINTFN(0, "Invalid number of USB 3.0 ports,"
1337				    "error=%s\n", usbd_errstr(err));
1338				goto error;
1339			}
1340			/* get complete HUB descriptor */
1341			err = usbd_req_get_ss_hub_descriptor(udev, NULL, &hubdesc30, nports);
1342
1343			if (err) {
1344				DPRINTFN(0, "Getting USB 2.0 HUB descriptor failed,"
1345				    "error=%s\n", usbd_errstr(err));
1346				goto error;
1347			}
1348			if (hubdesc30.bNbrPorts != nports) {
1349				DPRINTFN(0, "Number of ports changed\n");
1350				goto error;
1351			}
1352		}
1353		break;
1354	default:
1355		DPRINTF("Assuming HUB has only one port\n");
1356		/* default number of ports */
1357		nports = 1;
1358		/* default power delay */
1359		pwrdly = ((10 * UHD_PWRON_FACTOR) + usb_extra_power_up_time);
1360		break;
1361	}
1362	if (nports == 0) {
1363		DPRINTFN(0, "portless HUB\n");
1364		goto error;
1365	}
1366	if (nports > USB_MAX_PORTS) {
1367		DPRINTF("Port limit exceeded\n");
1368		goto error;
1369	}
1370#if (USB_HAVE_FIXED_PORT == 0)
1371	hub = malloc(sizeof(hub[0]) + (sizeof(hub->ports[0]) * nports),
1372	    M_USBDEV, M_WAITOK | M_ZERO);
1373
1374	if (hub == NULL)
1375		goto error;
1376#else
1377	hub = &sc->sc_hub;
1378#endif
1379	udev->hub = hub;
1380
1381	/* initialize HUB structure */
1382	hub->hubsoftc = sc;
1383	hub->explore = &uhub_explore;
1384	hub->nports = nports;
1385	hub->hubudev = udev;
1386#if USB_HAVE_TT_SUPPORT
1387	hub->tt_msg[0].hdr.pm_callback = &uhub_reset_tt_proc;
1388	hub->tt_msg[0].udev = udev;
1389	hub->tt_msg[1].hdr.pm_callback = &uhub_reset_tt_proc;
1390	hub->tt_msg[1].udev = udev;
1391#endif
1392	/* if self powered hub, give ports maximum current */
1393	if (udev->flags.self_powered) {
1394		hub->portpower = USB_MAX_POWER;
1395	} else {
1396		hub->portpower = USB_MIN_POWER;
1397	}
1398
1399	/* set up interrupt pipe */
1400	iface_index = 0;
1401	if (udev->parent_hub == NULL) {
1402		/* root HUB is special */
1403		err = 0;
1404	} else {
1405		/* normal HUB */
1406		err = usbd_transfer_setup(udev, &iface_index, sc->sc_xfer,
1407		    uhub_config, UHUB_N_TRANSFER, sc, &sc->sc_mtx);
1408	}
1409	if (err) {
1410		DPRINTFN(0, "cannot setup interrupt transfer, "
1411		    "errstr=%s\n", usbd_errstr(err));
1412		goto error;
1413	}
1414	/* wait with power off for a while */
1415	usb_pause_mtx(NULL, USB_MS_TO_TICKS(USB_POWER_DOWN_TIME));
1416
1417#if USB_HAVE_DISABLE_ENUM
1418	/* Add device sysctls */
1419
1420	sysctl_ctx = device_get_sysctl_ctx(dev);
1421	sysctl_tree = device_get_sysctl_tree(dev);
1422
1423	if (sysctl_ctx != NULL && sysctl_tree != NULL) {
1424		char path[128];
1425
1426		snprintf(path, sizeof(path), "dev.uhub.%d.disable_enumeration",
1427		    device_get_unit(dev));
1428		TUNABLE_INT_FETCH(path, &sc->sc_disable_enumeration);
1429
1430		(void) SYSCTL_ADD_INT(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
1431		    OID_AUTO, "disable_enumeration", CTLFLAG_RWTUN,
1432		    &sc->sc_disable_enumeration, 0,
1433		    "Set to disable enumeration on this USB HUB.");
1434
1435		snprintf(path, sizeof(path), "dev.uhub.%d.disable_port_power",
1436		    device_get_unit(dev));
1437		TUNABLE_INT_FETCH(path, &sc->sc_disable_port_power);
1438
1439		(void) SYSCTL_ADD_INT(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
1440		    OID_AUTO, "disable_port_power", CTLFLAG_RWTUN,
1441		    &sc->sc_disable_port_power, 0,
1442		    "Set to disable USB port power on this USB HUB.");
1443	}
1444#endif
1445	/*
1446	 * To have the best chance of success we do things in the exact same
1447	 * order as Windoze98.  This should not be necessary, but some
1448	 * devices do not follow the USB specs to the letter.
1449	 *
1450	 * These are the events on the bus when a hub is attached:
1451	 *  Get device and config descriptors (see attach code)
1452	 *  Get hub descriptor (see above)
1453	 *  For all ports
1454	 *     turn on power
1455	 *     wait for power to become stable
1456	 * (all below happens in explore code)
1457	 *  For all ports
1458	 *     clear C_PORT_CONNECTION
1459	 *  For all ports
1460	 *     get port status
1461	 *     if device connected
1462	 *        wait 100 ms
1463	 *        turn on reset
1464	 *        wait
1465	 *        clear C_PORT_RESET
1466	 *        get port status
1467	 *        proceed with device attachment
1468	 */
1469
1470	/* XXX should check for none, individual, or ganged power? */
1471
1472	removable = 0;
1473
1474	for (x = 0; x != nports; x++) {
1475		/* set up data structures */
1476		struct usb_port *up = hub->ports + x;
1477
1478		up->device_index = 0;
1479		up->restartcnt = 0;
1480		portno = x + 1;
1481
1482		/* check if port is removable */
1483		switch (udev->speed) {
1484		case USB_SPEED_LOW:
1485		case USB_SPEED_FULL:
1486		case USB_SPEED_HIGH:
1487			if (!UHD_NOT_REMOV(&hubdesc20, portno))
1488				removable++;
1489			break;
1490		case USB_SPEED_SUPER:
1491			if (!UHD_NOT_REMOV(&hubdesc30, portno))
1492				removable++;
1493			break;
1494		default:
1495			DPRINTF("Assuming removable port\n");
1496			removable++;
1497			break;
1498		}
1499		if (err == 0) {
1500#if USB_HAVE_DISABLE_ENUM
1501			/* check if we should disable USB port power or not */
1502			if (usb_disable_port_power != 0 ||
1503			    sc->sc_disable_port_power != 0) {
1504				/* turn the power off */
1505				DPRINTFN(2, "Turning port %d power off\n", portno);
1506				err = usbd_req_clear_port_feature(udev, NULL,
1507				    portno, UHF_PORT_POWER);
1508			} else {
1509#endif
1510				/* turn the power on */
1511				DPRINTFN(2, "Turning port %d power on\n", portno);
1512				err = usbd_req_set_port_feature(udev, NULL,
1513				    portno, UHF_PORT_POWER);
1514#if USB_HAVE_DISABLE_ENUM
1515			}
1516#endif
1517		}
1518		if (err != 0) {
1519			DPRINTFN(0, "port %d power on or off failed, %s\n",
1520			    portno, usbd_errstr(err));
1521		}
1522		DPRINTF("turn on port %d power\n",
1523		    portno);
1524
1525		/* wait for stable power */
1526		usb_pause_mtx(NULL, USB_MS_TO_TICKS(pwrdly));
1527	}
1528
1529	device_printf(dev, "%d port%s with %d "
1530	    "removable, %s powered\n", nports, (nports != 1) ? "s" : "",
1531	    removable, udev->flags.self_powered ? "self" : "bus");
1532
1533	/* Start the interrupt endpoint, if any */
1534
1535	mtx_lock(&sc->sc_mtx);
1536	usbd_transfer_start(sc->sc_xfer[UHUB_INTR_TRANSFER]);
1537	mtx_unlock(&sc->sc_mtx);
1538
1539	/* Enable automatic power save on all USB HUBs */
1540
1541	usbd_set_power_mode(udev, USB_POWER_MODE_SAVE);
1542
1543	return (0);
1544
1545error:
1546	usbd_transfer_unsetup(sc->sc_xfer, UHUB_N_TRANSFER);
1547
1548#if (USB_HAVE_FIXED_PORT == 0)
1549	free(udev->hub, M_USBDEV);
1550#endif
1551	udev->hub = NULL;
1552
1553	mtx_destroy(&sc->sc_mtx);
1554
1555	return (ENXIO);
1556}
1557
1558/*
1559 * Called from process context when the hub is gone.
1560 * Detach all devices on active ports.
1561 */
1562static int
1563uhub_detach(device_t dev)
1564{
1565	struct uhub_softc *sc = device_get_softc(dev);
1566	struct usb_hub *hub = sc->sc_udev->hub;
1567	struct usb_bus *bus = sc->sc_udev->bus;
1568	struct usb_device *child;
1569	uint8_t x;
1570
1571	if (hub == NULL)		/* must be partially working */
1572		return (0);
1573
1574	/* Make sure interrupt transfer is gone. */
1575	usbd_transfer_unsetup(sc->sc_xfer, UHUB_N_TRANSFER);
1576
1577	/* Detach all ports */
1578	for (x = 0; x != hub->nports; x++) {
1579
1580		child = usb_bus_port_get_device(bus, hub->ports + x);
1581
1582		if (child == NULL) {
1583			continue;
1584		}
1585
1586		/*
1587		 * Free USB device and all subdevices, if any.
1588		 */
1589		usb_free_device(child, 0);
1590	}
1591
1592#if USB_HAVE_TT_SUPPORT
1593	/* Make sure our TT messages are not queued anywhere */
1594	USB_BUS_LOCK(bus);
1595	usb_proc_mwait(USB_BUS_TT_PROC(bus),
1596	    &hub->tt_msg[0], &hub->tt_msg[1]);
1597	USB_BUS_UNLOCK(bus);
1598#endif
1599
1600#if (USB_HAVE_FIXED_PORT == 0)
1601	free(hub, M_USBDEV);
1602#endif
1603	sc->sc_udev->hub = NULL;
1604
1605	mtx_destroy(&sc->sc_mtx);
1606
1607	return (0);
1608}
1609
1610static int
1611uhub_suspend(device_t dev)
1612{
1613	DPRINTF("\n");
1614	/* Sub-devices are not suspended here! */
1615	return (0);
1616}
1617
1618static int
1619uhub_resume(device_t dev)
1620{
1621	DPRINTF("\n");
1622	/* Sub-devices are not resumed here! */
1623	return (0);
1624}
1625
1626static void
1627uhub_driver_added(device_t dev, driver_t *driver)
1628{
1629	usb_needs_explore_all();
1630}
1631
1632struct hub_result {
1633	struct usb_device *udev;
1634	uint8_t	portno;
1635	uint8_t	iface_index;
1636};
1637
1638static void
1639uhub_find_iface_index(struct usb_hub *hub, device_t child,
1640    struct hub_result *res)
1641{
1642	struct usb_interface *iface;
1643	struct usb_device *udev;
1644	uint8_t nports;
1645	uint8_t x;
1646	uint8_t i;
1647
1648	nports = hub->nports;
1649	for (x = 0; x != nports; x++) {
1650		udev = usb_bus_port_get_device(hub->hubudev->bus,
1651		    hub->ports + x);
1652		if (!udev) {
1653			continue;
1654		}
1655		for (i = 0; i != USB_IFACE_MAX; i++) {
1656			iface = usbd_get_iface(udev, i);
1657			if (iface &&
1658			    (iface->subdev == child)) {
1659				res->iface_index = i;
1660				res->udev = udev;
1661				res->portno = x + 1;
1662				return;
1663			}
1664		}
1665	}
1666	res->iface_index = 0;
1667	res->udev = NULL;
1668	res->portno = 0;
1669}
1670
1671static int
1672uhub_child_location_string(device_t parent, device_t child,
1673    char *buf, size_t buflen)
1674{
1675	struct uhub_softc *sc;
1676	struct usb_hub *hub;
1677	struct hub_result res;
1678
1679	if (!device_is_attached(parent)) {
1680		if (buflen)
1681			buf[0] = 0;
1682		return (0);
1683	}
1684
1685	sc = device_get_softc(parent);
1686	hub = sc->sc_udev->hub;
1687
1688	mtx_lock(&Giant);
1689	uhub_find_iface_index(hub, child, &res);
1690	if (!res.udev) {
1691		DPRINTF("device not on hub\n");
1692		if (buflen) {
1693			buf[0] = '\0';
1694		}
1695		goto done;
1696	}
1697	snprintf(buf, buflen, "bus=%u hubaddr=%u port=%u devaddr=%u"
1698	    " interface=%u"
1699#if USB_HAVE_UGEN
1700	    " ugen=%s"
1701#endif
1702	    , device_get_unit(res.udev->bus->bdev)
1703	    , (res.udev->parent_hub != NULL) ?
1704	    res.udev->parent_hub->device_index : 0
1705	    , res.portno, res.udev->device_index, res.iface_index
1706#if USB_HAVE_UGEN
1707	    , res.udev->ugen_name
1708#endif
1709	    );
1710done:
1711	mtx_unlock(&Giant);
1712
1713	return (0);
1714}
1715
1716static int
1717uhub_child_pnpinfo_string(device_t parent, device_t child,
1718    char *buf, size_t buflen)
1719{
1720	struct uhub_softc *sc;
1721	struct usb_hub *hub;
1722	struct usb_interface *iface;
1723	struct hub_result res;
1724
1725	if (!device_is_attached(parent)) {
1726		if (buflen)
1727			buf[0] = 0;
1728		return (0);
1729	}
1730
1731	sc = device_get_softc(parent);
1732	hub = sc->sc_udev->hub;
1733
1734	mtx_lock(&Giant);
1735	uhub_find_iface_index(hub, child, &res);
1736	if (!res.udev) {
1737		DPRINTF("device not on hub\n");
1738		if (buflen) {
1739			buf[0] = '\0';
1740		}
1741		goto done;
1742	}
1743	iface = usbd_get_iface(res.udev, res.iface_index);
1744	if (iface && iface->idesc) {
1745		snprintf(buf, buflen, "vendor=0x%04x product=0x%04x "
1746		    "devclass=0x%02x devsubclass=0x%02x "
1747		    "sernum=\"%s\" "
1748		    "release=0x%04x "
1749		    "mode=%s "
1750		    "intclass=0x%02x intsubclass=0x%02x "
1751		    "intprotocol=0x%02x" "%s%s",
1752		    UGETW(res.udev->ddesc.idVendor),
1753		    UGETW(res.udev->ddesc.idProduct),
1754		    res.udev->ddesc.bDeviceClass,
1755		    res.udev->ddesc.bDeviceSubClass,
1756		    usb_get_serial(res.udev),
1757		    UGETW(res.udev->ddesc.bcdDevice),
1758		    (res.udev->flags.usb_mode == USB_MODE_HOST) ? "host" : "device",
1759		    iface->idesc->bInterfaceClass,
1760		    iface->idesc->bInterfaceSubClass,
1761		    iface->idesc->bInterfaceProtocol,
1762		    iface->pnpinfo ? " " : "",
1763		    iface->pnpinfo ? iface->pnpinfo : "");
1764	} else {
1765		if (buflen) {
1766			buf[0] = '\0';
1767		}
1768		goto done;
1769	}
1770done:
1771	mtx_unlock(&Giant);
1772
1773	return (0);
1774}
1775
1776/*
1777 * The USB Transaction Translator:
1778 * ===============================
1779 *
1780 * When doing LOW- and FULL-speed USB transfers accross a HIGH-speed
1781 * USB HUB, bandwidth must be allocated for ISOCHRONOUS and INTERRUPT
1782 * USB transfers. To utilize bandwidth dynamically the "scatter and
1783 * gather" principle must be applied. This means that bandwidth must
1784 * be divided into equal parts of bandwidth. With regard to USB all
1785 * data is transferred in smaller packets with length
1786 * "wMaxPacketSize". The problem however is that "wMaxPacketSize" is
1787 * not a constant!
1788 *
1789 * The bandwidth scheduler which I have implemented will simply pack
1790 * the USB transfers back to back until there is no more space in the
1791 * schedule. Out of the 8 microframes which the USB 2.0 standard
1792 * provides, only 6 are available for non-HIGH-speed devices. I have
1793 * reserved the first 4 microframes for ISOCHRONOUS transfers. The
1794 * last 2 microframes I have reserved for INTERRUPT transfers. Without
1795 * this division, it is very difficult to allocate and free bandwidth
1796 * dynamically.
1797 *
1798 * NOTE about the Transaction Translator in USB HUBs:
1799 *
1800 * USB HUBs have a very simple Transaction Translator, that will
1801 * simply pipeline all the SPLIT transactions. That means that the
1802 * transactions will be executed in the order they are queued!
1803 *
1804 */
1805
1806/*------------------------------------------------------------------------*
1807 *	usb_intr_find_best_slot
1808 *
1809 * Return value:
1810 *   The best Transaction Translation slot for an interrupt endpoint.
1811 *------------------------------------------------------------------------*/
1812static uint8_t
1813usb_intr_find_best_slot(usb_size_t *ptr, uint8_t start,
1814    uint8_t end, uint8_t mask)
1815{
1816	usb_size_t min = (usb_size_t)-1;
1817	usb_size_t sum;
1818	uint8_t x;
1819	uint8_t y;
1820	uint8_t z;
1821
1822	y = 0;
1823
1824	/* find the last slot with lesser used bandwidth */
1825
1826	for (x = start; x < end; x++) {
1827
1828		sum = 0;
1829
1830		/* compute sum of bandwidth */
1831		for (z = x; z < end; z++) {
1832			if (mask & (1U << (z - x)))
1833				sum += ptr[z];
1834		}
1835
1836		/* check if the current multi-slot is more optimal */
1837		if (min >= sum) {
1838			min = sum;
1839			y = x;
1840		}
1841
1842		/* check if the mask is about to be shifted out */
1843		if (mask & (1U << (end - 1 - x)))
1844			break;
1845	}
1846	return (y);
1847}
1848
1849/*------------------------------------------------------------------------*
1850 *	usb_hs_bandwidth_adjust
1851 *
1852 * This function will update the bandwith usage for the microframe
1853 * having index "slot" by "len" bytes. "len" can be negative.  If the
1854 * "slot" argument is greater or equal to "USB_HS_MICRO_FRAMES_MAX"
1855 * the "slot" argument will be replaced by the slot having least used
1856 * bandwidth. The "mask" argument is used for multi-slot allocations.
1857 *
1858 * Returns:
1859 *    The slot in which the bandwidth update was done: 0..7
1860 *------------------------------------------------------------------------*/
1861static uint8_t
1862usb_hs_bandwidth_adjust(struct usb_device *udev, int16_t len,
1863    uint8_t slot, uint8_t mask)
1864{
1865	struct usb_bus *bus = udev->bus;
1866	struct usb_hub *hub;
1867	enum usb_dev_speed speed;
1868	uint8_t x;
1869
1870	USB_BUS_LOCK_ASSERT(bus, MA_OWNED);
1871
1872	speed = usbd_get_speed(udev);
1873
1874	switch (speed) {
1875	case USB_SPEED_LOW:
1876	case USB_SPEED_FULL:
1877		if (speed == USB_SPEED_LOW) {
1878			len *= 8;
1879		}
1880		/*
1881	         * The Host Controller Driver should have
1882	         * performed checks so that the lookup
1883	         * below does not result in a NULL pointer
1884	         * access.
1885	         */
1886
1887		hub = udev->parent_hs_hub->hub;
1888		if (slot >= USB_HS_MICRO_FRAMES_MAX) {
1889			slot = usb_intr_find_best_slot(hub->uframe_usage,
1890			    USB_FS_ISOC_UFRAME_MAX, 6, mask);
1891		}
1892		for (x = slot; x < 8; x++) {
1893			if (mask & (1U << (x - slot))) {
1894				hub->uframe_usage[x] += len;
1895				bus->uframe_usage[x] += len;
1896			}
1897		}
1898		break;
1899	default:
1900		if (slot >= USB_HS_MICRO_FRAMES_MAX) {
1901			slot = usb_intr_find_best_slot(bus->uframe_usage, 0,
1902			    USB_HS_MICRO_FRAMES_MAX, mask);
1903		}
1904		for (x = slot; x < 8; x++) {
1905			if (mask & (1U << (x - slot))) {
1906				bus->uframe_usage[x] += len;
1907			}
1908		}
1909		break;
1910	}
1911	return (slot);
1912}
1913
1914/*------------------------------------------------------------------------*
1915 *	usb_hs_bandwidth_alloc
1916 *
1917 * This function is a wrapper function for "usb_hs_bandwidth_adjust()".
1918 *------------------------------------------------------------------------*/
1919void
1920usb_hs_bandwidth_alloc(struct usb_xfer *xfer)
1921{
1922	struct usb_device *udev;
1923	uint8_t slot;
1924	uint8_t mask;
1925	uint8_t speed;
1926
1927	udev = xfer->xroot->udev;
1928
1929	if (udev->flags.usb_mode != USB_MODE_HOST)
1930		return;		/* not supported */
1931
1932	xfer->endpoint->refcount_bw++;
1933	if (xfer->endpoint->refcount_bw != 1)
1934		return;		/* already allocated */
1935
1936	speed = usbd_get_speed(udev);
1937
1938	switch (xfer->endpoint->edesc->bmAttributes & UE_XFERTYPE) {
1939	case UE_INTERRUPT:
1940		/* allocate a microframe slot */
1941
1942		mask = 0x01;
1943		slot = usb_hs_bandwidth_adjust(udev,
1944		    xfer->max_frame_size, USB_HS_MICRO_FRAMES_MAX, mask);
1945
1946		xfer->endpoint->usb_uframe = slot;
1947		xfer->endpoint->usb_smask = mask << slot;
1948
1949		if ((speed != USB_SPEED_FULL) &&
1950		    (speed != USB_SPEED_LOW)) {
1951			xfer->endpoint->usb_cmask = 0x00 ;
1952		} else {
1953			xfer->endpoint->usb_cmask = (-(0x04 << slot)) & 0xFE;
1954		}
1955		break;
1956
1957	case UE_ISOCHRONOUS:
1958		switch (usbd_xfer_get_fps_shift(xfer)) {
1959		case 0:
1960			mask = 0xFF;
1961			break;
1962		case 1:
1963			mask = 0x55;
1964			break;
1965		case 2:
1966			mask = 0x11;
1967			break;
1968		default:
1969			mask = 0x01;
1970			break;
1971		}
1972
1973		/* allocate a microframe multi-slot */
1974
1975		slot = usb_hs_bandwidth_adjust(udev,
1976		    xfer->max_frame_size, USB_HS_MICRO_FRAMES_MAX, mask);
1977
1978		xfer->endpoint->usb_uframe = slot;
1979		xfer->endpoint->usb_cmask = 0;
1980		xfer->endpoint->usb_smask = mask << slot;
1981		break;
1982
1983	default:
1984		xfer->endpoint->usb_uframe = 0;
1985		xfer->endpoint->usb_cmask = 0;
1986		xfer->endpoint->usb_smask = 0;
1987		break;
1988	}
1989
1990	DPRINTFN(11, "slot=%d, mask=0x%02x\n",
1991	    xfer->endpoint->usb_uframe,
1992	    xfer->endpoint->usb_smask >> xfer->endpoint->usb_uframe);
1993}
1994
1995/*------------------------------------------------------------------------*
1996 *	usb_hs_bandwidth_free
1997 *
1998 * This function is a wrapper function for "usb_hs_bandwidth_adjust()".
1999 *------------------------------------------------------------------------*/
2000void
2001usb_hs_bandwidth_free(struct usb_xfer *xfer)
2002{
2003	struct usb_device *udev;
2004	uint8_t slot;
2005	uint8_t mask;
2006
2007	udev = xfer->xroot->udev;
2008
2009	if (udev->flags.usb_mode != USB_MODE_HOST)
2010		return;		/* not supported */
2011
2012	xfer->endpoint->refcount_bw--;
2013	if (xfer->endpoint->refcount_bw != 0)
2014		return;		/* still allocated */
2015
2016	switch (xfer->endpoint->edesc->bmAttributes & UE_XFERTYPE) {
2017	case UE_INTERRUPT:
2018	case UE_ISOCHRONOUS:
2019
2020		slot = xfer->endpoint->usb_uframe;
2021		mask = xfer->endpoint->usb_smask;
2022
2023		/* free microframe slot(s): */
2024		usb_hs_bandwidth_adjust(udev,
2025		    -xfer->max_frame_size, slot, mask >> slot);
2026
2027		DPRINTFN(11, "slot=%d, mask=0x%02x\n",
2028		    slot, mask >> slot);
2029
2030		xfer->endpoint->usb_uframe = 0;
2031		xfer->endpoint->usb_cmask = 0;
2032		xfer->endpoint->usb_smask = 0;
2033		break;
2034
2035	default:
2036		break;
2037	}
2038}
2039
2040/*------------------------------------------------------------------------*
2041 *	usb_isoc_time_expand
2042 *
2043 * This function will expand the time counter from 7-bit to 16-bit.
2044 *
2045 * Returns:
2046 *   16-bit isochronous time counter.
2047 *------------------------------------------------------------------------*/
2048uint16_t
2049usb_isoc_time_expand(struct usb_bus *bus, uint16_t isoc_time_curr)
2050{
2051	uint16_t rem;
2052
2053	USB_BUS_LOCK_ASSERT(bus, MA_OWNED);
2054
2055	rem = bus->isoc_time_last & (USB_ISOC_TIME_MAX - 1);
2056
2057	isoc_time_curr &= (USB_ISOC_TIME_MAX - 1);
2058
2059	if (isoc_time_curr < rem) {
2060		/* the time counter wrapped around */
2061		bus->isoc_time_last += USB_ISOC_TIME_MAX;
2062	}
2063	/* update the remainder */
2064
2065	bus->isoc_time_last &= ~(USB_ISOC_TIME_MAX - 1);
2066	bus->isoc_time_last |= isoc_time_curr;
2067
2068	return (bus->isoc_time_last);
2069}
2070
2071/*------------------------------------------------------------------------*
2072 *	usbd_fs_isoc_schedule_alloc_slot
2073 *
2074 * This function will allocate bandwidth for an isochronous FULL speed
2075 * transaction in the FULL speed schedule.
2076 *
2077 * Returns:
2078 *    <8: Success
2079 * Else: Error
2080 *------------------------------------------------------------------------*/
2081#if USB_HAVE_TT_SUPPORT
2082uint8_t
2083usbd_fs_isoc_schedule_alloc_slot(struct usb_xfer *isoc_xfer, uint16_t isoc_time)
2084{
2085	struct usb_xfer *xfer;
2086	struct usb_xfer *pipe_xfer;
2087	struct usb_bus *bus;
2088	usb_frlength_t len;
2089	usb_frlength_t data_len;
2090	uint16_t delta;
2091	uint16_t slot;
2092	uint8_t retval;
2093
2094	data_len = 0;
2095	slot = 0;
2096
2097	bus = isoc_xfer->xroot->bus;
2098
2099	TAILQ_FOREACH(xfer, &bus->intr_q.head, wait_entry) {
2100
2101		/* skip self, if any */
2102
2103		if (xfer == isoc_xfer)
2104			continue;
2105
2106		/* check if this USB transfer is going through the same TT */
2107
2108		if (xfer->xroot->udev->parent_hs_hub !=
2109		    isoc_xfer->xroot->udev->parent_hs_hub) {
2110			continue;
2111		}
2112		if ((isoc_xfer->xroot->udev->parent_hs_hub->
2113		    ddesc.bDeviceProtocol == UDPROTO_HSHUBMTT) &&
2114		    (xfer->xroot->udev->hs_port_no !=
2115		    isoc_xfer->xroot->udev->hs_port_no)) {
2116			continue;
2117		}
2118		if (xfer->endpoint->methods != isoc_xfer->endpoint->methods)
2119			continue;
2120
2121		/* check if isoc_time is part of this transfer */
2122
2123		delta = xfer->isoc_time_complete - isoc_time;
2124		if (delta > 0 && delta <= xfer->nframes) {
2125			delta = xfer->nframes - delta;
2126
2127			len = xfer->frlengths[delta];
2128			len += 8;
2129			len *= 7;
2130			len /= 6;
2131
2132			data_len += len;
2133		}
2134
2135		/*
2136		 * Check double buffered transfers. Only stream ID
2137		 * equal to zero is valid here!
2138		 */
2139		TAILQ_FOREACH(pipe_xfer, &xfer->endpoint->endpoint_q[0].head,
2140		    wait_entry) {
2141
2142			/* skip self, if any */
2143
2144			if (pipe_xfer == isoc_xfer)
2145				continue;
2146
2147			/* check if isoc_time is part of this transfer */
2148
2149			delta = pipe_xfer->isoc_time_complete - isoc_time;
2150			if (delta > 0 && delta <= pipe_xfer->nframes) {
2151				delta = pipe_xfer->nframes - delta;
2152
2153				len = pipe_xfer->frlengths[delta];
2154				len += 8;
2155				len *= 7;
2156				len /= 6;
2157
2158				data_len += len;
2159			}
2160		}
2161	}
2162
2163	while (data_len >= USB_FS_BYTES_PER_HS_UFRAME) {
2164		data_len -= USB_FS_BYTES_PER_HS_UFRAME;
2165		slot++;
2166	}
2167
2168	/* check for overflow */
2169
2170	if (slot >= USB_FS_ISOC_UFRAME_MAX)
2171		return (255);
2172
2173	retval = slot;
2174
2175	delta = isoc_xfer->isoc_time_complete - isoc_time;
2176	if (delta > 0 && delta <= isoc_xfer->nframes) {
2177		delta = isoc_xfer->nframes - delta;
2178
2179		len = isoc_xfer->frlengths[delta];
2180		len += 8;
2181		len *= 7;
2182		len /= 6;
2183
2184		data_len += len;
2185	}
2186
2187	while (data_len >= USB_FS_BYTES_PER_HS_UFRAME) {
2188		data_len -= USB_FS_BYTES_PER_HS_UFRAME;
2189		slot++;
2190	}
2191
2192	/* check for overflow */
2193
2194	if (slot >= USB_FS_ISOC_UFRAME_MAX)
2195		return (255);
2196
2197	return (retval);
2198}
2199#endif
2200
2201/*------------------------------------------------------------------------*
2202 *	usb_bus_port_get_device
2203 *
2204 * This function is NULL safe.
2205 *------------------------------------------------------------------------*/
2206struct usb_device *
2207usb_bus_port_get_device(struct usb_bus *bus, struct usb_port *up)
2208{
2209	if ((bus == NULL) || (up == NULL)) {
2210		/* be NULL safe */
2211		return (NULL);
2212	}
2213	if (up->device_index == 0) {
2214		/* nothing to do */
2215		return (NULL);
2216	}
2217	return (bus->devices[up->device_index]);
2218}
2219
2220/*------------------------------------------------------------------------*
2221 *	usb_bus_port_set_device
2222 *
2223 * This function is NULL safe.
2224 *------------------------------------------------------------------------*/
2225void
2226usb_bus_port_set_device(struct usb_bus *bus, struct usb_port *up,
2227    struct usb_device *udev, uint8_t device_index)
2228{
2229	if (bus == NULL) {
2230		/* be NULL safe */
2231		return;
2232	}
2233	/*
2234	 * There is only one case where we don't
2235	 * have an USB port, and that is the Root Hub!
2236         */
2237	if (up) {
2238		if (udev) {
2239			up->device_index = device_index;
2240		} else {
2241			device_index = up->device_index;
2242			up->device_index = 0;
2243		}
2244	}
2245	/*
2246	 * Make relationships to our new device
2247	 */
2248	if (device_index != 0) {
2249#if USB_HAVE_UGEN
2250		mtx_lock(&usb_ref_lock);
2251#endif
2252		bus->devices[device_index] = udev;
2253#if USB_HAVE_UGEN
2254		mtx_unlock(&usb_ref_lock);
2255#endif
2256	}
2257	/*
2258	 * Debug print
2259	 */
2260	DPRINTFN(2, "bus %p devices[%u] = %p\n", bus, device_index, udev);
2261}
2262
2263/*------------------------------------------------------------------------*
2264 *	usb_needs_explore
2265 *
2266 * This functions is called when the USB event thread needs to run.
2267 *------------------------------------------------------------------------*/
2268void
2269usb_needs_explore(struct usb_bus *bus, uint8_t do_probe)
2270{
2271	uint8_t do_unlock;
2272
2273	DPRINTF("\n");
2274
2275	if (bus == NULL) {
2276		DPRINTF("No bus pointer!\n");
2277		return;
2278	}
2279	if ((bus->devices == NULL) ||
2280	    (bus->devices[USB_ROOT_HUB_ADDR] == NULL)) {
2281		DPRINTF("No root HUB\n");
2282		return;
2283	}
2284	if (mtx_owned(&bus->bus_mtx)) {
2285		do_unlock = 0;
2286	} else {
2287		USB_BUS_LOCK(bus);
2288		do_unlock = 1;
2289	}
2290	if (do_probe) {
2291		bus->do_probe = 1;
2292	}
2293	if (usb_proc_msignal(USB_BUS_EXPLORE_PROC(bus),
2294	    &bus->explore_msg[0], &bus->explore_msg[1])) {
2295		/* ignore */
2296	}
2297	if (do_unlock) {
2298		USB_BUS_UNLOCK(bus);
2299	}
2300}
2301
2302/*------------------------------------------------------------------------*
2303 *	usb_needs_explore_all
2304 *
2305 * This function is called whenever a new driver is loaded and will
2306 * cause that all USB busses are re-explored.
2307 *------------------------------------------------------------------------*/
2308void
2309usb_needs_explore_all(void)
2310{
2311	struct usb_bus *bus;
2312	devclass_t dc;
2313	device_t dev;
2314	int max;
2315
2316	DPRINTFN(3, "\n");
2317
2318	dc = usb_devclass_ptr;
2319	if (dc == NULL) {
2320		DPRINTFN(0, "no devclass\n");
2321		return;
2322	}
2323	/*
2324	 * Explore all USB busses in parallell.
2325	 */
2326	max = devclass_get_maxunit(dc);
2327	while (max >= 0) {
2328		dev = devclass_get_device(dc, max);
2329		if (dev) {
2330			bus = device_get_softc(dev);
2331			if (bus) {
2332				usb_needs_explore(bus, 1);
2333			}
2334		}
2335		max--;
2336	}
2337}
2338
2339/*------------------------------------------------------------------------*
2340 *	usb_bus_power_update
2341 *
2342 * This function will ensure that all USB devices on the given bus are
2343 * properly suspended or resumed according to the device transfer
2344 * state.
2345 *------------------------------------------------------------------------*/
2346#if USB_HAVE_POWERD
2347void
2348usb_bus_power_update(struct usb_bus *bus)
2349{
2350	usb_needs_explore(bus, 0 /* no probe */ );
2351}
2352#endif
2353
2354/*------------------------------------------------------------------------*
2355 *	usbd_transfer_power_ref
2356 *
2357 * This function will modify the power save reference counts and
2358 * wakeup the USB device associated with the given USB transfer, if
2359 * needed.
2360 *------------------------------------------------------------------------*/
2361#if USB_HAVE_POWERD
2362void
2363usbd_transfer_power_ref(struct usb_xfer *xfer, int val)
2364{
2365	static const usb_power_mask_t power_mask[4] = {
2366		[UE_CONTROL] = USB_HW_POWER_CONTROL,
2367		[UE_BULK] = USB_HW_POWER_BULK,
2368		[UE_INTERRUPT] = USB_HW_POWER_INTERRUPT,
2369		[UE_ISOCHRONOUS] = USB_HW_POWER_ISOC,
2370	};
2371	struct usb_device *udev;
2372	uint8_t needs_explore;
2373	uint8_t needs_hw_power;
2374	uint8_t xfer_type;
2375
2376	udev = xfer->xroot->udev;
2377
2378	if (udev->device_index == USB_ROOT_HUB_ADDR) {
2379		/* no power save for root HUB */
2380		return;
2381	}
2382	USB_BUS_LOCK(udev->bus);
2383
2384	xfer_type = xfer->endpoint->edesc->bmAttributes & UE_XFERTYPE;
2385
2386	udev->pwr_save.last_xfer_time = ticks;
2387	udev->pwr_save.type_refs[xfer_type] += val;
2388
2389	if (xfer->flags_int.control_xfr) {
2390		udev->pwr_save.read_refs += val;
2391		if (xfer->flags_int.usb_mode == USB_MODE_HOST) {
2392			/*
2393			 * It is not allowed to suspend during a
2394			 * control transfer:
2395			 */
2396			udev->pwr_save.write_refs += val;
2397		}
2398	} else if (USB_GET_DATA_ISREAD(xfer)) {
2399		udev->pwr_save.read_refs += val;
2400	} else {
2401		udev->pwr_save.write_refs += val;
2402	}
2403
2404	if (val > 0) {
2405		if (udev->flags.self_suspended)
2406			needs_explore = usb_peer_should_wakeup(udev);
2407		else
2408			needs_explore = 0;
2409
2410		if (!(udev->bus->hw_power_state & power_mask[xfer_type])) {
2411			DPRINTF("Adding type %u to power state\n", xfer_type);
2412			udev->bus->hw_power_state |= power_mask[xfer_type];
2413			needs_hw_power = 1;
2414		} else {
2415			needs_hw_power = 0;
2416		}
2417	} else {
2418		needs_explore = 0;
2419		needs_hw_power = 0;
2420	}
2421
2422	USB_BUS_UNLOCK(udev->bus);
2423
2424	if (needs_explore) {
2425		DPRINTF("update\n");
2426		usb_bus_power_update(udev->bus);
2427	} else if (needs_hw_power) {
2428		DPRINTF("needs power\n");
2429		if (udev->bus->methods->set_hw_power != NULL) {
2430			(udev->bus->methods->set_hw_power) (udev->bus);
2431		}
2432	}
2433}
2434#endif
2435
2436/*------------------------------------------------------------------------*
2437 *	usb_peer_should_wakeup
2438 *
2439 * This function returns non-zero if the current device should wake up.
2440 *------------------------------------------------------------------------*/
2441static uint8_t
2442usb_peer_should_wakeup(struct usb_device *udev)
2443{
2444	return (((udev->power_mode == USB_POWER_MODE_ON) &&
2445	    (udev->flags.usb_mode == USB_MODE_HOST)) ||
2446	    (udev->driver_added_refcount != udev->bus->driver_added_refcount) ||
2447	    (udev->re_enumerate_wait != USB_RE_ENUM_DONE) ||
2448	    (udev->pwr_save.type_refs[UE_ISOCHRONOUS] != 0) ||
2449	    (udev->pwr_save.write_refs != 0) ||
2450	    ((udev->pwr_save.read_refs != 0) &&
2451	    (udev->flags.usb_mode == USB_MODE_HOST) &&
2452	    (usb_peer_can_wakeup(udev) == 0)));
2453}
2454
2455/*------------------------------------------------------------------------*
2456 *	usb_bus_powerd
2457 *
2458 * This function implements the USB power daemon and is called
2459 * regularly from the USB explore thread.
2460 *------------------------------------------------------------------------*/
2461#if USB_HAVE_POWERD
2462void
2463usb_bus_powerd(struct usb_bus *bus)
2464{
2465	struct usb_device *udev;
2466	usb_ticks_t temp;
2467	usb_ticks_t limit;
2468	usb_ticks_t mintime;
2469	usb_size_t type_refs[5];
2470	uint8_t x;
2471
2472	limit = usb_power_timeout;
2473	if (limit == 0)
2474		limit = hz;
2475	else if (limit > 255)
2476		limit = 255 * hz;
2477	else
2478		limit = limit * hz;
2479
2480	DPRINTF("bus=%p\n", bus);
2481
2482	USB_BUS_LOCK(bus);
2483
2484	/*
2485	 * The root HUB device is never suspended
2486	 * and we simply skip it.
2487	 */
2488	for (x = USB_ROOT_HUB_ADDR + 1;
2489	    x != bus->devices_max; x++) {
2490
2491		udev = bus->devices[x];
2492		if (udev == NULL)
2493			continue;
2494
2495		temp = ticks - udev->pwr_save.last_xfer_time;
2496
2497		if (usb_peer_should_wakeup(udev)) {
2498			/* check if we are suspended */
2499			if (udev->flags.self_suspended != 0) {
2500				USB_BUS_UNLOCK(bus);
2501				usb_dev_resume_peer(udev);
2502				USB_BUS_LOCK(bus);
2503			}
2504		} else if ((temp >= limit) &&
2505		    (udev->flags.usb_mode == USB_MODE_HOST) &&
2506		    (udev->flags.self_suspended == 0)) {
2507			/* try to do suspend */
2508
2509			USB_BUS_UNLOCK(bus);
2510			usb_dev_suspend_peer(udev);
2511			USB_BUS_LOCK(bus);
2512		}
2513	}
2514
2515	/* reset counters */
2516
2517	mintime = (usb_ticks_t)-1;
2518	type_refs[0] = 0;
2519	type_refs[1] = 0;
2520	type_refs[2] = 0;
2521	type_refs[3] = 0;
2522	type_refs[4] = 0;
2523
2524	/* Re-loop all the devices to get the actual state */
2525
2526	for (x = USB_ROOT_HUB_ADDR + 1;
2527	    x != bus->devices_max; x++) {
2528
2529		udev = bus->devices[x];
2530		if (udev == NULL)
2531			continue;
2532
2533		/* we found a non-Root-Hub USB device */
2534		type_refs[4] += 1;
2535
2536		/* "last_xfer_time" can be updated by a resume */
2537		temp = ticks - udev->pwr_save.last_xfer_time;
2538
2539		/*
2540		 * Compute minimum time since last transfer for the complete
2541		 * bus:
2542		 */
2543		if (temp < mintime)
2544			mintime = temp;
2545
2546		if (udev->flags.self_suspended == 0) {
2547			type_refs[0] += udev->pwr_save.type_refs[0];
2548			type_refs[1] += udev->pwr_save.type_refs[1];
2549			type_refs[2] += udev->pwr_save.type_refs[2];
2550			type_refs[3] += udev->pwr_save.type_refs[3];
2551		}
2552	}
2553
2554	if (mintime >= (usb_ticks_t)(1 * hz)) {
2555		/* recompute power masks */
2556		DPRINTF("Recomputing power masks\n");
2557		bus->hw_power_state = 0;
2558		if (type_refs[UE_CONTROL] != 0)
2559			bus->hw_power_state |= USB_HW_POWER_CONTROL;
2560		if (type_refs[UE_BULK] != 0)
2561			bus->hw_power_state |= USB_HW_POWER_BULK;
2562		if (type_refs[UE_INTERRUPT] != 0)
2563			bus->hw_power_state |= USB_HW_POWER_INTERRUPT;
2564		if (type_refs[UE_ISOCHRONOUS] != 0)
2565			bus->hw_power_state |= USB_HW_POWER_ISOC;
2566		if (type_refs[4] != 0)
2567			bus->hw_power_state |= USB_HW_POWER_NON_ROOT_HUB;
2568	}
2569	USB_BUS_UNLOCK(bus);
2570
2571	if (bus->methods->set_hw_power != NULL) {
2572		/* always update hardware power! */
2573		(bus->methods->set_hw_power) (bus);
2574	}
2575	return;
2576}
2577#endif
2578
2579/*------------------------------------------------------------------------*
2580 *	usb_dev_resume_peer
2581 *
2582 * This function will resume an USB peer and do the required USB
2583 * signalling to get an USB device out of the suspended state.
2584 *------------------------------------------------------------------------*/
2585static void
2586usb_dev_resume_peer(struct usb_device *udev)
2587{
2588	struct usb_bus *bus;
2589	int err;
2590
2591	/* be NULL safe */
2592	if (udev == NULL)
2593		return;
2594
2595	/* check if already resumed */
2596	if (udev->flags.self_suspended == 0)
2597		return;
2598
2599	/* we need a parent HUB to do resume */
2600	if (udev->parent_hub == NULL)
2601		return;
2602
2603	DPRINTF("udev=%p\n", udev);
2604
2605	if ((udev->flags.usb_mode == USB_MODE_DEVICE) &&
2606	    (udev->flags.remote_wakeup == 0)) {
2607		/*
2608		 * If the host did not set the remote wakeup feature, we can
2609		 * not wake it up either!
2610		 */
2611		DPRINTF("remote wakeup is not set!\n");
2612		return;
2613	}
2614	/* get bus pointer */
2615	bus = udev->bus;
2616
2617	/* resume parent hub first */
2618	usb_dev_resume_peer(udev->parent_hub);
2619
2620	/* reduce chance of instant resume failure by waiting a little bit */
2621	usb_pause_mtx(NULL, USB_MS_TO_TICKS(20));
2622
2623	if (usb_device_20_compatible(udev)) {
2624		/* resume current port (Valid in Host and Device Mode) */
2625		err = usbd_req_clear_port_feature(udev->parent_hub,
2626		    NULL, udev->port_no, UHF_PORT_SUSPEND);
2627		if (err) {
2628			DPRINTFN(0, "Resuming port failed\n");
2629			return;
2630		}
2631	} else {
2632		/* resume current port (Valid in Host and Device Mode) */
2633		err = usbd_req_set_port_link_state(udev->parent_hub,
2634		    NULL, udev->port_no, UPS_PORT_LS_U0);
2635		if (err) {
2636			DPRINTFN(0, "Resuming port failed\n");
2637			return;
2638		}
2639	}
2640
2641	/* resume settle time */
2642	usb_pause_mtx(NULL, USB_MS_TO_TICKS(usb_port_resume_delay));
2643
2644	if (bus->methods->device_resume != NULL) {
2645		/* resume USB device on the USB controller */
2646		(bus->methods->device_resume) (udev);
2647	}
2648	USB_BUS_LOCK(bus);
2649	/* set that this device is now resumed */
2650	udev->flags.self_suspended = 0;
2651#if USB_HAVE_POWERD
2652	/* make sure that we don't go into suspend right away */
2653	udev->pwr_save.last_xfer_time = ticks;
2654
2655	/* make sure the needed power masks are on */
2656	if (udev->pwr_save.type_refs[UE_CONTROL] != 0)
2657		bus->hw_power_state |= USB_HW_POWER_CONTROL;
2658	if (udev->pwr_save.type_refs[UE_BULK] != 0)
2659		bus->hw_power_state |= USB_HW_POWER_BULK;
2660	if (udev->pwr_save.type_refs[UE_INTERRUPT] != 0)
2661		bus->hw_power_state |= USB_HW_POWER_INTERRUPT;
2662	if (udev->pwr_save.type_refs[UE_ISOCHRONOUS] != 0)
2663		bus->hw_power_state |= USB_HW_POWER_ISOC;
2664#endif
2665	USB_BUS_UNLOCK(bus);
2666
2667	if (bus->methods->set_hw_power != NULL) {
2668		/* always update hardware power! */
2669		(bus->methods->set_hw_power) (bus);
2670	}
2671
2672	usbd_sr_lock(udev);
2673
2674	/* notify all sub-devices about resume */
2675	err = usb_suspend_resume(udev, 0);
2676
2677	usbd_sr_unlock(udev);
2678
2679	/* check if peer has wakeup capability */
2680	if (usb_peer_can_wakeup(udev)) {
2681		/* clear remote wakeup */
2682		err = usbd_req_clear_device_feature(udev,
2683		    NULL, UF_DEVICE_REMOTE_WAKEUP);
2684		if (err) {
2685			DPRINTFN(0, "Clearing device "
2686			    "remote wakeup failed: %s\n",
2687			    usbd_errstr(err));
2688		}
2689	}
2690}
2691
2692/*------------------------------------------------------------------------*
2693 *	usb_dev_suspend_peer
2694 *
2695 * This function will suspend an USB peer and do the required USB
2696 * signalling to get an USB device into the suspended state.
2697 *------------------------------------------------------------------------*/
2698static void
2699usb_dev_suspend_peer(struct usb_device *udev)
2700{
2701	struct usb_device *child;
2702	int err;
2703	uint8_t x;
2704	uint8_t nports;
2705
2706repeat:
2707	/* be NULL safe */
2708	if (udev == NULL)
2709		return;
2710
2711	/* check if already suspended */
2712	if (udev->flags.self_suspended)
2713		return;
2714
2715	/* we need a parent HUB to do suspend */
2716	if (udev->parent_hub == NULL)
2717		return;
2718
2719	DPRINTF("udev=%p\n", udev);
2720
2721	/* check if the current device is a HUB */
2722	if (udev->hub != NULL) {
2723		nports = udev->hub->nports;
2724
2725		/* check if all devices on the HUB are suspended */
2726		for (x = 0; x != nports; x++) {
2727			child = usb_bus_port_get_device(udev->bus,
2728			    udev->hub->ports + x);
2729
2730			if (child == NULL)
2731				continue;
2732
2733			if (child->flags.self_suspended)
2734				continue;
2735
2736			DPRINTFN(1, "Port %u is busy on the HUB!\n", x + 1);
2737			return;
2738		}
2739	}
2740
2741	if (usb_peer_can_wakeup(udev)) {
2742		/*
2743		 * This request needs to be done before we set
2744		 * "udev->flags.self_suspended":
2745		 */
2746
2747		/* allow device to do remote wakeup */
2748		err = usbd_req_set_device_feature(udev,
2749		    NULL, UF_DEVICE_REMOTE_WAKEUP);
2750		if (err) {
2751			DPRINTFN(0, "Setting device "
2752			    "remote wakeup failed\n");
2753		}
2754	}
2755
2756	USB_BUS_LOCK(udev->bus);
2757	/*
2758	 * Checking for suspend condition and setting suspended bit
2759	 * must be atomic!
2760	 */
2761	err = usb_peer_should_wakeup(udev);
2762	if (err == 0) {
2763		/*
2764		 * Set that this device is suspended. This variable
2765		 * must be set before calling USB controller suspend
2766		 * callbacks.
2767		 */
2768		udev->flags.self_suspended = 1;
2769	}
2770	USB_BUS_UNLOCK(udev->bus);
2771
2772	if (err != 0) {
2773		if (usb_peer_can_wakeup(udev)) {
2774			/* allow device to do remote wakeup */
2775			err = usbd_req_clear_device_feature(udev,
2776			    NULL, UF_DEVICE_REMOTE_WAKEUP);
2777			if (err) {
2778				DPRINTFN(0, "Setting device "
2779				    "remote wakeup failed\n");
2780			}
2781		}
2782
2783		if (udev->flags.usb_mode == USB_MODE_DEVICE) {
2784			/* resume parent HUB first */
2785			usb_dev_resume_peer(udev->parent_hub);
2786
2787			/* reduce chance of instant resume failure by waiting a little bit */
2788			usb_pause_mtx(NULL, USB_MS_TO_TICKS(20));
2789
2790			/* resume current port (Valid in Host and Device Mode) */
2791			err = usbd_req_clear_port_feature(udev->parent_hub,
2792			    NULL, udev->port_no, UHF_PORT_SUSPEND);
2793
2794			/* resume settle time */
2795			usb_pause_mtx(NULL, USB_MS_TO_TICKS(usb_port_resume_delay));
2796		}
2797		DPRINTF("Suspend was cancelled!\n");
2798		return;
2799	}
2800
2801	usbd_sr_lock(udev);
2802
2803	/* notify all sub-devices about suspend */
2804	err = usb_suspend_resume(udev, 1);
2805
2806	usbd_sr_unlock(udev);
2807
2808	if (udev->bus->methods->device_suspend != NULL) {
2809		usb_timeout_t temp;
2810
2811		/* suspend device on the USB controller */
2812		(udev->bus->methods->device_suspend) (udev);
2813
2814		/* do DMA delay */
2815		temp = usbd_get_dma_delay(udev);
2816		if (temp != 0)
2817			usb_pause_mtx(NULL, USB_MS_TO_TICKS(temp));
2818
2819	}
2820
2821	if (usb_device_20_compatible(udev)) {
2822		/* suspend current port */
2823		err = usbd_req_set_port_feature(udev->parent_hub,
2824		    NULL, udev->port_no, UHF_PORT_SUSPEND);
2825		if (err) {
2826			DPRINTFN(0, "Suspending port failed\n");
2827			return;
2828		}
2829	} else {
2830		/* suspend current port */
2831		err = usbd_req_set_port_link_state(udev->parent_hub,
2832		    NULL, udev->port_no, UPS_PORT_LS_U3);
2833		if (err) {
2834			DPRINTFN(0, "Suspending port failed\n");
2835			return;
2836		}
2837	}
2838
2839	udev = udev->parent_hub;
2840	goto repeat;
2841}
2842
2843/*------------------------------------------------------------------------*
2844 *	usbd_set_power_mode
2845 *
2846 * This function will set the power mode, see USB_POWER_MODE_XXX for a
2847 * USB device.
2848 *------------------------------------------------------------------------*/
2849void
2850usbd_set_power_mode(struct usb_device *udev, uint8_t power_mode)
2851{
2852	/* filter input argument */
2853	if ((power_mode != USB_POWER_MODE_ON) &&
2854	    (power_mode != USB_POWER_MODE_OFF))
2855		power_mode = USB_POWER_MODE_SAVE;
2856
2857	power_mode = usbd_filter_power_mode(udev, power_mode);
2858
2859	udev->power_mode = power_mode;	/* update copy of power mode */
2860
2861#if USB_HAVE_POWERD
2862	usb_bus_power_update(udev->bus);
2863#else
2864	usb_needs_explore(udev->bus, 0 /* no probe */ );
2865#endif
2866}
2867
2868/*------------------------------------------------------------------------*
2869 *	usbd_filter_power_mode
2870 *
2871 * This function filters the power mode based on hardware requirements.
2872 *------------------------------------------------------------------------*/
2873uint8_t
2874usbd_filter_power_mode(struct usb_device *udev, uint8_t power_mode)
2875{
2876	struct usb_bus_methods *mtod;
2877	int8_t temp;
2878
2879	mtod = udev->bus->methods;
2880	temp = -1;
2881
2882	if (mtod->get_power_mode != NULL)
2883		(mtod->get_power_mode) (udev, &temp);
2884
2885	/* check if we should not filter */
2886	if (temp < 0)
2887		return (power_mode);
2888
2889	/* use fixed power mode given by hardware driver */
2890	return (temp);
2891}
2892
2893/*------------------------------------------------------------------------*
2894 *	usbd_start_re_enumerate
2895 *
2896 * This function starts re-enumeration of the given USB device. This
2897 * function does not need to be called BUS-locked. This function does
2898 * not wait until the re-enumeration is completed.
2899 *------------------------------------------------------------------------*/
2900void
2901usbd_start_re_enumerate(struct usb_device *udev)
2902{
2903	if (udev->re_enumerate_wait == USB_RE_ENUM_DONE) {
2904		udev->re_enumerate_wait = USB_RE_ENUM_START;
2905		usb_needs_explore(udev->bus, 0);
2906	}
2907}
2908
2909/*-----------------------------------------------------------------------*
2910 *	usbd_start_set_config
2911 *
2912 * This function starts setting a USB configuration. This function
2913 * does not need to be called BUS-locked. This function does not wait
2914 * until the set USB configuratino is completed.
2915 *------------------------------------------------------------------------*/
2916usb_error_t
2917usbd_start_set_config(struct usb_device *udev, uint8_t index)
2918{
2919	if (udev->re_enumerate_wait == USB_RE_ENUM_DONE) {
2920		if (udev->curr_config_index == index) {
2921			/* no change needed */
2922			return (0);
2923		}
2924		udev->next_config_index = index;
2925		udev->re_enumerate_wait = USB_RE_ENUM_SET_CONFIG;
2926		usb_needs_explore(udev->bus, 0);
2927		return (0);
2928	} else if (udev->re_enumerate_wait == USB_RE_ENUM_SET_CONFIG) {
2929		if (udev->next_config_index == index) {
2930			/* no change needed */
2931			return (0);
2932		}
2933	}
2934	return (USB_ERR_PENDING_REQUESTS);
2935}
2936