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