1 1.203 mrg /* $NetBSD: usb.c,v 1.203 2024/02/04 05:43:06 mrg Exp $ */ 2 1.1 augustss 3 1.1 augustss /* 4 1.129 mrg * Copyright (c) 1998, 2002, 2008, 2012 The NetBSD Foundation, Inc. 5 1.1 augustss * All rights reserved. 6 1.1 augustss * 7 1.5 augustss * This code is derived from software contributed to The NetBSD Foundation 8 1.44 augustss * by Lennart Augustsson (lennart (at) augustsson.net) at 9 1.203 mrg * Carlstedt Research & Technology and Matthew R. Green (mrg (at) eterna23.net). 10 1.1 augustss * 11 1.1 augustss * Redistribution and use in source and binary forms, with or without 12 1.1 augustss * modification, are permitted provided that the following conditions 13 1.1 augustss * are met: 14 1.1 augustss * 1. Redistributions of source code must retain the above copyright 15 1.1 augustss * notice, this list of conditions and the following disclaimer. 16 1.1 augustss * 2. Redistributions in binary form must reproduce the above copyright 17 1.1 augustss * notice, this list of conditions and the following disclaimer in the 18 1.1 augustss * documentation and/or other materials provided with the distribution. 19 1.1 augustss * 20 1.1 augustss * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21 1.1 augustss * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 1.1 augustss * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 1.1 augustss * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24 1.1 augustss * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 1.1 augustss * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 1.1 augustss * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 1.1 augustss * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 1.1 augustss * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 1.1 augustss * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 1.1 augustss * POSSIBILITY OF SUCH DAMAGE. 31 1.1 augustss */ 32 1.1 augustss 33 1.1 augustss /* 34 1.8 augustss * USB specifications and other documentation can be found at 35 1.80 wiz * http://www.usb.org/developers/docs/ and 36 1.80 wiz * http://www.usb.org/developers/devclass_docs/ 37 1.1 augustss */ 38 1.55 lukem 39 1.55 lukem #include <sys/cdefs.h> 40 1.203 mrg __KERNEL_RCSID(0, "$NetBSD: usb.c,v 1.203 2024/02/04 05:43:06 mrg Exp $"); 41 1.92 pavel 42 1.137 christos #ifdef _KERNEL_OPT 43 1.156 skrll #include "opt_usb.h" 44 1.189 mrg #include "opt_ddb.h" 45 1.92 pavel #include "opt_compat_netbsd.h" 46 1.137 christos #endif 47 1.76 dsainty 48 1.1 augustss #include <sys/param.h> 49 1.1 augustss #include <sys/systm.h> 50 1.1 augustss #include <sys/kernel.h> 51 1.162 skrll #include <sys/kmem.h> 52 1.1 augustss #include <sys/device.h> 53 1.13 augustss #include <sys/kthread.h> 54 1.30 augustss #include <sys/proc.h> 55 1.22 augustss #include <sys/conf.h> 56 1.69 augustss #include <sys/fcntl.h> 57 1.1 augustss #include <sys/poll.h> 58 1.1 augustss #include <sys/select.h> 59 1.26 augustss #include <sys/vnode.h> 60 1.26 augustss #include <sys/signalvar.h> 61 1.100 ad #include <sys/intr.h> 62 1.121 pgoyette #include <sys/module.h> 63 1.130 mrg #include <sys/mutex.h> 64 1.130 mrg #include <sys/bus.h> 65 1.130 mrg #include <sys/once.h> 66 1.152 riastrad #include <sys/atomic.h> 67 1.156 skrll #include <sys/sysctl.h> 68 1.175 pgoyette #include <sys/compat_stub.h> 69 1.183 riastrad #include <sys/sdt.h> 70 1.1 augustss 71 1.1 augustss #include <dev/usb/usb.h> 72 1.13 augustss #include <dev/usb/usbdi.h> 73 1.13 augustss #include <dev/usb/usbdi_util.h> 74 1.130 mrg #include <dev/usb/usbdivar.h> 75 1.121 pgoyette #include <dev/usb/usb_verbose.h> 76 1.130 mrg #include <dev/usb/usb_quirks.h> 77 1.156 skrll #include <dev/usb/usbhist.h> 78 1.183 riastrad #include <dev/usb/usb_sdt.h> 79 1.156 skrll 80 1.179 mrg #include "ioconf.h" 81 1.179 mrg 82 1.160 mrg #if defined(USB_DEBUG) 83 1.156 skrll 84 1.156 skrll #ifndef USBHIST_SIZE 85 1.156 skrll #define USBHIST_SIZE 50000 86 1.156 skrll #endif 87 1.156 skrll 88 1.157 skrll static struct kern_history_ent usbhistbuf[USBHIST_SIZE]; 89 1.157 skrll USBHIST_DEFINE(usbhist) = KERNHIST_INITIALIZER(usbhist, usbhistbuf); 90 1.157 skrll 91 1.156 skrll #endif 92 1.1 augustss 93 1.26 augustss #define USB_DEV_MINOR 255 94 1.26 augustss 95 1.1 augustss #ifdef USB_DEBUG 96 1.66 augustss /* 97 1.34 augustss * 0 - do usual exploration 98 1.34 augustss * 1 - do not use timeout exploration 99 1.34 augustss * >1 - do no exploration 100 1.34 augustss */ 101 1.21 augustss int usb_noexplore = 0; 102 1.156 skrll 103 1.201 mrg #ifndef USB_DEBUG_DEFAULT 104 1.201 mrg #define USB_DEBUG_DEFAULT 0 105 1.201 mrg #endif 106 1.201 mrg 107 1.201 mrg int usbdebug = USB_DEBUG_DEFAULT; 108 1.156 skrll SYSCTL_SETUP(sysctl_hw_usb_setup, "sysctl hw.usb setup") 109 1.156 skrll { 110 1.156 skrll int err; 111 1.156 skrll const struct sysctlnode *rnode; 112 1.156 skrll const struct sysctlnode *cnode; 113 1.156 skrll 114 1.156 skrll err = sysctl_createv(clog, 0, NULL, &rnode, 115 1.156 skrll CTLFLAG_PERMANENT, CTLTYPE_NODE, "usb", 116 1.156 skrll SYSCTL_DESCR("usb global controls"), 117 1.156 skrll NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL); 118 1.156 skrll 119 1.156 skrll if (err) 120 1.156 skrll goto fail; 121 1.156 skrll 122 1.156 skrll /* control debugging printfs */ 123 1.156 skrll err = sysctl_createv(clog, 0, &rnode, &cnode, 124 1.156 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE, CTLTYPE_INT, 125 1.156 skrll "debug", SYSCTL_DESCR("Enable debugging output"), 126 1.156 skrll NULL, 0, &usbdebug, sizeof(usbdebug), CTL_CREATE, CTL_EOL); 127 1.156 skrll if (err) 128 1.156 skrll goto fail; 129 1.156 skrll 130 1.156 skrll return; 131 1.156 skrll fail: 132 1.156 skrll aprint_error("%s: sysctl_createv failed (err = %d)\n", __func__, err); 133 1.156 skrll } 134 1.1 augustss #else 135 1.130 mrg #define usb_noexplore 0 136 1.1 augustss #endif 137 1.1 augustss 138 1.162 skrll #define DPRINTF(FMT,A,B,C,D) USBHIST_LOG(usbdebug,FMT,A,B,C,D) 139 1.162 skrll #define DPRINTFN(N,FMT,A,B,C,D) USBHIST_LOGN(usbdebug,N,FMT,A,B,C,D) 140 1.162 skrll 141 1.1 augustss struct usb_softc { 142 1.109 drochner #if 0 143 1.123 dyoung device_t sc_dev; /* base device */ 144 1.109 drochner #endif 145 1.185 skrll struct usbd_bus *sc_bus; /* USB controller */ 146 1.1 augustss struct usbd_port sc_port; /* dummy port for root hub */ 147 1.25 augustss 148 1.97 ad struct lwp *sc_event_thread; 149 1.196 riastrad struct lwp *sc_attach_thread; 150 1.25 augustss 151 1.25 augustss char sc_dying; 152 1.173 mrg bool sc_pmf_registered; 153 1.1 augustss }; 154 1.1 augustss 155 1.90 joerg struct usb_taskq { 156 1.90 joerg TAILQ_HEAD(, usb_task) tasks; 157 1.130 mrg kmutex_t lock; 158 1.130 mrg kcondvar_t cv; 159 1.97 ad struct lwp *task_thread_lwp; 160 1.90 joerg const char *name; 161 1.170 riastrad struct usb_task *current_task; 162 1.90 joerg }; 163 1.90 joerg 164 1.90 joerg static struct usb_taskq usb_taskq[USB_NUM_TASKQS]; 165 1.58 augustss 166 1.183 riastrad /* XXX wrong place */ 167 1.183 riastrad #ifdef KDTRACE_HOOKS 168 1.183 riastrad #define __dtrace_used 169 1.183 riastrad #else 170 1.183 riastrad #define __dtrace_used __unused 171 1.183 riastrad #endif 172 1.183 riastrad 173 1.183 riastrad SDT_PROVIDER_DEFINE(usb); 174 1.183 riastrad 175 1.183 riastrad SDT_PROBE_DEFINE3(usb, kernel, task, add, 176 1.183 riastrad "struct usbd_device *"/*dev*/, "struct usb_task *"/*task*/, "int"/*q*/); 177 1.183 riastrad SDT_PROBE_DEFINE2(usb, kernel, task, rem__start, 178 1.183 riastrad "struct usbd_device *"/*dev*/, "struct usb_task *"/*task*/); 179 1.183 riastrad SDT_PROBE_DEFINE3(usb, kernel, task, rem__done, 180 1.183 riastrad "struct usbd_device *"/*dev*/, 181 1.183 riastrad "struct usb_task *"/*task*/, 182 1.183 riastrad "bool"/*removed*/); 183 1.183 riastrad SDT_PROBE_DEFINE4(usb, kernel, task, rem__wait__start, 184 1.183 riastrad "struct usbd_device *"/*dev*/, 185 1.183 riastrad "struct usb_task *"/*task*/, 186 1.183 riastrad "int"/*queue*/, 187 1.183 riastrad "kmutex_t *"/*interlock*/); 188 1.183 riastrad SDT_PROBE_DEFINE5(usb, kernel, task, rem__wait__done, 189 1.183 riastrad "struct usbd_device *"/*dev*/, 190 1.183 riastrad "struct usb_task *"/*task*/, 191 1.183 riastrad "int"/*queue*/, 192 1.183 riastrad "kmutex_t *"/*interlock*/, 193 1.183 riastrad "bool"/*done*/); 194 1.183 riastrad 195 1.183 riastrad SDT_PROBE_DEFINE1(usb, kernel, task, start, "struct usb_task *"/*task*/); 196 1.183 riastrad SDT_PROBE_DEFINE1(usb, kernel, task, done, "struct usb_task *"/*task*/); 197 1.183 riastrad 198 1.183 riastrad SDT_PROBE_DEFINE1(usb, kernel, bus, needs__explore, 199 1.183 riastrad "struct usbd_bus *"/*bus*/); 200 1.183 riastrad SDT_PROBE_DEFINE1(usb, kernel, bus, needs__reattach, 201 1.183 riastrad "struct usbd_bus *"/*bus*/); 202 1.183 riastrad SDT_PROBE_DEFINE1(usb, kernel, bus, discover__start, 203 1.183 riastrad "struct usbd_bus *"/*bus*/); 204 1.183 riastrad SDT_PROBE_DEFINE1(usb, kernel, bus, discover__done, 205 1.183 riastrad "struct usbd_bus *"/*bus*/); 206 1.183 riastrad SDT_PROBE_DEFINE1(usb, kernel, bus, explore__start, 207 1.183 riastrad "struct usbd_bus *"/*bus*/); 208 1.183 riastrad SDT_PROBE_DEFINE1(usb, kernel, bus, explore__done, 209 1.183 riastrad "struct usbd_bus *"/*bus*/); 210 1.183 riastrad 211 1.183 riastrad SDT_PROBE_DEFINE1(usb, kernel, event, add, "struct usb_event *"/*uep*/); 212 1.183 riastrad SDT_PROBE_DEFINE1(usb, kernel, event, drop, "struct usb_event *"/*uep*/); 213 1.183 riastrad 214 1.72 gehenna dev_type_open(usbopen); 215 1.72 gehenna dev_type_close(usbclose); 216 1.72 gehenna dev_type_read(usbread); 217 1.72 gehenna dev_type_ioctl(usbioctl); 218 1.72 gehenna dev_type_poll(usbpoll); 219 1.74 jdolecek dev_type_kqfilter(usbkqfilter); 220 1.72 gehenna 221 1.72 gehenna const struct cdevsw usb_cdevsw = { 222 1.149 dholland .d_open = usbopen, 223 1.149 dholland .d_close = usbclose, 224 1.149 dholland .d_read = usbread, 225 1.149 dholland .d_write = nowrite, 226 1.149 dholland .d_ioctl = usbioctl, 227 1.149 dholland .d_stop = nostop, 228 1.149 dholland .d_tty = notty, 229 1.149 dholland .d_poll = usbpoll, 230 1.149 dholland .d_mmap = nommap, 231 1.149 dholland .d_kqfilter = usbkqfilter, 232 1.154 dholland .d_discard = nodiscard, 233 1.149 dholland .d_flag = D_OTHER 234 1.72 gehenna }; 235 1.7 augustss 236 1.109 drochner Static void usb_discover(struct usb_softc *); 237 1.109 drochner Static void usb_create_event_thread(device_t); 238 1.45 augustss Static void usb_event_thread(void *); 239 1.58 augustss Static void usb_task_thread(void *); 240 1.1 augustss 241 1.187 skrll /* 242 1.187 skrll * Count of USB busses 243 1.187 skrll */ 244 1.187 skrll int nusbbusses = 0; 245 1.187 skrll 246 1.41 augustss #define USB_MAX_EVENTS 100 247 1.26 augustss struct usb_event_q { 248 1.26 augustss struct usb_event ue; 249 1.26 augustss SIMPLEQ_ENTRY(usb_event_q) next; 250 1.26 augustss }; 251 1.66 augustss Static SIMPLEQ_HEAD(, usb_event_q) usb_events = 252 1.29 augustss SIMPLEQ_HEAD_INITIALIZER(usb_events); 253 1.42 augustss Static int usb_nevents = 0; 254 1.42 augustss Static struct selinfo usb_selevent; 255 1.130 mrg Static kmutex_t usb_event_lock; 256 1.130 mrg Static kcondvar_t usb_event_cv; 257 1.173 mrg /* XXX this is gross and broken */ 258 1.123 dyoung Static proc_t *usb_async_proc; /* process that wants USB SIGIO */ 259 1.112 ad Static void *usb_async_sih; 260 1.42 augustss Static int usb_dev_open = 0; 261 1.87 christos Static struct usb_event *usb_alloc_event(void); 262 1.87 christos Static void usb_free_event(struct usb_event *); 263 1.45 augustss Static void usb_add_event(int, struct usb_event *); 264 1.45 augustss Static int usb_get_next_event(struct usb_event *); 265 1.112 ad Static void usb_async_intr(void *); 266 1.130 mrg Static void usb_soft_intr(void *); 267 1.23 augustss 268 1.42 augustss Static const char *usbrev_str[] = USBREV_STR; 269 1.31 augustss 270 1.117 cegger static int usb_match(device_t, cfdata_t, void *); 271 1.106 dyoung static void usb_attach(device_t, device_t, void *); 272 1.106 dyoung static int usb_detach(device_t, int); 273 1.106 dyoung static int usb_activate(device_t, enum devact); 274 1.106 dyoung static void usb_childdet(device_t, device_t); 275 1.130 mrg static int usb_once_init(void); 276 1.110 ad static void usb_doattach(device_t); 277 1.106 dyoung 278 1.116 dyoung CFATTACH_DECL3_NEW(usb, sizeof(struct usb_softc), 279 1.116 dyoung usb_match, usb_attach, usb_detach, usb_activate, NULL, usb_childdet, 280 1.116 dyoung DVF_DETACH_SHUTDOWN); 281 1.1 augustss 282 1.134 mrg static const char *taskq_names[] = USB_TASKQ_NAMES; 283 1.134 mrg 284 1.118 dyoung int 285 1.118 dyoung usb_match(device_t parent, cfdata_t match, void *aux) 286 1.1 augustss { 287 1.162 skrll USBHIST_FUNC(); USBHIST_CALLED(usbdebug); 288 1.162 skrll 289 1.162 skrll return UMATCH_GENERIC; 290 1.1 augustss } 291 1.1 augustss 292 1.118 dyoung void 293 1.118 dyoung usb_attach(device_t parent, device_t self, void *aux) 294 1.1 augustss { 295 1.130 mrg static ONCE_DECL(init_control); 296 1.110 ad struct usb_softc *sc = device_private(self); 297 1.110 ad int usbrev; 298 1.110 ad 299 1.110 ad sc->sc_bus = aux; 300 1.162 skrll usbrev = sc->sc_bus->ub_revision; 301 1.110 ad 302 1.173 mrg cv_init(&sc->sc_bus->ub_needsexplore_cv, "usbevt"); 303 1.200 riastrad cv_init(&sc->sc_bus->ub_rhxfercv, "usbrhxfer"); 304 1.173 mrg sc->sc_pmf_registered = false; 305 1.173 mrg 306 1.110 ad aprint_naive("\n"); 307 1.110 ad aprint_normal(": USB revision %s", usbrev_str[usbrev]); 308 1.110 ad switch (usbrev) { 309 1.110 ad case USBREV_1_0: 310 1.110 ad case USBREV_1_1: 311 1.110 ad case USBREV_2_0: 312 1.155 skrll case USBREV_3_0: 313 1.169 msaitoh case USBREV_3_1: 314 1.110 ad break; 315 1.110 ad default: 316 1.110 ad aprint_error(", not supported\n"); 317 1.110 ad sc->sc_dying = 1; 318 1.123 dyoung return; 319 1.110 ad } 320 1.110 ad aprint_normal("\n"); 321 1.110 ad 322 1.143 jakllsch /* XXX we should have our own level */ 323 1.164 skrll sc->sc_bus->ub_soft = softint_establish(SOFTINT_USB | SOFTINT_MPSAFE, 324 1.143 jakllsch usb_soft_intr, sc->sc_bus); 325 1.162 skrll if (sc->sc_bus->ub_soft == NULL) { 326 1.143 jakllsch aprint_error("%s: can't register softintr\n", 327 1.143 jakllsch device_xname(self)); 328 1.143 jakllsch sc->sc_dying = 1; 329 1.143 jakllsch return; 330 1.143 jakllsch } 331 1.143 jakllsch 332 1.162 skrll sc->sc_bus->ub_methods->ubm_getlock(sc->sc_bus, &sc->sc_bus->ub_lock); 333 1.162 skrll KASSERT(sc->sc_bus->ub_lock != NULL); 334 1.134 mrg 335 1.130 mrg RUN_ONCE(&init_control, usb_once_init); 336 1.110 ad config_interrupts(self, usb_doattach); 337 1.110 ad } 338 1.110 ad 339 1.189 mrg #ifdef DDB 340 1.189 mrg #include <machine/db_machdep.h> 341 1.189 mrg #include <ddb/db_output.h> 342 1.189 mrg #include <ddb/db_command.h> 343 1.189 mrg 344 1.189 mrg static void 345 1.189 mrg db_usb_xfer(db_expr_t addr, bool have_addr, db_expr_t count, 346 1.189 mrg const char *modif) 347 1.189 mrg { 348 1.193 mrg struct usbd_xfer *xfer = (struct usbd_xfer *)(uintptr_t)addr; 349 1.189 mrg 350 1.190 mrg if (!have_addr) { 351 1.189 mrg db_printf("%s: need usbd_xfer address\n", __func__); 352 1.189 mrg return; 353 1.189 mrg } 354 1.189 mrg 355 1.189 mrg db_printf("usb xfer: %p pipe %p priv %p buffer %p\n", 356 1.189 mrg xfer, xfer->ux_pipe, xfer->ux_priv, xfer->ux_buffer); 357 1.189 mrg db_printf(" len %x actlen %x flags %x timeout %x status %x\n", 358 1.189 mrg xfer->ux_length, xfer->ux_actlen, xfer->ux_flags, xfer->ux_timeout, 359 1.189 mrg xfer->ux_status); 360 1.189 mrg db_printf(" callback %p done %x state %x tm_set %x tm_reset %x\n", 361 1.189 mrg xfer->ux_callback, xfer->ux_done, xfer->ux_state, 362 1.189 mrg xfer->ux_timeout_set, xfer->ux_timeout_reset); 363 1.189 mrg } 364 1.189 mrg 365 1.189 mrg static void 366 1.189 mrg db_usb_xferlist(db_expr_t addr, bool have_addr, db_expr_t count, 367 1.189 mrg const char *modif) 368 1.189 mrg { 369 1.193 mrg struct usbd_pipe *pipe = (struct usbd_pipe *)(uintptr_t)addr; 370 1.189 mrg struct usbd_xfer *xfer; 371 1.189 mrg 372 1.190 mrg if (!have_addr) { 373 1.189 mrg db_printf("%s: need usbd_pipe address\n", __func__); 374 1.189 mrg return; 375 1.189 mrg } 376 1.189 mrg 377 1.189 mrg db_printf("usb pipe: %p\n", pipe); 378 1.192 mrg unsigned xfercount = 0; 379 1.189 mrg SIMPLEQ_FOREACH(xfer, &pipe->up_queue, ux_next) { 380 1.192 mrg db_printf(" xfer = %p%s", xfer, 381 1.192 mrg xfercount == 0 || xfercount % 2 == 0 ? "" : "\n"); 382 1.192 mrg xfercount++; 383 1.189 mrg } 384 1.189 mrg } 385 1.189 mrg 386 1.190 mrg static const struct db_command db_usb_command_table[] = { 387 1.189 mrg { DDB_ADD_CMD("usbxfer", db_usb_xfer, 0, 388 1.189 mrg "display a USB xfer structure", 389 1.189 mrg NULL, NULL) }, 390 1.189 mrg { DDB_ADD_CMD("usbxferlist", db_usb_xferlist, 0, 391 1.189 mrg "display a USB xfer structure given pipe", 392 1.189 mrg NULL, NULL) }, 393 1.191 mrg { DDB_END_CMD }, 394 1.189 mrg }; 395 1.189 mrg 396 1.189 mrg static void 397 1.189 mrg usb_init_ddb(void) 398 1.189 mrg { 399 1.189 mrg 400 1.189 mrg (void)db_register_tbl(DDB_SHOW_CMD, db_usb_command_table); 401 1.189 mrg } 402 1.189 mrg #else 403 1.189 mrg #define usb_init_ddb() /* nothing */ 404 1.189 mrg #endif 405 1.189 mrg 406 1.130 mrg static int 407 1.130 mrg usb_once_init(void) 408 1.130 mrg { 409 1.134 mrg struct usb_taskq *taskq; 410 1.134 mrg int i; 411 1.130 mrg 412 1.159 skrll USBHIST_LINK_STATIC(usbhist); 413 1.158 skrll 414 1.130 mrg selinit(&usb_selevent); 415 1.130 mrg mutex_init(&usb_event_lock, MUTEX_DEFAULT, IPL_NONE); 416 1.130 mrg cv_init(&usb_event_cv, "usbrea"); 417 1.134 mrg 418 1.134 mrg for (i = 0; i < USB_NUM_TASKQS; i++) { 419 1.134 mrg taskq = &usb_taskq[i]; 420 1.134 mrg 421 1.134 mrg TAILQ_INIT(&taskq->tasks); 422 1.136 mrg /* 423 1.139 skrll * Since USB task methods usb_{add,rem}_task are callable 424 1.139 skrll * from any context, we have to make this lock a spinlock. 425 1.136 mrg */ 426 1.136 mrg mutex_init(&taskq->lock, MUTEX_DEFAULT, IPL_USB); 427 1.134 mrg cv_init(&taskq->cv, "usbtsk"); 428 1.134 mrg taskq->name = taskq_names[i]; 429 1.170 riastrad taskq->current_task = NULL; 430 1.134 mrg if (kthread_create(PRI_NONE, KTHREAD_MPSAFE, NULL, 431 1.134 mrg usb_task_thread, taskq, &taskq->task_thread_lwp, 432 1.134 mrg "%s", taskq->name)) { 433 1.134 mrg printf("unable to create task thread: %s\n", taskq->name); 434 1.134 mrg panic("usb_create_event_thread task"); 435 1.134 mrg } 436 1.134 mrg /* 437 1.134 mrg * XXX we should make sure these threads are alive before 438 1.134 mrg * end up using them in usb_doattach(). 439 1.134 mrg */ 440 1.134 mrg } 441 1.173 mrg 442 1.173 mrg KASSERT(usb_async_sih == NULL); 443 1.173 mrg usb_async_sih = softint_establish(SOFTINT_CLOCK | SOFTINT_MPSAFE, 444 1.173 mrg usb_async_intr, NULL); 445 1.173 mrg 446 1.189 mrg usb_init_ddb(); 447 1.189 mrg 448 1.130 mrg return 0; 449 1.130 mrg } 450 1.130 mrg 451 1.110 ad static void 452 1.110 ad usb_doattach(device_t self) 453 1.110 ad { 454 1.109 drochner struct usb_softc *sc = device_private(self); 455 1.162 skrll struct usbd_device *dev; 456 1.29 augustss usbd_status err; 457 1.57 augustss int speed; 458 1.87 christos struct usb_event *ue; 459 1.66 augustss 460 1.162 skrll USBHIST_FUNC(); USBHIST_CALLED(usbdebug); 461 1.31 augustss 462 1.195 riastrad KASSERT(KERNEL_LOCKED_P()); 463 1.195 riastrad 464 1.187 skrll /* Protected by KERNEL_LOCK */ 465 1.187 skrll nusbbusses++; 466 1.187 skrll 467 1.162 skrll sc->sc_bus->ub_usbctl = self; 468 1.162 skrll sc->sc_port.up_power = USB_MAX_POWER; 469 1.31 augustss 470 1.162 skrll switch (sc->sc_bus->ub_revision) { 471 1.57 augustss case USBREV_1_0: 472 1.57 augustss case USBREV_1_1: 473 1.57 augustss speed = USB_SPEED_FULL; 474 1.57 augustss break; 475 1.57 augustss case USBREV_2_0: 476 1.57 augustss speed = USB_SPEED_HIGH; 477 1.57 augustss break; 478 1.155 skrll case USBREV_3_0: 479 1.155 skrll speed = USB_SPEED_SUPER; 480 1.155 skrll break; 481 1.169 msaitoh case USBREV_3_1: 482 1.169 msaitoh speed = USB_SPEED_SUPER_PLUS; 483 1.169 msaitoh break; 484 1.57 augustss default: 485 1.110 ad panic("usb_doattach"); 486 1.32 augustss } 487 1.35 augustss 488 1.87 christos ue = usb_alloc_event(); 489 1.109 drochner ue->u.ue_ctrlr.ue_bus = device_unit(self); 490 1.87 christos usb_add_event(USB_EVENT_CTRLR_ATTACH, ue); 491 1.38 augustss 492 1.196 riastrad sc->sc_attach_thread = curlwp; 493 1.109 drochner err = usbd_new_device(self, sc->sc_bus, 0, speed, 0, 494 1.29 augustss &sc->sc_port); 495 1.196 riastrad sc->sc_attach_thread = NULL; 496 1.29 augustss if (!err) { 497 1.162 skrll dev = sc->sc_port.up_dev; 498 1.162 skrll if (dev->ud_hub == NULL) { 499 1.22 augustss sc->sc_dying = 1; 500 1.102 jmcneill aprint_error("%s: root device is not a hub\n", 501 1.109 drochner device_xname(self)); 502 1.123 dyoung return; 503 1.1 augustss } 504 1.162 skrll sc->sc_bus->ub_roothub = dev; 505 1.135 mrg usb_create_event_thread(self); 506 1.1 augustss } else { 507 1.142 jakllsch aprint_error("%s: root hub problem, error=%s\n", 508 1.142 jakllsch device_xname(self), usbd_errstr(err)); 509 1.22 augustss sc->sc_dying = 1; 510 1.1 augustss } 511 1.7 augustss 512 1.172 mrg /* 513 1.172 mrg * Drop this reference after the first set of attachments in the 514 1.172 mrg * event thread. 515 1.172 mrg */ 516 1.145 christos config_pending_incr(self); 517 1.28 augustss 518 1.104 jmcneill if (!pmf_device_register(self, NULL, NULL)) 519 1.104 jmcneill aprint_error_dev(self, "couldn't establish power handler\n"); 520 1.173 mrg else 521 1.173 mrg sc->sc_pmf_registered = true; 522 1.112 ad 523 1.123 dyoung return; 524 1.1 augustss } 525 1.1 augustss 526 1.13 augustss void 527 1.109 drochner usb_create_event_thread(device_t self) 528 1.13 augustss { 529 1.109 drochner struct usb_softc *sc = device_private(self); 530 1.13 augustss 531 1.194 riastrad if (kthread_create(PRI_NONE, 0, NULL, 532 1.130 mrg usb_event_thread, sc, &sc->sc_event_thread, 533 1.130 mrg "%s", device_xname(self))) { 534 1.13 augustss printf("%s: unable to create event thread for\n", 535 1.109 drochner device_xname(self)); 536 1.13 augustss panic("usb_create_event_thread"); 537 1.13 augustss } 538 1.13 augustss } 539 1.13 augustss 540 1.196 riastrad bool 541 1.196 riastrad usb_in_event_thread(device_t dev) 542 1.196 riastrad { 543 1.196 riastrad struct usb_softc *sc; 544 1.196 riastrad 545 1.196 riastrad if (cold) 546 1.196 riastrad return true; 547 1.196 riastrad 548 1.196 riastrad for (; dev; dev = device_parent(dev)) { 549 1.196 riastrad if (device_is_a(dev, "usb")) 550 1.196 riastrad break; 551 1.196 riastrad } 552 1.196 riastrad if (dev == NULL) 553 1.196 riastrad return false; 554 1.196 riastrad sc = device_private(dev); 555 1.196 riastrad 556 1.196 riastrad return curlwp == sc->sc_event_thread || curlwp == sc->sc_attach_thread; 557 1.196 riastrad } 558 1.196 riastrad 559 1.52 augustss /* 560 1.62 augustss * Add a task to be performed by the task thread. This function can be 561 1.52 augustss * called from any context and the task will be executed in a process 562 1.52 augustss * context ASAP. 563 1.52 augustss */ 564 1.13 augustss void 565 1.162 skrll usb_add_task(struct usbd_device *dev, struct usb_task *task, int queue) 566 1.51 augustss { 567 1.90 joerg struct usb_taskq *taskq; 568 1.51 augustss 569 1.162 skrll USBHIST_FUNC(); USBHIST_CALLED(usbdebug); 570 1.183 riastrad SDT_PROBE3(usb, kernel, task, add, dev, task, queue); 571 1.162 skrll 572 1.150 riastrad KASSERT(0 <= queue); 573 1.150 riastrad KASSERT(queue < USB_NUM_TASKQS); 574 1.90 joerg taskq = &usb_taskq[queue]; 575 1.130 mrg mutex_enter(&taskq->lock); 576 1.150 riastrad if (atomic_cas_uint(&task->queue, USB_NUM_TASKQS, queue) == 577 1.150 riastrad USB_NUM_TASKQS) { 578 1.168 pgoyette DPRINTFN(2, "task=%#jx", (uintptr_t)task, 0, 0, 0); 579 1.90 joerg TAILQ_INSERT_TAIL(&taskq->tasks, task, next); 580 1.150 riastrad cv_signal(&taskq->cv); 581 1.62 augustss } else { 582 1.168 pgoyette DPRINTFN(2, "task=%#jx on q", (uintptr_t)task, 0, 0, 0); 583 1.62 augustss } 584 1.130 mrg mutex_exit(&taskq->lock); 585 1.51 augustss } 586 1.51 augustss 587 1.150 riastrad /* 588 1.170 riastrad * usb_rem_task(dev, task) 589 1.170 riastrad * 590 1.181 riastrad * If task is queued to run, remove it from the queue. Return 591 1.181 riastrad * true if it successfully removed the task from the queue, false 592 1.181 riastrad * if not. 593 1.170 riastrad * 594 1.170 riastrad * Caller is _not_ guaranteed that the task is not running when 595 1.170 riastrad * this is done. 596 1.170 riastrad * 597 1.170 riastrad * Never sleeps. 598 1.150 riastrad */ 599 1.181 riastrad bool 600 1.162 skrll usb_rem_task(struct usbd_device *dev, struct usb_task *task) 601 1.53 augustss { 602 1.150 riastrad unsigned queue; 603 1.53 augustss 604 1.162 skrll USBHIST_FUNC(); USBHIST_CALLED(usbdebug); 605 1.183 riastrad SDT_PROBE2(usb, kernel, task, rem__start, dev, task); 606 1.162 skrll 607 1.150 riastrad while ((queue = task->queue) != USB_NUM_TASKQS) { 608 1.150 riastrad struct usb_taskq *taskq = &usb_taskq[queue]; 609 1.133 christos mutex_enter(&taskq->lock); 610 1.150 riastrad if (__predict_true(task->queue == queue)) { 611 1.150 riastrad TAILQ_REMOVE(&taskq->tasks, task, next); 612 1.150 riastrad task->queue = USB_NUM_TASKQS; 613 1.150 riastrad mutex_exit(&taskq->lock); 614 1.183 riastrad SDT_PROBE3(usb, kernel, task, rem__done, 615 1.183 riastrad dev, task, true); 616 1.181 riastrad return true; /* removed from the queue */ 617 1.150 riastrad } 618 1.133 christos mutex_exit(&taskq->lock); 619 1.132 cegger } 620 1.181 riastrad 621 1.183 riastrad SDT_PROBE3(usb, kernel, task, rem__done, dev, task, false); 622 1.181 riastrad return false; /* was not removed from the queue */ 623 1.53 augustss } 624 1.53 augustss 625 1.170 riastrad /* 626 1.171 riastrad * usb_rem_task_wait(dev, task, queue, interlock) 627 1.170 riastrad * 628 1.170 riastrad * If task is scheduled to run, remove it from the queue. If it 629 1.171 riastrad * may have already begun to run, drop interlock if not null, wait 630 1.171 riastrad * for it to complete, and reacquire interlock if not null. 631 1.171 riastrad * Return true if it successfully removed the task from the queue, 632 1.171 riastrad * false if not. 633 1.170 riastrad * 634 1.170 riastrad * Caller MUST guarantee that task will not be scheduled on a 635 1.170 riastrad * _different_ queue, at least until after this returns. 636 1.170 riastrad * 637 1.170 riastrad * If caller guarantees that task will not be scheduled on the 638 1.170 riastrad * same queue before this returns, then caller is guaranteed that 639 1.170 riastrad * the task is not running at all when this returns. 640 1.170 riastrad * 641 1.170 riastrad * May sleep. 642 1.170 riastrad */ 643 1.171 riastrad bool 644 1.171 riastrad usb_rem_task_wait(struct usbd_device *dev, struct usb_task *task, int queue, 645 1.171 riastrad kmutex_t *interlock) 646 1.170 riastrad { 647 1.170 riastrad struct usb_taskq *taskq; 648 1.170 riastrad int queue1; 649 1.171 riastrad bool removed; 650 1.170 riastrad 651 1.170 riastrad USBHIST_FUNC(); USBHIST_CALLED(usbdebug); 652 1.183 riastrad SDT_PROBE4(usb, kernel, task, rem__wait__start, 653 1.183 riastrad dev, task, queue, interlock); 654 1.170 riastrad ASSERT_SLEEPABLE(); 655 1.170 riastrad KASSERT(0 <= queue); 656 1.170 riastrad KASSERT(queue < USB_NUM_TASKQS); 657 1.170 riastrad 658 1.170 riastrad taskq = &usb_taskq[queue]; 659 1.171 riastrad mutex_enter(&taskq->lock); 660 1.171 riastrad queue1 = task->queue; 661 1.171 riastrad if (queue1 == USB_NUM_TASKQS) { 662 1.170 riastrad /* 663 1.171 riastrad * It is not on the queue. It may be about to run, or 664 1.171 riastrad * it may have already finished running -- there is no 665 1.171 riastrad * stopping it now. Wait for it if it is running. 666 1.170 riastrad */ 667 1.171 riastrad if (interlock) 668 1.171 riastrad mutex_exit(interlock); 669 1.171 riastrad while (taskq->current_task == task) 670 1.171 riastrad cv_wait(&taskq->cv, &taskq->lock); 671 1.171 riastrad removed = false; 672 1.170 riastrad } else { 673 1.170 riastrad /* 674 1.171 riastrad * It is still on the queue. We can stop it before the 675 1.171 riastrad * task thread will run it. 676 1.170 riastrad */ 677 1.171 riastrad KASSERTMSG(queue1 == queue, "task %p on q%d expected on q%d", 678 1.171 riastrad task, queue1, queue); 679 1.171 riastrad TAILQ_REMOVE(&taskq->tasks, task, next); 680 1.171 riastrad task->queue = USB_NUM_TASKQS; 681 1.171 riastrad removed = true; 682 1.170 riastrad } 683 1.171 riastrad mutex_exit(&taskq->lock); 684 1.171 riastrad 685 1.171 riastrad /* 686 1.171 riastrad * If there's an interlock, and we dropped it to wait, 687 1.171 riastrad * reacquire it. 688 1.171 riastrad */ 689 1.171 riastrad if (interlock && !removed) 690 1.171 riastrad mutex_enter(interlock); 691 1.171 riastrad 692 1.183 riastrad SDT_PROBE5(usb, kernel, task, rem__wait__done, 693 1.183 riastrad dev, task, queue, interlock, removed); 694 1.171 riastrad return removed; 695 1.170 riastrad } 696 1.170 riastrad 697 1.182 riastrad /* 698 1.182 riastrad * usb_task_pending(dev, task) 699 1.182 riastrad * 700 1.182 riastrad * True if task is queued, false if not. Note that if task is 701 1.182 riastrad * already running, it is not considered queued. 702 1.182 riastrad * 703 1.182 riastrad * For _negative_ diagnostic assertions only: 704 1.182 riastrad * 705 1.182 riastrad * KASSERT(!usb_task_pending(dev, task)); 706 1.182 riastrad */ 707 1.182 riastrad bool 708 1.182 riastrad usb_task_pending(struct usbd_device *dev, struct usb_task *task) 709 1.182 riastrad { 710 1.182 riastrad 711 1.182 riastrad return task->queue != USB_NUM_TASKQS; 712 1.182 riastrad } 713 1.182 riastrad 714 1.53 augustss void 715 1.45 augustss usb_event_thread(void *arg) 716 1.13 augustss { 717 1.13 augustss struct usb_softc *sc = arg; 718 1.172 mrg struct usbd_bus *bus = sc->sc_bus; 719 1.13 augustss 720 1.162 skrll USBHIST_FUNC(); USBHIST_CALLED(usbdebug); 721 1.40 augustss 722 1.195 riastrad KASSERT(KERNEL_LOCKED_P()); 723 1.195 riastrad 724 1.60 augustss /* 725 1.60 augustss * In case this controller is a companion controller to an 726 1.60 augustss * EHCI controller we need to wait until the EHCI controller 727 1.60 augustss * has grabbed the port. 728 1.64 augustss * XXX It would be nicer to do this with a tsleep(), but I don't 729 1.64 augustss * know how to synchronize the creation of the threads so it 730 1.64 augustss * will work. 731 1.60 augustss */ 732 1.198 jmcneill if (bus->ub_revision < USBREV_2_0) { 733 1.198 jmcneill usb_delay_ms(bus, 500); 734 1.198 jmcneill } 735 1.60 augustss 736 1.40 augustss /* Make sure first discover does something. */ 737 1.172 mrg mutex_enter(bus->ub_lock); 738 1.162 skrll sc->sc_bus->ub_needsexplore = 1; 739 1.51 augustss usb_discover(sc); 740 1.172 mrg mutex_exit(bus->ub_lock); 741 1.172 mrg 742 1.172 mrg /* Drop the config_pending reference from attach. */ 743 1.172 mrg config_pending_decr(bus->ub_usbctl); 744 1.27 augustss 745 1.172 mrg mutex_enter(bus->ub_lock); 746 1.22 augustss while (!sc->sc_dying) { 747 1.172 mrg #if 0 /* not yet */ 748 1.172 mrg while (sc->sc_bus->ub_usepolling) 749 1.172 mrg kpause("usbpoll", true, hz, bus->ub_lock); 750 1.172 mrg #endif 751 1.172 mrg 752 1.58 augustss if (usb_noexplore < 2) 753 1.130 mrg usb_discover(sc); 754 1.130 mrg 755 1.172 mrg cv_timedwait(&bus->ub_needsexplore_cv, 756 1.172 mrg bus->ub_lock, usb_noexplore ? 0 : hz * 60); 757 1.147 skrll 758 1.168 pgoyette DPRINTFN(2, "sc %#jx woke up", (uintptr_t)sc, 0, 0, 0); 759 1.13 augustss } 760 1.50 augustss sc->sc_event_thread = NULL; 761 1.13 augustss 762 1.13 augustss /* In case parent is waiting for us to exit. */ 763 1.172 mrg cv_signal(&bus->ub_needsexplore_cv); 764 1.172 mrg mutex_exit(bus->ub_lock); 765 1.13 augustss 766 1.168 pgoyette DPRINTF("sc %#jx exit", (uintptr_t)sc, 0, 0, 0); 767 1.13 augustss kthread_exit(0); 768 1.13 augustss } 769 1.13 augustss 770 1.58 augustss void 771 1.90 joerg usb_task_thread(void *arg) 772 1.58 augustss { 773 1.58 augustss struct usb_task *task; 774 1.90 joerg struct usb_taskq *taskq; 775 1.151 riastrad bool mpsafe; 776 1.58 augustss 777 1.180 mrg taskq = arg; 778 1.162 skrll 779 1.180 mrg USBHIST_FUNC(); 780 1.180 mrg USBHIST_CALLARGS(usbdebug, "start taskq %#jx", 781 1.180 mrg (uintptr_t)taskq, 0, 0, 0); 782 1.58 augustss 783 1.130 mrg mutex_enter(&taskq->lock); 784 1.58 augustss for (;;) { 785 1.90 joerg task = TAILQ_FIRST(&taskq->tasks); 786 1.58 augustss if (task == NULL) { 787 1.130 mrg cv_wait(&taskq->cv, &taskq->lock); 788 1.90 joerg task = TAILQ_FIRST(&taskq->tasks); 789 1.58 augustss } 790 1.168 pgoyette DPRINTFN(2, "woke up task=%#jx", (uintptr_t)task, 0, 0, 0); 791 1.58 augustss if (task != NULL) { 792 1.151 riastrad mpsafe = ISSET(task->flags, USB_TASKQ_MPSAFE); 793 1.90 joerg TAILQ_REMOVE(&taskq->tasks, task, next); 794 1.150 riastrad task->queue = USB_NUM_TASKQS; 795 1.170 riastrad taskq->current_task = task; 796 1.130 mrg mutex_exit(&taskq->lock); 797 1.140 jmcneill 798 1.151 riastrad if (!mpsafe) 799 1.140 jmcneill KERNEL_LOCK(1, curlwp); 800 1.183 riastrad SDT_PROBE1(usb, kernel, task, start, task); 801 1.58 augustss task->fun(task->arg); 802 1.151 riastrad /* Can't dereference task after this point. */ 803 1.183 riastrad SDT_PROBE1(usb, kernel, task, done, task); 804 1.151 riastrad if (!mpsafe) 805 1.140 jmcneill KERNEL_UNLOCK_ONE(curlwp); 806 1.140 jmcneill 807 1.130 mrg mutex_enter(&taskq->lock); 808 1.170 riastrad KASSERTMSG(taskq->current_task == task, 809 1.170 riastrad "somebody scribbled on usb taskq %p", taskq); 810 1.170 riastrad taskq->current_task = NULL; 811 1.170 riastrad cv_broadcast(&taskq->cv); 812 1.58 augustss } 813 1.58 augustss } 814 1.130 mrg mutex_exit(&taskq->lock); 815 1.58 augustss } 816 1.58 augustss 817 1.1 augustss int 818 1.91 christos usbctlprint(void *aux, const char *pnp) 819 1.1 augustss { 820 1.1 augustss /* only "usb"es can attach to host controllers */ 821 1.1 augustss if (pnp) 822 1.77 thorpej aprint_normal("usb at %s", pnp); 823 1.1 augustss 824 1.162 skrll return UNCONF; 825 1.1 augustss } 826 1.7 augustss 827 1.1 augustss int 828 1.91 christos usbopen(dev_t dev, int flag, int mode, struct lwp *l) 829 1.1 augustss { 830 1.26 augustss int unit = minor(dev); 831 1.26 augustss struct usb_softc *sc; 832 1.26 augustss 833 1.187 skrll if (nusbbusses == 0) 834 1.187 skrll return ENXIO; 835 1.187 skrll 836 1.26 augustss if (unit == USB_DEV_MINOR) { 837 1.26 augustss if (usb_dev_open) 838 1.162 skrll return EBUSY; 839 1.26 augustss usb_dev_open = 1; 840 1.184 ad mutex_enter(&proc_lock); 841 1.199 riastrad atomic_store_relaxed(&usb_async_proc, NULL); 842 1.184 ad mutex_exit(&proc_lock); 843 1.162 skrll return 0; 844 1.26 augustss } 845 1.26 augustss 846 1.109 drochner sc = device_lookup_private(&usb_cd, unit); 847 1.111 drochner if (!sc) 848 1.162 skrll return ENXIO; 849 1.1 augustss 850 1.22 augustss if (sc->sc_dying) 851 1.162 skrll return EIO; 852 1.1 augustss 853 1.162 skrll return 0; 854 1.1 augustss } 855 1.1 augustss 856 1.1 augustss int 857 1.45 augustss usbread(dev_t dev, struct uio *uio, int flag) 858 1.26 augustss { 859 1.92 pavel struct usb_event *ue; 860 1.202 christos struct usb_event30 *ueo = NULL; /* XXXGCC */ 861 1.146 christos int useold = 0; 862 1.146 christos int error, n; 863 1.26 augustss 864 1.26 augustss if (minor(dev) != USB_DEV_MINOR) 865 1.162 skrll return ENXIO; 866 1.26 augustss 867 1.92 pavel switch (uio->uio_resid) { 868 1.202 christos case sizeof(struct usb_event30): 869 1.202 christos ueo = kmem_zalloc(sizeof(struct usb_event30), KM_SLEEP); 870 1.92 pavel useold = 1; 871 1.177 mrg /* FALLTHROUGH */ 872 1.92 pavel case sizeof(struct usb_event): 873 1.92 pavel ue = usb_alloc_event(); 874 1.92 pavel break; 875 1.92 pavel default: 876 1.162 skrll return EINVAL; 877 1.92 pavel } 878 1.26 augustss 879 1.26 augustss error = 0; 880 1.130 mrg mutex_enter(&usb_event_lock); 881 1.26 augustss for (;;) { 882 1.87 christos n = usb_get_next_event(ue); 883 1.26 augustss if (n != 0) 884 1.26 augustss break; 885 1.26 augustss if (flag & IO_NDELAY) { 886 1.26 augustss error = EWOULDBLOCK; 887 1.26 augustss break; 888 1.26 augustss } 889 1.130 mrg error = cv_wait_sig(&usb_event_cv, &usb_event_lock); 890 1.26 augustss if (error) 891 1.26 augustss break; 892 1.26 augustss } 893 1.130 mrg mutex_exit(&usb_event_lock); 894 1.92 pavel if (!error) { 895 1.92 pavel if (useold) { /* copy fields to old struct */ 896 1.178 pgoyette MODULE_HOOK_CALL(usb_subr_copy_30_hook, 897 1.175 pgoyette (ue, ueo, uio), enosys(), error); 898 1.175 pgoyette if (error == ENOSYS) 899 1.175 pgoyette error = EINVAL; 900 1.92 pavel 901 1.175 pgoyette if (!error) 902 1.175 pgoyette error = uiomove((void *)ueo, sizeof(*ueo), uio); 903 1.92 pavel } else 904 1.162 skrll error = uiomove((void *)ue, sizeof(*ue), uio); 905 1.92 pavel } 906 1.87 christos usb_free_event(ue); 907 1.175 pgoyette if (ueo) 908 1.202 christos kmem_free(ueo, sizeof(struct usb_event30)); 909 1.26 augustss 910 1.162 skrll return error; 911 1.26 augustss } 912 1.26 augustss 913 1.26 augustss int 914 1.91 christos usbclose(dev_t dev, int flag, int mode, 915 1.91 christos struct lwp *l) 916 1.1 augustss { 917 1.26 augustss int unit = minor(dev); 918 1.26 augustss 919 1.26 augustss if (unit == USB_DEV_MINOR) { 920 1.184 ad mutex_enter(&proc_lock); 921 1.199 riastrad atomic_store_relaxed(&usb_async_proc, NULL); 922 1.184 ad mutex_exit(&proc_lock); 923 1.26 augustss usb_dev_open = 0; 924 1.26 augustss } 925 1.26 augustss 926 1.162 skrll return 0; 927 1.1 augustss } 928 1.1 augustss 929 1.1 augustss int 930 1.96 christos usbioctl(dev_t devt, u_long cmd, void *data, int flag, struct lwp *l) 931 1.1 augustss { 932 1.26 augustss struct usb_softc *sc; 933 1.28 augustss int unit = minor(devt); 934 1.26 augustss 935 1.180 mrg USBHIST_FUNC(); USBHIST_CALLARGS(usbdebug, "cmd %#jx", cmd, 0, 0, 0); 936 1.162 skrll 937 1.26 augustss if (unit == USB_DEV_MINOR) { 938 1.26 augustss switch (cmd) { 939 1.26 augustss case FIONBIO: 940 1.26 augustss /* All handled in the upper FS layer. */ 941 1.162 skrll return 0; 942 1.66 augustss 943 1.26 augustss case FIOASYNC: 944 1.184 ad mutex_enter(&proc_lock); 945 1.199 riastrad atomic_store_relaxed(&usb_async_proc, 946 1.199 riastrad *(int *)data ? l->l_proc : NULL); 947 1.184 ad mutex_exit(&proc_lock); 948 1.162 skrll return 0; 949 1.26 augustss 950 1.26 augustss default: 951 1.162 skrll return EINVAL; 952 1.26 augustss } 953 1.26 augustss } 954 1.26 augustss 955 1.109 drochner sc = device_lookup_private(&usb_cd, unit); 956 1.1 augustss 957 1.22 augustss if (sc->sc_dying) 958 1.162 skrll return EIO; 959 1.22 augustss 960 1.163 skrll int error = 0; 961 1.1 augustss switch (cmd) { 962 1.1 augustss #ifdef USB_DEBUG 963 1.1 augustss case USB_SETDEBUG: 964 1.69 augustss if (!(flag & FWRITE)) 965 1.162 skrll return EBADF; 966 1.30 augustss usbdebug = ((*(int *)data) & 0x000000ff); 967 1.1 augustss break; 968 1.56 augustss #endif /* USB_DEBUG */ 969 1.1 augustss case USB_REQUEST: 970 1.1 augustss { 971 1.1 augustss struct usb_ctl_request *ur = (void *)data; 972 1.68 christos int len = UGETW(ur->ucr_request.wLength); 973 1.1 augustss struct iovec iov; 974 1.1 augustss struct uio uio; 975 1.1 augustss void *ptr = 0; 976 1.68 christos int addr = ur->ucr_addr; 977 1.29 augustss usbd_status err; 978 1.69 augustss 979 1.163 skrll if (!(flag & FWRITE)) { 980 1.163 skrll error = EBADF; 981 1.163 skrll goto fail; 982 1.163 skrll } 983 1.1 augustss 984 1.168 pgoyette DPRINTF("USB_REQUEST addr=%jd len=%jd", addr, len, 0, 0); 985 1.163 skrll if (len < 0 || len > 32768) { 986 1.163 skrll error = EINVAL; 987 1.163 skrll goto fail; 988 1.163 skrll } 989 1.165 skrll if (addr < 0 || addr >= USB_MAX_DEVICES) { 990 1.165 skrll error = EINVAL; 991 1.165 skrll goto fail; 992 1.165 skrll } 993 1.165 skrll size_t dindex = usb_addr2dindex(addr); 994 1.165 skrll if (sc->sc_bus->ub_devices[dindex] == NULL) { 995 1.163 skrll error = EINVAL; 996 1.163 skrll goto fail; 997 1.163 skrll } 998 1.1 augustss if (len != 0) { 999 1.96 christos iov.iov_base = (void *)ur->ucr_data; 1000 1.1 augustss iov.iov_len = len; 1001 1.1 augustss uio.uio_iov = &iov; 1002 1.1 augustss uio.uio_iovcnt = 1; 1003 1.1 augustss uio.uio_resid = len; 1004 1.1 augustss uio.uio_offset = 0; 1005 1.1 augustss uio.uio_rw = 1006 1.68 christos ur->ucr_request.bmRequestType & UT_READ ? 1007 1.1 augustss UIO_READ : UIO_WRITE; 1008 1.85 yamt uio.uio_vmspace = l->l_proc->p_vmspace; 1009 1.162 skrll ptr = kmem_alloc(len, KM_SLEEP); 1010 1.1 augustss if (uio.uio_rw == UIO_WRITE) { 1011 1.1 augustss error = uiomove(ptr, len, &uio); 1012 1.1 augustss if (error) 1013 1.1 augustss goto ret; 1014 1.1 augustss } 1015 1.1 augustss } 1016 1.165 skrll err = usbd_do_request_flags(sc->sc_bus->ub_devices[dindex], 1017 1.68 christos &ur->ucr_request, ptr, ur->ucr_flags, &ur->ucr_actlen, 1018 1.67 augustss USBD_DEFAULT_TIMEOUT); 1019 1.29 augustss if (err) { 1020 1.1 augustss error = EIO; 1021 1.1 augustss goto ret; 1022 1.1 augustss } 1023 1.108 ws if (len > ur->ucr_actlen) 1024 1.108 ws len = ur->ucr_actlen; 1025 1.1 augustss if (len != 0) { 1026 1.1 augustss if (uio.uio_rw == UIO_READ) { 1027 1.1 augustss error = uiomove(ptr, len, &uio); 1028 1.1 augustss if (error) 1029 1.1 augustss goto ret; 1030 1.1 augustss } 1031 1.1 augustss } 1032 1.1 augustss ret: 1033 1.162 skrll if (ptr) { 1034 1.162 skrll len = UGETW(ur->ucr_request.wLength); 1035 1.162 skrll kmem_free(ptr, len); 1036 1.162 skrll } 1037 1.166 skrll break; 1038 1.1 augustss } 1039 1.1 augustss 1040 1.1 augustss case USB_DEVICEINFO: 1041 1.93 christos { 1042 1.162 skrll struct usbd_device *dev; 1043 1.93 christos struct usb_device_info *di = (void *)data; 1044 1.93 christos int addr = di->udi_addr; 1045 1.93 christos 1046 1.163 skrll if (addr < 0 || addr >= USB_MAX_DEVICES) { 1047 1.163 skrll error = EINVAL; 1048 1.163 skrll goto fail; 1049 1.163 skrll } 1050 1.165 skrll size_t dindex = usb_addr2dindex(addr); 1051 1.165 skrll if ((dev = sc->sc_bus->ub_devices[dindex]) == NULL) { 1052 1.163 skrll error = ENXIO; 1053 1.163 skrll goto fail; 1054 1.163 skrll } 1055 1.93 christos usbd_fill_deviceinfo(dev, di, 1); 1056 1.93 christos break; 1057 1.93 christos } 1058 1.93 christos 1059 1.202 christos case USB_DEVICEINFO_30: 1060 1.1 augustss { 1061 1.162 skrll struct usbd_device *dev; 1062 1.202 christos struct usb_device_info30 *di = (void *)data; 1063 1.93 christos int addr = di->udi_addr; 1064 1.1 augustss 1065 1.163 skrll if (addr < 1 || addr >= USB_MAX_DEVICES) { 1066 1.163 skrll error = EINVAL; 1067 1.163 skrll goto fail; 1068 1.163 skrll } 1069 1.165 skrll size_t dindex = usb_addr2dindex(addr); 1070 1.165 skrll if ((dev = sc->sc_bus->ub_devices[dindex]) == NULL) { 1071 1.163 skrll error = ENXIO; 1072 1.163 skrll goto fail; 1073 1.163 skrll } 1074 1.178 pgoyette MODULE_HOOK_CALL(usb_subr_fill_30_hook, 1075 1.175 pgoyette (dev, di, 1, usbd_devinfo_vp, usbd_printBCD), 1076 1.175 pgoyette enosys(), error); 1077 1.175 pgoyette if (error == ENOSYS) 1078 1.175 pgoyette error = EINVAL; 1079 1.175 pgoyette if (error) 1080 1.175 pgoyette goto fail; 1081 1.177 mrg break; 1082 1.1 augustss } 1083 1.2 augustss 1084 1.2 augustss case USB_DEVICESTATS: 1085 1.162 skrll *(struct usb_device_stats *)data = sc->sc_bus->ub_stats; 1086 1.2 augustss break; 1087 1.1 augustss 1088 1.1 augustss default: 1089 1.163 skrll error = EINVAL; 1090 1.1 augustss } 1091 1.163 skrll 1092 1.163 skrll fail: 1093 1.163 skrll 1094 1.168 pgoyette DPRINTF("... done (error = %jd)", error, 0, 0, 0); 1095 1.163 skrll 1096 1.163 skrll return error; 1097 1.1 augustss } 1098 1.1 augustss 1099 1.1 augustss int 1100 1.84 christos usbpoll(dev_t dev, int events, struct lwp *l) 1101 1.1 augustss { 1102 1.130 mrg int revents, mask; 1103 1.1 augustss 1104 1.30 augustss if (minor(dev) == USB_DEV_MINOR) { 1105 1.30 augustss revents = 0; 1106 1.30 augustss mask = POLLIN | POLLRDNORM; 1107 1.66 augustss 1108 1.130 mrg mutex_enter(&usb_event_lock); 1109 1.30 augustss if (events & mask && usb_nevents > 0) 1110 1.30 augustss revents |= events & mask; 1111 1.30 augustss if (revents == 0 && events & mask) 1112 1.84 christos selrecord(l, &usb_selevent); 1113 1.130 mrg mutex_exit(&usb_event_lock); 1114 1.66 augustss 1115 1.162 skrll return revents; 1116 1.30 augustss } else { 1117 1.162 skrll return 0; 1118 1.1 augustss } 1119 1.1 augustss } 1120 1.1 augustss 1121 1.74 jdolecek static void 1122 1.74 jdolecek filt_usbrdetach(struct knote *kn) 1123 1.74 jdolecek { 1124 1.74 jdolecek 1125 1.130 mrg mutex_enter(&usb_event_lock); 1126 1.188 thorpej selremove_knote(&usb_selevent, kn); 1127 1.130 mrg mutex_exit(&usb_event_lock); 1128 1.74 jdolecek } 1129 1.74 jdolecek 1130 1.74 jdolecek static int 1131 1.91 christos filt_usbread(struct knote *kn, long hint) 1132 1.74 jdolecek { 1133 1.74 jdolecek 1134 1.74 jdolecek if (usb_nevents == 0) 1135 1.162 skrll return 0; 1136 1.74 jdolecek 1137 1.74 jdolecek kn->kn_data = sizeof(struct usb_event); 1138 1.162 skrll return 1; 1139 1.74 jdolecek } 1140 1.74 jdolecek 1141 1.167 maya static const struct filterops usbread_filtops = { 1142 1.197 thorpej .f_flags = FILTEROP_ISFD, 1143 1.167 maya .f_attach = NULL, 1144 1.167 maya .f_detach = filt_usbrdetach, 1145 1.167 maya .f_event = filt_usbread, 1146 1.167 maya }; 1147 1.74 jdolecek 1148 1.74 jdolecek int 1149 1.74 jdolecek usbkqfilter(dev_t dev, struct knote *kn) 1150 1.74 jdolecek { 1151 1.74 jdolecek 1152 1.74 jdolecek switch (kn->kn_filter) { 1153 1.74 jdolecek case EVFILT_READ: 1154 1.74 jdolecek if (minor(dev) != USB_DEV_MINOR) 1155 1.162 skrll return 1; 1156 1.74 jdolecek kn->kn_fop = &usbread_filtops; 1157 1.74 jdolecek break; 1158 1.74 jdolecek 1159 1.74 jdolecek default: 1160 1.162 skrll return EINVAL; 1161 1.74 jdolecek } 1162 1.74 jdolecek 1163 1.74 jdolecek kn->kn_hook = NULL; 1164 1.74 jdolecek 1165 1.130 mrg mutex_enter(&usb_event_lock); 1166 1.188 thorpej selrecord_knote(&usb_selevent, kn); 1167 1.130 mrg mutex_exit(&usb_event_lock); 1168 1.74 jdolecek 1169 1.162 skrll return 0; 1170 1.74 jdolecek } 1171 1.74 jdolecek 1172 1.25 augustss /* Explore device tree from the root. */ 1173 1.51 augustss Static void 1174 1.109 drochner usb_discover(struct usb_softc *sc) 1175 1.1 augustss { 1176 1.172 mrg struct usbd_bus *bus = sc->sc_bus; 1177 1.51 augustss 1178 1.162 skrll USBHIST_FUNC(); USBHIST_CALLED(usbdebug); 1179 1.162 skrll 1180 1.195 riastrad KASSERT(KERNEL_LOCKED_P()); 1181 1.172 mrg KASSERT(mutex_owned(bus->ub_lock)); 1182 1.130 mrg 1183 1.51 augustss if (usb_noexplore > 1) 1184 1.51 augustss return; 1185 1.172 mrg 1186 1.66 augustss /* 1187 1.25 augustss * We need mutual exclusion while traversing the device tree, 1188 1.25 augustss * but this is guaranteed since this function is only called 1189 1.25 augustss * from the event thread for the controller. 1190 1.130 mrg * 1191 1.172 mrg * Also, we now have bus->ub_lock held, and in combination 1192 1.172 mrg * with ub_exploring, avoids interferring with polling. 1193 1.25 augustss */ 1194 1.183 riastrad SDT_PROBE1(usb, kernel, bus, discover__start, bus); 1195 1.172 mrg while (bus->ub_needsexplore && !sc->sc_dying) { 1196 1.172 mrg bus->ub_needsexplore = 0; 1197 1.162 skrll mutex_exit(sc->sc_bus->ub_lock); 1198 1.183 riastrad SDT_PROBE1(usb, kernel, bus, explore__start, bus); 1199 1.172 mrg bus->ub_roothub->ud_hub->uh_explore(bus->ub_roothub); 1200 1.183 riastrad SDT_PROBE1(usb, kernel, bus, explore__done, bus); 1201 1.172 mrg mutex_enter(bus->ub_lock); 1202 1.30 augustss } 1203 1.183 riastrad SDT_PROBE1(usb, kernel, bus, discover__done, bus); 1204 1.1 augustss } 1205 1.1 augustss 1206 1.1 augustss void 1207 1.162 skrll usb_needs_explore(struct usbd_device *dev) 1208 1.1 augustss { 1209 1.162 skrll 1210 1.162 skrll USBHIST_FUNC(); USBHIST_CALLED(usbdebug); 1211 1.183 riastrad SDT_PROBE1(usb, kernel, bus, needs__explore, dev->ud_bus); 1212 1.162 skrll 1213 1.162 skrll mutex_enter(dev->ud_bus->ub_lock); 1214 1.162 skrll dev->ud_bus->ub_needsexplore = 1; 1215 1.162 skrll cv_signal(&dev->ud_bus->ub_needsexplore_cv); 1216 1.162 skrll mutex_exit(dev->ud_bus->ub_lock); 1217 1.1 augustss } 1218 1.7 augustss 1219 1.81 joff void 1220 1.162 skrll usb_needs_reattach(struct usbd_device *dev) 1221 1.81 joff { 1222 1.162 skrll 1223 1.162 skrll USBHIST_FUNC(); USBHIST_CALLED(usbdebug); 1224 1.183 riastrad SDT_PROBE1(usb, kernel, bus, needs__reattach, dev->ud_bus); 1225 1.162 skrll 1226 1.162 skrll mutex_enter(dev->ud_bus->ub_lock); 1227 1.162 skrll dev->ud_powersrc->up_reattach = 1; 1228 1.162 skrll dev->ud_bus->ub_needsexplore = 1; 1229 1.162 skrll cv_signal(&dev->ud_bus->ub_needsexplore_cv); 1230 1.162 skrll mutex_exit(dev->ud_bus->ub_lock); 1231 1.81 joff } 1232 1.81 joff 1233 1.130 mrg /* Called at with usb_event_lock held. */ 1234 1.26 augustss int 1235 1.45 augustss usb_get_next_event(struct usb_event *ue) 1236 1.26 augustss { 1237 1.26 augustss struct usb_event_q *ueq; 1238 1.26 augustss 1239 1.130 mrg KASSERT(mutex_owned(&usb_event_lock)); 1240 1.130 mrg 1241 1.26 augustss if (usb_nevents <= 0) 1242 1.162 skrll return 0; 1243 1.26 augustss ueq = SIMPLEQ_FIRST(&usb_events); 1244 1.65 augustss #ifdef DIAGNOSTIC 1245 1.65 augustss if (ueq == NULL) { 1246 1.65 augustss printf("usb: usb_nevents got out of sync! %d\n", usb_nevents); 1247 1.65 augustss usb_nevents = 0; 1248 1.162 skrll return 0; 1249 1.65 augustss } 1250 1.65 augustss #endif 1251 1.83 drochner if (ue) 1252 1.83 drochner *ue = ueq->ue; 1253 1.71 lukem SIMPLEQ_REMOVE_HEAD(&usb_events, next); 1254 1.87 christos usb_free_event((struct usb_event *)(void *)ueq); 1255 1.26 augustss usb_nevents--; 1256 1.162 skrll return 1; 1257 1.26 augustss } 1258 1.26 augustss 1259 1.26 augustss void 1260 1.162 skrll usbd_add_dev_event(int type, struct usbd_device *udev) 1261 1.38 augustss { 1262 1.87 christos struct usb_event *ue = usb_alloc_event(); 1263 1.38 augustss 1264 1.161 skrll usbd_fill_deviceinfo(udev, &ue->u.ue_device, false); 1265 1.87 christos usb_add_event(type, ue); 1266 1.38 augustss } 1267 1.38 augustss 1268 1.38 augustss void 1269 1.162 skrll usbd_add_drv_event(int type, struct usbd_device *udev, device_t dev) 1270 1.38 augustss { 1271 1.87 christos struct usb_event *ue = usb_alloc_event(); 1272 1.87 christos 1273 1.162 skrll ue->u.ue_driver.ue_cookie = udev->ud_cookie; 1274 1.123 dyoung strncpy(ue->u.ue_driver.ue_devname, device_xname(dev), 1275 1.162 skrll sizeof(ue->u.ue_driver.ue_devname)); 1276 1.87 christos usb_add_event(type, ue); 1277 1.87 christos } 1278 1.87 christos 1279 1.87 christos Static struct usb_event * 1280 1.87 christos usb_alloc_event(void) 1281 1.87 christos { 1282 1.87 christos /* Yes, this is right; we allocate enough so that we can use it later */ 1283 1.162 skrll return kmem_zalloc(sizeof(struct usb_event_q), KM_SLEEP); 1284 1.87 christos } 1285 1.38 augustss 1286 1.87 christos Static void 1287 1.87 christos usb_free_event(struct usb_event *uep) 1288 1.87 christos { 1289 1.162 skrll kmem_free(uep, sizeof(struct usb_event_q)); 1290 1.38 augustss } 1291 1.38 augustss 1292 1.42 augustss Static void 1293 1.45 augustss usb_add_event(int type, struct usb_event *uep) 1294 1.26 augustss { 1295 1.26 augustss struct usb_event_q *ueq; 1296 1.26 augustss struct timeval thetime; 1297 1.26 augustss 1298 1.162 skrll USBHIST_FUNC(); USBHIST_CALLED(usbdebug); 1299 1.162 skrll 1300 1.38 augustss microtime(&thetime); 1301 1.130 mrg /* Don't want to wait here with usb_event_lock held */ 1302 1.87 christos ueq = (struct usb_event_q *)(void *)uep; 1303 1.38 augustss ueq->ue = *uep; 1304 1.38 augustss ueq->ue.ue_type = type; 1305 1.38 augustss TIMEVAL_TO_TIMESPEC(&thetime, &ueq->ue.ue_time); 1306 1.183 riastrad SDT_PROBE1(usb, kernel, event, add, uep); 1307 1.38 augustss 1308 1.130 mrg mutex_enter(&usb_event_lock); 1309 1.26 augustss if (++usb_nevents >= USB_MAX_EVENTS) { 1310 1.26 augustss /* Too many queued events, drop an old one. */ 1311 1.162 skrll DPRINTF("event dropped", 0, 0, 0, 0); 1312 1.183 riastrad #ifdef KDTRACE_HOOKS 1313 1.183 riastrad struct usb_event oue; 1314 1.183 riastrad if (usb_get_next_event(&oue)) 1315 1.183 riastrad SDT_PROBE1(usb, kernel, event, drop, &oue); 1316 1.183 riastrad #else 1317 1.183 riastrad usb_get_next_event(NULL); 1318 1.183 riastrad #endif 1319 1.26 augustss } 1320 1.26 augustss SIMPLEQ_INSERT_TAIL(&usb_events, ueq, next); 1321 1.130 mrg cv_signal(&usb_event_cv); 1322 1.107 rmind selnotify(&usb_selevent, 0, 0); 1323 1.199 riastrad if (atomic_load_relaxed(&usb_async_proc) != NULL) { 1324 1.130 mrg kpreempt_disable(); 1325 1.112 ad softint_schedule(usb_async_sih); 1326 1.130 mrg kpreempt_enable(); 1327 1.94 ad } 1328 1.130 mrg mutex_exit(&usb_event_lock); 1329 1.39 augustss } 1330 1.60 augustss 1331 1.112 ad Static void 1332 1.112 ad usb_async_intr(void *cookie) 1333 1.112 ad { 1334 1.112 ad proc_t *proc; 1335 1.112 ad 1336 1.184 ad mutex_enter(&proc_lock); 1337 1.199 riastrad if ((proc = atomic_load_relaxed(&usb_async_proc)) != NULL) 1338 1.112 ad psignal(proc, SIGIO); 1339 1.184 ad mutex_exit(&proc_lock); 1340 1.112 ad } 1341 1.112 ad 1342 1.130 mrg Static void 1343 1.130 mrg usb_soft_intr(void *arg) 1344 1.130 mrg { 1345 1.162 skrll struct usbd_bus *bus = arg; 1346 1.130 mrg 1347 1.162 skrll mutex_enter(bus->ub_lock); 1348 1.162 skrll bus->ub_methods->ubm_softint(bus); 1349 1.162 skrll mutex_exit(bus->ub_lock); 1350 1.130 mrg } 1351 1.130 mrg 1352 1.39 augustss void 1353 1.162 skrll usb_schedsoftintr(struct usbd_bus *bus) 1354 1.39 augustss { 1355 1.130 mrg 1356 1.180 mrg USBHIST_FUNC(); 1357 1.180 mrg USBHIST_CALLARGS(usbdebug, "polling=%jd", bus->ub_usepolling, 0, 0, 0); 1358 1.130 mrg 1359 1.173 mrg /* In case the bus never finished setting up. */ 1360 1.173 mrg if (__predict_false(bus->ub_soft == NULL)) 1361 1.173 mrg return; 1362 1.173 mrg 1363 1.162 skrll if (bus->ub_usepolling) { 1364 1.162 skrll bus->ub_methods->ubm_softint(bus); 1365 1.49 augustss } else { 1366 1.130 mrg kpreempt_disable(); 1367 1.162 skrll softint_schedule(bus->ub_soft); 1368 1.130 mrg kpreempt_enable(); 1369 1.49 augustss } 1370 1.26 augustss } 1371 1.26 augustss 1372 1.7 augustss int 1373 1.106 dyoung usb_activate(device_t self, enum devact act) 1374 1.7 augustss { 1375 1.106 dyoung struct usb_softc *sc = device_private(self); 1376 1.22 augustss 1377 1.22 augustss switch (act) { 1378 1.22 augustss case DVACT_DEACTIVATE: 1379 1.22 augustss sc->sc_dying = 1; 1380 1.119 dyoung return 0; 1381 1.119 dyoung default: 1382 1.119 dyoung return EOPNOTSUPP; 1383 1.22 augustss } 1384 1.13 augustss } 1385 1.7 augustss 1386 1.106 dyoung void 1387 1.106 dyoung usb_childdet(device_t self, device_t child) 1388 1.106 dyoung { 1389 1.114 drochner int i; 1390 1.106 dyoung struct usb_softc *sc = device_private(self); 1391 1.106 dyoung struct usbd_device *dev; 1392 1.106 dyoung 1393 1.162 skrll if ((dev = sc->sc_port.up_dev) == NULL || dev->ud_subdevlen == 0) 1394 1.106 dyoung return; 1395 1.106 dyoung 1396 1.162 skrll for (i = 0; i < dev->ud_subdevlen; i++) 1397 1.162 skrll if (dev->ud_subdevs[i] == child) 1398 1.162 skrll dev->ud_subdevs[i] = NULL; 1399 1.106 dyoung } 1400 1.106 dyoung 1401 1.13 augustss int 1402 1.106 dyoung usb_detach(device_t self, int flags) 1403 1.13 augustss { 1404 1.106 dyoung struct usb_softc *sc = device_private(self); 1405 1.87 christos struct usb_event *ue; 1406 1.119 dyoung int rc; 1407 1.22 augustss 1408 1.162 skrll USBHIST_FUNC(); USBHIST_CALLED(usbdebug); 1409 1.27 augustss 1410 1.119 dyoung /* Make all devices disconnect. */ 1411 1.162 skrll if (sc->sc_port.up_dev != NULL && 1412 1.119 dyoung (rc = usb_disconnect_port(&sc->sc_port, self, flags)) != 0) 1413 1.119 dyoung return rc; 1414 1.119 dyoung 1415 1.173 mrg if (sc->sc_pmf_registered) 1416 1.173 mrg pmf_device_deregister(self); 1417 1.99 kiyohara /* Kill off event thread. */ 1418 1.119 dyoung sc->sc_dying = 1; 1419 1.99 kiyohara while (sc->sc_event_thread != NULL) { 1420 1.162 skrll mutex_enter(sc->sc_bus->ub_lock); 1421 1.162 skrll cv_signal(&sc->sc_bus->ub_needsexplore_cv); 1422 1.162 skrll cv_timedwait(&sc->sc_bus->ub_needsexplore_cv, 1423 1.162 skrll sc->sc_bus->ub_lock, hz * 60); 1424 1.162 skrll mutex_exit(sc->sc_bus->ub_lock); 1425 1.162 skrll } 1426 1.162 skrll DPRINTF("event thread dead", 0, 0, 0, 0); 1427 1.162 skrll 1428 1.162 skrll if (sc->sc_bus->ub_soft != NULL) { 1429 1.162 skrll softint_disestablish(sc->sc_bus->ub_soft); 1430 1.162 skrll sc->sc_bus->ub_soft = NULL; 1431 1.49 augustss } 1432 1.38 augustss 1433 1.87 christos ue = usb_alloc_event(); 1434 1.109 drochner ue->u.ue_ctrlr.ue_bus = device_unit(self); 1435 1.87 christos usb_add_event(USB_EVENT_CTRLR_DETACH, ue); 1436 1.38 augustss 1437 1.162 skrll cv_destroy(&sc->sc_bus->ub_needsexplore_cv); 1438 1.200 riastrad cv_destroy(&sc->sc_bus->ub_rhxfercv); 1439 1.130 mrg 1440 1.162 skrll return 0; 1441 1.7 augustss } 1442