1 /* $NetBSD: usb.c,v 1.59 2001/11/26 20:16:55 augustss Exp $ */ 2 3 /* 4 * Copyright (c) 1998 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Lennart Augustsson (lennart@augustsson.net) at 9 * Carlstedt Research & Technology. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. All advertising materials mentioning features or use of this software 20 * must display the following acknowledgement: 21 * This product includes software developed by the NetBSD 22 * Foundation, Inc. and its contributors. 23 * 4. Neither the name of The NetBSD Foundation nor the names of its 24 * contributors may be used to endorse or promote products derived 25 * from this software without specific prior written permission. 26 * 27 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 28 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 29 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 30 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 31 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37 * POSSIBILITY OF SUCH DAMAGE. 38 */ 39 40 /* 41 * USB specifications and other documentation can be found at 42 * http://www.usb.org/developers/data/ and 43 * http://www.usb.org/developers/index.html . 44 */ 45 46 #include <sys/cdefs.h> 47 __KERNEL_RCSID(0, "$NetBSD: usb.c,v 1.59 2001/11/26 20:16:55 augustss Exp $"); 48 49 #include <sys/param.h> 50 #include <sys/systm.h> 51 #include <sys/kernel.h> 52 #include <sys/malloc.h> 53 #include <sys/device.h> 54 #include <sys/kthread.h> 55 #include <sys/proc.h> 56 #include <sys/conf.h> 57 #include <sys/poll.h> 58 #include <sys/select.h> 59 #include <sys/vnode.h> 60 #include <sys/signalvar.h> 61 62 #include <dev/usb/usb.h> 63 #include <dev/usb/usbdi.h> 64 #include <dev/usb/usbdi_util.h> 65 66 #define USB_DEV_MINOR 255 67 68 #include <machine/bus.h> 69 70 #include <dev/usb/usbdivar.h> 71 #include <dev/usb/usb_quirks.h> 72 73 #ifdef USB_DEBUG 74 #define DPRINTF(x) if (usbdebug) logprintf x 75 #define DPRINTFN(n,x) if (usbdebug>(n)) logprintf x 76 int usbdebug = 0; 77 #ifdef UHCI_DEBUG 78 int uhcidebug; 79 #endif 80 #ifdef OHCI_DEBUG 81 int ohcidebug; 82 #endif 83 /* 84 * 0 - do usual exploration 85 * 1 - do not use timeout exploration 86 * >1 - do no exploration 87 */ 88 int usb_noexplore = 0; 89 #else 90 #define DPRINTF(x) 91 #define DPRINTFN(n,x) 92 #endif 93 94 struct usb_softc { 95 USBBASEDEVICE sc_dev; /* base device */ 96 usbd_bus_handle sc_bus; /* USB controller */ 97 struct usbd_port sc_port; /* dummy port for root hub */ 98 99 struct proc *sc_event_thread; 100 101 char sc_dying; 102 }; 103 104 TAILQ_HEAD(, usb_task) usb_all_tasks; 105 106 cdev_decl(usb); 107 108 Static void usb_discover(void *); 109 Static void usb_create_event_thread(void *); 110 Static void usb_event_thread(void *); 111 Static void usb_task_thread(void *); 112 Static struct proc *usb_task_thread_proc = NULL; 113 114 #define USB_MAX_EVENTS 100 115 struct usb_event_q { 116 struct usb_event ue; 117 SIMPLEQ_ENTRY(usb_event_q) next; 118 }; 119 Static SIMPLEQ_HEAD(, usb_event_q) usb_events = 120 SIMPLEQ_HEAD_INITIALIZER(usb_events); 121 Static int usb_nevents = 0; 122 Static struct selinfo usb_selevent; 123 Static struct proc *usb_async_proc; /* process that wants USB SIGIO */ 124 Static int usb_dev_open = 0; 125 Static void usb_add_event(int, struct usb_event *); 126 127 Static int usb_get_next_event(struct usb_event *); 128 129 Static const char *usbrev_str[] = USBREV_STR; 130 131 USB_DECLARE_DRIVER(usb); 132 133 USB_MATCH(usb) 134 { 135 DPRINTF(("usbd_match\n")); 136 return (UMATCH_GENERIC); 137 } 138 139 USB_ATTACH(usb) 140 { 141 struct usb_softc *sc = (struct usb_softc *)self; 142 usbd_device_handle dev; 143 usbd_status err; 144 int usbrev; 145 int speed; 146 struct usb_event ue; 147 148 DPRINTF(("usbd_attach\n")); 149 150 usbd_init(); 151 sc->sc_bus = aux; 152 sc->sc_bus->usbctl = sc; 153 sc->sc_port.power = USB_MAX_POWER; 154 155 usbrev = sc->sc_bus->usbrev; 156 printf(": USB revision %s", usbrev_str[usbrev]); 157 switch (usbrev) { 158 case USBREV_1_0: 159 case USBREV_1_1: 160 speed = USB_SPEED_FULL; 161 break; 162 case USBREV_2_0: 163 speed = USB_SPEED_HIGH; 164 break; 165 default: 166 printf(", not supported\n"); 167 sc->sc_dying = 1; 168 USB_ATTACH_ERROR_RETURN; 169 } 170 printf("\n"); 171 172 /* Make sure not to use tsleep() if we are cold booting. */ 173 if (cold) 174 sc->sc_bus->use_polling++; 175 176 ue.u.ue_ctrlr.ue_bus = USBDEVUNIT(sc->sc_dev); 177 usb_add_event(USB_EVENT_CTRLR_ATTACH, &ue); 178 179 #ifdef USB_USE_SOFTINTR 180 #ifdef __HAVE_GENERIC_SOFT_INTERRUPTS 181 /* XXX we should have our own level */ 182 sc->sc_bus->soft = softintr_establish(IPL_SOFTNET, 183 sc->sc_bus->methods->soft_intr, sc->sc_bus); 184 if (sc->sc_bus->soft == NULL) { 185 printf("%s: can't register softintr\n", USBDEVNAME(sc->sc_dev)); 186 sc->sc_dying = 1; 187 USB_ATTACH_ERROR_RETURN; 188 } 189 #else 190 callout_init(&sc->sc_bus->softi); 191 #endif 192 #endif 193 194 err = usbd_new_device(USBDEV(sc->sc_dev), sc->sc_bus, 0, speed, 0, 195 &sc->sc_port); 196 if (!err) { 197 dev = sc->sc_port.device; 198 if (dev->hub == NULL) { 199 sc->sc_dying = 1; 200 printf("%s: root device is not a hub\n", 201 USBDEVNAME(sc->sc_dev)); 202 USB_ATTACH_ERROR_RETURN; 203 } 204 sc->sc_bus->root_hub = dev; 205 #if 1 206 /* 207 * Turning this code off will delay attachment of USB devices 208 * until the USB event thread is running, which means that 209 * the keyboard will not work until after cold boot. 210 */ 211 if (cold && (sc->sc_dev.dv_cfdata->cf_flags & 1)) 212 dev->hub->explore(sc->sc_bus->root_hub); 213 #endif 214 } else { 215 printf("%s: root hub problem, error=%d\n", 216 USBDEVNAME(sc->sc_dev), err); 217 sc->sc_dying = 1; 218 } 219 if (cold) 220 sc->sc_bus->use_polling--; 221 222 config_pending_incr(); 223 usb_kthread_create(usb_create_event_thread, sc); 224 225 USB_ATTACH_SUCCESS_RETURN; 226 } 227 228 #if defined(__NetBSD__) || defined(__OpenBSD__) 229 void 230 usb_create_event_thread(void *arg) 231 { 232 struct usb_softc *sc = arg; 233 static int created = 0; 234 235 if (usb_kthread_create1(usb_event_thread, sc, &sc->sc_event_thread, 236 "%s", sc->sc_dev.dv_xname)) { 237 printf("%s: unable to create event thread for\n", 238 sc->sc_dev.dv_xname); 239 panic("usb_create_event_thread"); 240 } 241 if (!created) { 242 created = 1; 243 TAILQ_INIT(&usb_all_tasks); 244 if (usb_kthread_create1(usb_task_thread, NULL, 245 &usb_task_thread_proc, "usbtask")) { 246 printf("unable to create task thread\n"); 247 panic("usb_create_event_thread task"); 248 } 249 } 250 } 251 252 /* 253 * Add a task to be performed by the event thread. This function can be 254 * called from any context and the task will be executed in a process 255 * context ASAP. 256 */ 257 void 258 usb_add_task(usbd_device_handle dev, struct usb_task *task) 259 { 260 int s; 261 262 s = splusb(); 263 if (!task->onqueue) { 264 DPRINTFN(2,("usb_add_task: task=%p\n", task)); 265 TAILQ_INSERT_TAIL(&usb_all_tasks, task, next); 266 task->onqueue = 1; 267 } else 268 DPRINTFN(3,("usb_add_task: task=%p on q\n", task)); 269 wakeup(&usb_all_tasks); 270 splx(s); 271 } 272 273 void 274 usb_rem_task(usbd_device_handle dev, struct usb_task *task) 275 { 276 int s; 277 278 s = splusb(); 279 if (task->onqueue) { 280 TAILQ_REMOVE(&usb_all_tasks, task, next); 281 task->onqueue = 0; 282 } 283 splx(s); 284 } 285 286 void 287 usb_event_thread(void *arg) 288 { 289 struct usb_softc *sc = arg; 290 291 DPRINTF(("usb_event_thread: start\n")); 292 293 /* Make sure first discover does something. */ 294 sc->sc_bus->needs_explore = 1; 295 usb_discover(sc); 296 config_pending_decr(); 297 298 while (!sc->sc_dying) { 299 #ifdef USB_DEBUG 300 if (usb_noexplore < 2) 301 #endif 302 usb_discover(sc); 303 #ifdef USB_DEBUG 304 (void)tsleep(&sc->sc_bus->needs_explore, PWAIT, "usbevt", 305 usb_noexplore ? 0 : hz * 60); 306 #else 307 (void)tsleep(&sc->sc_bus->needs_explore, PWAIT, "usbevt", 308 hz * 60); 309 #endif 310 DPRINTFN(2,("usb_event_thread: woke up\n")); 311 } 312 sc->sc_event_thread = NULL; 313 314 /* In case parent is waiting for us to exit. */ 315 wakeup(sc); 316 317 DPRINTF(("usb_event_thread: exit\n")); 318 kthread_exit(0); 319 } 320 321 void 322 usb_task_thread(void *arg) 323 { 324 struct usb_task *task; 325 int s; 326 327 DPRINTF(("usb_task_thread: start\n")); 328 329 s = splusb(); 330 for (;;) { 331 task = TAILQ_FIRST(&usb_all_tasks); 332 if (task == NULL) { 333 tsleep(&usb_all_tasks, PWAIT, "usbtsk", 0); 334 task = TAILQ_FIRST(&usb_all_tasks); 335 } 336 DPRINTFN(2,("usb_task_thread: woke up task=%p\n", task)); 337 if (task != NULL) { 338 TAILQ_REMOVE(&usb_all_tasks, task, next); 339 task->onqueue = 0; 340 splx(s); 341 task->fun(task->arg); 342 s = splusb(); 343 } 344 } 345 } 346 347 int 348 usbctlprint(void *aux, const char *pnp) 349 { 350 /* only "usb"es can attach to host controllers */ 351 if (pnp) 352 printf("usb at %s", pnp); 353 354 return (UNCONF); 355 } 356 #endif /* defined(__NetBSD__) || defined(__OpenBSD__) */ 357 358 int 359 usbopen(dev_t dev, int flag, int mode, struct proc *p) 360 { 361 int unit = minor(dev); 362 struct usb_softc *sc; 363 364 if (unit == USB_DEV_MINOR) { 365 if (usb_dev_open) 366 return (EBUSY); 367 usb_dev_open = 1; 368 usb_async_proc = 0; 369 return (0); 370 } 371 372 USB_GET_SC_OPEN(usb, unit, sc); 373 374 if (sc->sc_dying) 375 return (EIO); 376 377 return (0); 378 } 379 380 int 381 usbread(dev_t dev, struct uio *uio, int flag) 382 { 383 struct usb_event ue; 384 int s, error, n; 385 386 if (minor(dev) != USB_DEV_MINOR) 387 return (ENXIO); 388 389 if (uio->uio_resid != sizeof(struct usb_event)) 390 return (EINVAL); 391 392 error = 0; 393 s = splusb(); 394 for (;;) { 395 n = usb_get_next_event(&ue); 396 if (n != 0) 397 break; 398 if (flag & IO_NDELAY) { 399 error = EWOULDBLOCK; 400 break; 401 } 402 error = tsleep(&usb_events, PZERO | PCATCH, "usbrea", 0); 403 if (error) 404 break; 405 } 406 splx(s); 407 if (!error) 408 error = uiomove((void *)&ue, uio->uio_resid, uio); 409 410 return (error); 411 } 412 413 int 414 usbclose(dev_t dev, int flag, int mode, struct proc *p) 415 { 416 int unit = minor(dev); 417 418 if (unit == USB_DEV_MINOR) { 419 usb_async_proc = 0; 420 usb_dev_open = 0; 421 } 422 423 return (0); 424 } 425 426 int 427 usbioctl(dev_t devt, u_long cmd, caddr_t data, int flag, struct proc *p) 428 { 429 struct usb_softc *sc; 430 int unit = minor(devt); 431 432 if (unit == USB_DEV_MINOR) { 433 switch (cmd) { 434 case FIONBIO: 435 /* All handled in the upper FS layer. */ 436 return (0); 437 438 case FIOASYNC: 439 if (*(int *)data) 440 usb_async_proc = p; 441 else 442 usb_async_proc = 0; 443 return (0); 444 445 default: 446 return (EINVAL); 447 } 448 } 449 450 USB_GET_SC(usb, unit, sc); 451 452 if (sc->sc_dying) 453 return (EIO); 454 455 switch (cmd) { 456 #ifdef USB_DEBUG 457 case USB_SETDEBUG: 458 usbdebug = ((*(int *)data) & 0x000000ff); 459 #ifdef UHCI_DEBUG 460 uhcidebug = ((*(int *)data) & 0x0000ff00) >> 8; 461 #endif 462 #ifdef OHCI_DEBUG 463 ohcidebug = ((*(int *)data) & 0x00ff0000) >> 16; 464 #endif 465 break; 466 #endif /* USB_DEBUG */ 467 case USB_REQUEST: 468 { 469 struct usb_ctl_request *ur = (void *)data; 470 int len = UGETW(ur->request.wLength); 471 struct iovec iov; 472 struct uio uio; 473 void *ptr = 0; 474 int addr = ur->addr; 475 usbd_status err; 476 int error = 0; 477 478 DPRINTF(("usbioctl: USB_REQUEST addr=%d len=%d\n", addr, len)); 479 if (len < 0 || len > 32768) 480 return (EINVAL); 481 if (addr < 0 || addr >= USB_MAX_DEVICES || 482 sc->sc_bus->devices[addr] == 0) 483 return (EINVAL); 484 if (len != 0) { 485 iov.iov_base = (caddr_t)ur->data; 486 iov.iov_len = len; 487 uio.uio_iov = &iov; 488 uio.uio_iovcnt = 1; 489 uio.uio_resid = len; 490 uio.uio_offset = 0; 491 uio.uio_segflg = UIO_USERSPACE; 492 uio.uio_rw = 493 ur->request.bmRequestType & UT_READ ? 494 UIO_READ : UIO_WRITE; 495 uio.uio_procp = p; 496 ptr = malloc(len, M_TEMP, M_WAITOK); 497 if (uio.uio_rw == UIO_WRITE) { 498 error = uiomove(ptr, len, &uio); 499 if (error) 500 goto ret; 501 } 502 } 503 err = usbd_do_request_flags(sc->sc_bus->devices[addr], 504 &ur->request, ptr, ur->flags, &ur->actlen); 505 if (err) { 506 error = EIO; 507 goto ret; 508 } 509 if (len != 0) { 510 if (uio.uio_rw == UIO_READ) { 511 error = uiomove(ptr, len, &uio); 512 if (error) 513 goto ret; 514 } 515 } 516 ret: 517 if (ptr) 518 free(ptr, M_TEMP); 519 return (error); 520 } 521 522 case USB_DEVICEINFO: 523 { 524 struct usb_device_info *di = (void *)data; 525 int addr = di->addr; 526 usbd_device_handle dev; 527 528 if (addr < 1 || addr >= USB_MAX_DEVICES) 529 return (EINVAL); 530 dev = sc->sc_bus->devices[addr]; 531 if (dev == NULL) 532 return (ENXIO); 533 usbd_fill_deviceinfo(dev, di, 1); 534 break; 535 } 536 537 case USB_DEVICESTATS: 538 *(struct usb_device_stats *)data = sc->sc_bus->stats; 539 break; 540 541 default: 542 return (EINVAL); 543 } 544 return (0); 545 } 546 547 int 548 usbpoll(dev_t dev, int events, struct proc *p) 549 { 550 int revents, mask, s; 551 552 if (minor(dev) == USB_DEV_MINOR) { 553 revents = 0; 554 mask = POLLIN | POLLRDNORM; 555 556 s = splusb(); 557 if (events & mask && usb_nevents > 0) 558 revents |= events & mask; 559 if (revents == 0 && events & mask) 560 selrecord(p, &usb_selevent); 561 splx(s); 562 563 return (revents); 564 } else { 565 return (ENXIO); 566 } 567 } 568 569 /* Explore device tree from the root. */ 570 Static void 571 usb_discover(void *v) 572 { 573 struct usb_softc *sc = v; 574 575 DPRINTFN(2,("usb_discover\n")); 576 #ifdef USB_DEBUG 577 if (usb_noexplore > 1) 578 return; 579 #endif 580 /* 581 * We need mutual exclusion while traversing the device tree, 582 * but this is guaranteed since this function is only called 583 * from the event thread for the controller. 584 */ 585 while (sc->sc_bus->needs_explore && !sc->sc_dying) { 586 sc->sc_bus->needs_explore = 0; 587 sc->sc_bus->root_hub->hub->explore(sc->sc_bus->root_hub); 588 } 589 } 590 591 void 592 usb_needs_explore(usbd_device_handle dev) 593 { 594 DPRINTFN(2,("usb_needs_explore\n")); 595 dev->bus->needs_explore = 1; 596 wakeup(&dev->bus->needs_explore); 597 } 598 599 /* Called at splusb() */ 600 int 601 usb_get_next_event(struct usb_event *ue) 602 { 603 struct usb_event_q *ueq; 604 605 if (usb_nevents <= 0) 606 return (0); 607 ueq = SIMPLEQ_FIRST(&usb_events); 608 *ue = ueq->ue; 609 SIMPLEQ_REMOVE_HEAD(&usb_events, ueq, next); 610 free(ueq, M_USBDEV); 611 usb_nevents--; 612 return (1); 613 } 614 615 void 616 usbd_add_dev_event(int type, usbd_device_handle udev) 617 { 618 struct usb_event ue; 619 620 usbd_fill_deviceinfo(udev, &ue.u.ue_device, USB_EVENT_IS_ATTACH(type)); 621 usb_add_event(type, &ue); 622 } 623 624 void 625 usbd_add_drv_event(int type, usbd_device_handle udev, device_ptr_t dev) 626 { 627 struct usb_event ue; 628 629 ue.u.ue_driver.ue_cookie = udev->cookie; 630 strncpy(ue.u.ue_driver.ue_devname, USBDEVPTRNAME(dev), 631 sizeof ue.u.ue_driver.ue_devname); 632 usb_add_event(type, &ue); 633 } 634 635 Static void 636 usb_add_event(int type, struct usb_event *uep) 637 { 638 struct usb_event_q *ueq; 639 struct usb_event ue; 640 struct timeval thetime; 641 int s; 642 643 microtime(&thetime); 644 /* Don't want to wait here inside splusb() */ 645 ueq = malloc(sizeof *ueq, M_USBDEV, M_WAITOK); 646 ueq->ue = *uep; 647 ueq->ue.ue_type = type; 648 TIMEVAL_TO_TIMESPEC(&thetime, &ueq->ue.ue_time); 649 650 s = splusb(); 651 if (++usb_nevents >= USB_MAX_EVENTS) { 652 /* Too many queued events, drop an old one. */ 653 DPRINTFN(-1,("usb: event dropped\n")); 654 (void)usb_get_next_event(&ue); 655 } 656 SIMPLEQ_INSERT_TAIL(&usb_events, ueq, next); 657 wakeup(&usb_events); 658 selwakeup(&usb_selevent); 659 if (usb_async_proc != NULL) 660 psignal(usb_async_proc, SIGIO); 661 splx(s); 662 } 663 void 664 usb_schedsoftintr(usbd_bus_handle bus) 665 { 666 DPRINTFN(10,("usb_schedsoftintr: polling=%d\n", bus->use_polling)); 667 #ifdef USB_USE_SOFTINTR 668 if (bus->use_polling) { 669 bus->methods->soft_intr(bus); 670 } else { 671 #ifdef __HAVE_GENERIC_SOFT_INTERRUPTS 672 softintr_schedule(bus->soft); 673 #else 674 if (!callout_pending(&bus->softi)) 675 callout_reset(&bus->softi, 0, bus->methods->soft_intr, 676 bus); 677 #endif /* __HAVE_GENERIC_SOFT_INTERRUPTS */ 678 } 679 #else 680 bus->methods->soft_intr(bus); 681 #endif /* USB_USE_SOFTINTR */ 682 } 683 684 int 685 usb_activate(device_ptr_t self, enum devact act) 686 { 687 struct usb_softc *sc = (struct usb_softc *)self; 688 usbd_device_handle dev = sc->sc_port.device; 689 int i, rv = 0; 690 691 switch (act) { 692 case DVACT_ACTIVATE: 693 return (EOPNOTSUPP); 694 break; 695 696 case DVACT_DEACTIVATE: 697 sc->sc_dying = 1; 698 if (dev && dev->cdesc && dev->subdevs) { 699 for (i = 0; dev->subdevs[i]; i++) 700 rv |= config_deactivate(dev->subdevs[i]); 701 } 702 break; 703 } 704 return (rv); 705 } 706 707 int 708 usb_detach(device_ptr_t self, int flags) 709 { 710 struct usb_softc *sc = (struct usb_softc *)self; 711 struct usb_event ue; 712 713 DPRINTF(("usb_detach: start\n")); 714 715 sc->sc_dying = 1; 716 717 /* Make all devices disconnect. */ 718 if (sc->sc_port.device) 719 usb_disconnect_port(&sc->sc_port, self); 720 721 /* Kill off event thread. */ 722 if (sc->sc_event_thread) { 723 wakeup(&sc->sc_bus->needs_explore); 724 if (tsleep(sc, PWAIT, "usbdet", hz * 60)) 725 printf("%s: event thread didn't die\n", 726 USBDEVNAME(sc->sc_dev)); 727 DPRINTF(("usb_detach: event thread dead\n")); 728 } 729 730 usbd_finish(); 731 732 #ifdef USB_USE_SOFTINTR 733 #ifdef __HAVE_GENERIC_SOFT_INTERRUPTS 734 if (sc->sc_bus->soft != NULL) { 735 softintr_disestablish(sc->sc_bus->soft); 736 sc->sc_bus->soft = NULL; 737 } 738 #else 739 callout_stop(&sc->sc_bus->softi); 740 #endif 741 #endif 742 743 ue.u.ue_ctrlr.ue_bus = USBDEVUNIT(sc->sc_dev); 744 usb_add_event(USB_EVENT_CTRLR_DETACH, &ue); 745 746 return (0); 747 } 748