1 /* $FreeBSD$ */ 2 /*- 3 * Copyright (c) 2006-2008 Hans Petter Selasky. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * 27 * usb_dev.c - An abstraction layer for creating devices under /dev/... 28 */ 29 30 #include <sys/stdint.h> 31 #include <sys/param.h> 32 #include <sys/queue.h> 33 #include <sys/types.h> 34 #include <sys/systm.h> 35 #include <sys/kernel.h> 36 #include <sys/thread2.h> 37 #include <sys/bus.h> 38 #include <sys/module.h> 39 #include <sys/lock.h> 40 #include <sys/mutex.h> 41 #include <sys/condvar.h> 42 #include <sys/sysctl.h> 43 #include <sys/unistd.h> 44 #include <sys/callout.h> 45 #include <sys/malloc.h> 46 #include <sys/priv.h> 47 #include <sys/vnode.h> 48 #include <sys/conf.h> 49 #include <sys/fcntl.h> 50 #include <sys/devfs.h> 51 52 #include <bus/u4b/usb.h> 53 #include <bus/u4b/usb_ioctl.h> 54 #include <bus/u4b/usbdi.h> 55 #include <bus/u4b/usbdi_util.h> 56 57 #define USB_DEBUG_VAR usb_fifo_debug 58 59 #include <bus/u4b/usb_core.h> 60 #include <bus/u4b/usb_dev.h> 61 #include <bus/u4b/usb_mbuf.h> 62 #include <bus/u4b/usb_process.h> 63 #include <bus/u4b/usb_device.h> 64 #include <bus/u4b/usb_debug.h> 65 #include <bus/u4b/usb_busdma.h> 66 #include <bus/u4b/usb_generic.h> 67 #include <bus/u4b/usb_dynamic.h> 68 #include <bus/u4b/usb_util.h> 69 70 #include <bus/u4b/usb_controller.h> 71 #include <bus/u4b/usb_bus.h> 72 73 #include <sys/filio.h> 74 #include <sys/ttycom.h> 75 #include <sys/kern_syscall.h> 76 77 #include <machine/stdarg.h> 78 79 #if USB_HAVE_UGEN 80 81 #ifdef USB_DEBUG 82 static int usb_fifo_debug = 0; 83 84 static SYSCTL_NODE(_hw_usb, OID_AUTO, dev, CTLFLAG_RW, 0, "USB device"); 85 SYSCTL_INT(_hw_usb_dev, OID_AUTO, debug, CTLFLAG_RW, 86 &usb_fifo_debug, 0, "Debug Level"); 87 88 TUNABLE_INT("hw.usb.dev.debug", &usb_fifo_debug); 89 #endif 90 91 #define USB_UCRED struct ucred *ucred, 92 93 /* prototypes */ 94 95 static int usb_fifo_open(struct usb_cdev_privdata *, 96 struct usb_fifo *, int); 97 static void usb_fifo_close(struct usb_fifo *, int); 98 static void usb_dev_init(void *); 99 static void usb_dev_init_post(void *); 100 static void usb_dev_uninit(void *); 101 static int usb_fifo_uiomove(struct usb_fifo *, void *, int, 102 struct uio *); 103 static void usb_fifo_check_methods(struct usb_fifo_methods *); 104 static struct usb_fifo *usb_fifo_alloc(void); 105 static struct usb_endpoint *usb_dev_get_ep(struct usb_device *, uint8_t, 106 uint8_t); 107 static void usb_loc_fill(struct usb_fs_privdata *, 108 struct usb_cdev_privdata *); 109 static usb_error_t usb_ref_device(struct usb_cdev_privdata *, struct usb_cdev_refdata *, int); 110 static usb_error_t usb_usb_ref_device(struct usb_cdev_privdata *, struct usb_cdev_refdata *); 111 static void usb_unref_device(struct usb_cdev_privdata *, struct usb_cdev_refdata *); 112 113 static void usb_filter_detach(struct knote *kn); 114 static int usb_filter_read(struct knote *kn, long hint); 115 static int usb_filter_write(struct knote *kn, long hint); 116 117 static d_open_t usb_open; 118 static d_close_t usb_close; 119 static d_ioctl_t usb_ioctl; 120 static d_read_t usb_read; 121 static d_write_t usb_write; 122 static d_kqfilter_t usb_kqfilter; 123 124 static d_ioctl_t usb_static_ioctl; 125 static d_open_t usb_static_open; 126 static d_close_t usb_static_close; 127 128 static usb_fifo_open_t usb_fifo_dummy_open; 129 static usb_fifo_close_t usb_fifo_dummy_close; 130 static usb_fifo_ioctl_t usb_fifo_dummy_ioctl; 131 static usb_fifo_cmd_t usb_fifo_dummy_cmd; 132 133 /* character device structure used for devices (/dev/ugenX.Y and /dev/uXXX) */ 134 struct dev_ops usb_ops = { 135 { "usbdev", 0, D_MEM }, 136 .d_open = usb_open, 137 .d_close = usb_close, 138 .d_ioctl = usb_ioctl, 139 .d_read = usb_read, 140 .d_write = usb_write, 141 .d_kqfilter = usb_kqfilter 142 }; 143 144 static struct cdev* usb_dev = NULL; 145 146 /* character device structure used for /bus/u4b */ 147 static struct dev_ops usb_static_ops = { 148 { "usb", 0, D_MEM }, 149 .d_open = usb_static_open, 150 .d_close = usb_static_close, 151 .d_ioctl = usb_static_ioctl, 152 }; 153 154 static TAILQ_HEAD(, usb_symlink) usb_sym_head; 155 static struct lock usb_sym_lock; 156 157 struct lock usb_ref_lock; 158 159 static struct kqinfo usb_kqevent; 160 161 static void 162 usb_cdevpriv_dtor(void *cpd) 163 { 164 } 165 166 /*------------------------------------------------------------------------* 167 * usb_loc_fill 168 * 169 * This is used to fill out a usb_cdev_privdata structure based on the 170 * device's address as contained in usb_fs_privdata. 171 *------------------------------------------------------------------------*/ 172 static void 173 usb_loc_fill(struct usb_fs_privdata* pd, struct usb_cdev_privdata *cpd) 174 { 175 cpd->bus_index = pd->bus_index; 176 cpd->dev_index = pd->dev_index; 177 cpd->ep_addr = pd->ep_addr; 178 cpd->fifo_index = pd->fifo_index; 179 } 180 181 /*------------------------------------------------------------------------* 182 * usb_ref_device 183 * 184 * This function is used to atomically refer an USB device by its 185 * device location. If this function returns success the USB device 186 * will not dissappear until the USB device is unreferenced. 187 * 188 * Return values: 189 * 0: Success, refcount incremented on the given USB device. 190 * Else: Failure. 191 *------------------------------------------------------------------------*/ 192 static usb_error_t 193 usb_ref_device(struct usb_cdev_privdata *cpd, 194 struct usb_cdev_refdata *crd, int need_uref) 195 { 196 struct usb_fifo **ppf; 197 struct usb_fifo *f; 198 199 DPRINTFN(2, "cpd=%p need uref=%d\n", cpd, need_uref); 200 201 /* clear all refs */ 202 memset(crd, 0, sizeof(*crd)); 203 204 lockmgr(&usb_ref_lock, LK_EXCLUSIVE); 205 cpd->bus = devclass_get_softc(usb_devclass_ptr, cpd->bus_index); 206 if (cpd->bus == NULL) { 207 DPRINTFN(2, "no bus at %u\n", cpd->bus_index); 208 goto error; 209 } 210 cpd->udev = cpd->bus->devices[cpd->dev_index]; 211 if (cpd->udev == NULL) { 212 DPRINTFN(2, "no device at %u\n", cpd->dev_index); 213 goto error; 214 } 215 if (cpd->udev->refcount == USB_DEV_REF_MAX) { 216 DPRINTFN(2, "no dev ref\n"); 217 goto error; 218 } 219 if (need_uref) { 220 DPRINTFN(2, "ref udev - needed\n"); 221 cpd->udev->refcount++; 222 223 lockmgr(&usb_ref_lock, LK_RELEASE); 224 225 /* 226 * We need to grab the sx-lock before grabbing the 227 * FIFO refs to avoid deadlock at detach! 228 */ 229 crd->do_unlock = usbd_enum_lock(cpd->udev); 230 231 lockmgr(&usb_ref_lock, LK_EXCLUSIVE); 232 233 /* 234 * Set "is_uref" after grabbing the default SX lock 235 */ 236 crd->is_uref = 1; 237 } 238 239 /* check if we are doing an open */ 240 if (cpd->fflags == 0) { 241 /* use zero defaults */ 242 } else { 243 /* check for write */ 244 if (cpd->fflags & FWRITE) { 245 ppf = cpd->udev->fifo; 246 f = ppf[cpd->fifo_index + USB_FIFO_TX]; 247 crd->txfifo = f; 248 crd->is_write = 1; /* ref */ 249 if (f == NULL || f->refcount == USB_FIFO_REF_MAX) 250 goto error; 251 if (f->curr_cpd != cpd) 252 goto error; 253 /* check if USB-FS is active */ 254 if (f->fs_ep_max != 0) { 255 crd->is_usbfs = 1; 256 } 257 } 258 259 /* check for read */ 260 if (cpd->fflags & FREAD) { 261 ppf = cpd->udev->fifo; 262 f = ppf[cpd->fifo_index + USB_FIFO_RX]; 263 crd->rxfifo = f; 264 crd->is_read = 1; /* ref */ 265 if (f == NULL || f->refcount == USB_FIFO_REF_MAX) 266 goto error; 267 if (f->curr_cpd != cpd) 268 goto error; 269 /* check if USB-FS is active */ 270 if (f->fs_ep_max != 0) { 271 crd->is_usbfs = 1; 272 } 273 } 274 } 275 276 /* when everything is OK we increment the refcounts */ 277 if (crd->is_write) { 278 DPRINTFN(2, "ref write\n"); 279 crd->txfifo->refcount++; 280 } 281 if (crd->is_read) { 282 DPRINTFN(2, "ref read\n"); 283 crd->rxfifo->refcount++; 284 } 285 lockmgr(&usb_ref_lock, LK_RELEASE); 286 287 return (0); 288 289 error: 290 if (crd->do_unlock) 291 usbd_enum_unlock(cpd->udev); 292 293 if (crd->is_uref) { 294 if (--(cpd->udev->refcount) == 0) { 295 cv_signal(&cpd->udev->ref_cv); 296 } 297 } 298 lockmgr(&usb_ref_lock, LK_RELEASE); 299 DPRINTFN(2, "fail\n"); 300 return (USB_ERR_INVAL); 301 } 302 303 /*------------------------------------------------------------------------* 304 * usb_usb_ref_device 305 * 306 * This function is used to upgrade an USB reference to include the 307 * USB device reference on a USB location. 308 * 309 * Return values: 310 * 0: Success, refcount incremented on the given USB device. 311 * Else: Failure. 312 *------------------------------------------------------------------------*/ 313 static usb_error_t 314 usb_usb_ref_device(struct usb_cdev_privdata *cpd, 315 struct usb_cdev_refdata *crd) 316 { 317 /* 318 * Check if we already got an USB reference on this location: 319 */ 320 if (crd->is_uref) 321 return (0); /* success */ 322 323 /* 324 * To avoid deadlock at detach we need to drop the FIFO ref 325 * and re-acquire a new ref! 326 */ 327 usb_unref_device(cpd, crd); 328 329 return (usb_ref_device(cpd, crd, 1 /* need uref */)); 330 } 331 332 /*------------------------------------------------------------------------* 333 * usb_unref_device 334 * 335 * This function will release the reference count by one unit for the 336 * given USB device. 337 *------------------------------------------------------------------------*/ 338 static void 339 usb_unref_device(struct usb_cdev_privdata *cpd, 340 struct usb_cdev_refdata *crd) 341 { 342 343 DPRINTFN(2, "cpd=%p is_uref=%d\n", cpd, crd->is_uref); 344 345 if (crd->do_unlock) 346 usbd_enum_unlock(cpd->udev); 347 348 lockmgr(&usb_ref_lock, LK_EXCLUSIVE); 349 if (crd->is_read) { 350 if (--(crd->rxfifo->refcount) == 0) { 351 cv_signal(&crd->rxfifo->cv_drain); 352 } 353 crd->is_read = 0; 354 } 355 if (crd->is_write) { 356 if (--(crd->txfifo->refcount) == 0) { 357 cv_signal(&crd->txfifo->cv_drain); 358 } 359 crd->is_write = 0; 360 } 361 if (crd->is_uref) { 362 if (--(cpd->udev->refcount) == 0) { 363 cv_signal(&cpd->udev->ref_cv); 364 } 365 crd->is_uref = 0; 366 } 367 lockmgr(&usb_ref_lock, LK_RELEASE); 368 } 369 370 static struct usb_fifo * 371 usb_fifo_alloc(void) 372 { 373 struct usb_fifo *f; 374 375 f = kmalloc(sizeof(*f), M_USBDEV, M_WAITOK | M_ZERO); 376 if (f) { 377 cv_init(&f->cv_io, "FIFO-IO"); 378 cv_init(&f->cv_drain, "FIFO-DRAIN"); 379 f->refcount = 1; 380 } 381 return (f); 382 } 383 384 /*------------------------------------------------------------------------* 385 * usb_fifo_create 386 *------------------------------------------------------------------------*/ 387 static int 388 usb_fifo_create(struct usb_cdev_privdata *cpd, 389 struct usb_cdev_refdata *crd) 390 { 391 struct usb_device *udev = cpd->udev; 392 struct usb_fifo *f; 393 struct usb_endpoint *ep; 394 uint8_t n; 395 uint8_t is_tx; 396 uint8_t is_rx; 397 uint8_t no_null; 398 uint8_t is_busy; 399 int e = cpd->ep_addr; 400 401 is_tx = (cpd->fflags & FWRITE) ? 1 : 0; 402 is_rx = (cpd->fflags & FREAD) ? 1 : 0; 403 no_null = 1; 404 is_busy = 0; 405 406 /* Preallocated FIFO */ 407 if (e < 0) { 408 DPRINTFN(5, "Preallocated FIFO\n"); 409 if (is_tx) { 410 f = udev->fifo[cpd->fifo_index + USB_FIFO_TX]; 411 if (f == NULL) 412 return (EINVAL); 413 crd->txfifo = f; 414 } 415 if (is_rx) { 416 f = udev->fifo[cpd->fifo_index + USB_FIFO_RX]; 417 if (f == NULL) 418 return (EINVAL); 419 crd->rxfifo = f; 420 } 421 return (0); 422 } 423 424 KASSERT(e >= 0 && e <= 15, ("endpoint %d out of range", e)); 425 426 /* search for a free FIFO slot */ 427 DPRINTFN(5, "Endpoint device, searching for 0x%02x\n", e); 428 for (n = 0;; n += 2) { 429 430 if (n == USB_FIFO_MAX) { 431 if (no_null) { 432 no_null = 0; 433 n = 0; 434 } else { 435 /* end of FIFOs reached */ 436 DPRINTFN(5, "out of FIFOs\n"); 437 return (ENOMEM); 438 } 439 } 440 /* Check for TX FIFO */ 441 if (is_tx) { 442 f = udev->fifo[n + USB_FIFO_TX]; 443 if (f != NULL) { 444 if (f->dev_ep_index != e) { 445 /* wrong endpoint index */ 446 continue; 447 } 448 if (f->curr_cpd != NULL) { 449 /* FIFO is opened */ 450 is_busy = 1; 451 continue; 452 } 453 } else if (no_null) { 454 continue; 455 } 456 } 457 /* Check for RX FIFO */ 458 if (is_rx) { 459 f = udev->fifo[n + USB_FIFO_RX]; 460 if (f != NULL) { 461 if (f->dev_ep_index != e) { 462 /* wrong endpoint index */ 463 continue; 464 } 465 if (f->curr_cpd != NULL) { 466 /* FIFO is opened */ 467 is_busy = 1; 468 continue; 469 } 470 } else if (no_null) { 471 continue; 472 } 473 } 474 break; 475 } 476 477 if (no_null == 0) { 478 if (e >= (USB_EP_MAX / 2)) { 479 /* we don't create any endpoints in this range */ 480 DPRINTFN(5, "ep out of range\n"); 481 return (is_busy ? EBUSY : EINVAL); 482 } 483 } 484 485 if ((e != 0) && is_busy) { 486 /* 487 * Only the default control endpoint is allowed to be 488 * opened multiple times! 489 */ 490 DPRINTFN(5, "busy\n"); 491 return (EBUSY); 492 } 493 494 /* Check TX FIFO */ 495 if (is_tx && 496 (udev->fifo[n + USB_FIFO_TX] == NULL)) { 497 ep = usb_dev_get_ep(udev, e, USB_FIFO_TX); 498 DPRINTFN(5, "dev_get_endpoint(%d, 0x%x)\n", e, USB_FIFO_TX); 499 if (ep == NULL) { 500 DPRINTFN(5, "dev_get_endpoint returned NULL\n"); 501 return (EINVAL); 502 } 503 f = usb_fifo_alloc(); 504 if (f == NULL) { 505 DPRINTFN(5, "could not alloc tx fifo\n"); 506 return (ENOMEM); 507 } 508 /* update some fields */ 509 f->fifo_index = n + USB_FIFO_TX; 510 f->dev_ep_index = e; 511 f->priv_lock = &udev->device_lock; 512 f->priv_sc0 = ep; 513 f->methods = &usb_ugen_methods; 514 f->iface_index = ep->iface_index; 515 f->udev = udev; 516 lockmgr(&usb_ref_lock, LK_EXCLUSIVE); 517 udev->fifo[n + USB_FIFO_TX] = f; 518 lockmgr(&usb_ref_lock, LK_RELEASE); 519 } 520 /* Check RX FIFO */ 521 if (is_rx && 522 (udev->fifo[n + USB_FIFO_RX] == NULL)) { 523 524 ep = usb_dev_get_ep(udev, e, USB_FIFO_RX); 525 DPRINTFN(5, "dev_get_endpoint(%d, 0x%x)\n", e, USB_FIFO_RX); 526 if (ep == NULL) { 527 DPRINTFN(5, "dev_get_endpoint returned NULL\n"); 528 return (EINVAL); 529 } 530 f = usb_fifo_alloc(); 531 if (f == NULL) { 532 DPRINTFN(5, "could not alloc rx fifo\n"); 533 return (ENOMEM); 534 } 535 /* update some fields */ 536 f->fifo_index = n + USB_FIFO_RX; 537 f->dev_ep_index = e; 538 f->priv_lock = &udev->device_lock; 539 f->priv_sc0 = ep; 540 f->methods = &usb_ugen_methods; 541 f->iface_index = ep->iface_index; 542 f->udev = udev; 543 lockmgr(&usb_ref_lock, LK_EXCLUSIVE); 544 udev->fifo[n + USB_FIFO_RX] = f; 545 lockmgr(&usb_ref_lock, LK_RELEASE); 546 } 547 if (is_tx) { 548 crd->txfifo = udev->fifo[n + USB_FIFO_TX]; 549 } 550 if (is_rx) { 551 crd->rxfifo = udev->fifo[n + USB_FIFO_RX]; 552 } 553 /* fill out fifo index */ 554 DPRINTFN(5, "fifo index = %d\n", n); 555 cpd->fifo_index = n; 556 557 /* complete */ 558 559 return (0); 560 } 561 562 void 563 usb_fifo_free(struct usb_fifo *f) 564 { 565 uint8_t n; 566 567 if (f == NULL) { 568 /* be NULL safe */ 569 return; 570 } 571 /* destroy symlink devices, if any */ 572 for (n = 0; n != 2; n++) { 573 if (f->symlink[n]) { 574 usb_free_symlink(f->symlink[n]); 575 f->symlink[n] = NULL; 576 } 577 } 578 lockmgr(&usb_ref_lock, LK_EXCLUSIVE); 579 580 /* delink ourselves to stop calls from userland */ 581 if ((f->fifo_index < USB_FIFO_MAX) && 582 (f->udev != NULL) && 583 (f->udev->fifo[f->fifo_index] == f)) { 584 f->udev->fifo[f->fifo_index] = NULL; 585 } else { 586 DPRINTFN(0, "USB FIFO %p has not been linked\n", f); 587 } 588 589 /* decrease refcount */ 590 f->refcount--; 591 /* prevent any write flush */ 592 f->flag_iserror = 1; 593 /* need to wait until all callers have exited */ 594 while (f->refcount != 0) { 595 lockmgr(&usb_ref_lock, LK_RELEASE); /* avoid LOR */ 596 lockmgr(f->priv_lock, LK_EXCLUSIVE); 597 /* get I/O thread out of any sleep state */ 598 if (f->flag_sleeping) { 599 f->flag_sleeping = 0; 600 cv_broadcast(&f->cv_io); 601 } 602 lockmgr(f->priv_lock, LK_RELEASE); 603 lockmgr(&usb_ref_lock, LK_EXCLUSIVE); 604 605 /* wait for sync */ 606 cv_wait(&f->cv_drain, &usb_ref_lock); 607 } 608 lockmgr(&usb_ref_lock, LK_RELEASE); 609 610 /* take care of closing the device here, if any */ 611 usb_fifo_close(f, 0); 612 613 cv_destroy(&f->cv_io); 614 cv_destroy(&f->cv_drain); 615 616 kfree(f, M_USBDEV); 617 } 618 619 static struct usb_endpoint * 620 usb_dev_get_ep(struct usb_device *udev, uint8_t ep_index, uint8_t dir) 621 { 622 struct usb_endpoint *ep; 623 uint8_t ep_dir; 624 625 if (ep_index == 0) { 626 ep = &udev->ctrl_ep; 627 } else { 628 if (dir == USB_FIFO_RX) { 629 if (udev->flags.usb_mode == USB_MODE_HOST) { 630 ep_dir = UE_DIR_IN; 631 } else { 632 ep_dir = UE_DIR_OUT; 633 } 634 } else { 635 if (udev->flags.usb_mode == USB_MODE_HOST) { 636 ep_dir = UE_DIR_OUT; 637 } else { 638 ep_dir = UE_DIR_IN; 639 } 640 } 641 ep = usbd_get_ep_by_addr(udev, ep_index | ep_dir); 642 } 643 644 if (ep == NULL) { 645 /* if the endpoint does not exist then return */ 646 return (NULL); 647 } 648 if (ep->edesc == NULL) { 649 /* invalid endpoint */ 650 return (NULL); 651 } 652 return (ep); /* success */ 653 } 654 655 /*------------------------------------------------------------------------* 656 * usb_fifo_open 657 * 658 * Returns: 659 * 0: Success 660 * Else: Failure 661 *------------------------------------------------------------------------*/ 662 static int 663 usb_fifo_open(struct usb_cdev_privdata *cpd, 664 struct usb_fifo *f, int fflags) 665 { 666 int err; 667 668 if (f == NULL) { 669 /* no FIFO there */ 670 DPRINTFN(2, "no FIFO\n"); 671 return (ENXIO); 672 } 673 /* remove FWRITE and FREAD flags */ 674 fflags &= ~(FWRITE | FREAD); 675 676 /* set correct file flags */ 677 if ((f->fifo_index & 1) == USB_FIFO_TX) { 678 fflags |= FWRITE; 679 } else { 680 fflags |= FREAD; 681 } 682 683 /* check if we are already opened */ 684 /* we don't need any locks when checking this variable */ 685 if (f->curr_cpd != NULL) { 686 err = EBUSY; 687 goto done; 688 } 689 690 /* reset short flag before open */ 691 f->flag_short = 0; 692 693 /* call open method */ 694 err = (f->methods->f_open) (f, fflags); 695 if (err) { 696 goto done; 697 } 698 lockmgr(f->priv_lock, LK_EXCLUSIVE); 699 700 /* reset sleep flag */ 701 f->flag_sleeping = 0; 702 703 /* reset error flag */ 704 f->flag_iserror = 0; 705 706 /* reset complete flag */ 707 f->flag_iscomplete = 0; 708 709 /* reset select flag */ 710 f->flag_isselect = 0; 711 712 /* reset flushing flag */ 713 f->flag_flushing = 0; 714 715 /* reset ASYNC proc flag */ 716 f->async_p = NULL; 717 718 lockmgr(&usb_ref_lock, LK_EXCLUSIVE); 719 /* flag the fifo as opened to prevent others */ 720 f->curr_cpd = cpd; 721 lockmgr(&usb_ref_lock, LK_RELEASE); 722 723 /* reset queue */ 724 usb_fifo_reset(f); 725 726 lockmgr(f->priv_lock, LK_RELEASE); 727 done: 728 return (err); 729 } 730 731 /*------------------------------------------------------------------------* 732 * usb_fifo_reset 733 *------------------------------------------------------------------------*/ 734 void 735 usb_fifo_reset(struct usb_fifo *f) 736 { 737 struct usb_mbuf *m; 738 739 if (f == NULL) { 740 return; 741 } 742 while (1) { 743 USB_IF_DEQUEUE(&f->used_q, m); 744 if (m) { 745 USB_IF_ENQUEUE(&f->free_q, m); 746 } else { 747 break; 748 } 749 } 750 /* reset have fragment flag */ 751 f->flag_have_fragment = 0; 752 } 753 754 /*------------------------------------------------------------------------* 755 * usb_fifo_close 756 *------------------------------------------------------------------------*/ 757 static void 758 usb_fifo_close(struct usb_fifo *f, int fflags) 759 { 760 int err; 761 762 /* check if we are not opened */ 763 if (f->curr_cpd == NULL) { 764 /* nothing to do - already closed */ 765 return; 766 } 767 lockmgr(f->priv_lock, LK_EXCLUSIVE); 768 769 /* clear current cdev private data pointer */ 770 f->curr_cpd = NULL; 771 772 /* check if we are selected */ 773 if (f->flag_isselect) { 774 #if 0 /* XXXDF */ 775 selwakeup(&f->selinfo); 776 #endif 777 f->flag_isselect = 0; 778 } 779 /* check if a thread wants SIGIO */ 780 if (f->async_p != NULL && lwkt_trytoken(&f->async_p->p_token)) { 781 ksignal(f->async_p, SIGIO); 782 lwkt_reltoken(&f->async_p->p_token); 783 f->async_p = NULL; 784 } 785 /* remove FWRITE and FREAD flags */ 786 fflags &= ~(FWRITE | FREAD); 787 788 /* flush written data, if any */ 789 if ((f->fifo_index & 1) == USB_FIFO_TX) { 790 791 if (!f->flag_iserror) { 792 793 /* set flushing flag */ 794 f->flag_flushing = 1; 795 796 /* get the last packet in */ 797 if (f->flag_have_fragment) { 798 struct usb_mbuf *m; 799 f->flag_have_fragment = 0; 800 USB_IF_DEQUEUE(&f->free_q, m); 801 if (m) { 802 USB_IF_ENQUEUE(&f->used_q, m); 803 } 804 } 805 806 /* start write transfer, if not already started */ 807 (f->methods->f_start_write) (f); 808 809 /* check if flushed already */ 810 while (f->flag_flushing && 811 (!f->flag_iserror)) { 812 /* wait until all data has been written */ 813 f->flag_sleeping = 1; 814 err = cv_wait_sig(&f->cv_io, f->priv_lock); 815 if (err) { 816 DPRINTF("signal received\n"); 817 break; 818 } 819 } 820 } 821 fflags |= FWRITE; 822 823 /* stop write transfer, if not already stopped */ 824 (f->methods->f_stop_write) (f); 825 } else { 826 fflags |= FREAD; 827 828 /* stop write transfer, if not already stopped */ 829 (f->methods->f_stop_read) (f); 830 } 831 832 /* check if we are sleeping */ 833 if (f->flag_sleeping) { 834 DPRINTFN(2, "Sleeping at close!\n"); 835 } 836 lockmgr(f->priv_lock, LK_RELEASE); 837 838 /* call close method */ 839 (f->methods->f_close) (f, fflags); 840 841 DPRINTF("closed\n"); 842 } 843 844 /*------------------------------------------------------------------------* 845 * usb_open - cdev callback 846 *------------------------------------------------------------------------*/ 847 static int 848 usb_open(struct dev_open_args *ap) 849 { 850 struct cdev *dev = ap->a_head.a_dev; 851 int fflags = ap->a_oflags; 852 struct usb_fs_privdata* pd = (struct usb_fs_privdata*)dev->si_drv1; 853 struct usb_cdev_refdata refs; 854 struct usb_cdev_privdata *cpd; 855 int err, ep; 856 857 DPRINTFN(2, "%s fflags=0x%08x\n", devtoname(dev), fflags); 858 859 KASSERT(fflags & (FREAD|FWRITE), ("invalid open flags")); 860 if (((fflags & FREAD) && !(pd->mode & FREAD)) || 861 ((fflags & FWRITE) && !(pd->mode & FWRITE))) { 862 DPRINTFN(2, "access mode not supported\n"); 863 return (EPERM); 864 } 865 866 cpd = kmalloc(sizeof(*cpd), M_USBDEV, M_WAITOK | M_ZERO); 867 ep = cpd->ep_addr = pd->ep_addr; 868 869 usb_loc_fill(pd, cpd); 870 err = usb_ref_device(cpd, &refs, 1); 871 if (err) { 872 DPRINTFN(2, "cannot ref device\n"); 873 kfree(cpd, M_USBDEV); 874 return (ENXIO); 875 } 876 cpd->fflags = fflags; /* access mode for open lifetime */ 877 878 /* create FIFOs, if any */ 879 err = usb_fifo_create(cpd, &refs); 880 /* check for error */ 881 if (err) { 882 DPRINTFN(2, "cannot create fifo\n"); 883 usb_unref_device(cpd, &refs); 884 kfree(cpd, M_USBDEV); 885 return (err); 886 } 887 if (fflags & FREAD) { 888 err = usb_fifo_open(cpd, refs.rxfifo, fflags); 889 if (err) { 890 DPRINTFN(2, "read open failed\n"); 891 usb_unref_device(cpd, &refs); 892 kfree(cpd, M_USBDEV); 893 return (err); 894 } 895 } 896 if (fflags & FWRITE) { 897 err = usb_fifo_open(cpd, refs.txfifo, fflags); 898 if (err) { 899 DPRINTFN(2, "write open failed\n"); 900 if (fflags & FREAD) { 901 usb_fifo_close(refs.rxfifo, fflags); 902 } 903 usb_unref_device(cpd, &refs); 904 kfree(cpd, M_USBDEV); 905 return (err); 906 } 907 } 908 usb_unref_device(cpd, &refs); 909 err = devfs_set_cdevpriv(ap->a_fp, cpd, usb_cdevpriv_dtor); 910 if(err) { 911 DPRINTFN(2, "devfs_set_cdevpriv failed in %s\n", __func__); 912 kfree(cpd, M_USBDEV); 913 return(err); 914 } 915 return (0); 916 } 917 918 /*------------------------------------------------------------------------* 919 * usb_close - cdev callback 920 *------------------------------------------------------------------------*/ 921 static int 922 usb_close(struct dev_close_args *ap) 923 { 924 struct usb_cdev_refdata refs; 925 struct usb_cdev_privdata *cpd; 926 int err; 927 928 err = devfs_get_cdevpriv(ap->a_fp, (void **)&cpd); 929 if (err != 0) 930 return (err); 931 932 DPRINTFN(2, "cpd=%p\n", cpd); 933 934 err = usb_ref_device(cpd, &refs, 0); 935 if (err) 936 goto done; 937 938 /* 939 * If this function is not called directly from the root HUB 940 * thread, there is usually a need to lock the enumeration 941 * lock. Check this. 942 */ 943 if (!usbd_enum_is_locked(cpd->udev)) { 944 945 DPRINTFN(2, "Locking enumeration\n"); 946 947 /* reference device */ 948 err = usb_usb_ref_device(cpd, &refs); 949 if (err) 950 goto done; 951 } 952 if (cpd->fflags & FREAD) { 953 usb_fifo_close(refs.rxfifo, cpd->fflags); 954 } 955 if (cpd->fflags & FWRITE) { 956 usb_fifo_close(refs.txfifo, cpd->fflags); 957 } 958 usb_unref_device(cpd, &refs); 959 done: 960 kfree(cpd, M_USBDEV); 961 return 0; 962 } 963 964 static void 965 usb_dev_init(void *arg) 966 { 967 lockinit(&usb_ref_lock, "USB ref mutex", 0, 0); 968 lockinit(&usb_sym_lock, "USB sym mutex", 0, 0); 969 TAILQ_INIT(&usb_sym_head); 970 971 /* check the UGEN methods */ 972 usb_fifo_check_methods(&usb_ugen_methods); 973 } 974 975 /* XXX SI_SUB_KLD? */ 976 SYSINIT(usb_dev_init, SI_SUB_PRE_DRIVERS, SI_ORDER_FIRST, usb_dev_init, NULL); 977 978 static void 979 usb_dev_init_post(void *arg) 980 { 981 /* 982 * Create /dev/usb - this is needed for usbconfig(8), which 983 * needs a well-known device name to access. 984 */ 985 usb_dev = make_dev(&usb_static_ops, 0, UID_ROOT, GID_OPERATOR, 986 0644, USB_DEVICE_NAME); 987 if (usb_dev == NULL) { 988 DPRINTFN(0, "Could not create usb bus device\n"); 989 } 990 } 991 992 SYSINIT(usb_dev_init_post, SI_SUB_DRIVERS, SI_ORDER_FIRST, usb_dev_init_post, 993 NULL); 994 995 static void 996 usb_dev_uninit(void *arg) 997 { 998 if (usb_dev != NULL) { 999 destroy_dev(usb_dev); 1000 usb_dev = NULL; 1001 } 1002 lockuninit(&usb_ref_lock); 1003 lockuninit(&usb_sym_lock); 1004 } 1005 1006 SYSUNINIT(usb_dev_uninit, SI_SUB_KICK_SCHEDULER, SI_ORDER_ANY, usb_dev_uninit, NULL); 1007 1008 static int 1009 usb_ioctl_f_sub(struct usb_fifo *f, u_long cmd, void *addr, 1010 struct thread *td) 1011 { 1012 int error = 0; 1013 1014 switch (cmd) { 1015 case FIODTYPE: 1016 *(int *)addr = 0; /* character device */ 1017 break; 1018 1019 case FIONBIO: 1020 /* handled by upper FS layer */ 1021 break; 1022 1023 case FIOASYNC: 1024 if (*(int *)addr) { 1025 if (f->async_p != NULL) { 1026 error = EBUSY; 1027 break; 1028 } 1029 f->async_p = USB_TD_GET_PROC(td); 1030 } else { 1031 f->async_p = NULL; 1032 } 1033 break; 1034 1035 /* XXX this is not the most general solution */ 1036 case TIOCSPGRP: 1037 if (f->async_p == NULL) { 1038 error = EINVAL; 1039 break; 1040 } 1041 if (*(int *)addr != USB_PROC_GET_GID(f->async_p)) { 1042 error = EPERM; 1043 break; 1044 } 1045 break; 1046 default: 1047 return (ENOIOCTL); 1048 } 1049 DPRINTFN(3, "cmd 0x%lx = %d\n", cmd, error); 1050 return (error); 1051 } 1052 1053 /*------------------------------------------------------------------------* 1054 * usb_ioctl - cdev callback 1055 *------------------------------------------------------------------------*/ 1056 static int 1057 usb_ioctl(struct dev_ioctl_args *ap) 1058 { 1059 u_long cmd = ap->a_cmd; 1060 caddr_t addr = ap->a_data; 1061 struct thread *td = curthread; 1062 struct usb_cdev_refdata refs; 1063 struct usb_cdev_privdata* cpd; 1064 struct usb_fifo *f; 1065 int fflags; 1066 int err; 1067 1068 DPRINTFN(2, "cmd=0x%lx\n", cmd); 1069 1070 err = devfs_get_cdevpriv(ap->a_fp, (void **)&cpd); 1071 if (err != 0) 1072 return (err); 1073 1074 /* 1075 * Performance optimisation: We try to check for IOCTL's that 1076 * don't need the USB reference first. Then we grab the USB 1077 * reference if we need it! 1078 */ 1079 err = usb_ref_device(cpd, &refs, 0 /* no uref */ ); 1080 if (err) 1081 return (ENXIO); 1082 1083 fflags = cpd->fflags; 1084 1085 f = NULL; /* set default value */ 1086 err = ENOIOCTL; /* set default value */ 1087 1088 if (fflags & FWRITE) { 1089 f = refs.txfifo; 1090 err = usb_ioctl_f_sub(f, cmd, addr, td); 1091 } 1092 if (fflags & FREAD) { 1093 f = refs.rxfifo; 1094 err = usb_ioctl_f_sub(f, cmd, addr, td); 1095 } 1096 KASSERT(f != NULL, ("fifo not found")); 1097 if (err != ENOIOCTL) 1098 goto done; 1099 1100 err = (f->methods->f_ioctl) (f, cmd, addr, fflags); 1101 1102 DPRINTFN(2, "f_ioctl cmd 0x%lx = %d\n", cmd, err); 1103 1104 if (err != ENOIOCTL) 1105 goto done; 1106 1107 if (usb_usb_ref_device(cpd, &refs)) { 1108 err = ENXIO; 1109 goto done; 1110 } 1111 1112 err = (f->methods->f_ioctl_post) (f, cmd, addr, fflags); 1113 1114 DPRINTFN(2, "f_ioctl_post cmd 0x%lx = %d\n", cmd, err); 1115 1116 if (err == ENOIOCTL) 1117 err = ENOTTY; 1118 1119 if (err) 1120 goto done; 1121 1122 /* Wait for re-enumeration, if any */ 1123 1124 while (f->udev->re_enumerate_wait != 0) { 1125 1126 usb_unref_device(cpd, &refs); 1127 1128 usb_pause_mtx(NULL, hz / 128); 1129 1130 if (usb_ref_device(cpd, &refs, 1 /* need uref */)) { 1131 err = ENXIO; 1132 goto done; 1133 } 1134 } 1135 1136 done: 1137 usb_unref_device(cpd, &refs); 1138 return (err); 1139 } 1140 1141 static struct filterops usb_filtops_read = 1142 { FILTEROP_ISFD, NULL, usb_filter_detach, usb_filter_read }; 1143 1144 static struct filterops usb_filtops_write = 1145 { FILTEROP_ISFD, NULL, usb_filter_detach, usb_filter_write }; 1146 1147 static int 1148 usb_kqfilter(struct dev_kqfilter_args *ap) 1149 { 1150 cdev_t dev = ap->a_head.a_dev; 1151 struct knote *kn = ap->a_kn; 1152 struct klist *klist; 1153 1154 ap->a_result = 0; 1155 1156 switch(kn->kn_filter) { 1157 case EVFILT_READ: 1158 kn->kn_fop = &usb_filtops_read; 1159 kn->kn_hook = (caddr_t)dev; 1160 break; 1161 case EVFILT_WRITE: 1162 kn->kn_fop = &usb_filtops_write; 1163 kn->kn_hook = (caddr_t)dev; 1164 break; 1165 default: 1166 ap->a_result = EOPNOTSUPP; 1167 return(0); 1168 } 1169 1170 klist = &usb_kqevent.ki_note; 1171 knote_insert(klist, kn); 1172 1173 return(0); 1174 } 1175 1176 static void 1177 usb_filter_detach(struct knote *kn) 1178 { 1179 struct klist *klist; 1180 1181 klist = &usb_kqevent.ki_note; 1182 knote_remove(klist, kn); 1183 } 1184 1185 static int 1186 usb_filter_read(struct knote *kn, long hint) 1187 { 1188 /*cdev_t dev = (cdev_t)kn->kn_hook; 1189 */ 1190 int ready = 0; 1191 1192 return(ready); 1193 } 1194 1195 static int 1196 usb_filter_write(struct knote *kn, long hint) 1197 { 1198 /*cdev_t dev = (cdev_t)kn->kn_hook; 1199 */ 1200 int ready = 0; 1201 1202 return(ready); 1203 } 1204 1205 #if 0 /* XXX implement using kqfilter */ 1206 /* ARGSUSED */ 1207 static int 1208 usb_poll(struct cdev* dev, int events, struct thread* td) 1209 { 1210 struct usb_cdev_refdata refs; 1211 struct usb_cdev_privdata* cpd; 1212 struct usb_fifo *f; 1213 struct usb_mbuf *m; 1214 int fflags, revents; 1215 1216 if (devfs_get_cdevpriv((void **)&cpd) != 0 || 1217 usb_ref_device(cpd, &refs, 0) != 0) 1218 return (events & 1219 (POLLHUP|POLLIN|POLLRDNORM|POLLOUT|POLLWRNORM)); 1220 1221 fflags = cpd->fflags; 1222 1223 /* Figure out who needs service */ 1224 revents = 0; 1225 if ((events & (POLLOUT | POLLWRNORM)) && 1226 (fflags & FWRITE)) { 1227 1228 f = refs.txfifo; 1229 1230 lockmgr(f->priv_lock, LK_EXCLUSIVE); 1231 1232 if (!refs.is_usbfs) { 1233 if (f->flag_iserror) { 1234 /* we got an error */ 1235 m = (void *)1; 1236 } else { 1237 if (f->queue_data == NULL) { 1238 /* 1239 * start write transfer, if not 1240 * already started 1241 */ 1242 (f->methods->f_start_write) (f); 1243 } 1244 /* check if any packets are available */ 1245 USB_IF_POLL(&f->free_q, m); 1246 } 1247 } else { 1248 if (f->flag_iscomplete) { 1249 m = (void *)1; 1250 } else { 1251 m = NULL; 1252 } 1253 } 1254 1255 if (m) { 1256 revents |= events & (POLLOUT | POLLWRNORM); 1257 } else { 1258 f->flag_isselect = 1; 1259 selrecord(td, &f->selinfo); 1260 } 1261 1262 lockmgr(f->priv_lock); 1263 } 1264 if ((events & (POLLIN | POLLRDNORM)) && 1265 (fflags & FREAD)) { 1266 1267 f = refs.rxfifo; 1268 1269 lockmgr(f->priv_lock, LK_EXCLUSIVE); 1270 1271 if (!refs.is_usbfs) { 1272 if (f->flag_iserror) { 1273 /* we have and error */ 1274 m = (void *)1; 1275 } else { 1276 if (f->queue_data == NULL) { 1277 /* 1278 * start read transfer, if not 1279 * already started 1280 */ 1281 (f->methods->f_start_read) (f); 1282 } 1283 /* check if any packets are available */ 1284 USB_IF_POLL(&f->used_q, m); 1285 } 1286 } else { 1287 if (f->flag_iscomplete) { 1288 m = (void *)1; 1289 } else { 1290 m = NULL; 1291 } 1292 } 1293 1294 if (m) { 1295 revents |= events & (POLLIN | POLLRDNORM); 1296 } else { 1297 f->flag_isselect = 1; 1298 selrecord(td, &f->selinfo); 1299 1300 if (!refs.is_usbfs) { 1301 /* start reading data */ 1302 (f->methods->f_start_read) (f); 1303 } 1304 } 1305 1306 lockmgr(f->priv_lock, LK_RELEASE); 1307 } 1308 usb_unref_device(cpd, &refs); 1309 return (revents); 1310 } 1311 #endif 1312 1313 static int 1314 usb_read(struct dev_read_args *ap) 1315 { 1316 struct uio *uio = ap->a_uio; 1317 int ioflag = ap->a_ioflag; 1318 struct usb_cdev_refdata refs; 1319 struct usb_cdev_privdata* cpd; 1320 struct usb_fifo *f; 1321 struct usb_mbuf *m; 1322 int fflags; 1323 int resid; 1324 int io_len; 1325 int err; 1326 uint8_t tr_data = 0; 1327 1328 err = devfs_get_cdevpriv(ap->a_fp, (void **)&cpd); 1329 if (err != 0) 1330 return (err); 1331 err = usb_ref_device(cpd, &refs, 0 /* no uref */ ); 1332 if (err) { 1333 return (ENXIO); 1334 } 1335 fflags = cpd->fflags; 1336 1337 f = refs.rxfifo; 1338 if (f == NULL) { 1339 /* should not happen */ 1340 usb_unref_device(cpd, &refs); 1341 return (EPERM); 1342 } 1343 1344 resid = uio->uio_resid; 1345 1346 lockmgr(f->priv_lock, LK_EXCLUSIVE); 1347 1348 /* check for permanent read error */ 1349 if (f->flag_iserror) { 1350 err = EIO; 1351 goto done; 1352 } 1353 /* check if USB-FS interface is active */ 1354 if (refs.is_usbfs) { 1355 /* 1356 * The queue is used for events that should be 1357 * retrieved using the "USB_FS_COMPLETE" ioctl. 1358 */ 1359 err = EINVAL; 1360 goto done; 1361 } 1362 while (uio->uio_resid > 0) { 1363 1364 USB_IF_DEQUEUE(&f->used_q, m); 1365 1366 if (m == NULL) { 1367 1368 /* start read transfer, if not already started */ 1369 1370 (f->methods->f_start_read) (f); 1371 1372 if (ioflag & IO_NDELAY) { 1373 if (tr_data) { 1374 /* return length before error */ 1375 break; 1376 } 1377 err = EWOULDBLOCK; 1378 break; 1379 } 1380 DPRINTF("sleeping\n"); 1381 1382 err = usb_fifo_wait(f); 1383 if (err) { 1384 break; 1385 } 1386 continue; 1387 } 1388 if (f->methods->f_filter_read) { 1389 /* 1390 * Sometimes it is convenient to process data at the 1391 * expense of a userland process instead of a kernel 1392 * process. 1393 */ 1394 (f->methods->f_filter_read) (f, m); 1395 } 1396 tr_data = 1; 1397 1398 io_len = MIN(m->cur_data_len, uio->uio_resid); 1399 1400 DPRINTFN(2, "transfer %d bytes from %p\n", 1401 io_len, m->cur_data_ptr); 1402 1403 err = usb_fifo_uiomove(f, 1404 m->cur_data_ptr, io_len, uio); 1405 1406 m->cur_data_len -= io_len; 1407 m->cur_data_ptr += io_len; 1408 1409 if (m->cur_data_len == 0) { 1410 1411 uint8_t last_packet; 1412 1413 last_packet = m->last_packet; 1414 1415 USB_IF_ENQUEUE(&f->free_q, m); 1416 1417 if (last_packet) { 1418 /* keep framing */ 1419 break; 1420 } 1421 } else { 1422 USB_IF_PREPEND(&f->used_q, m); 1423 } 1424 1425 if (err) { 1426 break; 1427 } 1428 } 1429 done: 1430 lockmgr(f->priv_lock, LK_RELEASE); 1431 1432 usb_unref_device(cpd, &refs); 1433 1434 return (err); 1435 } 1436 1437 static int 1438 usb_write(struct dev_write_args *ap) 1439 { 1440 struct uio *uio = ap->a_uio; 1441 int ioflag = ap->a_ioflag; 1442 struct usb_cdev_refdata refs; 1443 struct usb_cdev_privdata* cpd; 1444 struct usb_fifo *f; 1445 struct usb_mbuf *m; 1446 uint8_t *pdata; 1447 int fflags; 1448 int resid; 1449 int io_len; 1450 int err; 1451 uint8_t tr_data = 0; 1452 1453 DPRINTFN(2, "\n"); 1454 1455 err = devfs_get_cdevpriv(ap->a_fp, (void **)&cpd); 1456 if (err != 0) 1457 return (err); 1458 err = usb_ref_device(cpd, &refs, 0 /* no uref */ ); 1459 if (err) { 1460 return (ENXIO); 1461 } 1462 fflags = cpd->fflags; 1463 1464 f = refs.txfifo; 1465 if (f == NULL) { 1466 /* should not happen */ 1467 usb_unref_device(cpd, &refs); 1468 return (EPERM); 1469 } 1470 resid = uio->uio_resid; 1471 1472 lockmgr(f->priv_lock, LK_EXCLUSIVE); 1473 1474 /* check for permanent write error */ 1475 if (f->flag_iserror) { 1476 err = EIO; 1477 goto done; 1478 } 1479 /* check if USB-FS interface is active */ 1480 if (refs.is_usbfs) { 1481 /* 1482 * The queue is used for events that should be 1483 * retrieved using the "USB_FS_COMPLETE" ioctl. 1484 */ 1485 err = EINVAL; 1486 goto done; 1487 } 1488 if (f->queue_data == NULL) { 1489 /* start write transfer, if not already started */ 1490 (f->methods->f_start_write) (f); 1491 } 1492 /* we allow writing zero length data */ 1493 do { 1494 USB_IF_DEQUEUE(&f->free_q, m); 1495 1496 if (m == NULL) { 1497 1498 if (ioflag & IO_NDELAY) { 1499 if (tr_data) { 1500 /* return length before error */ 1501 break; 1502 } 1503 err = EWOULDBLOCK; 1504 break; 1505 } 1506 DPRINTF("sleeping\n"); 1507 1508 err = usb_fifo_wait(f); 1509 if (err) { 1510 break; 1511 } 1512 continue; 1513 } 1514 tr_data = 1; 1515 1516 if (f->flag_have_fragment == 0) { 1517 USB_MBUF_RESET(m); 1518 io_len = m->cur_data_len; 1519 pdata = m->cur_data_ptr; 1520 if (io_len > uio->uio_resid) 1521 io_len = uio->uio_resid; 1522 m->cur_data_len = io_len; 1523 } else { 1524 io_len = m->max_data_len - m->cur_data_len; 1525 pdata = m->cur_data_ptr + m->cur_data_len; 1526 if (io_len > uio->uio_resid) 1527 io_len = uio->uio_resid; 1528 m->cur_data_len += io_len; 1529 } 1530 1531 DPRINTFN(2, "transfer %d bytes to %p\n", 1532 io_len, pdata); 1533 1534 err = usb_fifo_uiomove(f, pdata, io_len, uio); 1535 1536 if (err) { 1537 f->flag_have_fragment = 0; 1538 USB_IF_ENQUEUE(&f->free_q, m); 1539 break; 1540 } 1541 1542 /* check if the buffer is ready to be transmitted */ 1543 1544 if ((f->flag_write_defrag == 0) || 1545 (m->cur_data_len == m->max_data_len)) { 1546 f->flag_have_fragment = 0; 1547 1548 /* 1549 * Check for write filter: 1550 * 1551 * Sometimes it is convenient to process data 1552 * at the expense of a userland process 1553 * instead of a kernel process. 1554 */ 1555 if (f->methods->f_filter_write) { 1556 (f->methods->f_filter_write) (f, m); 1557 } 1558 1559 /* Put USB mbuf in the used queue */ 1560 USB_IF_ENQUEUE(&f->used_q, m); 1561 1562 /* Start writing data, if not already started */ 1563 (f->methods->f_start_write) (f); 1564 } else { 1565 /* Wait for more data or close */ 1566 f->flag_have_fragment = 1; 1567 USB_IF_PREPEND(&f->free_q, m); 1568 } 1569 1570 } while (uio->uio_resid > 0); 1571 done: 1572 lockmgr(f->priv_lock, LK_RELEASE); 1573 1574 usb_unref_device(cpd, &refs); 1575 1576 return (err); 1577 } 1578 1579 int 1580 usb_static_open(struct dev_open_args *ap) 1581 { 1582 return 0; 1583 } 1584 1585 int 1586 usb_static_close(struct dev_close_args *ap) 1587 { 1588 return 0; 1589 } 1590 1591 int 1592 usb_static_ioctl(struct dev_ioctl_args *ap) 1593 { 1594 u_long cmd = ap->a_cmd; 1595 caddr_t data = ap->a_data; 1596 struct thread *td = curthread; /* XXX: curthread the correct choice? */ 1597 int fflag = ap->a_fflag; 1598 union { 1599 struct usb_read_dir *urd; 1600 void* data; 1601 } u; 1602 int err; 1603 1604 u.data = data; 1605 switch (cmd) { 1606 case USB_READ_DIR: 1607 err = usb_read_symlink(u.urd->urd_data, 1608 u.urd->urd_startentry, u.urd->urd_maxlen); 1609 break; 1610 case USB_DEV_QUIRK_GET: 1611 case USB_QUIRK_NAME_GET: 1612 case USB_DEV_QUIRK_ADD: 1613 case USB_DEV_QUIRK_REMOVE: 1614 err = usb_quirk_ioctl_p(cmd, data, fflag, td); 1615 break; 1616 case USB_GET_TEMPLATE: 1617 *(int *)data = usb_template; 1618 err = 0; 1619 break; 1620 case USB_SET_TEMPLATE: 1621 err = priv_check(curthread, PRIV_DRIVER); 1622 if (err) 1623 break; 1624 usb_template = *(int *)data; 1625 break; 1626 default: 1627 err = ENOTTY; 1628 break; 1629 } 1630 return (err); 1631 } 1632 1633 static int 1634 usb_fifo_uiomove(struct usb_fifo *f, void *cp, 1635 int n, struct uio *uio) 1636 { 1637 int error; 1638 1639 lockmgr(f->priv_lock, LK_RELEASE); 1640 1641 /* 1642 * "uiomove()" can sleep so one needs to make a wrapper, 1643 * exiting the mutex and checking things: 1644 */ 1645 error = uiomove(cp, n, uio); 1646 1647 lockmgr(f->priv_lock, LK_EXCLUSIVE); 1648 1649 return (error); 1650 } 1651 1652 int 1653 usb_fifo_wait(struct usb_fifo *f) 1654 { 1655 int err; 1656 1657 KKASSERT(lockowned(f->priv_lock)); 1658 1659 if (f->flag_iserror) { 1660 /* we are gone */ 1661 return (EIO); 1662 } 1663 f->flag_sleeping = 1; 1664 1665 err = cv_wait_sig(&f->cv_io, f->priv_lock); 1666 1667 if (f->flag_iserror) { 1668 /* we are gone */ 1669 err = EIO; 1670 } 1671 return (err); 1672 } 1673 1674 void 1675 usb_fifo_signal(struct usb_fifo *f) 1676 { 1677 if (f->flag_sleeping) { 1678 f->flag_sleeping = 0; 1679 cv_broadcast(&f->cv_io); 1680 } 1681 } 1682 1683 void 1684 usb_fifo_wakeup(struct usb_fifo *f) 1685 { 1686 usb_fifo_signal(f); 1687 1688 if (f->flag_isselect) { 1689 #if 0 /* XXXDF */ 1690 selwakeup(&f->selinfo); 1691 #endif 1692 f->flag_isselect = 0; 1693 } 1694 if (f->async_p != NULL && lwkt_trytoken(&f->async_p->p_token)) { 1695 ksignal(f->async_p, SIGIO); 1696 lwkt_reltoken(&f->async_p->p_token); 1697 } 1698 } 1699 1700 static int 1701 usb_fifo_dummy_open(struct usb_fifo *fifo, int fflags) 1702 { 1703 return (0); 1704 } 1705 1706 static void 1707 usb_fifo_dummy_close(struct usb_fifo *fifo, int fflags) 1708 { 1709 return; 1710 } 1711 1712 static int 1713 usb_fifo_dummy_ioctl(struct usb_fifo *fifo, u_long cmd, void *addr, int fflags) 1714 { 1715 return (ENOIOCTL); 1716 } 1717 1718 static void 1719 usb_fifo_dummy_cmd(struct usb_fifo *fifo) 1720 { 1721 fifo->flag_flushing = 0; /* not flushing */ 1722 } 1723 1724 static void 1725 usb_fifo_check_methods(struct usb_fifo_methods *pm) 1726 { 1727 /* check that all callback functions are OK */ 1728 1729 if (pm->f_open == NULL) 1730 pm->f_open = &usb_fifo_dummy_open; 1731 1732 if (pm->f_close == NULL) 1733 pm->f_close = &usb_fifo_dummy_close; 1734 1735 if (pm->f_ioctl == NULL) 1736 pm->f_ioctl = &usb_fifo_dummy_ioctl; 1737 1738 if (pm->f_ioctl_post == NULL) 1739 pm->f_ioctl_post = &usb_fifo_dummy_ioctl; 1740 1741 if (pm->f_start_read == NULL) 1742 pm->f_start_read = &usb_fifo_dummy_cmd; 1743 1744 if (pm->f_stop_read == NULL) 1745 pm->f_stop_read = &usb_fifo_dummy_cmd; 1746 1747 if (pm->f_start_write == NULL) 1748 pm->f_start_write = &usb_fifo_dummy_cmd; 1749 1750 if (pm->f_stop_write == NULL) 1751 pm->f_stop_write = &usb_fifo_dummy_cmd; 1752 } 1753 1754 /*------------------------------------------------------------------------* 1755 * usb_fifo_attach 1756 * 1757 * The following function will create a duplex FIFO. 1758 * 1759 * Return values: 1760 * 0: Success. 1761 * Else: Failure. 1762 *------------------------------------------------------------------------*/ 1763 int 1764 usb_fifo_attach(struct usb_device *udev, void *priv_sc, 1765 struct lock *priv_lock, struct usb_fifo_methods *pm, 1766 struct usb_fifo_sc *f_sc, uint16_t unit, int16_t subunit, 1767 uint8_t iface_index, uid_t uid, gid_t gid, int mode) 1768 { 1769 struct usb_fifo *f_tx; 1770 struct usb_fifo *f_rx; 1771 char devname[32]; 1772 uint8_t n; 1773 1774 f_sc->fp[USB_FIFO_TX] = NULL; 1775 f_sc->fp[USB_FIFO_RX] = NULL; 1776 1777 if (pm == NULL) 1778 return (EINVAL); 1779 1780 /* check the methods */ 1781 usb_fifo_check_methods(pm); 1782 1783 /* search for a free FIFO slot */ 1784 for (n = 0;; n += 2) { 1785 1786 if (n == USB_FIFO_MAX) { 1787 /* end of FIFOs reached */ 1788 return (ENOMEM); 1789 } 1790 /* Check for TX FIFO */ 1791 if (udev->fifo[n + USB_FIFO_TX] != NULL) { 1792 continue; 1793 } 1794 /* Check for RX FIFO */ 1795 if (udev->fifo[n + USB_FIFO_RX] != NULL) { 1796 continue; 1797 } 1798 break; 1799 } 1800 1801 f_tx = usb_fifo_alloc(); 1802 f_rx = usb_fifo_alloc(); 1803 1804 if ((f_tx == NULL) || (f_rx == NULL)) { 1805 usb_fifo_free(f_tx); 1806 usb_fifo_free(f_rx); 1807 return (ENOMEM); 1808 } 1809 /* initialise FIFO structures */ 1810 1811 f_tx->fifo_index = n + USB_FIFO_TX; 1812 f_tx->dev_ep_index = -1; 1813 f_tx->priv_lock = priv_lock; 1814 f_tx->priv_sc0 = priv_sc; 1815 f_tx->methods = pm; 1816 f_tx->iface_index = iface_index; 1817 f_tx->udev = udev; 1818 1819 f_rx->fifo_index = n + USB_FIFO_RX; 1820 f_rx->dev_ep_index = -1; 1821 f_rx->priv_lock = priv_lock; 1822 f_rx->priv_sc0 = priv_sc; 1823 f_rx->methods = pm; 1824 f_rx->iface_index = iface_index; 1825 f_rx->udev = udev; 1826 1827 f_sc->fp[USB_FIFO_TX] = f_tx; 1828 f_sc->fp[USB_FIFO_RX] = f_rx; 1829 1830 lockmgr(&usb_ref_lock, LK_EXCLUSIVE); 1831 udev->fifo[f_tx->fifo_index] = f_tx; 1832 udev->fifo[f_rx->fifo_index] = f_rx; 1833 lockmgr(&usb_ref_lock, LK_RELEASE); 1834 1835 for (n = 0; n != 4; n++) { 1836 1837 if (pm->basename[n] == NULL) { 1838 continue; 1839 } 1840 if (subunit == 0xFFFF) { 1841 if (ksnprintf(devname, sizeof(devname), 1842 "%s%u%s", pm->basename[n], 1843 unit, pm->postfix[n] ? 1844 pm->postfix[n] : "")) { 1845 /* ignore */ 1846 } 1847 } else { 1848 if (ksnprintf(devname, sizeof(devname), 1849 "%s%u.%u%s", pm->basename[n], 1850 unit, subunit, pm->postfix[n] ? 1851 pm->postfix[n] : "")) { 1852 /* ignore */ 1853 } 1854 } 1855 1856 /* 1857 * Distribute the symbolic links into two FIFO structures: 1858 */ 1859 if (n & 1) { 1860 f_rx->symlink[n / 2] = 1861 usb_alloc_symlink(devname); 1862 } else { 1863 f_tx->symlink[n / 2] = 1864 usb_alloc_symlink(devname); 1865 } 1866 1867 /* Create the device */ 1868 f_sc->dev = usb_make_dev(udev, devname, -1, 1869 f_tx->fifo_index & f_rx->fifo_index, 1870 FREAD|FWRITE, uid, gid, mode); 1871 } 1872 1873 DPRINTFN(2, "attached %p/%p\n", f_tx, f_rx); 1874 return (0); 1875 } 1876 1877 /*------------------------------------------------------------------------* 1878 * usb_fifo_alloc_buffer 1879 * 1880 * Return values: 1881 * 0: Success 1882 * Else failure 1883 *------------------------------------------------------------------------*/ 1884 int 1885 usb_fifo_alloc_buffer(struct usb_fifo *f, usb_size_t bufsize, 1886 uint16_t nbuf) 1887 { 1888 usb_fifo_free_buffer(f); 1889 1890 /* allocate an endpoint */ 1891 f->free_q.ifq_maxlen = nbuf; 1892 f->used_q.ifq_maxlen = nbuf; 1893 1894 f->queue_data = usb_alloc_mbufs( 1895 M_USBDEV, &f->free_q, bufsize, nbuf); 1896 1897 if ((f->queue_data == NULL) && bufsize && nbuf) { 1898 return (ENOMEM); 1899 } 1900 return (0); /* success */ 1901 } 1902 1903 /*------------------------------------------------------------------------* 1904 * usb_fifo_free_buffer 1905 * 1906 * This function will free the buffers associated with a FIFO. This 1907 * function can be called multiple times in a row. 1908 *------------------------------------------------------------------------*/ 1909 void 1910 usb_fifo_free_buffer(struct usb_fifo *f) 1911 { 1912 if (f->queue_data) { 1913 /* free old buffer */ 1914 kfree(f->queue_data, M_USBDEV); 1915 f->queue_data = NULL; 1916 } 1917 /* reset queues */ 1918 1919 memset(&f->free_q, 0, sizeof(f->free_q)); 1920 memset(&f->used_q, 0, sizeof(f->used_q)); 1921 } 1922 1923 void 1924 usb_fifo_detach(struct usb_fifo_sc *f_sc) 1925 { 1926 if (f_sc == NULL) { 1927 return; 1928 } 1929 usb_fifo_free(f_sc->fp[USB_FIFO_TX]); 1930 usb_fifo_free(f_sc->fp[USB_FIFO_RX]); 1931 1932 f_sc->fp[USB_FIFO_TX] = NULL; 1933 f_sc->fp[USB_FIFO_RX] = NULL; 1934 1935 usb_destroy_dev(f_sc->dev); 1936 1937 f_sc->dev = NULL; 1938 1939 DPRINTFN(2, "detached %p\n", f_sc); 1940 } 1941 1942 usb_size_t 1943 usb_fifo_put_bytes_max(struct usb_fifo *f) 1944 { 1945 struct usb_mbuf *m; 1946 usb_size_t len; 1947 1948 USB_IF_POLL(&f->free_q, m); 1949 1950 if (m) { 1951 len = m->max_data_len; 1952 } else { 1953 len = 0; 1954 } 1955 return (len); 1956 } 1957 1958 /*------------------------------------------------------------------------* 1959 * usb_fifo_put_data 1960 * 1961 * what: 1962 * 0 - normal operation 1963 * 1 - set last packet flag to enforce framing 1964 *------------------------------------------------------------------------*/ 1965 void 1966 usb_fifo_put_data(struct usb_fifo *f, struct usb_page_cache *pc, 1967 usb_frlength_t offset, usb_frlength_t len, uint8_t what) 1968 { 1969 struct usb_mbuf *m; 1970 usb_frlength_t io_len; 1971 1972 while (len || (what == 1)) { 1973 1974 USB_IF_DEQUEUE(&f->free_q, m); 1975 1976 if (m) { 1977 USB_MBUF_RESET(m); 1978 1979 io_len = MIN(len, m->cur_data_len); 1980 1981 usbd_copy_out(pc, offset, m->cur_data_ptr, io_len); 1982 1983 m->cur_data_len = io_len; 1984 offset += io_len; 1985 len -= io_len; 1986 1987 if ((len == 0) && (what == 1)) { 1988 m->last_packet = 1; 1989 } 1990 USB_IF_ENQUEUE(&f->used_q, m); 1991 1992 usb_fifo_wakeup(f); 1993 1994 if ((len == 0) || (what == 1)) { 1995 break; 1996 } 1997 } else { 1998 break; 1999 } 2000 } 2001 } 2002 2003 void 2004 usb_fifo_put_data_linear(struct usb_fifo *f, void *ptr, 2005 usb_size_t len, uint8_t what) 2006 { 2007 struct usb_mbuf *m; 2008 usb_size_t io_len; 2009 2010 while (len || (what == 1)) { 2011 2012 USB_IF_DEQUEUE(&f->free_q, m); 2013 2014 if (m) { 2015 USB_MBUF_RESET(m); 2016 2017 io_len = MIN(len, m->cur_data_len); 2018 2019 memcpy(m->cur_data_ptr, ptr, io_len); 2020 2021 m->cur_data_len = io_len; 2022 ptr = USB_ADD_BYTES(ptr, io_len); 2023 len -= io_len; 2024 2025 if ((len == 0) && (what == 1)) { 2026 m->last_packet = 1; 2027 } 2028 USB_IF_ENQUEUE(&f->used_q, m); 2029 2030 usb_fifo_wakeup(f); 2031 2032 if ((len == 0) || (what == 1)) { 2033 break; 2034 } 2035 } else { 2036 break; 2037 } 2038 } 2039 } 2040 2041 uint8_t 2042 usb_fifo_put_data_buffer(struct usb_fifo *f, void *ptr, usb_size_t len) 2043 { 2044 struct usb_mbuf *m; 2045 2046 USB_IF_DEQUEUE(&f->free_q, m); 2047 2048 if (m) { 2049 m->cur_data_len = len; 2050 m->cur_data_ptr = ptr; 2051 USB_IF_ENQUEUE(&f->used_q, m); 2052 usb_fifo_wakeup(f); 2053 return (1); 2054 } 2055 return (0); 2056 } 2057 2058 void 2059 usb_fifo_put_data_error(struct usb_fifo *f) 2060 { 2061 f->flag_iserror = 1; 2062 usb_fifo_wakeup(f); 2063 } 2064 2065 /*------------------------------------------------------------------------* 2066 * usb_fifo_get_data 2067 * 2068 * what: 2069 * 0 - normal operation 2070 * 1 - only get one "usb_mbuf" 2071 * 2072 * returns: 2073 * 0 - no more data 2074 * 1 - data in buffer 2075 *------------------------------------------------------------------------*/ 2076 uint8_t 2077 usb_fifo_get_data(struct usb_fifo *f, struct usb_page_cache *pc, 2078 usb_frlength_t offset, usb_frlength_t len, usb_frlength_t *actlen, 2079 uint8_t what) 2080 { 2081 struct usb_mbuf *m; 2082 usb_frlength_t io_len; 2083 uint8_t tr_data = 0; 2084 2085 actlen[0] = 0; 2086 2087 while (1) { 2088 2089 USB_IF_DEQUEUE(&f->used_q, m); 2090 2091 if (m) { 2092 2093 tr_data = 1; 2094 2095 io_len = MIN(len, m->cur_data_len); 2096 2097 usbd_copy_in(pc, offset, m->cur_data_ptr, io_len); 2098 2099 len -= io_len; 2100 offset += io_len; 2101 actlen[0] += io_len; 2102 m->cur_data_ptr += io_len; 2103 m->cur_data_len -= io_len; 2104 2105 if ((m->cur_data_len == 0) || (what == 1)) { 2106 USB_IF_ENQUEUE(&f->free_q, m); 2107 2108 usb_fifo_wakeup(f); 2109 2110 if (what == 1) { 2111 break; 2112 } 2113 } else { 2114 USB_IF_PREPEND(&f->used_q, m); 2115 } 2116 } else { 2117 2118 if (tr_data) { 2119 /* wait for data to be written out */ 2120 break; 2121 } 2122 if (f->flag_flushing) { 2123 /* check if we should send a short packet */ 2124 if (f->flag_short != 0) { 2125 f->flag_short = 0; 2126 tr_data = 1; 2127 break; 2128 } 2129 /* flushing complete */ 2130 f->flag_flushing = 0; 2131 usb_fifo_wakeup(f); 2132 } 2133 break; 2134 } 2135 if (len == 0) { 2136 break; 2137 } 2138 } 2139 return (tr_data); 2140 } 2141 2142 uint8_t 2143 usb_fifo_get_data_linear(struct usb_fifo *f, void *ptr, 2144 usb_size_t len, usb_size_t *actlen, uint8_t what) 2145 { 2146 struct usb_mbuf *m; 2147 usb_size_t io_len; 2148 uint8_t tr_data = 0; 2149 2150 actlen[0] = 0; 2151 2152 while (1) { 2153 2154 USB_IF_DEQUEUE(&f->used_q, m); 2155 2156 if (m) { 2157 2158 tr_data = 1; 2159 2160 io_len = MIN(len, m->cur_data_len); 2161 2162 memcpy(ptr, m->cur_data_ptr, io_len); 2163 2164 len -= io_len; 2165 ptr = USB_ADD_BYTES(ptr, io_len); 2166 actlen[0] += io_len; 2167 m->cur_data_ptr += io_len; 2168 m->cur_data_len -= io_len; 2169 2170 if ((m->cur_data_len == 0) || (what == 1)) { 2171 USB_IF_ENQUEUE(&f->free_q, m); 2172 2173 usb_fifo_wakeup(f); 2174 2175 if (what == 1) { 2176 break; 2177 } 2178 } else { 2179 USB_IF_PREPEND(&f->used_q, m); 2180 } 2181 } else { 2182 2183 if (tr_data) { 2184 /* wait for data to be written out */ 2185 break; 2186 } 2187 if (f->flag_flushing) { 2188 /* check if we should send a short packet */ 2189 if (f->flag_short != 0) { 2190 f->flag_short = 0; 2191 tr_data = 1; 2192 break; 2193 } 2194 /* flushing complete */ 2195 f->flag_flushing = 0; 2196 usb_fifo_wakeup(f); 2197 } 2198 break; 2199 } 2200 if (len == 0) { 2201 break; 2202 } 2203 } 2204 return (tr_data); 2205 } 2206 2207 uint8_t 2208 usb_fifo_get_data_buffer(struct usb_fifo *f, void **pptr, usb_size_t *plen) 2209 { 2210 struct usb_mbuf *m; 2211 2212 USB_IF_POLL(&f->used_q, m); 2213 2214 if (m) { 2215 *plen = m->cur_data_len; 2216 *pptr = m->cur_data_ptr; 2217 2218 return (1); 2219 } 2220 return (0); 2221 } 2222 2223 void 2224 usb_fifo_get_data_error(struct usb_fifo *f) 2225 { 2226 f->flag_iserror = 1; 2227 usb_fifo_wakeup(f); 2228 } 2229 2230 /*------------------------------------------------------------------------* 2231 * usb_alloc_symlink 2232 * 2233 * Return values: 2234 * NULL: Failure 2235 * Else: Pointer to symlink entry 2236 *------------------------------------------------------------------------*/ 2237 struct usb_symlink * 2238 usb_alloc_symlink(const char *target) 2239 { 2240 struct usb_symlink *ps; 2241 2242 ps = kmalloc(sizeof(*ps), M_USBDEV, M_WAITOK); 2243 if (ps == NULL) { 2244 return (ps); 2245 } 2246 /* XXX no longer needed */ 2247 strlcpy(ps->src_path, target, sizeof(ps->src_path)); 2248 ps->src_len = strlen(ps->src_path); 2249 strlcpy(ps->dst_path, target, sizeof(ps->dst_path)); 2250 ps->dst_len = strlen(ps->dst_path); 2251 2252 lockmgr(&usb_sym_lock, LK_EXCLUSIVE); 2253 TAILQ_INSERT_TAIL(&usb_sym_head, ps, sym_entry); 2254 lockmgr(&usb_sym_lock, LK_RELEASE); 2255 return (ps); 2256 } 2257 2258 /*------------------------------------------------------------------------* 2259 * usb_free_symlink 2260 *------------------------------------------------------------------------*/ 2261 void 2262 usb_free_symlink(struct usb_symlink *ps) 2263 { 2264 if (ps == NULL) { 2265 return; 2266 } 2267 lockmgr(&usb_sym_lock, LK_EXCLUSIVE); 2268 TAILQ_REMOVE(&usb_sym_head, ps, sym_entry); 2269 lockmgr(&usb_sym_lock, LK_RELEASE); 2270 2271 kfree(ps, M_USBDEV); 2272 } 2273 2274 /*------------------------------------------------------------------------* 2275 * usb_read_symlink 2276 * 2277 * Return value: 2278 * 0: Success 2279 * Else: Failure 2280 *------------------------------------------------------------------------*/ 2281 int 2282 usb_read_symlink(uint8_t *user_ptr, uint32_t startentry, uint32_t user_len) 2283 { 2284 struct usb_symlink *ps; 2285 uint32_t temp; 2286 uint32_t delta = 0; 2287 uint8_t len; 2288 int error = 0; 2289 2290 lockmgr(&usb_sym_lock, LK_EXCLUSIVE); 2291 2292 TAILQ_FOREACH(ps, &usb_sym_head, sym_entry) { 2293 2294 /* 2295 * Compute total length of source and destination symlink 2296 * strings pluss one length byte and two NUL bytes: 2297 */ 2298 temp = ps->src_len + ps->dst_len + 3; 2299 2300 if (temp > 255) { 2301 /* 2302 * Skip entry because this length cannot fit 2303 * into one byte: 2304 */ 2305 continue; 2306 } 2307 if (startentry != 0) { 2308 /* decrement read offset */ 2309 startentry--; 2310 continue; 2311 } 2312 if (temp > user_len) { 2313 /* out of buffer space */ 2314 break; 2315 } 2316 len = temp; 2317 2318 /* copy out total length */ 2319 2320 error = copyout(&len, 2321 USB_ADD_BYTES(user_ptr, delta), 1); 2322 if (error) { 2323 break; 2324 } 2325 delta += 1; 2326 2327 /* copy out source string */ 2328 2329 error = copyout(ps->src_path, 2330 USB_ADD_BYTES(user_ptr, delta), ps->src_len); 2331 if (error) { 2332 break; 2333 } 2334 len = 0; 2335 delta += ps->src_len; 2336 error = copyout(&len, 2337 USB_ADD_BYTES(user_ptr, delta), 1); 2338 if (error) { 2339 break; 2340 } 2341 delta += 1; 2342 2343 /* copy out destination string */ 2344 2345 error = copyout(ps->dst_path, 2346 USB_ADD_BYTES(user_ptr, delta), ps->dst_len); 2347 if (error) { 2348 break; 2349 } 2350 len = 0; 2351 delta += ps->dst_len; 2352 error = copyout(&len, 2353 USB_ADD_BYTES(user_ptr, delta), 1); 2354 if (error) { 2355 break; 2356 } 2357 delta += 1; 2358 2359 user_len -= temp; 2360 } 2361 2362 /* a zero length entry indicates the end */ 2363 2364 if ((user_len != 0) && (error == 0)) { 2365 2366 len = 0; 2367 2368 error = copyout(&len, 2369 USB_ADD_BYTES(user_ptr, delta), 1); 2370 } 2371 lockmgr(&usb_sym_lock, LK_RELEASE); 2372 return (error); 2373 } 2374 2375 void 2376 usb_fifo_set_close_zlp(struct usb_fifo *f, uint8_t onoff) 2377 { 2378 if (f == NULL) 2379 return; 2380 2381 /* send a Zero Length Packet, ZLP, before close */ 2382 f->flag_short = onoff; 2383 } 2384 2385 void 2386 usb_fifo_set_write_defrag(struct usb_fifo *f, uint8_t onoff) 2387 { 2388 if (f == NULL) 2389 return; 2390 2391 /* defrag written data */ 2392 f->flag_write_defrag = onoff; 2393 /* reset defrag state */ 2394 f->flag_have_fragment = 0; 2395 } 2396 2397 void * 2398 usb_fifo_softc(struct usb_fifo *f) 2399 { 2400 return (f->priv_sc0); 2401 } 2402 #endif /* USB_HAVE_UGEN */ 2403