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