1 /* $NetBSD: ugen.c,v 1.173 2023/07/31 17:41:18 christos Exp $ */ 2 3 /* 4 * Copyright (c) 1998, 2004 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 * Copyright (c) 2006 BBN Technologies Corp. All rights reserved. 12 * Effort sponsored in part by the Defense Advanced Research Projects 13 * Agency (DARPA) and the Department of the Interior National Business 14 * Center under agreement number NBCHC050166. 15 * 16 * Redistribution and use in source and binary forms, with or without 17 * modification, are permitted provided that the following conditions 18 * are met: 19 * 1. Redistributions of source code must retain the above copyright 20 * notice, this list of conditions and the following disclaimer. 21 * 2. Redistributions in binary form must reproduce the above copyright 22 * notice, this list of conditions and the following disclaimer in the 23 * documentation and/or other materials provided with the distribution. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 26 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 27 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 28 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 35 * POSSIBILITY OF SUCH DAMAGE. 36 */ 37 38 39 #include <sys/cdefs.h> 40 __KERNEL_RCSID(0, "$NetBSD: ugen.c,v 1.173 2023/07/31 17:41:18 christos Exp $"); 41 42 #ifdef _KERNEL_OPT 43 #include "opt_compat_netbsd.h" 44 #include "opt_usb.h" 45 #endif 46 47 #include <sys/param.h> 48 #include <sys/systm.h> 49 #include <sys/kernel.h> 50 #include <sys/kmem.h> 51 #include <sys/device.h> 52 #include <sys/ioctl.h> 53 #include <sys/conf.h> 54 #include <sys/tty.h> 55 #include <sys/file.h> 56 #include <sys/select.h> 57 #include <sys/proc.h> 58 #include <sys/vnode.h> 59 #include <sys/poll.h> 60 #include <sys/compat_stub.h> 61 #include <sys/module.h> 62 #include <sys/rbtree.h> 63 64 #include <dev/usb/usb.h> 65 #include <dev/usb/usbdi.h> 66 #include <dev/usb/usbdi_util.h> 67 #include <dev/usb/usbhist.h> 68 69 #include "ioconf.h" 70 71 #ifdef USB_DEBUG 72 #ifndef UGEN_DEBUG 73 #define ugendebug 0 74 #else 75 76 #ifndef UGEN_DEBUG_DEFAULT 77 #define UGEN_DEBUG_DEFAULT 0 78 #endif 79 80 int ugendebug = UGEN_DEBUG_DEFAULT; 81 82 SYSCTL_SETUP(sysctl_hw_ugen_setup, "sysctl hw.ugen setup") 83 { 84 int err; 85 const struct sysctlnode *rnode; 86 const struct sysctlnode *cnode; 87 88 err = sysctl_createv(clog, 0, NULL, &rnode, 89 CTLFLAG_PERMANENT, CTLTYPE_NODE, "ugen", 90 SYSCTL_DESCR("ugen global controls"), 91 NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL); 92 93 if (err) 94 goto fail; 95 96 /* control debugging printfs */ 97 err = sysctl_createv(clog, 0, &rnode, &cnode, 98 CTLFLAG_PERMANENT|CTLFLAG_READWRITE, CTLTYPE_INT, 99 "debug", SYSCTL_DESCR("Enable debugging output"), 100 NULL, 0, &ugendebug, sizeof(ugendebug), CTL_CREATE, CTL_EOL); 101 if (err) 102 goto fail; 103 104 return; 105 fail: 106 aprint_error("%s: sysctl_createv failed (err = %d)\n", __func__, err); 107 } 108 109 #endif /* UGEN_DEBUG */ 110 #endif /* USB_DEBUG */ 111 112 #define DPRINTF(FMT,A,B,C,D) USBHIST_LOGN(ugendebug,1,FMT,A,B,C,D) 113 #define DPRINTFN(N,FMT,A,B,C,D) USBHIST_LOGN(ugendebug,N,FMT,A,B,C,D) 114 #define UGENHIST_FUNC() USBHIST_FUNC() 115 #define UGENHIST_CALLED(name) USBHIST_CALLED(ugendebug) 116 #define UGENHIST_CALLARGS(FMT,A,B,C,D) \ 117 USBHIST_CALLARGS(ugendebug,FMT,A,B,C,D) 118 #define UGENHIST_CALLARGSN(N,FMT,A,B,C,D) \ 119 USBHIST_CALLARGSN(ugendebug,N,FMT,A,B,C,D) 120 121 #define UGEN_CHUNK 128 /* chunk size for read */ 122 #define UGEN_IBSIZE 1020 /* buffer size */ 123 #define UGEN_BBSIZE 1024 124 125 #define UGEN_NISOREQS 4 /* number of outstanding xfer requests */ 126 #define UGEN_NISORFRMS 8 /* number of transactions per req */ 127 #define UGEN_NISOFRAMES (UGEN_NISORFRMS * UGEN_NISOREQS) 128 129 #define UGEN_BULK_RA_WB_BUFSIZE 16384 /* default buffer size */ 130 #define UGEN_BULK_RA_WB_BUFMAX (1 << 20) /* maximum allowed buffer */ 131 132 struct isoreq { 133 struct ugen_endpoint *sce; 134 struct usbd_xfer *xfer; 135 void *dmabuf; 136 uint16_t sizes[UGEN_NISORFRMS]; 137 }; 138 139 struct ugen_endpoint { 140 struct ugen_softc *sc; 141 usb_endpoint_descriptor_t *edesc; 142 struct usbd_interface *iface; 143 int state; 144 #define UGEN_SHORT_OK 0x04 /* short xfers are OK */ 145 #define UGEN_BULK_RA 0x08 /* in bulk read-ahead mode */ 146 #define UGEN_BULK_WB 0x10 /* in bulk write-behind mode */ 147 #define UGEN_RA_WB_STOP 0x20 /* RA/WB xfer is stopped (buffer full/empty) */ 148 struct usbd_pipe *pipeh; 149 struct clist q; 150 u_char *ibuf; /* start of buffer (circular for isoc) */ 151 u_char *fill; /* location for input (isoc) */ 152 u_char *limit; /* end of circular buffer (isoc) */ 153 u_char *cur; /* current read location (isoc) */ 154 uint32_t timeout; 155 uint32_t ra_wb_bufsize; /* requested size for RA/WB buffer */ 156 uint32_t ra_wb_reqsize; /* requested xfer length for RA/WB */ 157 uint32_t ra_wb_used; /* how much is in buffer */ 158 uint32_t ra_wb_xferlen; /* current xfer length for RA/WB */ 159 struct usbd_xfer *ra_wb_xfer; 160 struct isoreq isoreqs[UGEN_NISOREQS]; 161 /* Keep these last; we don't overwrite them in ugen_set_config() */ 162 #define UGEN_ENDPOINT_NONZERO_CRUFT offsetof(struct ugen_endpoint, rsel) 163 struct selinfo rsel; 164 kcondvar_t cv; 165 }; 166 167 struct ugen_softc { 168 device_t sc_dev; /* base device */ 169 struct usbd_device *sc_udev; 170 struct rb_node sc_node; 171 unsigned sc_unit; 172 173 kmutex_t sc_lock; 174 kcondvar_t sc_detach_cv; 175 176 char sc_is_open[USB_MAX_ENDPOINTS]; 177 struct ugen_endpoint sc_endpoints[USB_MAX_ENDPOINTS][2]; 178 #define OUT 0 179 #define IN 1 180 181 int sc_refcnt; 182 char sc_buffer[UGEN_BBSIZE]; 183 u_char sc_dying; 184 u_char sc_attached; 185 }; 186 187 static struct { 188 kmutex_t lock; 189 rb_tree_t tree; 190 } ugenif __cacheline_aligned; 191 192 static int 193 compare_ugen(void *cookie, const void *vsca, const void *vscb) 194 { 195 const struct ugen_softc *sca = vsca; 196 const struct ugen_softc *scb = vscb; 197 198 if (sca->sc_unit < scb->sc_unit) 199 return -1; 200 if (sca->sc_unit > scb->sc_unit) 201 return +1; 202 return 0; 203 } 204 205 static int 206 compare_ugen_key(void *cookie, const void *vsc, const void *vk) 207 { 208 const struct ugen_softc *sc = vsc; 209 const unsigned *k = vk; 210 211 if (sc->sc_unit < *k) 212 return -1; 213 if (sc->sc_unit > *k) 214 return +1; 215 return 0; 216 } 217 218 static const rb_tree_ops_t ugenif_tree_ops = { 219 .rbto_compare_nodes = compare_ugen, 220 .rbto_compare_key = compare_ugen_key, 221 .rbto_node_offset = offsetof(struct ugen_softc, sc_node), 222 }; 223 224 static void 225 ugenif_get_unit(struct ugen_softc *sc) 226 { 227 struct ugen_softc *sc0; 228 unsigned i; 229 230 mutex_enter(&ugenif.lock); 231 for (i = 0, sc0 = RB_TREE_MIN(&ugenif.tree); 232 sc0 != NULL && i == sc0->sc_unit; 233 i++, sc0 = RB_TREE_NEXT(&ugenif.tree, sc0)) 234 KASSERT(i < UINT_MAX); 235 KASSERT(rb_tree_find_node(&ugenif.tree, &i) == NULL); 236 sc->sc_unit = i; 237 sc0 = rb_tree_insert_node(&ugenif.tree, sc); 238 KASSERT(sc0 == sc); 239 KASSERT(rb_tree_find_node(&ugenif.tree, &i) == sc); 240 mutex_exit(&ugenif.lock); 241 } 242 243 static void 244 ugenif_put_unit(struct ugen_softc *sc) 245 { 246 247 mutex_enter(&ugenif.lock); 248 KASSERT(rb_tree_find_node(&ugenif.tree, &sc->sc_unit) == sc); 249 rb_tree_remove_node(&ugenif.tree, sc); 250 sc->sc_unit = -1; 251 mutex_exit(&ugenif.lock); 252 } 253 254 static struct ugen_softc * 255 ugenif_acquire(unsigned unit) 256 { 257 struct ugen_softc *sc; 258 259 mutex_enter(&ugenif.lock); 260 sc = rb_tree_find_node(&ugenif.tree, &unit); 261 if (sc == NULL) 262 goto out; 263 mutex_enter(&sc->sc_lock); 264 if (sc->sc_dying) { 265 mutex_exit(&sc->sc_lock); 266 sc = NULL; 267 goto out; 268 } 269 KASSERT(sc->sc_refcnt < INT_MAX); 270 sc->sc_refcnt++; 271 mutex_exit(&sc->sc_lock); 272 out: mutex_exit(&ugenif.lock); 273 274 return sc; 275 } 276 277 static void 278 ugenif_release(struct ugen_softc *sc) 279 { 280 281 mutex_enter(&sc->sc_lock); 282 if (--sc->sc_refcnt < 0) 283 cv_broadcast(&sc->sc_detach_cv); 284 mutex_exit(&sc->sc_lock); 285 } 286 287 static dev_type_open(ugenopen); 288 static dev_type_close(ugenclose); 289 static dev_type_read(ugenread); 290 static dev_type_write(ugenwrite); 291 static dev_type_ioctl(ugenioctl); 292 static dev_type_poll(ugenpoll); 293 static dev_type_kqfilter(ugenkqfilter); 294 295 const struct cdevsw ugen_cdevsw = { 296 .d_open = ugenopen, 297 .d_close = ugenclose, 298 .d_read = ugenread, 299 .d_write = ugenwrite, 300 .d_ioctl = ugenioctl, 301 .d_stop = nostop, 302 .d_tty = notty, 303 .d_poll = ugenpoll, 304 .d_mmap = nommap, 305 .d_kqfilter = ugenkqfilter, 306 .d_discard = nodiscard, 307 .d_flag = D_OTHER, 308 }; 309 310 Static void ugenintr(struct usbd_xfer *, void *, 311 usbd_status); 312 Static void ugen_isoc_rintr(struct usbd_xfer *, void *, 313 usbd_status); 314 Static void ugen_bulkra_intr(struct usbd_xfer *, void *, 315 usbd_status); 316 Static void ugen_bulkwb_intr(struct usbd_xfer *, void *, 317 usbd_status); 318 Static int ugen_do_read(struct ugen_softc *, int, struct uio *, int); 319 Static int ugen_do_write(struct ugen_softc *, int, struct uio *, int); 320 Static int ugen_do_ioctl(struct ugen_softc *, int, u_long, 321 void *, int, struct lwp *); 322 Static int ugen_set_config(struct ugen_softc *, int, int); 323 Static usb_config_descriptor_t *ugen_get_cdesc(struct ugen_softc *, 324 int, int *); 325 Static usbd_status ugen_set_interface(struct ugen_softc *, int, int); 326 Static int ugen_get_alt_index(struct ugen_softc *, int); 327 Static void ugen_clear_endpoints(struct ugen_softc *); 328 329 #define UGENUNIT(n) ((minor(n) >> 4) & 0xf) 330 #define UGENENDPOINT(n) (minor(n) & 0xf) 331 #define UGENDEV(u, e) (makedev(0, ((u) << 4) | (e))) 332 333 static int ugenif_match(device_t, cfdata_t, void *); 334 static void ugenif_attach(device_t, device_t, void *); 335 static int ugen_match(device_t, cfdata_t, void *); 336 static void ugen_attach(device_t, device_t, void *); 337 static int ugen_detach(device_t, int); 338 static int ugen_activate(device_t, enum devact); 339 340 CFATTACH_DECL_NEW(ugen, sizeof(struct ugen_softc), ugen_match, 341 ugen_attach, ugen_detach, ugen_activate); 342 CFATTACH_DECL_NEW(ugenif, sizeof(struct ugen_softc), ugenif_match, 343 ugenif_attach, ugen_detach, ugen_activate); 344 345 /* toggle to control attach priority. -1 means "let autoconf decide" */ 346 int ugen_override = -1; 347 348 static int 349 ugen_match(device_t parent, cfdata_t match, void *aux) 350 { 351 struct usb_attach_arg *uaa = aux; 352 int override; 353 354 if (ugen_override != -1) 355 override = ugen_override; 356 else 357 override = match->cf_flags & 1; 358 359 if (override) 360 return UMATCH_HIGHEST; 361 else if (uaa->uaa_usegeneric) 362 return UMATCH_GENERIC; 363 else 364 return UMATCH_NONE; 365 } 366 367 static int 368 ugenif_match(device_t parent, cfdata_t match, void *aux) 369 { 370 /* Assume that they knew what they configured! (see ugenif(4)) */ 371 return UMATCH_HIGHEST; 372 } 373 374 static void 375 ugen_attach(device_t parent, device_t self, void *aux) 376 { 377 struct usb_attach_arg *uaa = aux; 378 struct usbif_attach_arg uiaa; 379 380 memset(&uiaa, 0, sizeof(uiaa)); 381 uiaa.uiaa_port = uaa->uaa_port; 382 uiaa.uiaa_vendor = uaa->uaa_vendor; 383 uiaa.uiaa_product = uaa->uaa_product; 384 uiaa.uiaa_release = uaa->uaa_release; 385 uiaa.uiaa_device = uaa->uaa_device; 386 uiaa.uiaa_configno = -1; 387 uiaa.uiaa_ifaceno = -1; 388 389 ugenif_attach(parent, self, &uiaa); 390 } 391 392 static void 393 ugenif_attach(device_t parent, device_t self, void *aux) 394 { 395 struct ugen_softc *sc = device_private(self); 396 struct usbif_attach_arg *uiaa = aux; 397 struct usbd_device *udev; 398 char *devinfop; 399 usbd_status err; 400 int i, dir, conf; 401 402 aprint_naive("\n"); 403 aprint_normal("\n"); 404 405 mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTUSB); 406 cv_init(&sc->sc_detach_cv, "ugendet"); 407 408 devinfop = usbd_devinfo_alloc(uiaa->uiaa_device, 0); 409 aprint_normal_dev(self, "%s\n", devinfop); 410 usbd_devinfo_free(devinfop); 411 412 sc->sc_dev = self; 413 sc->sc_udev = udev = uiaa->uiaa_device; 414 415 for (i = 0; i < USB_MAX_ENDPOINTS; i++) { 416 for (dir = OUT; dir <= IN; dir++) { 417 struct ugen_endpoint *sce; 418 419 sce = &sc->sc_endpoints[i][dir]; 420 selinit(&sce->rsel); 421 cv_init(&sce->cv, "ugensce"); 422 } 423 } 424 425 if (!pmf_device_register(self, NULL, NULL)) 426 aprint_error_dev(self, "couldn't establish power handler\n"); 427 428 if (uiaa->uiaa_ifaceno < 0) { 429 /* 430 * If we attach the whole device, 431 * set configuration index 0, the default one. 432 */ 433 err = usbd_set_config_index(udev, 0, 0); 434 if (err) { 435 aprint_error_dev(self, 436 "setting configuration index 0 failed\n"); 437 return; 438 } 439 } 440 441 /* Get current configuration */ 442 conf = usbd_get_config_descriptor(udev)->bConfigurationValue; 443 444 /* Set up all the local state for this configuration. */ 445 err = ugen_set_config(sc, conf, uiaa->uiaa_ifaceno < 0); 446 if (err) { 447 aprint_error_dev(self, "setting configuration %d failed\n", 448 conf); 449 return; 450 } 451 452 ugenif_get_unit(sc); 453 usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, sc->sc_udev, sc->sc_dev); 454 sc->sc_attached = 1; 455 } 456 457 Static void 458 ugen_clear_endpoints(struct ugen_softc *sc) 459 { 460 461 /* Clear out the old info, but leave the selinfo and cv initialised. */ 462 for (int i = 0; i < USB_MAX_ENDPOINTS; i++) { 463 for (int dir = OUT; dir <= IN; dir++) { 464 struct ugen_endpoint *sce = &sc->sc_endpoints[i][dir]; 465 memset(sce, 0, UGEN_ENDPOINT_NONZERO_CRUFT); 466 } 467 } 468 } 469 470 Static int 471 ugen_set_config(struct ugen_softc *sc, int configno, int chkopen) 472 { 473 struct usbd_device *dev = sc->sc_udev; 474 usb_config_descriptor_t *cdesc; 475 struct usbd_interface *iface; 476 usb_endpoint_descriptor_t *ed; 477 struct ugen_endpoint *sce; 478 uint8_t niface, nendpt; 479 int ifaceno, endptno, endpt; 480 usbd_status err; 481 int dir; 482 483 UGENHIST_FUNC(); 484 UGENHIST_CALLARGSN(1, "ugen%jd: to configno %jd, sc=%jx", 485 device_unit(sc->sc_dev), configno, (uintptr_t)sc, 0); 486 487 KASSERT(KERNEL_LOCKED_P()); /* sc_is_open */ 488 489 if (chkopen) { 490 /* 491 * We start at 1, not 0, because we don't care whether the 492 * control endpoint is open or not. It is always present. 493 */ 494 for (endptno = 1; endptno < USB_MAX_ENDPOINTS; endptno++) 495 if (sc->sc_is_open[endptno]) { 496 DPRINTFN(1, 497 "ugen%jd - endpoint %d is open", 498 device_unit(sc->sc_dev), endptno, 0, 0); 499 return USBD_IN_USE; 500 } 501 502 /* Prevent opening while we're setting the config. */ 503 for (endptno = 1; endptno < USB_MAX_ENDPOINTS; endptno++) { 504 KASSERT(!sc->sc_is_open[endptno]); 505 sc->sc_is_open[endptno] = 1; 506 } 507 } 508 509 /* Avoid setting the current value. */ 510 cdesc = usbd_get_config_descriptor(dev); 511 if (!cdesc || cdesc->bConfigurationValue != configno) { 512 err = usbd_set_config_no(dev, configno, 1); 513 if (err) 514 goto out; 515 } 516 517 ugen_clear_endpoints(sc); 518 519 err = usbd_interface_count(dev, &niface); 520 if (err) 521 goto out; 522 523 for (ifaceno = 0; ifaceno < niface; ifaceno++) { 524 DPRINTFN(1, "ifaceno %jd", ifaceno, 0, 0, 0); 525 err = usbd_device2interface_handle(dev, ifaceno, &iface); 526 if (err) 527 goto out; 528 err = usbd_endpoint_count(iface, &nendpt); 529 if (err) 530 goto out; 531 for (endptno = 0; endptno < nendpt; endptno++) { 532 ed = usbd_interface2endpoint_descriptor(iface,endptno); 533 KASSERT(ed != NULL); 534 endpt = ed->bEndpointAddress; 535 dir = UE_GET_DIR(endpt) == UE_DIR_IN ? IN : OUT; 536 sce = &sc->sc_endpoints[UE_GET_ADDR(endpt)][dir]; 537 DPRINTFN(1, "endptno %jd, endpt=0x%02jx (%jd,%jd)", 538 endptno, endpt, UE_GET_ADDR(endpt), 539 UE_GET_DIR(endpt)); 540 sce->sc = sc; 541 sce->edesc = ed; 542 sce->iface = iface; 543 } 544 } 545 err = USBD_NORMAL_COMPLETION; 546 547 out: if (chkopen) { 548 /* 549 * Allow open again now that we're done trying to set 550 * the config. 551 */ 552 for (endptno = 1; endptno < USB_MAX_ENDPOINTS; endptno++) { 553 KASSERT(sc->sc_is_open[endptno]); 554 sc->sc_is_open[endptno] = 0; 555 } 556 } 557 return err; 558 } 559 560 static int 561 ugenopen(dev_t dev, int flag, int mode, struct lwp *l) 562 { 563 struct ugen_softc *sc; 564 int unit = UGENUNIT(dev); 565 int endpt = UGENENDPOINT(dev); 566 usb_endpoint_descriptor_t *edesc; 567 struct ugen_endpoint *sce; 568 int dir, isize; 569 usbd_status err; 570 struct usbd_xfer *xfer; 571 int i, j; 572 int error; 573 int opened = 0; 574 575 UGENHIST_FUNC(); 576 UGENHIST_CALLARGS("flag=%jd, mode=%jd, unit=%jd endpt=%jd", 577 flag, mode, unit, endpt); 578 579 KASSERT(KERNEL_LOCKED_P()); /* sc_is_open */ 580 581 if ((sc = ugenif_acquire(unit)) == NULL) 582 return ENXIO; 583 584 /* The control endpoint allows multiple opens. */ 585 if (endpt == USB_CONTROL_ENDPOINT) { 586 opened = sc->sc_is_open[USB_CONTROL_ENDPOINT] = 1; 587 error = 0; 588 goto out; 589 } 590 591 if (sc->sc_is_open[endpt]) { 592 error = EBUSY; 593 goto out; 594 } 595 opened = sc->sc_is_open[endpt] = 1; 596 597 /* Make sure there are pipes for all directions. */ 598 for (dir = OUT; dir <= IN; dir++) { 599 if (flag & (dir == OUT ? FWRITE : FREAD)) { 600 sce = &sc->sc_endpoints[endpt][dir]; 601 if (sce->edesc == NULL) { 602 error = ENXIO; 603 goto out; 604 } 605 } 606 } 607 608 /* Actually open the pipes. */ 609 /* XXX Should back out properly if it fails. */ 610 for (dir = OUT; dir <= IN; dir++) { 611 if (!(flag & (dir == OUT ? FWRITE : FREAD))) 612 continue; 613 sce = &sc->sc_endpoints[endpt][dir]; 614 sce->state = 0; 615 sce->timeout = USBD_NO_TIMEOUT; 616 DPRINTFN(5, "sc=%jx, endpt=%jd, dir=%jd, sce=%jp", 617 (uintptr_t)sc, endpt, dir, (uintptr_t)sce); 618 edesc = sce->edesc; 619 switch (edesc->bmAttributes & UE_XFERTYPE) { 620 case UE_INTERRUPT: 621 if (dir == OUT) { 622 err = usbd_open_pipe(sce->iface, 623 edesc->bEndpointAddress, 0, &sce->pipeh); 624 if (err) { 625 error = EIO; 626 goto out; 627 } 628 break; 629 } 630 isize = UGETW(edesc->wMaxPacketSize); 631 if (isize == 0) { /* shouldn't happen */ 632 error = EINVAL; 633 goto out; 634 } 635 sce->ibuf = kmem_alloc(isize, KM_SLEEP); 636 DPRINTFN(5, "intr endpt=%d, isize=%d", 637 endpt, isize, 0, 0); 638 if (clalloc(&sce->q, UGEN_IBSIZE, 0) == -1) { 639 kmem_free(sce->ibuf, isize); 640 sce->ibuf = NULL; 641 error = ENOMEM; 642 goto out; 643 } 644 err = usbd_open_pipe_intr(sce->iface, 645 edesc->bEndpointAddress, 646 USBD_SHORT_XFER_OK, &sce->pipeh, sce, 647 sce->ibuf, isize, ugenintr, 648 USBD_DEFAULT_INTERVAL); 649 if (err) { 650 clfree(&sce->q); 651 kmem_free(sce->ibuf, isize); 652 sce->ibuf = NULL; 653 error = EIO; 654 goto out; 655 } 656 DPRINTFN(5, "interrupt open done", 0, 0, 0, 0); 657 break; 658 case UE_BULK: 659 err = usbd_open_pipe(sce->iface, 660 edesc->bEndpointAddress, 0, &sce->pipeh); 661 if (err) { 662 error = EIO; 663 goto out; 664 } 665 sce->ra_wb_bufsize = UGEN_BULK_RA_WB_BUFSIZE; 666 /* 667 * Use request size for non-RA/WB transfers 668 * as the default. 669 */ 670 sce->ra_wb_reqsize = UGEN_BBSIZE; 671 break; 672 case UE_ISOCHRONOUS: 673 if (dir == OUT) { 674 error = EINVAL; 675 goto out; 676 } 677 isize = UGETW(edesc->wMaxPacketSize); 678 if (isize == 0) { /* shouldn't happen */ 679 error = EINVAL; 680 goto out; 681 } 682 sce->ibuf = kmem_alloc(isize * UGEN_NISOFRAMES, 683 KM_SLEEP); 684 sce->cur = sce->fill = sce->ibuf; 685 sce->limit = sce->ibuf + isize * UGEN_NISOFRAMES; 686 DPRINTFN(5, "isoc endpt=%d, isize=%d", 687 endpt, isize, 0, 0); 688 err = usbd_open_pipe(sce->iface, 689 edesc->bEndpointAddress, 0, &sce->pipeh); 690 if (err) { 691 kmem_free(sce->ibuf, isize * UGEN_NISOFRAMES); 692 sce->ibuf = NULL; 693 error = EIO; 694 goto out; 695 } 696 for (i = 0; i < UGEN_NISOREQS; ++i) { 697 sce->isoreqs[i].sce = sce; 698 err = usbd_create_xfer(sce->pipeh, 699 isize * UGEN_NISORFRMS, 0, UGEN_NISORFRMS, 700 &xfer); 701 if (err) 702 goto bad; 703 sce->isoreqs[i].xfer = xfer; 704 sce->isoreqs[i].dmabuf = usbd_get_buffer(xfer); 705 for (j = 0; j < UGEN_NISORFRMS; ++j) 706 sce->isoreqs[i].sizes[j] = isize; 707 usbd_setup_isoc_xfer(xfer, &sce->isoreqs[i], 708 sce->isoreqs[i].sizes, UGEN_NISORFRMS, 0, 709 ugen_isoc_rintr); 710 (void)usbd_transfer(xfer); 711 } 712 DPRINTFN(5, "isoc open done", 0, 0, 0, 0); 713 break; 714 bad: 715 while (--i >= 0) { /* implicit buffer free */ 716 usbd_destroy_xfer(sce->isoreqs[i].xfer); 717 sce->isoreqs[i].xfer = NULL; 718 } 719 usbd_close_pipe(sce->pipeh); 720 sce->pipeh = NULL; 721 kmem_free(sce->ibuf, isize * UGEN_NISOFRAMES); 722 sce->ibuf = NULL; 723 error = ENOMEM; 724 goto out; 725 case UE_CONTROL: 726 sce->timeout = USBD_DEFAULT_TIMEOUT; 727 error = EINVAL; 728 goto out; 729 } 730 } 731 error = 0; 732 out: if (error && opened) 733 sc->sc_is_open[endpt] = 0; 734 ugenif_release(sc); 735 return error; 736 } 737 738 static void 739 ugen_do_close(struct ugen_softc *sc, int flag, int endpt) 740 { 741 struct ugen_endpoint *sce; 742 int dir; 743 int i; 744 745 UGENHIST_FUNC(); 746 UGENHIST_CALLARGS("flag=%jd endpt=%jd", flag, endpt, 0, 0); 747 748 KASSERT(KERNEL_LOCKED_P()); /* sc_is_open */ 749 750 if (!sc->sc_is_open[endpt]) 751 goto out; 752 753 if (endpt == USB_CONTROL_ENDPOINT) { 754 DPRINTFN(5, "close control", 0, 0, 0, 0); 755 goto out; 756 } 757 758 for (dir = OUT; dir <= IN; dir++) { 759 if (!(flag & (dir == OUT ? FWRITE : FREAD))) 760 continue; 761 sce = &sc->sc_endpoints[endpt][dir]; 762 if (sce->pipeh == NULL) 763 continue; 764 DPRINTFN(5, "endpt=%jd dir=%jd sce=%jx", 765 endpt, dir, (uintptr_t)sce, 0); 766 767 usbd_abort_pipe(sce->pipeh); 768 769 int isize = UGETW(sce->edesc->wMaxPacketSize); 770 int msize = 0; 771 772 switch (sce->edesc->bmAttributes & UE_XFERTYPE) { 773 case UE_INTERRUPT: 774 ndflush(&sce->q, sce->q.c_cc); 775 clfree(&sce->q); 776 msize = isize; 777 break; 778 case UE_ISOCHRONOUS: 779 for (i = 0; i < UGEN_NISOREQS; ++i) { 780 usbd_destroy_xfer(sce->isoreqs[i].xfer); 781 sce->isoreqs[i].xfer = NULL; 782 } 783 msize = isize * UGEN_NISOFRAMES; 784 break; 785 case UE_BULK: 786 if (sce->state & (UGEN_BULK_RA | UGEN_BULK_WB)) { 787 usbd_destroy_xfer(sce->ra_wb_xfer); 788 sce->ra_wb_xfer = NULL; 789 msize = sce->ra_wb_bufsize; 790 } 791 break; 792 default: 793 break; 794 } 795 usbd_close_pipe(sce->pipeh); 796 sce->pipeh = NULL; 797 if (sce->ibuf != NULL) { 798 kmem_free(sce->ibuf, msize); 799 sce->ibuf = NULL; 800 } 801 } 802 803 out: sc->sc_is_open[endpt] = 0; 804 for (dir = OUT; dir <= IN; dir++) { 805 sce = &sc->sc_endpoints[endpt][dir]; 806 KASSERT(sce->pipeh == NULL); 807 KASSERT(sce->ibuf == NULL); 808 KASSERT(sce->ra_wb_xfer == NULL); 809 for (i = 0; i < UGEN_NISOREQS; i++) 810 KASSERT(sce->isoreqs[i].xfer == NULL); 811 } 812 } 813 814 static int 815 ugenclose(dev_t dev, int flag, int mode, struct lwp *l) 816 { 817 int endpt = UGENENDPOINT(dev); 818 struct ugen_softc *sc; 819 820 UGENHIST_FUNC(); 821 UGENHIST_CALLARGS("flag=%jd, mode=%jd, unit=%jd, endpt=%jd", 822 flag, mode, UGENUNIT(dev), endpt); 823 824 KASSERT(KERNEL_LOCKED_P()); /* ugen_do_close */ 825 826 if ((sc = ugenif_acquire(UGENUNIT(dev))) == NULL) 827 return ENXIO; 828 829 KASSERT(sc->sc_is_open[endpt]); 830 ugen_do_close(sc, flag, endpt); 831 KASSERT(!sc->sc_is_open[endpt]); 832 833 ugenif_release(sc); 834 835 return 0; 836 } 837 838 Static int 839 ugen_do_read(struct ugen_softc *sc, int endpt, struct uio *uio, int flag) 840 { 841 struct ugen_endpoint *sce = &sc->sc_endpoints[endpt][IN]; 842 uint32_t n, tn; 843 struct usbd_xfer *xfer; 844 usbd_status err; 845 int error = 0; 846 847 UGENHIST_FUNC(); 848 UGENHIST_CALLARGS("ugen%d: %jd", device_unit(sc->sc_dev), endpt, 0, 0); 849 850 if (endpt == USB_CONTROL_ENDPOINT) 851 return ENODEV; 852 853 KASSERT(sce->edesc); 854 KASSERT(sce->pipeh); 855 856 switch (sce->edesc->bmAttributes & UE_XFERTYPE) { 857 case UE_INTERRUPT: 858 /* Block until activity occurred. */ 859 mutex_enter(&sc->sc_lock); 860 while (sce->q.c_cc == 0) { 861 if (flag & IO_NDELAY) { 862 mutex_exit(&sc->sc_lock); 863 return EWOULDBLOCK; 864 } 865 DPRINTFN(5, "sleep on %jx", (uintptr_t)sce, 0, 0, 0); 866 /* "ugenri" */ 867 error = cv_timedwait_sig(&sce->cv, &sc->sc_lock, 868 mstohz(sce->timeout)); 869 DPRINTFN(5, "woke, error=%jd", 870 error, 0, 0, 0); 871 if (sc->sc_dying) 872 error = EIO; 873 if (error) 874 break; 875 } 876 mutex_exit(&sc->sc_lock); 877 878 /* Transfer as many chunks as possible. */ 879 while (sce->q.c_cc > 0 && uio->uio_resid > 0 && !error) { 880 n = uimin(sce->q.c_cc, uio->uio_resid); 881 if (n > sizeof(sc->sc_buffer)) 882 n = sizeof(sc->sc_buffer); 883 884 /* Remove a small chunk from the input queue. */ 885 q_to_b(&sce->q, sc->sc_buffer, n); 886 DPRINTFN(5, "got %jd chars", n, 0, 0, 0); 887 888 /* Copy the data to the user process. */ 889 error = uiomove(sc->sc_buffer, n, uio); 890 if (error) 891 break; 892 } 893 break; 894 case UE_BULK: 895 if (sce->state & UGEN_BULK_RA) { 896 DPRINTFN(5, "BULK_RA req: %zd used: %d", 897 uio->uio_resid, sce->ra_wb_used, 0, 0); 898 xfer = sce->ra_wb_xfer; 899 900 mutex_enter(&sc->sc_lock); 901 if (sce->ra_wb_used == 0 && flag & IO_NDELAY) { 902 mutex_exit(&sc->sc_lock); 903 return EWOULDBLOCK; 904 } 905 while (uio->uio_resid > 0 && !error) { 906 while (sce->ra_wb_used == 0) { 907 DPRINTFN(5, "sleep on %jx", 908 (uintptr_t)sce, 0, 0, 0); 909 /* "ugenrb" */ 910 error = cv_timedwait_sig(&sce->cv, 911 &sc->sc_lock, mstohz(sce->timeout)); 912 DPRINTFN(5, "woke, error=%jd", 913 error, 0, 0, 0); 914 if (sc->sc_dying) 915 error = EIO; 916 if (error) 917 break; 918 } 919 920 /* Copy data to the process. */ 921 while (uio->uio_resid > 0 922 && sce->ra_wb_used > 0) { 923 n = uimin(uio->uio_resid, 924 sce->ra_wb_used); 925 n = uimin(n, sce->limit - sce->cur); 926 error = uiomove(sce->cur, n, uio); 927 if (error) 928 break; 929 sce->cur += n; 930 sce->ra_wb_used -= n; 931 if (sce->cur == sce->limit) 932 sce->cur = sce->ibuf; 933 } 934 935 /* 936 * If the transfers stopped because the 937 * buffer was full, restart them. 938 */ 939 if (sce->state & UGEN_RA_WB_STOP && 940 sce->ra_wb_used < sce->limit - sce->ibuf) { 941 n = (sce->limit - sce->ibuf) 942 - sce->ra_wb_used; 943 usbd_setup_xfer(xfer, sce, NULL, 944 uimin(n, sce->ra_wb_xferlen), 945 0, USBD_NO_TIMEOUT, 946 ugen_bulkra_intr); 947 sce->state &= ~UGEN_RA_WB_STOP; 948 err = usbd_transfer(xfer); 949 if (err != USBD_IN_PROGRESS) 950 /* 951 * The transfer has not been 952 * queued. Setting STOP 953 * will make us try 954 * again at the next read. 955 */ 956 sce->state |= UGEN_RA_WB_STOP; 957 } 958 } 959 mutex_exit(&sc->sc_lock); 960 break; 961 } 962 error = usbd_create_xfer(sce->pipeh, UGEN_BBSIZE, 963 0, 0, &xfer); 964 if (error) 965 return error; 966 while ((n = uimin(UGEN_BBSIZE, uio->uio_resid)) != 0) { 967 DPRINTFN(1, "start transfer %jd bytes", n, 0, 0, 0); 968 tn = n; 969 err = usbd_bulk_transfer(xfer, sce->pipeh, 970 sce->state & UGEN_SHORT_OK ? USBD_SHORT_XFER_OK : 0, 971 sce->timeout, sc->sc_buffer, &tn); 972 if (err) { 973 if (err == USBD_INTERRUPTED) 974 error = EINTR; 975 else if (err == USBD_TIMEOUT) 976 error = ETIMEDOUT; 977 else 978 error = EIO; 979 break; 980 } 981 DPRINTFN(1, "got %jd bytes", tn, 0, 0, 0); 982 error = uiomove(sc->sc_buffer, tn, uio); 983 if (error || tn < n) 984 break; 985 } 986 usbd_destroy_xfer(xfer); 987 break; 988 case UE_ISOCHRONOUS: 989 mutex_enter(&sc->sc_lock); 990 while (sce->cur == sce->fill) { 991 if (flag & IO_NDELAY) { 992 mutex_exit(&sc->sc_lock); 993 return EWOULDBLOCK; 994 } 995 /* "ugenri" */ 996 DPRINTFN(5, "sleep on %jx", (uintptr_t)sce, 0, 0, 0); 997 error = cv_timedwait_sig(&sce->cv, &sc->sc_lock, 998 mstohz(sce->timeout)); 999 DPRINTFN(5, "woke, error=%jd", error, 0, 0, 0); 1000 if (sc->sc_dying) 1001 error = EIO; 1002 if (error) 1003 break; 1004 } 1005 1006 while (sce->cur != sce->fill && uio->uio_resid > 0 && !error) { 1007 if(sce->fill > sce->cur) 1008 n = uimin(sce->fill - sce->cur, uio->uio_resid); 1009 else 1010 n = uimin(sce->limit - sce->cur, uio->uio_resid); 1011 1012 DPRINTFN(5, "isoc got %jd chars", n, 0, 0, 0); 1013 1014 /* Copy the data to the user process. */ 1015 error = uiomove(sce->cur, n, uio); 1016 if (error) 1017 break; 1018 sce->cur += n; 1019 if (sce->cur >= sce->limit) 1020 sce->cur = sce->ibuf; 1021 } 1022 mutex_exit(&sc->sc_lock); 1023 break; 1024 1025 1026 default: 1027 return ENXIO; 1028 } 1029 return error; 1030 } 1031 1032 static int 1033 ugenread(dev_t dev, struct uio *uio, int flag) 1034 { 1035 int endpt = UGENENDPOINT(dev); 1036 struct ugen_softc *sc; 1037 int error; 1038 1039 if ((sc = ugenif_acquire(UGENUNIT(dev))) == NULL) 1040 return ENXIO; 1041 error = ugen_do_read(sc, endpt, uio, flag); 1042 ugenif_release(sc); 1043 1044 return error; 1045 } 1046 1047 Static int 1048 ugen_do_write(struct ugen_softc *sc, int endpt, struct uio *uio, 1049 int flag) 1050 { 1051 struct ugen_endpoint *sce = &sc->sc_endpoints[endpt][OUT]; 1052 uint32_t n; 1053 int error = 0; 1054 uint32_t tn; 1055 char *dbuf; 1056 struct usbd_xfer *xfer; 1057 usbd_status err; 1058 1059 UGENHIST_FUNC(); 1060 UGENHIST_CALLARGSN(5, "ugen%jd: %jd", 1061 device_unit(sc->sc_dev), endpt, 0, 0); 1062 1063 if (endpt == USB_CONTROL_ENDPOINT) 1064 return ENODEV; 1065 1066 KASSERT(sce->edesc); 1067 KASSERT(sce->pipeh); 1068 1069 switch (sce->edesc->bmAttributes & UE_XFERTYPE) { 1070 case UE_BULK: 1071 if (sce->state & UGEN_BULK_WB) { 1072 DPRINTFN(5, "BULK_WB req: %jd used: %jd", 1073 uio->uio_resid, sce->ra_wb_used, 0, 0); 1074 xfer = sce->ra_wb_xfer; 1075 1076 mutex_enter(&sc->sc_lock); 1077 if (sce->ra_wb_used == sce->limit - sce->ibuf && 1078 flag & IO_NDELAY) { 1079 mutex_exit(&sc->sc_lock); 1080 return EWOULDBLOCK; 1081 } 1082 while (uio->uio_resid > 0 && !error) { 1083 while (sce->ra_wb_used == 1084 sce->limit - sce->ibuf) { 1085 DPRINTFN(5, "sleep on %#jx", 1086 (uintptr_t)sce, 0, 0, 0); 1087 /* "ugenwb" */ 1088 error = cv_timedwait_sig(&sce->cv, 1089 &sc->sc_lock, mstohz(sce->timeout)); 1090 DPRINTFN(5, "woke, error=%d", 1091 error, 0, 0, 0); 1092 if (sc->sc_dying) 1093 error = EIO; 1094 if (error) 1095 break; 1096 } 1097 1098 /* Copy data from the process. */ 1099 while (uio->uio_resid > 0 && 1100 sce->ra_wb_used < sce->limit - sce->ibuf) { 1101 n = uimin(uio->uio_resid, 1102 (sce->limit - sce->ibuf) 1103 - sce->ra_wb_used); 1104 n = uimin(n, sce->limit - sce->fill); 1105 error = uiomove(sce->fill, n, uio); 1106 if (error) 1107 break; 1108 sce->fill += n; 1109 sce->ra_wb_used += n; 1110 if (sce->fill == sce->limit) 1111 sce->fill = sce->ibuf; 1112 } 1113 1114 /* 1115 * If the transfers stopped because the 1116 * buffer was empty, restart them. 1117 */ 1118 if (sce->state & UGEN_RA_WB_STOP && 1119 sce->ra_wb_used > 0) { 1120 dbuf = (char *)usbd_get_buffer(xfer); 1121 n = uimin(sce->ra_wb_used, 1122 sce->ra_wb_xferlen); 1123 tn = uimin(n, sce->limit - sce->cur); 1124 memcpy(dbuf, sce->cur, tn); 1125 dbuf += tn; 1126 if (n - tn > 0) 1127 memcpy(dbuf, sce->ibuf, 1128 n - tn); 1129 usbd_setup_xfer(xfer, sce, NULL, n, 1130 0, USBD_NO_TIMEOUT, 1131 ugen_bulkwb_intr); 1132 sce->state &= ~UGEN_RA_WB_STOP; 1133 err = usbd_transfer(xfer); 1134 if (err != USBD_IN_PROGRESS) 1135 /* 1136 * The transfer has not been 1137 * queued. Setting STOP 1138 * will make us try again 1139 * at the next read. 1140 */ 1141 sce->state |= UGEN_RA_WB_STOP; 1142 } 1143 } 1144 mutex_exit(&sc->sc_lock); 1145 break; 1146 } 1147 error = usbd_create_xfer(sce->pipeh, UGEN_BBSIZE, 1148 0, 0, &xfer); 1149 if (error) 1150 return error; 1151 while ((n = uimin(UGEN_BBSIZE, uio->uio_resid)) != 0) { 1152 error = uiomove(sc->sc_buffer, n, uio); 1153 if (error) 1154 break; 1155 DPRINTFN(1, "transfer %jd bytes", n, 0, 0, 0); 1156 err = usbd_bulk_transfer(xfer, sce->pipeh, 0, sce->timeout, 1157 sc->sc_buffer, &n); 1158 if (err) { 1159 if (err == USBD_INTERRUPTED) 1160 error = EINTR; 1161 else if (err == USBD_TIMEOUT) 1162 error = ETIMEDOUT; 1163 else 1164 error = EIO; 1165 break; 1166 } 1167 } 1168 usbd_destroy_xfer(xfer); 1169 break; 1170 case UE_INTERRUPT: 1171 error = usbd_create_xfer(sce->pipeh, 1172 UGETW(sce->edesc->wMaxPacketSize), 0, 0, &xfer); 1173 if (error) 1174 return error; 1175 while ((n = uimin(UGETW(sce->edesc->wMaxPacketSize), 1176 uio->uio_resid)) != 0) { 1177 error = uiomove(sc->sc_buffer, n, uio); 1178 if (error) 1179 break; 1180 DPRINTFN(1, "transfer %jd bytes", n, 0, 0, 0); 1181 err = usbd_intr_transfer(xfer, sce->pipeh, 0, 1182 sce->timeout, sc->sc_buffer, &n); 1183 if (err) { 1184 if (err == USBD_INTERRUPTED) 1185 error = EINTR; 1186 else if (err == USBD_TIMEOUT) 1187 error = ETIMEDOUT; 1188 else 1189 error = EIO; 1190 break; 1191 } 1192 } 1193 usbd_destroy_xfer(xfer); 1194 break; 1195 default: 1196 return ENXIO; 1197 } 1198 return error; 1199 } 1200 1201 static int 1202 ugenwrite(dev_t dev, struct uio *uio, int flag) 1203 { 1204 int endpt = UGENENDPOINT(dev); 1205 struct ugen_softc *sc; 1206 int error; 1207 1208 if ((sc = ugenif_acquire(UGENUNIT(dev))) == NULL) 1209 return ENXIO; 1210 error = ugen_do_write(sc, endpt, uio, flag); 1211 ugenif_release(sc); 1212 1213 return error; 1214 } 1215 1216 static int 1217 ugen_activate(device_t self, enum devact act) 1218 { 1219 struct ugen_softc *sc = device_private(self); 1220 1221 switch (act) { 1222 case DVACT_DEACTIVATE: 1223 sc->sc_dying = 1; 1224 return 0; 1225 default: 1226 return EOPNOTSUPP; 1227 } 1228 } 1229 1230 static int 1231 ugen_detach(device_t self, int flags) 1232 { 1233 struct ugen_softc *sc = device_private(self); 1234 struct ugen_endpoint *sce; 1235 int i, dir; 1236 int maj, mn; 1237 1238 UGENHIST_FUNC(); 1239 UGENHIST_CALLARGS("sc=%ju flags=%ju", (uintptr_t)sc, flags, 0, 0); 1240 1241 KASSERT(KERNEL_LOCKED_P()); /* sc_is_open */ 1242 1243 /* 1244 * Fail if we're not forced to detach and userland has any 1245 * endpoints open. 1246 */ 1247 if ((flags & DETACH_FORCE) == 0) { 1248 for (i = 0; i < USB_MAX_ENDPOINTS; i++) { 1249 if (sc->sc_is_open[i]) 1250 return EBUSY; 1251 } 1252 } 1253 1254 /* Prevent new users. Prevent suspend/resume. */ 1255 sc->sc_dying = 1; 1256 pmf_device_deregister(self); 1257 1258 /* 1259 * If we never finished attaching, skip nixing endpoints and 1260 * users because there aren't any. 1261 */ 1262 if (!sc->sc_attached) 1263 goto out; 1264 1265 /* Abort all pipes. */ 1266 for (i = 0; i < USB_MAX_ENDPOINTS; i++) { 1267 for (dir = OUT; dir <= IN; dir++) { 1268 sce = &sc->sc_endpoints[i][dir]; 1269 if (sce->pipeh) 1270 usbd_abort_pipe(sce->pipeh); 1271 } 1272 } 1273 1274 /* 1275 * Wait for users to drain. Before this point there can be no 1276 * more I/O operations started because we set sc_dying; after 1277 * this, there can be no more I/O operations in progress, so it 1278 * will be safe to free things. 1279 */ 1280 mutex_enter(&sc->sc_lock); 1281 if (--sc->sc_refcnt >= 0) { 1282 /* Wake everyone */ 1283 for (i = 0; i < USB_MAX_ENDPOINTS; i++) { 1284 for (dir = OUT; dir <= IN; dir++) 1285 cv_broadcast(&sc->sc_endpoints[i][dir].cv); 1286 } 1287 /* Wait for processes to go away. */ 1288 do { 1289 cv_wait(&sc->sc_detach_cv, &sc->sc_lock); 1290 } while (sc->sc_refcnt >= 0); 1291 } 1292 mutex_exit(&sc->sc_lock); 1293 1294 /* locate the major number */ 1295 maj = cdevsw_lookup_major(&ugen_cdevsw); 1296 1297 /* 1298 * Nuke the vnodes for any open instances (calls ugenclose, but 1299 * with no effect because we already set sc_dying). 1300 */ 1301 mn = sc->sc_unit * USB_MAX_ENDPOINTS; 1302 vdevgone(maj, mn, mn + USB_MAX_ENDPOINTS - 1, VCHR); 1303 1304 /* Actually close any lingering pipes. */ 1305 for (i = 0; i < USB_MAX_ENDPOINTS; i++) 1306 ugen_do_close(sc, FREAD|FWRITE, i); 1307 1308 usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev, sc->sc_dev); 1309 ugenif_put_unit(sc); 1310 1311 out: for (i = 0; i < USB_MAX_ENDPOINTS; i++) { 1312 for (dir = OUT; dir <= IN; dir++) { 1313 sce = &sc->sc_endpoints[i][dir]; 1314 seldestroy(&sce->rsel); 1315 cv_destroy(&sce->cv); 1316 } 1317 } 1318 1319 cv_destroy(&sc->sc_detach_cv); 1320 mutex_destroy(&sc->sc_lock); 1321 1322 return 0; 1323 } 1324 1325 Static void 1326 ugenintr(struct usbd_xfer *xfer, void *addr, usbd_status status) 1327 { 1328 struct ugen_endpoint *sce = addr; 1329 struct ugen_softc *sc = sce->sc; 1330 uint32_t count; 1331 u_char *ibuf; 1332 1333 UGENHIST_FUNC(); 1334 UGENHIST_CALLARGS("xfer %jx status %d", (uintptr_t)xfer, status, 0, 0); 1335 1336 if (status == USBD_CANCELLED) 1337 return; 1338 1339 if (status != USBD_NORMAL_COMPLETION) { 1340 DPRINTF("status=%jd", status, 0, 0, 0); 1341 if (status == USBD_STALLED) 1342 usbd_clear_endpoint_stall_async(sce->pipeh); 1343 return; 1344 } 1345 1346 usbd_get_xfer_status(xfer, NULL, NULL, &count, NULL); 1347 ibuf = sce->ibuf; 1348 1349 DPRINTFN(5, "xfer=%#jx status=%d count=%d", 1350 (uintptr_t)xfer, status, count, 0); 1351 DPRINTFN(5, " data = %02x %02x %02x", 1352 ibuf[0], ibuf[1], ibuf[2], 0); 1353 1354 mutex_enter(&sc->sc_lock); 1355 (void)b_to_q(ibuf, count, &sce->q); 1356 cv_signal(&sce->cv); 1357 mutex_exit(&sc->sc_lock); 1358 selnotify(&sce->rsel, 0, 0); 1359 } 1360 1361 Static void 1362 ugen_isoc_rintr(struct usbd_xfer *xfer, void *addr, 1363 usbd_status status) 1364 { 1365 struct isoreq *req = addr; 1366 struct ugen_endpoint *sce = req->sce; 1367 struct ugen_softc *sc = sce->sc; 1368 uint32_t count, n; 1369 int i, isize; 1370 1371 UGENHIST_FUNC(); 1372 UGENHIST_CALLARGS("xfer=%jx status=%jd", (uintptr_t)xfer, status, 0, 0); 1373 1374 /* Return if we are aborting. */ 1375 if (status == USBD_CANCELLED) 1376 return; 1377 1378 usbd_get_xfer_status(xfer, NULL, NULL, &count, NULL); 1379 DPRINTFN(5, "xfer %ld, count=%d", 1380 (long)(req - sce->isoreqs), count, 0, 0); 1381 1382 mutex_enter(&sc->sc_lock); 1383 1384 /* throw away oldest input if the buffer is full */ 1385 if (sce->fill < sce->cur && sce->cur <= sce->fill + count) { 1386 sce->cur += count; 1387 if (sce->cur >= sce->limit) 1388 sce->cur = sce->ibuf + (sce->limit - sce->cur); 1389 DPRINTFN(5, "throwing away %jd bytes", 1390 count, 0, 0, 0); 1391 } 1392 1393 isize = UGETW(sce->edesc->wMaxPacketSize); 1394 for (i = 0; i < UGEN_NISORFRMS; i++) { 1395 uint32_t actlen = req->sizes[i]; 1396 char const *tbuf = (char const *)req->dmabuf + isize * i; 1397 1398 /* copy data to buffer */ 1399 while (actlen > 0) { 1400 n = uimin(actlen, sce->limit - sce->fill); 1401 memcpy(sce->fill, tbuf, n); 1402 1403 tbuf += n; 1404 actlen -= n; 1405 sce->fill += n; 1406 if (sce->fill == sce->limit) 1407 sce->fill = sce->ibuf; 1408 } 1409 1410 /* setup size for next transfer */ 1411 req->sizes[i] = isize; 1412 } 1413 1414 usbd_setup_isoc_xfer(xfer, req, req->sizes, UGEN_NISORFRMS, 0, 1415 ugen_isoc_rintr); 1416 (void)usbd_transfer(xfer); 1417 1418 cv_signal(&sce->cv); 1419 mutex_exit(&sc->sc_lock); 1420 selnotify(&sce->rsel, 0, 0); 1421 } 1422 1423 Static void 1424 ugen_bulkra_intr(struct usbd_xfer *xfer, void *addr, 1425 usbd_status status) 1426 { 1427 struct ugen_endpoint *sce = addr; 1428 struct ugen_softc *sc = sce->sc; 1429 uint32_t count, n; 1430 char const *tbuf; 1431 usbd_status err; 1432 1433 UGENHIST_FUNC(); 1434 UGENHIST_CALLARGS("xfer=%jx status=%jd", (uintptr_t)xfer, status, 0, 0); 1435 1436 /* Return if we are aborting. */ 1437 if (status == USBD_CANCELLED) 1438 return; 1439 1440 if (status != USBD_NORMAL_COMPLETION) { 1441 DPRINTF("status=%jd", status, 0, 0, 0); 1442 sce->state |= UGEN_RA_WB_STOP; 1443 if (status == USBD_STALLED) 1444 usbd_clear_endpoint_stall_async(sce->pipeh); 1445 return; 1446 } 1447 1448 usbd_get_xfer_status(xfer, NULL, NULL, &count, NULL); 1449 1450 mutex_enter(&sc->sc_lock); 1451 1452 /* Keep track of how much is in the buffer. */ 1453 sce->ra_wb_used += count; 1454 1455 /* Copy data to buffer. */ 1456 tbuf = (char const *)usbd_get_buffer(sce->ra_wb_xfer); 1457 n = uimin(count, sce->limit - sce->fill); 1458 memcpy(sce->fill, tbuf, n); 1459 tbuf += n; 1460 count -= n; 1461 sce->fill += n; 1462 if (sce->fill == sce->limit) 1463 sce->fill = sce->ibuf; 1464 if (count > 0) { 1465 memcpy(sce->fill, tbuf, count); 1466 sce->fill += count; 1467 } 1468 1469 /* Set up the next request if necessary. */ 1470 n = (sce->limit - sce->ibuf) - sce->ra_wb_used; 1471 if (n > 0) { 1472 usbd_setup_xfer(xfer, sce, NULL, uimin(n, sce->ra_wb_xferlen), 0, 1473 USBD_NO_TIMEOUT, ugen_bulkra_intr); 1474 err = usbd_transfer(xfer); 1475 if (err != USBD_IN_PROGRESS) { 1476 printf("error=%d", err); 1477 /* 1478 * The transfer has not been queued. Setting STOP 1479 * will make us try again at the next read. 1480 */ 1481 sce->state |= UGEN_RA_WB_STOP; 1482 } 1483 } 1484 else 1485 sce->state |= UGEN_RA_WB_STOP; 1486 1487 cv_signal(&sce->cv); 1488 mutex_exit(&sc->sc_lock); 1489 selnotify(&sce->rsel, 0, 0); 1490 } 1491 1492 Static void 1493 ugen_bulkwb_intr(struct usbd_xfer *xfer, void *addr, 1494 usbd_status status) 1495 { 1496 struct ugen_endpoint *sce = addr; 1497 struct ugen_softc *sc = sce->sc; 1498 uint32_t count, n; 1499 char *tbuf; 1500 usbd_status err; 1501 1502 UGENHIST_FUNC(); 1503 UGENHIST_CALLARGS("xfer=%jx status=%jd", (uintptr_t)xfer, status, 0, 0); 1504 1505 /* Return if we are aborting. */ 1506 if (status == USBD_CANCELLED) 1507 return; 1508 1509 if (status != USBD_NORMAL_COMPLETION) { 1510 DPRINTF("status=%jd", status, 0, 0, 0); 1511 sce->state |= UGEN_RA_WB_STOP; 1512 if (status == USBD_STALLED) 1513 usbd_clear_endpoint_stall_async(sce->pipeh); 1514 return; 1515 } 1516 1517 usbd_get_xfer_status(xfer, NULL, NULL, &count, NULL); 1518 1519 mutex_enter(&sc->sc_lock); 1520 1521 /* Keep track of how much is in the buffer. */ 1522 sce->ra_wb_used -= count; 1523 1524 /* Update buffer pointers. */ 1525 sce->cur += count; 1526 if (sce->cur >= sce->limit) 1527 sce->cur = sce->ibuf + (sce->cur - sce->limit); 1528 1529 /* Set up next request if necessary. */ 1530 if (sce->ra_wb_used > 0) { 1531 /* copy data from buffer */ 1532 tbuf = (char *)usbd_get_buffer(sce->ra_wb_xfer); 1533 count = uimin(sce->ra_wb_used, sce->ra_wb_xferlen); 1534 n = uimin(count, sce->limit - sce->cur); 1535 memcpy(tbuf, sce->cur, n); 1536 tbuf += n; 1537 if (count - n > 0) 1538 memcpy(tbuf, sce->ibuf, count - n); 1539 1540 usbd_setup_xfer(xfer, sce, NULL, count, 0, USBD_NO_TIMEOUT, 1541 ugen_bulkwb_intr); 1542 err = usbd_transfer(xfer); 1543 if (err != USBD_IN_PROGRESS) { 1544 printf("error=%d", err); 1545 /* 1546 * The transfer has not been queued. Setting STOP 1547 * will make us try again at the next write. 1548 */ 1549 sce->state |= UGEN_RA_WB_STOP; 1550 } 1551 } 1552 else 1553 sce->state |= UGEN_RA_WB_STOP; 1554 1555 cv_signal(&sce->cv); 1556 mutex_exit(&sc->sc_lock); 1557 selnotify(&sce->rsel, 0, 0); 1558 } 1559 1560 Static usbd_status 1561 ugen_set_interface(struct ugen_softc *sc, int ifaceidx, int altno) 1562 { 1563 struct usbd_interface *iface; 1564 usb_endpoint_descriptor_t *ed; 1565 usbd_status err; 1566 struct ugen_endpoint *sce; 1567 uint8_t niface, nendpt, endptno, endpt; 1568 int dir; 1569 1570 UGENHIST_FUNC(); 1571 UGENHIST_CALLARGSN(15, "ifaceidx=%jd altno=%jd", ifaceidx, altno, 0, 0); 1572 1573 err = usbd_interface_count(sc->sc_udev, &niface); 1574 if (err) 1575 return err; 1576 if (ifaceidx < 0 || ifaceidx >= niface) 1577 return USBD_INVAL; 1578 1579 err = usbd_device2interface_handle(sc->sc_udev, ifaceidx, &iface); 1580 if (err) 1581 return err; 1582 err = usbd_endpoint_count(iface, &nendpt); 1583 if (err) 1584 return err; 1585 1586 /* change setting */ 1587 err = usbd_set_interface(iface, altno); 1588 if (err) 1589 return err; 1590 1591 err = usbd_endpoint_count(iface, &nendpt); 1592 if (err) 1593 return err; 1594 1595 ugen_clear_endpoints(sc); 1596 1597 for (endptno = 0; endptno < nendpt; endptno++) { 1598 ed = usbd_interface2endpoint_descriptor(iface,endptno); 1599 KASSERT(ed != NULL); 1600 endpt = ed->bEndpointAddress; 1601 dir = UE_GET_DIR(endpt) == UE_DIR_IN ? IN : OUT; 1602 sce = &sc->sc_endpoints[UE_GET_ADDR(endpt)][dir]; 1603 sce->sc = sc; 1604 sce->edesc = ed; 1605 sce->iface = iface; 1606 } 1607 return 0; 1608 } 1609 1610 /* Retrieve a complete descriptor for a certain device and index. */ 1611 Static usb_config_descriptor_t * 1612 ugen_get_cdesc(struct ugen_softc *sc, int index, int *lenp) 1613 { 1614 usb_config_descriptor_t *cdesc = NULL, *tdesc, cdescr; 1615 int len = 0; 1616 usbd_status err; 1617 1618 UGENHIST_FUNC(); UGENHIST_CALLARGS("index=%jd", index, 0, 0, 0); 1619 1620 switch (index) { 1621 case USB_CURRENT_CONFIG_INDEX: 1622 tdesc = usbd_get_config_descriptor(sc->sc_udev); 1623 if (tdesc == NULL) 1624 break; 1625 len = UGETW(tdesc->wTotalLength); 1626 cdesc = kmem_alloc(len, KM_SLEEP); 1627 memcpy(cdesc, tdesc, len); 1628 break; 1629 default: 1630 err = usbd_get_config_desc(sc->sc_udev, index, &cdescr); 1631 if (err) 1632 break; 1633 len = UGETW(cdescr.wTotalLength); 1634 cdesc = kmem_alloc(len, KM_SLEEP); 1635 err = usbd_get_config_desc_full(sc->sc_udev, index, cdesc, len); 1636 if (err) { 1637 kmem_free(cdesc, len); 1638 cdesc = NULL; 1639 } 1640 break; 1641 } 1642 DPRINTFN(5, "req len=%jd cdesc=%jx", len, (uintptr_t)cdesc, 0, 0); 1643 if (cdesc && lenp) 1644 *lenp = len; 1645 return cdesc; 1646 } 1647 1648 Static int 1649 ugen_get_alt_index(struct ugen_softc *sc, int ifaceidx) 1650 { 1651 struct usbd_interface *iface; 1652 usbd_status err; 1653 1654 err = usbd_device2interface_handle(sc->sc_udev, ifaceidx, &iface); 1655 if (err) 1656 return -1; 1657 return usbd_get_interface_altindex(iface); 1658 } 1659 1660 Static int 1661 ugen_do_ioctl(struct ugen_softc *sc, int endpt, u_long cmd, 1662 void *addr, int flag, struct lwp *l) 1663 { 1664 struct ugen_endpoint *sce; 1665 usbd_status err; 1666 struct usbd_interface *iface; 1667 struct usb_config_desc *cd; 1668 usb_config_descriptor_t *cdesc; 1669 struct usb_interface_desc *id; 1670 usb_interface_descriptor_t *idesc; 1671 struct usb_endpoint_desc *ed; 1672 usb_endpoint_descriptor_t *edesc; 1673 struct usb_alt_interface *ai; 1674 struct usb_string_desc *si; 1675 uint8_t conf, alt; 1676 int cdesclen; 1677 int error; 1678 int dir; 1679 1680 UGENHIST_FUNC(); 1681 UGENHIST_CALLARGS("ugen%d: endpt=%ju cmd=%08jx flag=%jx", 1682 device_unit(sc->sc_dev), endpt, cmd, flag); 1683 1684 KASSERT(KERNEL_LOCKED_P()); /* ugen_set_config */ 1685 1686 switch (cmd) { 1687 case FIONBIO: 1688 /* All handled in the upper FS layer. */ 1689 return 0; 1690 case USB_SET_SHORT_XFER: 1691 if (endpt == USB_CONTROL_ENDPOINT) 1692 return EINVAL; 1693 /* This flag only affects read */ 1694 sce = &sc->sc_endpoints[endpt][IN]; 1695 if (sce == NULL || sce->pipeh == NULL) 1696 return EINVAL; 1697 if (*(int *)addr) 1698 sce->state |= UGEN_SHORT_OK; 1699 else 1700 sce->state &= ~UGEN_SHORT_OK; 1701 DPRINTFN(5, "pipe=%jx short xfer=%ju", 1702 (uintptr_t)sce->pipeh, sce->state & UGEN_SHORT_OK, 0, 0); 1703 return 0; 1704 case USB_SET_TIMEOUT: 1705 for (dir = OUT; dir <= IN; dir++) { 1706 sce = &sc->sc_endpoints[endpt][dir]; 1707 if (sce == NULL) 1708 return EINVAL; 1709 1710 sce->timeout = *(int *)addr; 1711 DPRINTFN(5, "pipe=%jx timeout[dir=%ju] timeout=%ju", 1712 (uintptr_t)sce->pipeh, dir, sce->timeout, 0); 1713 } 1714 return 0; 1715 case USB_SET_BULK_RA: 1716 if (endpt == USB_CONTROL_ENDPOINT) 1717 return EINVAL; 1718 sce = &sc->sc_endpoints[endpt][IN]; 1719 if (sce == NULL || sce->pipeh == NULL) 1720 return EINVAL; 1721 edesc = sce->edesc; 1722 if ((edesc->bmAttributes & UE_XFERTYPE) != UE_BULK) 1723 return EINVAL; 1724 1725 if (*(int *)addr) { 1726 /* Only turn RA on if it's currently off. */ 1727 if (sce->state & UGEN_BULK_RA) 1728 return 0; 1729 KASSERT(sce->ra_wb_xfer == NULL); 1730 KASSERT(sce->ibuf == NULL); 1731 1732 if (sce->ra_wb_bufsize == 0 || sce->ra_wb_reqsize == 0) 1733 /* shouldn't happen */ 1734 return EINVAL; 1735 error = usbd_create_xfer(sce->pipeh, 1736 sce->ra_wb_reqsize, 0, 0, &sce->ra_wb_xfer); 1737 if (error) 1738 return error; 1739 sce->ra_wb_xferlen = sce->ra_wb_reqsize; 1740 sce->ibuf = kmem_alloc(sce->ra_wb_bufsize, KM_SLEEP); 1741 sce->fill = sce->cur = sce->ibuf; 1742 sce->limit = sce->ibuf + sce->ra_wb_bufsize; 1743 sce->ra_wb_used = 0; 1744 sce->state |= UGEN_BULK_RA; 1745 sce->state &= ~UGEN_RA_WB_STOP; 1746 /* Now start reading. */ 1747 usbd_setup_xfer(sce->ra_wb_xfer, sce, NULL, 1748 uimin(sce->ra_wb_xferlen, sce->ra_wb_bufsize), 1749 0, USBD_NO_TIMEOUT, ugen_bulkra_intr); 1750 err = usbd_transfer(sce->ra_wb_xfer); 1751 if (err != USBD_IN_PROGRESS) { 1752 sce->state &= ~UGEN_BULK_RA; 1753 kmem_free(sce->ibuf, sce->ra_wb_bufsize); 1754 sce->ibuf = NULL; 1755 usbd_destroy_xfer(sce->ra_wb_xfer); 1756 sce->ra_wb_xfer = NULL; 1757 return EIO; 1758 } 1759 } else { 1760 /* Only turn RA off if it's currently on. */ 1761 if (!(sce->state & UGEN_BULK_RA)) 1762 return 0; 1763 1764 sce->state &= ~UGEN_BULK_RA; 1765 usbd_abort_pipe(sce->pipeh); 1766 usbd_destroy_xfer(sce->ra_wb_xfer); 1767 sce->ra_wb_xfer = NULL; 1768 /* 1769 * XXX Discard whatever's in the buffer, but we 1770 * should keep it around and drain the buffer 1771 * instead. 1772 */ 1773 kmem_free(sce->ibuf, sce->ra_wb_bufsize); 1774 sce->ibuf = NULL; 1775 } 1776 return 0; 1777 case USB_SET_BULK_WB: 1778 if (endpt == USB_CONTROL_ENDPOINT) 1779 return EINVAL; 1780 sce = &sc->sc_endpoints[endpt][OUT]; 1781 if (sce == NULL || sce->pipeh == NULL) 1782 return EINVAL; 1783 edesc = sce->edesc; 1784 if ((edesc->bmAttributes & UE_XFERTYPE) != UE_BULK) 1785 return EINVAL; 1786 1787 if (*(int *)addr) { 1788 /* Only turn WB on if it's currently off. */ 1789 if (sce->state & UGEN_BULK_WB) 1790 return 0; 1791 KASSERT(sce->ra_wb_xfer == NULL); 1792 KASSERT(sce->ibuf == NULL); 1793 1794 if (sce->ra_wb_bufsize == 0 || sce->ra_wb_reqsize == 0) 1795 /* shouldn't happen */ 1796 return EINVAL; 1797 error = usbd_create_xfer(sce->pipeh, sce->ra_wb_reqsize, 1798 0, 0, &sce->ra_wb_xfer); 1799 /* XXX check error??? */ 1800 sce->ra_wb_xferlen = sce->ra_wb_reqsize; 1801 sce->ibuf = kmem_alloc(sce->ra_wb_bufsize, KM_SLEEP); 1802 sce->fill = sce->cur = sce->ibuf; 1803 sce->limit = sce->ibuf + sce->ra_wb_bufsize; 1804 sce->ra_wb_used = 0; 1805 sce->state |= UGEN_BULK_WB | UGEN_RA_WB_STOP; 1806 } else { 1807 /* Only turn WB off if it's currently on. */ 1808 if (!(sce->state & UGEN_BULK_WB)) 1809 return 0; 1810 1811 sce->state &= ~UGEN_BULK_WB; 1812 /* 1813 * XXX Discard whatever's in the buffer, but we 1814 * should keep it around and keep writing to 1815 * drain the buffer instead. 1816 */ 1817 usbd_abort_pipe(sce->pipeh); 1818 usbd_destroy_xfer(sce->ra_wb_xfer); 1819 sce->ra_wb_xfer = NULL; 1820 kmem_free(sce->ibuf, sce->ra_wb_bufsize); 1821 sce->ibuf = NULL; 1822 } 1823 return 0; 1824 case USB_SET_BULK_RA_OPT: 1825 case USB_SET_BULK_WB_OPT: 1826 { 1827 struct usb_bulk_ra_wb_opt *opt; 1828 1829 if (endpt == USB_CONTROL_ENDPOINT) 1830 return EINVAL; 1831 opt = (struct usb_bulk_ra_wb_opt *)addr; 1832 if (cmd == USB_SET_BULK_RA_OPT) 1833 sce = &sc->sc_endpoints[endpt][IN]; 1834 else 1835 sce = &sc->sc_endpoints[endpt][OUT]; 1836 if (sce == NULL || sce->pipeh == NULL) 1837 return EINVAL; 1838 if (opt->ra_wb_buffer_size < 1 || 1839 opt->ra_wb_buffer_size > UGEN_BULK_RA_WB_BUFMAX || 1840 opt->ra_wb_request_size < 1 || 1841 opt->ra_wb_request_size > opt->ra_wb_buffer_size) 1842 return EINVAL; 1843 /* 1844 * XXX These changes do not take effect until the 1845 * next time RA/WB mode is enabled but they ought to 1846 * take effect immediately. 1847 */ 1848 sce->ra_wb_bufsize = opt->ra_wb_buffer_size; 1849 sce->ra_wb_reqsize = opt->ra_wb_request_size; 1850 return 0; 1851 } 1852 default: 1853 break; 1854 } 1855 1856 if (endpt != USB_CONTROL_ENDPOINT) 1857 return EINVAL; 1858 1859 switch (cmd) { 1860 #ifdef UGEN_DEBUG 1861 case USB_SETDEBUG: 1862 ugendebug = *(int *)addr; 1863 break; 1864 #endif 1865 case USB_GET_CONFIG: 1866 err = usbd_get_config(sc->sc_udev, &conf); 1867 if (err) 1868 return EIO; 1869 *(int *)addr = conf; 1870 break; 1871 case USB_SET_CONFIG: 1872 if (!(flag & FWRITE)) 1873 return EPERM; 1874 err = ugen_set_config(sc, *(int *)addr, 1); 1875 switch (err) { 1876 case USBD_NORMAL_COMPLETION: 1877 break; 1878 case USBD_IN_USE: 1879 return EBUSY; 1880 default: 1881 return EIO; 1882 } 1883 break; 1884 case USB_GET_ALTINTERFACE: 1885 ai = (struct usb_alt_interface *)addr; 1886 err = usbd_device2interface_handle(sc->sc_udev, 1887 ai->uai_interface_index, &iface); 1888 if (err) 1889 return EINVAL; 1890 idesc = usbd_get_interface_descriptor(iface); 1891 if (idesc == NULL) 1892 return EIO; 1893 ai->uai_alt_no = idesc->bAlternateSetting; 1894 break; 1895 case USB_SET_ALTINTERFACE: 1896 if (!(flag & FWRITE)) 1897 return EPERM; 1898 ai = (struct usb_alt_interface *)addr; 1899 err = usbd_device2interface_handle(sc->sc_udev, 1900 ai->uai_interface_index, &iface); 1901 if (err) 1902 return EINVAL; 1903 err = ugen_set_interface(sc, ai->uai_interface_index, 1904 ai->uai_alt_no); 1905 if (err) 1906 return EINVAL; 1907 break; 1908 case USB_GET_NO_ALT: 1909 ai = (struct usb_alt_interface *)addr; 1910 cdesc = ugen_get_cdesc(sc, ai->uai_config_index, &cdesclen); 1911 if (cdesc == NULL) 1912 return EINVAL; 1913 idesc = usbd_find_idesc(cdesc, ai->uai_interface_index, 0); 1914 if (idesc == NULL) { 1915 kmem_free(cdesc, cdesclen); 1916 return EINVAL; 1917 } 1918 ai->uai_alt_no = usbd_get_no_alts(cdesc, 1919 idesc->bInterfaceNumber); 1920 kmem_free(cdesc, cdesclen); 1921 break; 1922 case USB_GET_DEVICE_DESC: 1923 *(usb_device_descriptor_t *)addr = 1924 *usbd_get_device_descriptor(sc->sc_udev); 1925 break; 1926 case USB_GET_CONFIG_DESC: 1927 cd = (struct usb_config_desc *)addr; 1928 cdesc = ugen_get_cdesc(sc, cd->ucd_config_index, &cdesclen); 1929 if (cdesc == NULL) 1930 return EINVAL; 1931 cd->ucd_desc = *cdesc; 1932 kmem_free(cdesc, cdesclen); 1933 break; 1934 case USB_GET_INTERFACE_DESC: 1935 id = (struct usb_interface_desc *)addr; 1936 cdesc = ugen_get_cdesc(sc, id->uid_config_index, &cdesclen); 1937 if (cdesc == NULL) 1938 return EINVAL; 1939 if (id->uid_config_index == USB_CURRENT_CONFIG_INDEX && 1940 id->uid_alt_index == USB_CURRENT_ALT_INDEX) 1941 alt = ugen_get_alt_index(sc, id->uid_interface_index); 1942 else 1943 alt = id->uid_alt_index; 1944 idesc = usbd_find_idesc(cdesc, id->uid_interface_index, alt); 1945 if (idesc == NULL) { 1946 kmem_free(cdesc, cdesclen); 1947 return EINVAL; 1948 } 1949 id->uid_desc = *idesc; 1950 kmem_free(cdesc, cdesclen); 1951 break; 1952 case USB_GET_ENDPOINT_DESC: 1953 ed = (struct usb_endpoint_desc *)addr; 1954 cdesc = ugen_get_cdesc(sc, ed->ued_config_index, &cdesclen); 1955 if (cdesc == NULL) 1956 return EINVAL; 1957 if (ed->ued_config_index == USB_CURRENT_CONFIG_INDEX && 1958 ed->ued_alt_index == USB_CURRENT_ALT_INDEX) 1959 alt = ugen_get_alt_index(sc, ed->ued_interface_index); 1960 else 1961 alt = ed->ued_alt_index; 1962 edesc = usbd_find_edesc(cdesc, ed->ued_interface_index, 1963 alt, ed->ued_endpoint_index); 1964 if (edesc == NULL) { 1965 kmem_free(cdesc, cdesclen); 1966 return EINVAL; 1967 } 1968 ed->ued_desc = *edesc; 1969 kmem_free(cdesc, cdesclen); 1970 break; 1971 case USB_GET_FULL_DESC: 1972 { 1973 int len; 1974 struct iovec iov; 1975 struct uio uio; 1976 struct usb_full_desc *fd = (struct usb_full_desc *)addr; 1977 1978 cdesc = ugen_get_cdesc(sc, fd->ufd_config_index, &cdesclen); 1979 if (cdesc == NULL) 1980 return EINVAL; 1981 len = cdesclen; 1982 if (len > fd->ufd_size) 1983 len = fd->ufd_size; 1984 iov.iov_base = (void *)fd->ufd_data; 1985 iov.iov_len = len; 1986 uio.uio_iov = &iov; 1987 uio.uio_iovcnt = 1; 1988 uio.uio_resid = len; 1989 uio.uio_offset = 0; 1990 uio.uio_rw = UIO_READ; 1991 uio.uio_vmspace = l->l_proc->p_vmspace; 1992 error = uiomove((void *)cdesc, len, &uio); 1993 kmem_free(cdesc, cdesclen); 1994 return error; 1995 } 1996 case USB_GET_STRING_DESC: { 1997 int len; 1998 si = (struct usb_string_desc *)addr; 1999 err = usbd_get_string_desc(sc->sc_udev, si->usd_string_index, 2000 si->usd_language_id, &si->usd_desc, &len); 2001 if (err) 2002 return EINVAL; 2003 break; 2004 } 2005 case USB_DO_REQUEST: 2006 { 2007 struct usb_ctl_request *ur = (void *)addr; 2008 int len = UGETW(ur->ucr_request.wLength); 2009 struct iovec iov; 2010 struct uio uio; 2011 void *ptr = 0; 2012 usbd_status xerr; 2013 2014 error = 0; 2015 2016 if (!(flag & FWRITE)) 2017 return EPERM; 2018 /* Avoid requests that would damage the bus integrity. */ 2019 if ((ur->ucr_request.bmRequestType == UT_WRITE_DEVICE && 2020 ur->ucr_request.bRequest == UR_SET_ADDRESS) || 2021 (ur->ucr_request.bmRequestType == UT_WRITE_DEVICE && 2022 ur->ucr_request.bRequest == UR_SET_CONFIG) || 2023 (ur->ucr_request.bmRequestType == UT_WRITE_INTERFACE && 2024 ur->ucr_request.bRequest == UR_SET_INTERFACE)) 2025 return EINVAL; 2026 2027 if (len < 0 || len > 32767) 2028 return EINVAL; 2029 if (len != 0) { 2030 iov.iov_base = (void *)ur->ucr_data; 2031 iov.iov_len = len; 2032 uio.uio_iov = &iov; 2033 uio.uio_iovcnt = 1; 2034 uio.uio_resid = len; 2035 uio.uio_offset = 0; 2036 uio.uio_rw = 2037 ur->ucr_request.bmRequestType & UT_READ ? 2038 UIO_READ : UIO_WRITE; 2039 uio.uio_vmspace = l->l_proc->p_vmspace; 2040 ptr = kmem_alloc(len, KM_SLEEP); 2041 if (uio.uio_rw == UIO_WRITE) { 2042 error = uiomove(ptr, len, &uio); 2043 if (error) 2044 goto ret; 2045 } 2046 } 2047 sce = &sc->sc_endpoints[endpt][IN]; 2048 xerr = usbd_do_request_flags(sc->sc_udev, &ur->ucr_request, 2049 ptr, ur->ucr_flags, &ur->ucr_actlen, sce->timeout); 2050 if (xerr) { 2051 error = EIO; 2052 goto ret; 2053 } 2054 if (len != 0) { 2055 if (uio.uio_rw == UIO_READ) { 2056 size_t alen = uimin(len, ur->ucr_actlen); 2057 error = uiomove(ptr, alen, &uio); 2058 if (error) 2059 goto ret; 2060 } 2061 } 2062 ret: 2063 if (ptr) 2064 kmem_free(ptr, len); 2065 return error; 2066 } 2067 case USB_GET_DEVICEINFO: 2068 usbd_fill_deviceinfo(sc->sc_udev, 2069 (struct usb_device_info *)addr, 0); 2070 break; 2071 case USB_GET_DEVICEINFO_30: 2072 { 2073 int ret; 2074 MODULE_HOOK_CALL(usb_subr_fill_30_hook, 2075 (sc->sc_udev, (struct usb_device_info30 *)addr, 0, 2076 usbd_devinfo_vp, usbd_printBCD), 2077 enosys(), ret); 2078 if (ret == 0) 2079 return 0; 2080 return EINVAL; 2081 } 2082 default: 2083 return EINVAL; 2084 } 2085 return 0; 2086 } 2087 2088 static int 2089 ugenioctl(dev_t dev, u_long cmd, void *addr, int flag, struct lwp *l) 2090 { 2091 int endpt = UGENENDPOINT(dev); 2092 struct ugen_softc *sc; 2093 int error; 2094 2095 if ((sc = ugenif_acquire(UGENUNIT(dev))) == 0) 2096 return ENXIO; 2097 error = ugen_do_ioctl(sc, endpt, cmd, addr, flag, l); 2098 ugenif_release(sc); 2099 2100 return error; 2101 } 2102 2103 static int 2104 ugenpoll(dev_t dev, int events, struct lwp *l) 2105 { 2106 struct ugen_softc *sc; 2107 struct ugen_endpoint *sce_in, *sce_out; 2108 int revents = 0; 2109 2110 if ((sc = ugenif_acquire(UGENUNIT(dev))) == NULL) 2111 return POLLHUP; 2112 2113 if (UGENENDPOINT(dev) == USB_CONTROL_ENDPOINT) { 2114 revents |= POLLERR; 2115 goto out; 2116 } 2117 2118 sce_in = &sc->sc_endpoints[UGENENDPOINT(dev)][IN]; 2119 sce_out = &sc->sc_endpoints[UGENENDPOINT(dev)][OUT]; 2120 KASSERT(sce_in->edesc || sce_out->edesc); 2121 KASSERT(sce_in->pipeh || sce_out->pipeh); 2122 2123 mutex_enter(&sc->sc_lock); 2124 if (sce_in && sce_in->pipeh && (events & (POLLIN | POLLRDNORM))) 2125 switch (sce_in->edesc->bmAttributes & UE_XFERTYPE) { 2126 case UE_INTERRUPT: 2127 if (sce_in->q.c_cc > 0) 2128 revents |= events & (POLLIN | POLLRDNORM); 2129 else 2130 selrecord(l, &sce_in->rsel); 2131 break; 2132 case UE_ISOCHRONOUS: 2133 if (sce_in->cur != sce_in->fill) 2134 revents |= events & (POLLIN | POLLRDNORM); 2135 else 2136 selrecord(l, &sce_in->rsel); 2137 break; 2138 case UE_BULK: 2139 if (sce_in->state & UGEN_BULK_RA) { 2140 if (sce_in->ra_wb_used > 0) 2141 revents |= events & 2142 (POLLIN | POLLRDNORM); 2143 else 2144 selrecord(l, &sce_in->rsel); 2145 break; 2146 } 2147 /* 2148 * We have no easy way of determining if a read will 2149 * yield any data or a write will happen. 2150 * Pretend they will. 2151 */ 2152 revents |= events & (POLLIN | POLLRDNORM); 2153 break; 2154 default: 2155 break; 2156 } 2157 if (sce_out && sce_out->pipeh && (events & (POLLOUT | POLLWRNORM))) 2158 switch (sce_out->edesc->bmAttributes & UE_XFERTYPE) { 2159 case UE_INTERRUPT: 2160 case UE_ISOCHRONOUS: 2161 /* XXX unimplemented */ 2162 break; 2163 case UE_BULK: 2164 if (sce_out->state & UGEN_BULK_WB) { 2165 if (sce_out->ra_wb_used < 2166 sce_out->limit - sce_out->ibuf) 2167 revents |= events & 2168 (POLLOUT | POLLWRNORM); 2169 else 2170 selrecord(l, &sce_out->rsel); 2171 break; 2172 } 2173 /* 2174 * We have no easy way of determining if a read will 2175 * yield any data or a write will happen. 2176 * Pretend they will. 2177 */ 2178 revents |= events & (POLLOUT | POLLWRNORM); 2179 break; 2180 default: 2181 break; 2182 } 2183 2184 mutex_exit(&sc->sc_lock); 2185 2186 out: ugenif_release(sc); 2187 return revents; 2188 } 2189 2190 static void 2191 filt_ugenrdetach(struct knote *kn) 2192 { 2193 struct ugen_endpoint *sce = kn->kn_hook; 2194 struct ugen_softc *sc = sce->sc; 2195 2196 mutex_enter(&sc->sc_lock); 2197 selremove_knote(&sce->rsel, kn); 2198 mutex_exit(&sc->sc_lock); 2199 } 2200 2201 static int 2202 filt_ugenread_intr(struct knote *kn, long hint) 2203 { 2204 struct ugen_endpoint *sce = kn->kn_hook; 2205 struct ugen_softc *sc = sce->sc; 2206 int ret; 2207 2208 mutex_enter(&sc->sc_lock); 2209 if (sc->sc_dying) { 2210 ret = 0; 2211 } else { 2212 kn->kn_data = sce->q.c_cc; 2213 ret = kn->kn_data > 0; 2214 } 2215 mutex_exit(&sc->sc_lock); 2216 2217 return ret; 2218 } 2219 2220 static int 2221 filt_ugenread_isoc(struct knote *kn, long hint) 2222 { 2223 struct ugen_endpoint *sce = kn->kn_hook; 2224 struct ugen_softc *sc = sce->sc; 2225 int ret; 2226 2227 mutex_enter(&sc->sc_lock); 2228 if (sc->sc_dying) { 2229 ret = 0; 2230 } else if (sce->cur == sce->fill) { 2231 ret = 0; 2232 } else if (sce->cur < sce->fill) { 2233 kn->kn_data = sce->fill - sce->cur; 2234 ret = 1; 2235 } else { 2236 kn->kn_data = (sce->limit - sce->cur) + 2237 (sce->fill - sce->ibuf); 2238 ret = 1; 2239 } 2240 mutex_exit(&sc->sc_lock); 2241 2242 return ret; 2243 } 2244 2245 static int 2246 filt_ugenread_bulk(struct knote *kn, long hint) 2247 { 2248 struct ugen_endpoint *sce = kn->kn_hook; 2249 struct ugen_softc *sc = sce->sc; 2250 int ret; 2251 2252 mutex_enter(&sc->sc_lock); 2253 if (sc->sc_dying) { 2254 ret = 0; 2255 } else if (!(sce->state & UGEN_BULK_RA)) { 2256 /* 2257 * We have no easy way of determining if a read will 2258 * yield any data or a write will happen. 2259 * So, emulate "seltrue". 2260 */ 2261 ret = filt_seltrue(kn, hint); 2262 } else if (sce->ra_wb_used == 0) { 2263 ret = 0; 2264 } else { 2265 kn->kn_data = sce->ra_wb_used; 2266 ret = 1; 2267 } 2268 mutex_exit(&sc->sc_lock); 2269 2270 return ret; 2271 } 2272 2273 static int 2274 filt_ugenwrite_bulk(struct knote *kn, long hint) 2275 { 2276 struct ugen_endpoint *sce = kn->kn_hook; 2277 struct ugen_softc *sc = sce->sc; 2278 int ret; 2279 2280 mutex_enter(&sc->sc_lock); 2281 if (sc->sc_dying) { 2282 ret = 0; 2283 } else if (!(sce->state & UGEN_BULK_WB)) { 2284 /* 2285 * We have no easy way of determining if a read will 2286 * yield any data or a write will happen. 2287 * So, emulate "seltrue". 2288 */ 2289 ret = filt_seltrue(kn, hint); 2290 } else if (sce->ra_wb_used == sce->limit - sce->ibuf) { 2291 ret = 0; 2292 } else { 2293 kn->kn_data = (sce->limit - sce->ibuf) - sce->ra_wb_used; 2294 ret = 1; 2295 } 2296 mutex_exit(&sc->sc_lock); 2297 2298 return ret; 2299 } 2300 2301 static const struct filterops ugenread_intr_filtops = { 2302 .f_flags = FILTEROP_ISFD, 2303 .f_attach = NULL, 2304 .f_detach = filt_ugenrdetach, 2305 .f_event = filt_ugenread_intr, 2306 }; 2307 2308 static const struct filterops ugenread_isoc_filtops = { 2309 .f_flags = FILTEROP_ISFD, 2310 .f_attach = NULL, 2311 .f_detach = filt_ugenrdetach, 2312 .f_event = filt_ugenread_isoc, 2313 }; 2314 2315 static const struct filterops ugenread_bulk_filtops = { 2316 .f_flags = FILTEROP_ISFD, 2317 .f_attach = NULL, 2318 .f_detach = filt_ugenrdetach, 2319 .f_event = filt_ugenread_bulk, 2320 }; 2321 2322 static const struct filterops ugenwrite_bulk_filtops = { 2323 .f_flags = FILTEROP_ISFD, 2324 .f_attach = NULL, 2325 .f_detach = filt_ugenrdetach, 2326 .f_event = filt_ugenwrite_bulk, 2327 }; 2328 2329 static int 2330 ugenkqfilter(dev_t dev, struct knote *kn) 2331 { 2332 struct ugen_softc *sc; 2333 struct ugen_endpoint *sce; 2334 struct selinfo *sip; 2335 int error; 2336 2337 if ((sc = ugenif_acquire(UGENUNIT(dev))) == NULL) 2338 return ENXIO; 2339 2340 if (UGENENDPOINT(dev) == USB_CONTROL_ENDPOINT) { 2341 error = ENODEV; 2342 goto out; 2343 } 2344 2345 switch (kn->kn_filter) { 2346 case EVFILT_READ: 2347 sce = &sc->sc_endpoints[UGENENDPOINT(dev)][IN]; 2348 if (sce == NULL) { 2349 error = EINVAL; 2350 goto out; 2351 } 2352 2353 sip = &sce->rsel; 2354 switch (sce->edesc->bmAttributes & UE_XFERTYPE) { 2355 case UE_INTERRUPT: 2356 kn->kn_fop = &ugenread_intr_filtops; 2357 break; 2358 case UE_ISOCHRONOUS: 2359 kn->kn_fop = &ugenread_isoc_filtops; 2360 break; 2361 case UE_BULK: 2362 kn->kn_fop = &ugenread_bulk_filtops; 2363 break; 2364 default: 2365 error = EINVAL; 2366 goto out; 2367 } 2368 break; 2369 2370 case EVFILT_WRITE: 2371 sce = &sc->sc_endpoints[UGENENDPOINT(dev)][OUT]; 2372 if (sce == NULL) { 2373 error = EINVAL; 2374 goto out; 2375 } 2376 2377 sip = &sce->rsel; 2378 switch (sce->edesc->bmAttributes & UE_XFERTYPE) { 2379 case UE_INTERRUPT: 2380 case UE_ISOCHRONOUS: 2381 /* XXX poll doesn't support this */ 2382 error = EINVAL; 2383 goto out; 2384 2385 case UE_BULK: 2386 kn->kn_fop = &ugenwrite_bulk_filtops; 2387 break; 2388 default: 2389 error = EINVAL; 2390 goto out; 2391 } 2392 break; 2393 2394 default: 2395 error = EINVAL; 2396 goto out; 2397 } 2398 2399 kn->kn_hook = sce; 2400 2401 mutex_enter(&sc->sc_lock); 2402 selrecord_knote(sip, kn); 2403 mutex_exit(&sc->sc_lock); 2404 2405 error = 0; 2406 2407 out: ugenif_release(sc); 2408 return error; 2409 } 2410 2411 MODULE(MODULE_CLASS_DRIVER, ugen, NULL); 2412 2413 static int 2414 ugen_modcmd(modcmd_t cmd, void *aux) 2415 { 2416 2417 switch (cmd) { 2418 case MODULE_CMD_INIT: 2419 mutex_init(&ugenif.lock, MUTEX_DEFAULT, IPL_NONE); 2420 rb_tree_init(&ugenif.tree, &ugenif_tree_ops); 2421 return 0; 2422 default: 2423 return ENOTTY; 2424 } 2425 } 2426