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_TT_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_TT_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 "devproto=0x%02x " 1735 "sernum=\"%s\" " 1736 "release=0x%04x " 1737 "mode=%s " 1738 "intclass=0x%02x intsubclass=0x%02x " 1739 "intprotocol=0x%02x" "%s%s", 1740 UGETW(res.udev->ddesc.idVendor), 1741 UGETW(res.udev->ddesc.idProduct), 1742 res.udev->ddesc.bDeviceClass, 1743 res.udev->ddesc.bDeviceSubClass, 1744 res.udev->ddesc.bDeviceProtocol, 1745 usb_get_serial(res.udev), 1746 UGETW(res.udev->ddesc.bcdDevice), 1747 (res.udev->flags.usb_mode == USB_MODE_HOST) ? "host" : "device", 1748 iface->idesc->bInterfaceClass, 1749 iface->idesc->bInterfaceSubClass, 1750 iface->idesc->bInterfaceProtocol, 1751 iface->pnpinfo ? " " : "", 1752 iface->pnpinfo ? iface->pnpinfo : ""); 1753 } else { 1754 if (buflen) { 1755 buf[0] = '\0'; 1756 } 1757 goto done; 1758 } 1759 done: 1760 mtx_unlock(&Giant); 1761 1762 return (0); 1763 } 1764 1765 /* 1766 * The USB Transaction Translator: 1767 * =============================== 1768 * 1769 * When doing LOW- and FULL-speed USB transfers across a HIGH-speed 1770 * USB HUB, bandwidth must be allocated for ISOCHRONOUS and INTERRUPT 1771 * USB transfers. To utilize bandwidth dynamically the "scatter and 1772 * gather" principle must be applied. This means that bandwidth must 1773 * be divided into equal parts of bandwidth. With regard to USB all 1774 * data is transferred in smaller packets with length 1775 * "wMaxPacketSize". The problem however is that "wMaxPacketSize" is 1776 * not a constant! 1777 * 1778 * The bandwidth scheduler which I have implemented will simply pack 1779 * the USB transfers back to back until there is no more space in the 1780 * schedule. Out of the 8 microframes which the USB 2.0 standard 1781 * provides, only 6 are available for non-HIGH-speed devices. I have 1782 * reserved the first 4 microframes for ISOCHRONOUS transfers. The 1783 * last 2 microframes I have reserved for INTERRUPT transfers. Without 1784 * this division, it is very difficult to allocate and free bandwidth 1785 * dynamically. 1786 * 1787 * NOTE about the Transaction Translator in USB HUBs: 1788 * 1789 * USB HUBs have a very simple Transaction Translator, that will 1790 * simply pipeline all the SPLIT transactions. That means that the 1791 * transactions will be executed in the order they are queued! 1792 * 1793 */ 1794 1795 /*------------------------------------------------------------------------* 1796 * usb_intr_find_best_slot 1797 * 1798 * Return value: 1799 * The best Transaction Translation slot for an interrupt endpoint. 1800 *------------------------------------------------------------------------*/ 1801 static uint8_t 1802 usb_intr_find_best_slot(usb_size_t *ptr, uint8_t start, 1803 uint8_t end, uint8_t mask) 1804 { 1805 usb_size_t min = (usb_size_t)-1; 1806 usb_size_t sum; 1807 uint8_t x; 1808 uint8_t y; 1809 uint8_t z; 1810 1811 y = 0; 1812 1813 /* find the last slot with lesser used bandwidth */ 1814 1815 for (x = start; x < end; x++) { 1816 1817 sum = 0; 1818 1819 /* compute sum of bandwidth */ 1820 for (z = x; z < end; z++) { 1821 if (mask & (1U << (z - x))) 1822 sum += ptr[z]; 1823 } 1824 1825 /* check if the current multi-slot is more optimal */ 1826 if (min >= sum) { 1827 min = sum; 1828 y = x; 1829 } 1830 1831 /* check if the mask is about to be shifted out */ 1832 if (mask & (1U << (end - 1 - x))) 1833 break; 1834 } 1835 return (y); 1836 } 1837 1838 /*------------------------------------------------------------------------* 1839 * usb_hs_bandwidth_adjust 1840 * 1841 * This function will update the bandwidth usage for the microframe 1842 * having index "slot" by "len" bytes. "len" can be negative. If the 1843 * "slot" argument is greater or equal to "USB_HS_MICRO_FRAMES_MAX" 1844 * the "slot" argument will be replaced by the slot having least used 1845 * bandwidth. The "mask" argument is used for multi-slot allocations. 1846 * 1847 * Returns: 1848 * The slot in which the bandwidth update was done: 0..7 1849 *------------------------------------------------------------------------*/ 1850 static uint8_t 1851 usb_hs_bandwidth_adjust(struct usb_device *udev, int16_t len, 1852 uint8_t slot, uint8_t mask) 1853 { 1854 struct usb_bus *bus = udev->bus; 1855 struct usb_hub *hub; 1856 enum usb_dev_speed speed; 1857 uint8_t x; 1858 1859 USB_BUS_LOCK_ASSERT(bus, MA_OWNED); 1860 1861 speed = usbd_get_speed(udev); 1862 1863 switch (speed) { 1864 case USB_SPEED_LOW: 1865 case USB_SPEED_FULL: 1866 if (speed == USB_SPEED_LOW) { 1867 len *= 8; 1868 } 1869 /* 1870 * The Host Controller Driver should have 1871 * performed checks so that the lookup 1872 * below does not result in a NULL pointer 1873 * access. 1874 */ 1875 1876 hub = udev->parent_hs_hub->hub; 1877 if (slot >= USB_HS_MICRO_FRAMES_MAX) { 1878 slot = usb_intr_find_best_slot(hub->uframe_usage, 1879 USB_FS_ISOC_UFRAME_MAX, 6, mask); 1880 } 1881 for (x = slot; x < 8; x++) { 1882 if (mask & (1U << (x - slot))) { 1883 hub->uframe_usage[x] += len; 1884 bus->uframe_usage[x] += len; 1885 } 1886 } 1887 break; 1888 default: 1889 if (slot >= USB_HS_MICRO_FRAMES_MAX) { 1890 slot = usb_intr_find_best_slot(bus->uframe_usage, 0, 1891 USB_HS_MICRO_FRAMES_MAX, mask); 1892 } 1893 for (x = slot; x < 8; x++) { 1894 if (mask & (1U << (x - slot))) { 1895 bus->uframe_usage[x] += len; 1896 } 1897 } 1898 break; 1899 } 1900 return (slot); 1901 } 1902 1903 /*------------------------------------------------------------------------* 1904 * usb_hs_bandwidth_alloc 1905 * 1906 * This function is a wrapper function for "usb_hs_bandwidth_adjust()". 1907 *------------------------------------------------------------------------*/ 1908 void 1909 usb_hs_bandwidth_alloc(struct usb_xfer *xfer) 1910 { 1911 struct usb_device *udev; 1912 uint8_t slot; 1913 uint8_t mask; 1914 uint8_t speed; 1915 1916 udev = xfer->xroot->udev; 1917 1918 if (udev->flags.usb_mode != USB_MODE_HOST) 1919 return; /* not supported */ 1920 1921 xfer->endpoint->refcount_bw++; 1922 if (xfer->endpoint->refcount_bw != 1) 1923 return; /* already allocated */ 1924 1925 speed = usbd_get_speed(udev); 1926 1927 switch (xfer->endpoint->edesc->bmAttributes & UE_XFERTYPE) { 1928 case UE_INTERRUPT: 1929 /* allocate a microframe slot */ 1930 1931 mask = 0x01; 1932 slot = usb_hs_bandwidth_adjust(udev, 1933 xfer->max_frame_size, USB_HS_MICRO_FRAMES_MAX, mask); 1934 1935 xfer->endpoint->usb_uframe = slot; 1936 xfer->endpoint->usb_smask = mask << slot; 1937 1938 if ((speed != USB_SPEED_FULL) && 1939 (speed != USB_SPEED_LOW)) { 1940 xfer->endpoint->usb_cmask = 0x00 ; 1941 } else { 1942 xfer->endpoint->usb_cmask = (-(0x04 << slot)) & 0xFE; 1943 } 1944 break; 1945 1946 case UE_ISOCHRONOUS: 1947 switch (usbd_xfer_get_fps_shift(xfer)) { 1948 case 0: 1949 mask = 0xFF; 1950 break; 1951 case 1: 1952 mask = 0x55; 1953 break; 1954 case 2: 1955 mask = 0x11; 1956 break; 1957 default: 1958 mask = 0x01; 1959 break; 1960 } 1961 1962 /* allocate a microframe multi-slot */ 1963 1964 slot = usb_hs_bandwidth_adjust(udev, 1965 xfer->max_frame_size, USB_HS_MICRO_FRAMES_MAX, mask); 1966 1967 xfer->endpoint->usb_uframe = slot; 1968 xfer->endpoint->usb_cmask = 0; 1969 xfer->endpoint->usb_smask = mask << slot; 1970 break; 1971 1972 default: 1973 xfer->endpoint->usb_uframe = 0; 1974 xfer->endpoint->usb_cmask = 0; 1975 xfer->endpoint->usb_smask = 0; 1976 break; 1977 } 1978 1979 DPRINTFN(11, "slot=%d, mask=0x%02x\n", 1980 xfer->endpoint->usb_uframe, 1981 xfer->endpoint->usb_smask >> xfer->endpoint->usb_uframe); 1982 } 1983 1984 /*------------------------------------------------------------------------* 1985 * usb_hs_bandwidth_free 1986 * 1987 * This function is a wrapper function for "usb_hs_bandwidth_adjust()". 1988 *------------------------------------------------------------------------*/ 1989 void 1990 usb_hs_bandwidth_free(struct usb_xfer *xfer) 1991 { 1992 struct usb_device *udev; 1993 uint8_t slot; 1994 uint8_t mask; 1995 1996 udev = xfer->xroot->udev; 1997 1998 if (udev->flags.usb_mode != USB_MODE_HOST) 1999 return; /* not supported */ 2000 2001 xfer->endpoint->refcount_bw--; 2002 if (xfer->endpoint->refcount_bw != 0) 2003 return; /* still allocated */ 2004 2005 switch (xfer->endpoint->edesc->bmAttributes & UE_XFERTYPE) { 2006 case UE_INTERRUPT: 2007 case UE_ISOCHRONOUS: 2008 2009 slot = xfer->endpoint->usb_uframe; 2010 mask = xfer->endpoint->usb_smask; 2011 2012 /* free microframe slot(s): */ 2013 usb_hs_bandwidth_adjust(udev, 2014 -xfer->max_frame_size, slot, mask >> slot); 2015 2016 DPRINTFN(11, "slot=%d, mask=0x%02x\n", 2017 slot, mask >> slot); 2018 2019 xfer->endpoint->usb_uframe = 0; 2020 xfer->endpoint->usb_cmask = 0; 2021 xfer->endpoint->usb_smask = 0; 2022 break; 2023 2024 default: 2025 break; 2026 } 2027 } 2028 2029 /*------------------------------------------------------------------------* 2030 * usb_isoc_time_expand 2031 * 2032 * This function will expand the time counter from 7-bit to 16-bit. 2033 * 2034 * Returns: 2035 * 16-bit isochronous time counter. 2036 *------------------------------------------------------------------------*/ 2037 uint16_t 2038 usb_isoc_time_expand(struct usb_bus *bus, uint16_t isoc_time_curr) 2039 { 2040 uint16_t rem; 2041 2042 USB_BUS_LOCK_ASSERT(bus, MA_OWNED); 2043 2044 rem = bus->isoc_time_last & (USB_ISOC_TIME_MAX - 1); 2045 2046 isoc_time_curr &= (USB_ISOC_TIME_MAX - 1); 2047 2048 if (isoc_time_curr < rem) { 2049 /* the time counter wrapped around */ 2050 bus->isoc_time_last += USB_ISOC_TIME_MAX; 2051 } 2052 /* update the remainder */ 2053 2054 bus->isoc_time_last &= ~(USB_ISOC_TIME_MAX - 1); 2055 bus->isoc_time_last |= isoc_time_curr; 2056 2057 return (bus->isoc_time_last); 2058 } 2059 2060 /*------------------------------------------------------------------------* 2061 * usbd_fs_isoc_schedule_alloc_slot 2062 * 2063 * This function will allocate bandwidth for an isochronous FULL speed 2064 * transaction in the FULL speed schedule. 2065 * 2066 * Returns: 2067 * <8: Success 2068 * Else: Error 2069 *------------------------------------------------------------------------*/ 2070 #if USB_HAVE_TT_SUPPORT 2071 uint8_t 2072 usbd_fs_isoc_schedule_alloc_slot(struct usb_xfer *isoc_xfer, uint16_t isoc_time) 2073 { 2074 struct usb_xfer *xfer; 2075 struct usb_xfer *pipe_xfer; 2076 struct usb_bus *bus; 2077 usb_frlength_t len; 2078 usb_frlength_t data_len; 2079 uint16_t delta; 2080 uint16_t slot; 2081 uint8_t retval; 2082 2083 data_len = 0; 2084 slot = 0; 2085 2086 bus = isoc_xfer->xroot->bus; 2087 2088 TAILQ_FOREACH(xfer, &bus->intr_q.head, wait_entry) { 2089 2090 /* skip self, if any */ 2091 2092 if (xfer == isoc_xfer) 2093 continue; 2094 2095 /* check if this USB transfer is going through the same TT */ 2096 2097 if (xfer->xroot->udev->parent_hs_hub != 2098 isoc_xfer->xroot->udev->parent_hs_hub) { 2099 continue; 2100 } 2101 if ((isoc_xfer->xroot->udev->parent_hs_hub-> 2102 ddesc.bDeviceProtocol == UDPROTO_HSHUBMTT) && 2103 (xfer->xroot->udev->hs_port_no != 2104 isoc_xfer->xroot->udev->hs_port_no)) { 2105 continue; 2106 } 2107 if (xfer->endpoint->methods != isoc_xfer->endpoint->methods) 2108 continue; 2109 2110 /* check if isoc_time is part of this transfer */ 2111 2112 delta = xfer->isoc_time_complete - isoc_time; 2113 if (delta > 0 && delta <= xfer->nframes) { 2114 delta = xfer->nframes - delta; 2115 2116 len = xfer->frlengths[delta]; 2117 len += 8; 2118 len *= 7; 2119 len /= 6; 2120 2121 data_len += len; 2122 } 2123 2124 /* 2125 * Check double buffered transfers. Only stream ID 2126 * equal to zero is valid here! 2127 */ 2128 TAILQ_FOREACH(pipe_xfer, &xfer->endpoint->endpoint_q[0].head, 2129 wait_entry) { 2130 2131 /* skip self, if any */ 2132 2133 if (pipe_xfer == isoc_xfer) 2134 continue; 2135 2136 /* check if isoc_time is part of this transfer */ 2137 2138 delta = pipe_xfer->isoc_time_complete - isoc_time; 2139 if (delta > 0 && delta <= pipe_xfer->nframes) { 2140 delta = pipe_xfer->nframes - delta; 2141 2142 len = pipe_xfer->frlengths[delta]; 2143 len += 8; 2144 len *= 7; 2145 len /= 6; 2146 2147 data_len += len; 2148 } 2149 } 2150 } 2151 2152 while (data_len >= USB_FS_BYTES_PER_HS_UFRAME) { 2153 data_len -= USB_FS_BYTES_PER_HS_UFRAME; 2154 slot++; 2155 } 2156 2157 /* check for overflow */ 2158 2159 if (slot >= USB_FS_ISOC_UFRAME_MAX) 2160 return (255); 2161 2162 retval = slot; 2163 2164 delta = isoc_xfer->isoc_time_complete - isoc_time; 2165 if (delta > 0 && delta <= isoc_xfer->nframes) { 2166 delta = isoc_xfer->nframes - delta; 2167 2168 len = isoc_xfer->frlengths[delta]; 2169 len += 8; 2170 len *= 7; 2171 len /= 6; 2172 2173 data_len += len; 2174 } 2175 2176 while (data_len >= USB_FS_BYTES_PER_HS_UFRAME) { 2177 data_len -= USB_FS_BYTES_PER_HS_UFRAME; 2178 slot++; 2179 } 2180 2181 /* check for overflow */ 2182 2183 if (slot >= USB_FS_ISOC_UFRAME_MAX) 2184 return (255); 2185 2186 return (retval); 2187 } 2188 #endif 2189 2190 /*------------------------------------------------------------------------* 2191 * usb_bus_port_get_device 2192 * 2193 * This function is NULL safe. 2194 *------------------------------------------------------------------------*/ 2195 struct usb_device * 2196 usb_bus_port_get_device(struct usb_bus *bus, struct usb_port *up) 2197 { 2198 if ((bus == NULL) || (up == NULL)) { 2199 /* be NULL safe */ 2200 return (NULL); 2201 } 2202 if (up->device_index == 0) { 2203 /* nothing to do */ 2204 return (NULL); 2205 } 2206 return (bus->devices[up->device_index]); 2207 } 2208 2209 /*------------------------------------------------------------------------* 2210 * usb_bus_port_set_device 2211 * 2212 * This function is NULL safe. 2213 *------------------------------------------------------------------------*/ 2214 void 2215 usb_bus_port_set_device(struct usb_bus *bus, struct usb_port *up, 2216 struct usb_device *udev, uint8_t device_index) 2217 { 2218 if (bus == NULL) { 2219 /* be NULL safe */ 2220 return; 2221 } 2222 /* 2223 * There is only one case where we don't 2224 * have an USB port, and that is the Root Hub! 2225 */ 2226 if (up) { 2227 if (udev) { 2228 up->device_index = device_index; 2229 } else { 2230 device_index = up->device_index; 2231 up->device_index = 0; 2232 } 2233 } 2234 /* 2235 * Make relationships to our new device 2236 */ 2237 if (device_index != 0) { 2238 #if USB_HAVE_UGEN 2239 mtx_lock(&usb_ref_lock); 2240 #endif 2241 bus->devices[device_index] = udev; 2242 #if USB_HAVE_UGEN 2243 mtx_unlock(&usb_ref_lock); 2244 #endif 2245 } 2246 /* 2247 * Debug print 2248 */ 2249 DPRINTFN(2, "bus %p devices[%u] = %p\n", bus, device_index, udev); 2250 } 2251 2252 /*------------------------------------------------------------------------* 2253 * usb_needs_explore 2254 * 2255 * This functions is called when the USB event thread needs to run. 2256 *------------------------------------------------------------------------*/ 2257 void 2258 usb_needs_explore(struct usb_bus *bus, uint8_t do_probe) 2259 { 2260 uint8_t do_unlock; 2261 2262 DPRINTF("\n"); 2263 2264 if (bus == NULL) { 2265 DPRINTF("No bus pointer!\n"); 2266 return; 2267 } 2268 if ((bus->devices == NULL) || 2269 (bus->devices[USB_ROOT_HUB_ADDR] == NULL)) { 2270 DPRINTF("No root HUB\n"); 2271 return; 2272 } 2273 if (mtx_owned(&bus->bus_mtx)) { 2274 do_unlock = 0; 2275 } else { 2276 USB_BUS_LOCK(bus); 2277 do_unlock = 1; 2278 } 2279 if (do_probe) { 2280 bus->do_probe = 1; 2281 } 2282 if (usb_proc_msignal(USB_BUS_EXPLORE_PROC(bus), 2283 &bus->explore_msg[0], &bus->explore_msg[1])) { 2284 /* ignore */ 2285 } 2286 if (do_unlock) { 2287 USB_BUS_UNLOCK(bus); 2288 } 2289 } 2290 2291 /*------------------------------------------------------------------------* 2292 * usb_needs_explore_all 2293 * 2294 * This function is called whenever a new driver is loaded and will 2295 * cause that all USB busses are re-explored. 2296 *------------------------------------------------------------------------*/ 2297 void 2298 usb_needs_explore_all(void) 2299 { 2300 struct usb_bus *bus; 2301 devclass_t dc; 2302 device_t dev; 2303 int max; 2304 2305 DPRINTFN(3, "\n"); 2306 2307 dc = usb_devclass_ptr; 2308 if (dc == NULL) { 2309 DPRINTFN(0, "no devclass\n"); 2310 return; 2311 } 2312 /* 2313 * Explore all USB busses in parallel. 2314 */ 2315 max = devclass_get_maxunit(dc); 2316 while (max >= 0) { 2317 dev = devclass_get_device(dc, max); 2318 if (dev) { 2319 bus = device_get_softc(dev); 2320 if (bus) { 2321 usb_needs_explore(bus, 1); 2322 } 2323 } 2324 max--; 2325 } 2326 } 2327 2328 /*------------------------------------------------------------------------* 2329 * usb_bus_power_update 2330 * 2331 * This function will ensure that all USB devices on the given bus are 2332 * properly suspended or resumed according to the device transfer 2333 * state. 2334 *------------------------------------------------------------------------*/ 2335 #if USB_HAVE_POWERD 2336 void 2337 usb_bus_power_update(struct usb_bus *bus) 2338 { 2339 usb_needs_explore(bus, 0 /* no probe */ ); 2340 } 2341 #endif 2342 2343 /*------------------------------------------------------------------------* 2344 * usbd_transfer_power_ref 2345 * 2346 * This function will modify the power save reference counts and 2347 * wakeup the USB device associated with the given USB transfer, if 2348 * needed. 2349 *------------------------------------------------------------------------*/ 2350 #if USB_HAVE_POWERD 2351 void 2352 usbd_transfer_power_ref(struct usb_xfer *xfer, int val) 2353 { 2354 static const usb_power_mask_t power_mask[4] = { 2355 [UE_CONTROL] = USB_HW_POWER_CONTROL, 2356 [UE_BULK] = USB_HW_POWER_BULK, 2357 [UE_INTERRUPT] = USB_HW_POWER_INTERRUPT, 2358 [UE_ISOCHRONOUS] = USB_HW_POWER_ISOC, 2359 }; 2360 struct usb_device *udev; 2361 uint8_t needs_explore; 2362 uint8_t needs_hw_power; 2363 uint8_t xfer_type; 2364 2365 udev = xfer->xroot->udev; 2366 2367 if (udev->device_index == USB_ROOT_HUB_ADDR) { 2368 /* no power save for root HUB */ 2369 return; 2370 } 2371 USB_BUS_LOCK(udev->bus); 2372 2373 xfer_type = xfer->endpoint->edesc->bmAttributes & UE_XFERTYPE; 2374 2375 udev->pwr_save.last_xfer_time = ticks; 2376 udev->pwr_save.type_refs[xfer_type] += val; 2377 2378 if (xfer->flags_int.control_xfr) { 2379 udev->pwr_save.read_refs += val; 2380 if (xfer->flags_int.usb_mode == USB_MODE_HOST) { 2381 /* 2382 * It is not allowed to suspend during a 2383 * control transfer: 2384 */ 2385 udev->pwr_save.write_refs += val; 2386 } 2387 } else if (USB_GET_DATA_ISREAD(xfer)) { 2388 udev->pwr_save.read_refs += val; 2389 } else { 2390 udev->pwr_save.write_refs += val; 2391 } 2392 2393 if (val > 0) { 2394 if (udev->flags.self_suspended) 2395 needs_explore = usb_peer_should_wakeup(udev); 2396 else 2397 needs_explore = 0; 2398 2399 if (!(udev->bus->hw_power_state & power_mask[xfer_type])) { 2400 DPRINTF("Adding type %u to power state\n", xfer_type); 2401 udev->bus->hw_power_state |= power_mask[xfer_type]; 2402 needs_hw_power = 1; 2403 } else { 2404 needs_hw_power = 0; 2405 } 2406 } else { 2407 needs_explore = 0; 2408 needs_hw_power = 0; 2409 } 2410 2411 USB_BUS_UNLOCK(udev->bus); 2412 2413 if (needs_explore) { 2414 DPRINTF("update\n"); 2415 usb_bus_power_update(udev->bus); 2416 } else if (needs_hw_power) { 2417 DPRINTF("needs power\n"); 2418 if (udev->bus->methods->set_hw_power != NULL) { 2419 (udev->bus->methods->set_hw_power) (udev->bus); 2420 } 2421 } 2422 } 2423 #endif 2424 2425 /*------------------------------------------------------------------------* 2426 * usb_peer_should_wakeup 2427 * 2428 * This function returns non-zero if the current device should wake up. 2429 *------------------------------------------------------------------------*/ 2430 static uint8_t 2431 usb_peer_should_wakeup(struct usb_device *udev) 2432 { 2433 return (((udev->power_mode == USB_POWER_MODE_ON) && 2434 (udev->flags.usb_mode == USB_MODE_HOST)) || 2435 (udev->driver_added_refcount != udev->bus->driver_added_refcount) || 2436 (udev->re_enumerate_wait != USB_RE_ENUM_DONE) || 2437 (udev->pwr_save.type_refs[UE_ISOCHRONOUS] != 0) || 2438 (udev->pwr_save.write_refs != 0) || 2439 ((udev->pwr_save.read_refs != 0) && 2440 (udev->flags.usb_mode == USB_MODE_HOST) && 2441 (usb_peer_can_wakeup(udev) == 0))); 2442 } 2443 2444 /*------------------------------------------------------------------------* 2445 * usb_bus_powerd 2446 * 2447 * This function implements the USB power daemon and is called 2448 * regularly from the USB explore thread. 2449 *------------------------------------------------------------------------*/ 2450 #if USB_HAVE_POWERD 2451 void 2452 usb_bus_powerd(struct usb_bus *bus) 2453 { 2454 struct usb_device *udev; 2455 usb_ticks_t temp; 2456 usb_ticks_t limit; 2457 usb_ticks_t mintime; 2458 usb_size_t type_refs[5]; 2459 uint8_t x; 2460 2461 limit = usb_power_timeout; 2462 if (limit == 0) 2463 limit = hz; 2464 else if (limit > 255) 2465 limit = 255 * hz; 2466 else 2467 limit = limit * hz; 2468 2469 DPRINTF("bus=%p\n", bus); 2470 2471 USB_BUS_LOCK(bus); 2472 2473 /* 2474 * The root HUB device is never suspended 2475 * and we simply skip it. 2476 */ 2477 for (x = USB_ROOT_HUB_ADDR + 1; 2478 x != bus->devices_max; x++) { 2479 2480 udev = bus->devices[x]; 2481 if (udev == NULL) 2482 continue; 2483 2484 temp = ticks - udev->pwr_save.last_xfer_time; 2485 2486 if (usb_peer_should_wakeup(udev)) { 2487 /* check if we are suspended */ 2488 if (udev->flags.self_suspended != 0) { 2489 USB_BUS_UNLOCK(bus); 2490 usb_dev_resume_peer(udev); 2491 USB_BUS_LOCK(bus); 2492 } 2493 } else if ((temp >= limit) && 2494 (udev->flags.usb_mode == USB_MODE_HOST) && 2495 (udev->flags.self_suspended == 0)) { 2496 /* try to do suspend */ 2497 2498 USB_BUS_UNLOCK(bus); 2499 usb_dev_suspend_peer(udev); 2500 USB_BUS_LOCK(bus); 2501 } 2502 } 2503 2504 /* reset counters */ 2505 2506 mintime = (usb_ticks_t)-1; 2507 type_refs[0] = 0; 2508 type_refs[1] = 0; 2509 type_refs[2] = 0; 2510 type_refs[3] = 0; 2511 type_refs[4] = 0; 2512 2513 /* Re-loop all the devices to get the actual state */ 2514 2515 for (x = USB_ROOT_HUB_ADDR + 1; 2516 x != bus->devices_max; x++) { 2517 2518 udev = bus->devices[x]; 2519 if (udev == NULL) 2520 continue; 2521 2522 /* we found a non-Root-Hub USB device */ 2523 type_refs[4] += 1; 2524 2525 /* "last_xfer_time" can be updated by a resume */ 2526 temp = ticks - udev->pwr_save.last_xfer_time; 2527 2528 /* 2529 * Compute minimum time since last transfer for the complete 2530 * bus: 2531 */ 2532 if (temp < mintime) 2533 mintime = temp; 2534 2535 if (udev->flags.self_suspended == 0) { 2536 type_refs[0] += udev->pwr_save.type_refs[0]; 2537 type_refs[1] += udev->pwr_save.type_refs[1]; 2538 type_refs[2] += udev->pwr_save.type_refs[2]; 2539 type_refs[3] += udev->pwr_save.type_refs[3]; 2540 } 2541 } 2542 2543 if (mintime >= (usb_ticks_t)(1 * hz)) { 2544 /* recompute power masks */ 2545 DPRINTF("Recomputing power masks\n"); 2546 bus->hw_power_state = 0; 2547 if (type_refs[UE_CONTROL] != 0) 2548 bus->hw_power_state |= USB_HW_POWER_CONTROL; 2549 if (type_refs[UE_BULK] != 0) 2550 bus->hw_power_state |= USB_HW_POWER_BULK; 2551 if (type_refs[UE_INTERRUPT] != 0) 2552 bus->hw_power_state |= USB_HW_POWER_INTERRUPT; 2553 if (type_refs[UE_ISOCHRONOUS] != 0) 2554 bus->hw_power_state |= USB_HW_POWER_ISOC; 2555 if (type_refs[4] != 0) 2556 bus->hw_power_state |= USB_HW_POWER_NON_ROOT_HUB; 2557 } 2558 USB_BUS_UNLOCK(bus); 2559 2560 if (bus->methods->set_hw_power != NULL) { 2561 /* always update hardware power! */ 2562 (bus->methods->set_hw_power) (bus); 2563 } 2564 return; 2565 } 2566 #endif 2567 2568 /*------------------------------------------------------------------------* 2569 * usb_dev_resume_peer 2570 * 2571 * This function will resume an USB peer and do the required USB 2572 * signalling to get an USB device out of the suspended state. 2573 *------------------------------------------------------------------------*/ 2574 static void 2575 usb_dev_resume_peer(struct usb_device *udev) 2576 { 2577 struct usb_bus *bus; 2578 int err; 2579 2580 /* be NULL safe */ 2581 if (udev == NULL) 2582 return; 2583 2584 /* check if already resumed */ 2585 if (udev->flags.self_suspended == 0) 2586 return; 2587 2588 /* we need a parent HUB to do resume */ 2589 if (udev->parent_hub == NULL) 2590 return; 2591 2592 DPRINTF("udev=%p\n", udev); 2593 2594 if ((udev->flags.usb_mode == USB_MODE_DEVICE) && 2595 (udev->flags.remote_wakeup == 0)) { 2596 /* 2597 * If the host did not set the remote wakeup feature, we can 2598 * not wake it up either! 2599 */ 2600 DPRINTF("remote wakeup is not set!\n"); 2601 return; 2602 } 2603 /* get bus pointer */ 2604 bus = udev->bus; 2605 2606 /* resume parent hub first */ 2607 usb_dev_resume_peer(udev->parent_hub); 2608 2609 /* reduce chance of instant resume failure by waiting a little bit */ 2610 usb_pause_mtx(NULL, USB_MS_TO_TICKS(20)); 2611 2612 if (usb_device_20_compatible(udev)) { 2613 /* resume current port (Valid in Host and Device Mode) */ 2614 err = usbd_req_clear_port_feature(udev->parent_hub, 2615 NULL, udev->port_no, UHF_PORT_SUSPEND); 2616 if (err) { 2617 DPRINTFN(0, "Resuming port failed\n"); 2618 return; 2619 } 2620 } else { 2621 /* resume current port (Valid in Host and Device Mode) */ 2622 err = usbd_req_set_port_link_state(udev->parent_hub, 2623 NULL, udev->port_no, UPS_PORT_LS_U0); 2624 if (err) { 2625 DPRINTFN(0, "Resuming port failed\n"); 2626 return; 2627 } 2628 } 2629 2630 /* resume settle time */ 2631 usb_pause_mtx(NULL, USB_MS_TO_TICKS(usb_port_resume_delay)); 2632 2633 if (bus->methods->device_resume != NULL) { 2634 /* resume USB device on the USB controller */ 2635 (bus->methods->device_resume) (udev); 2636 } 2637 USB_BUS_LOCK(bus); 2638 /* set that this device is now resumed */ 2639 udev->flags.self_suspended = 0; 2640 #if USB_HAVE_POWERD 2641 /* make sure that we don't go into suspend right away */ 2642 udev->pwr_save.last_xfer_time = ticks; 2643 2644 /* make sure the needed power masks are on */ 2645 if (udev->pwr_save.type_refs[UE_CONTROL] != 0) 2646 bus->hw_power_state |= USB_HW_POWER_CONTROL; 2647 if (udev->pwr_save.type_refs[UE_BULK] != 0) 2648 bus->hw_power_state |= USB_HW_POWER_BULK; 2649 if (udev->pwr_save.type_refs[UE_INTERRUPT] != 0) 2650 bus->hw_power_state |= USB_HW_POWER_INTERRUPT; 2651 if (udev->pwr_save.type_refs[UE_ISOCHRONOUS] != 0) 2652 bus->hw_power_state |= USB_HW_POWER_ISOC; 2653 #endif 2654 USB_BUS_UNLOCK(bus); 2655 2656 if (bus->methods->set_hw_power != NULL) { 2657 /* always update hardware power! */ 2658 (bus->methods->set_hw_power) (bus); 2659 } 2660 2661 usbd_sr_lock(udev); 2662 2663 /* notify all sub-devices about resume */ 2664 err = usb_suspend_resume(udev, 0); 2665 2666 usbd_sr_unlock(udev); 2667 2668 /* check if peer has wakeup capability */ 2669 if (usb_peer_can_wakeup(udev)) { 2670 /* clear remote wakeup */ 2671 err = usbd_req_clear_device_feature(udev, 2672 NULL, UF_DEVICE_REMOTE_WAKEUP); 2673 if (err) { 2674 DPRINTFN(0, "Clearing device " 2675 "remote wakeup failed: %s\n", 2676 usbd_errstr(err)); 2677 } 2678 } 2679 } 2680 2681 /*------------------------------------------------------------------------* 2682 * usb_dev_suspend_peer 2683 * 2684 * This function will suspend an USB peer and do the required USB 2685 * signalling to get an USB device into the suspended state. 2686 *------------------------------------------------------------------------*/ 2687 static void 2688 usb_dev_suspend_peer(struct usb_device *udev) 2689 { 2690 struct usb_device *child; 2691 int err; 2692 uint8_t x; 2693 uint8_t nports; 2694 2695 repeat: 2696 /* be NULL safe */ 2697 if (udev == NULL) 2698 return; 2699 2700 /* check if already suspended */ 2701 if (udev->flags.self_suspended) 2702 return; 2703 2704 /* we need a parent HUB to do suspend */ 2705 if (udev->parent_hub == NULL) 2706 return; 2707 2708 DPRINTF("udev=%p\n", udev); 2709 2710 /* check if the current device is a HUB */ 2711 if (udev->hub != NULL) { 2712 nports = udev->hub->nports; 2713 2714 /* check if all devices on the HUB are suspended */ 2715 for (x = 0; x != nports; x++) { 2716 child = usb_bus_port_get_device(udev->bus, 2717 udev->hub->ports + x); 2718 2719 if (child == NULL) 2720 continue; 2721 2722 if (child->flags.self_suspended) 2723 continue; 2724 2725 DPRINTFN(1, "Port %u is busy on the HUB!\n", x + 1); 2726 return; 2727 } 2728 } 2729 2730 if (usb_peer_can_wakeup(udev)) { 2731 /* 2732 * This request needs to be done before we set 2733 * "udev->flags.self_suspended": 2734 */ 2735 2736 /* allow device to do remote wakeup */ 2737 err = usbd_req_set_device_feature(udev, 2738 NULL, UF_DEVICE_REMOTE_WAKEUP); 2739 if (err) { 2740 DPRINTFN(0, "Setting device " 2741 "remote wakeup failed\n"); 2742 } 2743 } 2744 2745 USB_BUS_LOCK(udev->bus); 2746 /* 2747 * Checking for suspend condition and setting suspended bit 2748 * must be atomic! 2749 */ 2750 err = usb_peer_should_wakeup(udev); 2751 if (err == 0) { 2752 /* 2753 * Set that this device is suspended. This variable 2754 * must be set before calling USB controller suspend 2755 * callbacks. 2756 */ 2757 udev->flags.self_suspended = 1; 2758 } 2759 USB_BUS_UNLOCK(udev->bus); 2760 2761 if (err != 0) { 2762 if (usb_peer_can_wakeup(udev)) { 2763 /* allow device to do remote wakeup */ 2764 err = usbd_req_clear_device_feature(udev, 2765 NULL, UF_DEVICE_REMOTE_WAKEUP); 2766 if (err) { 2767 DPRINTFN(0, "Setting device " 2768 "remote wakeup failed\n"); 2769 } 2770 } 2771 2772 if (udev->flags.usb_mode == USB_MODE_DEVICE) { 2773 /* resume parent HUB first */ 2774 usb_dev_resume_peer(udev->parent_hub); 2775 2776 /* reduce chance of instant resume failure by waiting a little bit */ 2777 usb_pause_mtx(NULL, USB_MS_TO_TICKS(20)); 2778 2779 /* resume current port (Valid in Host and Device Mode) */ 2780 err = usbd_req_clear_port_feature(udev->parent_hub, 2781 NULL, udev->port_no, UHF_PORT_SUSPEND); 2782 2783 /* resume settle time */ 2784 usb_pause_mtx(NULL, USB_MS_TO_TICKS(usb_port_resume_delay)); 2785 } 2786 DPRINTF("Suspend was cancelled!\n"); 2787 return; 2788 } 2789 2790 usbd_sr_lock(udev); 2791 2792 /* notify all sub-devices about suspend */ 2793 err = usb_suspend_resume(udev, 1); 2794 2795 usbd_sr_unlock(udev); 2796 2797 if (udev->bus->methods->device_suspend != NULL) { 2798 usb_timeout_t temp; 2799 2800 /* suspend device on the USB controller */ 2801 (udev->bus->methods->device_suspend) (udev); 2802 2803 /* do DMA delay */ 2804 temp = usbd_get_dma_delay(udev); 2805 if (temp != 0) 2806 usb_pause_mtx(NULL, USB_MS_TO_TICKS(temp)); 2807 2808 } 2809 2810 if (usb_device_20_compatible(udev)) { 2811 /* suspend current port */ 2812 err = usbd_req_set_port_feature(udev->parent_hub, 2813 NULL, udev->port_no, UHF_PORT_SUSPEND); 2814 if (err) { 2815 DPRINTFN(0, "Suspending port failed\n"); 2816 return; 2817 } 2818 } else { 2819 /* suspend current port */ 2820 err = usbd_req_set_port_link_state(udev->parent_hub, 2821 NULL, udev->port_no, UPS_PORT_LS_U3); 2822 if (err) { 2823 DPRINTFN(0, "Suspending port failed\n"); 2824 return; 2825 } 2826 } 2827 2828 udev = udev->parent_hub; 2829 goto repeat; 2830 } 2831 2832 /*------------------------------------------------------------------------* 2833 * usbd_set_power_mode 2834 * 2835 * This function will set the power mode, see USB_POWER_MODE_XXX for a 2836 * USB device. 2837 *------------------------------------------------------------------------*/ 2838 void 2839 usbd_set_power_mode(struct usb_device *udev, uint8_t power_mode) 2840 { 2841 /* filter input argument */ 2842 if ((power_mode != USB_POWER_MODE_ON) && 2843 (power_mode != USB_POWER_MODE_OFF)) 2844 power_mode = USB_POWER_MODE_SAVE; 2845 2846 power_mode = usbd_filter_power_mode(udev, power_mode); 2847 2848 udev->power_mode = power_mode; /* update copy of power mode */ 2849 2850 #if USB_HAVE_POWERD 2851 usb_bus_power_update(udev->bus); 2852 #else 2853 usb_needs_explore(udev->bus, 0 /* no probe */ ); 2854 #endif 2855 } 2856 2857 /*------------------------------------------------------------------------* 2858 * usbd_filter_power_mode 2859 * 2860 * This function filters the power mode based on hardware requirements. 2861 *------------------------------------------------------------------------*/ 2862 uint8_t 2863 usbd_filter_power_mode(struct usb_device *udev, uint8_t power_mode) 2864 { 2865 const struct usb_bus_methods *mtod; 2866 int8_t temp; 2867 2868 mtod = udev->bus->methods; 2869 temp = -1; 2870 2871 if (mtod->get_power_mode != NULL) 2872 (mtod->get_power_mode) (udev, &temp); 2873 2874 /* check if we should not filter */ 2875 if (temp < 0) 2876 return (power_mode); 2877 2878 /* use fixed power mode given by hardware driver */ 2879 return (temp); 2880 } 2881 2882 /*------------------------------------------------------------------------* 2883 * usbd_start_re_enumerate 2884 * 2885 * This function starts re-enumeration of the given USB device. This 2886 * function does not need to be called BUS-locked. This function does 2887 * not wait until the re-enumeration is completed. 2888 *------------------------------------------------------------------------*/ 2889 void 2890 usbd_start_re_enumerate(struct usb_device *udev) 2891 { 2892 if (udev->re_enumerate_wait == USB_RE_ENUM_DONE) { 2893 udev->re_enumerate_wait = USB_RE_ENUM_START; 2894 usb_needs_explore(udev->bus, 0); 2895 } 2896 } 2897 2898 /*-----------------------------------------------------------------------* 2899 * usbd_start_set_config 2900 * 2901 * This function starts setting a USB configuration. This function 2902 * does not need to be called BUS-locked. This function does not wait 2903 * until the set USB configuratino is completed. 2904 *------------------------------------------------------------------------*/ 2905 usb_error_t 2906 usbd_start_set_config(struct usb_device *udev, uint8_t index) 2907 { 2908 if (udev->re_enumerate_wait == USB_RE_ENUM_DONE) { 2909 if (udev->curr_config_index == index) { 2910 /* no change needed */ 2911 return (0); 2912 } 2913 udev->next_config_index = index; 2914 udev->re_enumerate_wait = USB_RE_ENUM_SET_CONFIG; 2915 usb_needs_explore(udev->bus, 0); 2916 return (0); 2917 } else if (udev->re_enumerate_wait == USB_RE_ENUM_SET_CONFIG) { 2918 if (udev->next_config_index == index) { 2919 /* no change needed */ 2920 return (0); 2921 } 2922 } 2923 return (USB_ERR_PENDING_REQUESTS); 2924 } 2925