1 /* $NetBSD: ubt.c,v 1.49 2012/10/06 14:37:41 christos Exp $ */ 2 3 /*- 4 * Copyright (c) 2006 Itronix Inc. 5 * All rights reserved. 6 * 7 * Written by Iain Hibbert for Itronix Inc. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. The name of Itronix Inc. may not be used to endorse 18 * or promote products derived from this software without specific 19 * prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY ITRONIX INC. ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 23 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY 25 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 27 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 28 * ON ANY THEORY OF LIABILITY, WHETHER IN 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31 * POSSIBILITY OF SUCH DAMAGE. 32 */ 33 /* 34 * Copyright (c) 2002, 2003 The NetBSD Foundation, Inc. 35 * All rights reserved. 36 * 37 * This code is derived from software contributed to The NetBSD Foundation 38 * by Lennart Augustsson (lennart@augustsson.net) and 39 * David Sainty (David.Sainty@dtsp.co.nz). 40 * 41 * Redistribution and use in source and binary forms, with or without 42 * modification, are permitted provided that the following conditions 43 * are met: 44 * 1. Redistributions of source code must retain the above copyright 45 * notice, this list of conditions and the following disclaimer. 46 * 2. Redistributions in binary form must reproduce the above copyright 47 * notice, this list of conditions and the following disclaimer in the 48 * documentation and/or other materials provided with the distribution. 49 * 50 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 51 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 52 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 53 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 54 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 55 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 56 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 57 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 58 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 59 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 60 * POSSIBILITY OF SUCH DAMAGE. 61 */ 62 /* 63 * This driver originally written by Lennart Augustsson and David Sainty, 64 * but was mostly rewritten for the NetBSD Bluetooth protocol stack by 65 * Iain Hibbert for Itronix, Inc using the FreeBSD ng_ubt.c driver as a 66 * reference. 67 */ 68 69 #include <sys/cdefs.h> 70 __KERNEL_RCSID(0, "$NetBSD: ubt.c,v 1.49 2012/10/06 14:37:41 christos Exp $"); 71 72 #include <sys/param.h> 73 #include <sys/device.h> 74 #include <sys/ioctl.h> 75 #include <sys/kernel.h> 76 #include <sys/malloc.h> 77 #include <sys/mbuf.h> 78 #include <sys/proc.h> 79 #include <sys/sysctl.h> 80 #include <sys/systm.h> 81 82 #include <dev/usb/usb.h> 83 #include <dev/usb/usbdi.h> 84 #include <dev/usb/usbdi_util.h> 85 #include <dev/usb/usbdevs.h> 86 87 #include <netbt/bluetooth.h> 88 #include <netbt/hci.h> 89 90 /******************************************************************************* 91 * 92 * debugging stuff 93 */ 94 #undef DPRINTF 95 #undef DPRINTFN 96 97 #ifdef UBT_DEBUG 98 int ubt_debug = 0; 99 100 #define DPRINTF(...) do { \ 101 if (ubt_debug) { \ 102 printf("%s: ", __func__); \ 103 printf(__VA_ARGS__); \ 104 } \ 105 } while (/* CONSTCOND */0) 106 107 #define DPRINTFN(n, ...) do { \ 108 if (ubt_debug > (n)) { \ 109 printf("%s: ", __func__); \ 110 printf(__VA_ARGS__); \ 111 } \ 112 } while (/* CONSTCOND */0) 113 114 SYSCTL_SETUP(sysctl_hw_ubt_debug_setup, "sysctl hw.ubt_debug setup") 115 { 116 117 sysctl_createv(NULL, 0, NULL, NULL, 118 CTLFLAG_PERMANENT, 119 CTLTYPE_NODE, "hw", 120 NULL, 121 NULL, 0, 122 NULL, 0, 123 CTL_HW, CTL_EOL); 124 125 sysctl_createv(NULL, 0, NULL, NULL, 126 CTLFLAG_PERMANENT | CTLFLAG_READWRITE, 127 CTLTYPE_INT, "ubt_debug", 128 SYSCTL_DESCR("ubt debug level"), 129 NULL, 0, 130 &ubt_debug, sizeof(ubt_debug), 131 CTL_HW, CTL_CREATE, CTL_EOL); 132 } 133 #else 134 #define DPRINTF(...) 135 #define DPRINTFN(...) 136 #endif 137 138 /******************************************************************************* 139 * 140 * ubt softc structure 141 * 142 */ 143 144 /* buffer sizes */ 145 /* 146 * NB: although ACL packets can extend to 65535 bytes, most devices 147 * have max_acl_size at much less (largest I have seen is 384) 148 */ 149 #define UBT_BUFSIZ_CMD (HCI_CMD_PKT_SIZE - 1) 150 #define UBT_BUFSIZ_ACL (2048 - 1) 151 #define UBT_BUFSIZ_EVENT (HCI_EVENT_PKT_SIZE - 1) 152 153 /* Transmit timeouts */ 154 #define UBT_CMD_TIMEOUT USBD_DEFAULT_TIMEOUT 155 #define UBT_ACL_TIMEOUT USBD_DEFAULT_TIMEOUT 156 157 /* 158 * ISOC transfers 159 * 160 * xfer buffer size depends on the frame size, and the number 161 * of frames per transfer is fixed, as each frame should be 162 * 1ms worth of data. This keeps the rate that xfers complete 163 * fairly constant. We use multiple xfers to keep the hardware 164 * busy 165 */ 166 #define UBT_NXFERS 3 /* max xfers to queue */ 167 #define UBT_NFRAMES 10 /* frames per xfer */ 168 169 struct ubt_isoc_xfer { 170 struct ubt_softc *softc; 171 usbd_xfer_handle xfer; 172 uint8_t *buf; 173 uint16_t size[UBT_NFRAMES]; 174 int busy; 175 }; 176 177 struct ubt_softc { 178 device_t sc_dev; 179 usbd_device_handle sc_udev; 180 int sc_refcnt; 181 int sc_dying; 182 int sc_enabled; 183 184 /* Control Interface */ 185 usbd_interface_handle sc_iface0; 186 187 /* Commands (control) */ 188 usbd_xfer_handle sc_cmd_xfer; 189 uint8_t *sc_cmd_buf; 190 int sc_cmd_busy; /* write active */ 191 MBUFQ_HEAD() sc_cmd_queue; /* output queue */ 192 193 /* Events (interrupt) */ 194 int sc_evt_addr; /* endpoint address */ 195 usbd_pipe_handle sc_evt_pipe; 196 uint8_t *sc_evt_buf; 197 198 /* ACL data (in) */ 199 int sc_aclrd_addr; /* endpoint address */ 200 usbd_pipe_handle sc_aclrd_pipe; /* read pipe */ 201 usbd_xfer_handle sc_aclrd_xfer; /* read xfer */ 202 uint8_t *sc_aclrd_buf; /* read buffer */ 203 int sc_aclrd_busy; /* reading */ 204 205 /* ACL data (out) */ 206 int sc_aclwr_addr; /* endpoint address */ 207 usbd_pipe_handle sc_aclwr_pipe; /* write pipe */ 208 usbd_xfer_handle sc_aclwr_xfer; /* write xfer */ 209 uint8_t *sc_aclwr_buf; /* write buffer */ 210 int sc_aclwr_busy; /* write active */ 211 MBUFQ_HEAD() sc_aclwr_queue;/* output queue */ 212 213 /* ISOC interface */ 214 usbd_interface_handle sc_iface1; /* ISOC interface */ 215 struct sysctllog *sc_log; /* sysctl log */ 216 int sc_config; /* current config no */ 217 int sc_alt_config; /* no of alternates */ 218 219 /* SCO data (in) */ 220 int sc_scord_addr; /* endpoint address */ 221 usbd_pipe_handle sc_scord_pipe; /* read pipe */ 222 int sc_scord_size; /* frame length */ 223 struct ubt_isoc_xfer sc_scord[UBT_NXFERS]; 224 struct mbuf *sc_scord_mbuf; /* current packet */ 225 226 /* SCO data (out) */ 227 int sc_scowr_addr; /* endpoint address */ 228 usbd_pipe_handle sc_scowr_pipe; /* write pipe */ 229 int sc_scowr_size; /* frame length */ 230 struct ubt_isoc_xfer sc_scowr[UBT_NXFERS]; 231 struct mbuf *sc_scowr_mbuf; /* current packet */ 232 int sc_scowr_busy; /* write active */ 233 MBUFQ_HEAD() sc_scowr_queue;/* output queue */ 234 235 /* Protocol structure */ 236 struct hci_unit *sc_unit; 237 struct bt_stats sc_stats; 238 239 /* Successfully attached */ 240 int sc_ok; 241 }; 242 243 /******************************************************************************* 244 * 245 * Bluetooth unit/USB callback routines 246 * 247 */ 248 static int ubt_enable(device_t); 249 static void ubt_disable(device_t); 250 251 static void ubt_xmit_cmd(device_t, struct mbuf *); 252 static void ubt_xmit_cmd_start(struct ubt_softc *); 253 static void ubt_xmit_cmd_complete(usbd_xfer_handle, 254 usbd_private_handle, usbd_status); 255 256 static void ubt_xmit_acl(device_t, struct mbuf *); 257 static void ubt_xmit_acl_start(struct ubt_softc *); 258 static void ubt_xmit_acl_complete(usbd_xfer_handle, 259 usbd_private_handle, usbd_status); 260 261 static void ubt_xmit_sco(device_t, struct mbuf *); 262 static void ubt_xmit_sco_start(struct ubt_softc *); 263 static void ubt_xmit_sco_start1(struct ubt_softc *, struct ubt_isoc_xfer *); 264 static void ubt_xmit_sco_complete(usbd_xfer_handle, 265 usbd_private_handle, usbd_status); 266 267 static void ubt_recv_event(usbd_xfer_handle, 268 usbd_private_handle, usbd_status); 269 270 static void ubt_recv_acl_start(struct ubt_softc *); 271 static void ubt_recv_acl_complete(usbd_xfer_handle, 272 usbd_private_handle, usbd_status); 273 274 static void ubt_recv_sco_start1(struct ubt_softc *, struct ubt_isoc_xfer *); 275 static void ubt_recv_sco_complete(usbd_xfer_handle, 276 usbd_private_handle, usbd_status); 277 278 static void ubt_stats(device_t, struct bt_stats *, int); 279 280 static const struct hci_if ubt_hci = { 281 .enable = ubt_enable, 282 .disable = ubt_disable, 283 .output_cmd = ubt_xmit_cmd, 284 .output_acl = ubt_xmit_acl, 285 .output_sco = ubt_xmit_sco, 286 .get_stats = ubt_stats, 287 .ipl = IPL_USB, /* IPL_SOFTUSB ??? */ 288 }; 289 290 /******************************************************************************* 291 * 292 * USB Autoconfig stuff 293 * 294 */ 295 296 int ubt_match(device_t, cfdata_t, void *); 297 void ubt_attach(device_t, device_t, void *); 298 int ubt_detach(device_t, int); 299 int ubt_activate(device_t, enum devact); 300 extern struct cfdriver ubt_cd; 301 CFATTACH_DECL_NEW(ubt, sizeof(struct ubt_softc), ubt_match, ubt_attach, ubt_detach, ubt_activate); 302 303 static int ubt_set_isoc_config(struct ubt_softc *); 304 static int ubt_sysctl_config(SYSCTLFN_PROTO); 305 static void ubt_abortdealloc(struct ubt_softc *); 306 307 /* 308 * To match or ignore forcibly, add 309 * 310 * { { VendorID, ProductID } , UMATCH_VENDOR_PRODUCT|UMATCH_NONE } 311 * 312 * to the ubt_dev list. 313 */ 314 const struct ubt_devno { 315 struct usb_devno devno; 316 int match; 317 } ubt_dev[] = { 318 { { USB_VENDOR_BROADCOM, USB_PRODUCT_BROADCOM_BCM2033NF }, 319 UMATCH_NONE }, 320 { { USB_VENDOR_APPLE, USB_PRODUCT_APPLE_BLUETOOTH_HOST_C }, 321 UMATCH_VENDOR_PRODUCT }, 322 }; 323 #define ubt_lookup(vendor, product) \ 324 ((const struct ubt_devno *)usb_lookup(ubt_dev, vendor, product)) 325 326 int 327 ubt_match(device_t parent, cfdata_t match, void *aux) 328 { 329 struct usb_attach_arg *uaa = aux; 330 const struct ubt_devno *dev; 331 332 DPRINTFN(50, "ubt_match\n"); 333 334 if ((dev = ubt_lookup(uaa->vendor, uaa->product)) != NULL) 335 return dev->match; 336 337 if (uaa->class == UDCLASS_WIRELESS 338 && uaa->subclass == UDSUBCLASS_RF 339 && uaa->proto == UDPROTO_BLUETOOTH) 340 return UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO; 341 342 return UMATCH_NONE; 343 } 344 345 void 346 ubt_attach(device_t parent, device_t self, void *aux) 347 { 348 struct ubt_softc *sc = device_private(self); 349 struct usb_attach_arg *uaa = aux; 350 usb_config_descriptor_t *cd; 351 usb_endpoint_descriptor_t *ed; 352 const struct sysctlnode *node; 353 char *devinfop; 354 int err; 355 uint8_t count, i; 356 357 DPRINTFN(50, "ubt_attach: sc=%p\n", sc); 358 359 sc->sc_dev = self; 360 sc->sc_udev = uaa->device; 361 362 MBUFQ_INIT(&sc->sc_cmd_queue); 363 MBUFQ_INIT(&sc->sc_aclwr_queue); 364 MBUFQ_INIT(&sc->sc_scowr_queue); 365 366 aprint_naive("\n"); 367 aprint_normal("\n"); 368 369 devinfop = usbd_devinfo_alloc(sc->sc_udev, 0); 370 aprint_normal_dev(self, "%s\n", devinfop); 371 usbd_devinfo_free(devinfop); 372 373 /* 374 * Move the device into the configured state 375 */ 376 err = usbd_set_config_index(sc->sc_udev, 0, 1); 377 if (err) { 378 aprint_error_dev(self, "failed to set configuration idx 0: %s\n", 379 usbd_errstr(err)); 380 381 return; 382 } 383 384 /* 385 * Interface 0 must have 3 endpoints 386 * 1) Interrupt endpoint to receive HCI events 387 * 2) Bulk IN endpoint to receive ACL data 388 * 3) Bulk OUT endpoint to send ACL data 389 */ 390 err = usbd_device2interface_handle(sc->sc_udev, 0, &sc->sc_iface0); 391 if (err) { 392 aprint_error_dev(self, "Could not get interface 0 handle %s (%d)\n", 393 usbd_errstr(err), err); 394 395 return; 396 } 397 398 sc->sc_evt_addr = -1; 399 sc->sc_aclrd_addr = -1; 400 sc->sc_aclwr_addr = -1; 401 402 count = 0; 403 (void)usbd_endpoint_count(sc->sc_iface0, &count); 404 405 for (i = 0 ; i < count ; i++) { 406 int dir, type; 407 408 ed = usbd_interface2endpoint_descriptor(sc->sc_iface0, i); 409 if (ed == NULL) { 410 aprint_error_dev(self, 411 "could not read endpoint descriptor %d\n", i); 412 413 return; 414 } 415 416 dir = UE_GET_DIR(ed->bEndpointAddress); 417 type = UE_GET_XFERTYPE(ed->bmAttributes); 418 419 if (dir == UE_DIR_IN && type == UE_INTERRUPT) 420 sc->sc_evt_addr = ed->bEndpointAddress; 421 else if (dir == UE_DIR_IN && type == UE_BULK) 422 sc->sc_aclrd_addr = ed->bEndpointAddress; 423 else if (dir == UE_DIR_OUT && type == UE_BULK) 424 sc->sc_aclwr_addr = ed->bEndpointAddress; 425 } 426 427 if (sc->sc_evt_addr == -1) { 428 aprint_error_dev(self, 429 "missing INTERRUPT endpoint on interface 0\n"); 430 431 return; 432 } 433 if (sc->sc_aclrd_addr == -1) { 434 aprint_error_dev(self, 435 "missing BULK IN endpoint on interface 0\n"); 436 437 return; 438 } 439 if (sc->sc_aclwr_addr == -1) { 440 aprint_error_dev(self, 441 "missing BULK OUT endpoint on interface 0\n"); 442 443 return; 444 } 445 446 /* 447 * Interface 1 must have 2 endpoints 448 * 1) Isochronous IN endpoint to receive SCO data 449 * 2) Isochronous OUT endpoint to send SCO data 450 * 451 * and will have several configurations, which can be selected 452 * via a sysctl variable. We select config 0 to start, which 453 * means that no SCO data will be available. 454 */ 455 err = usbd_device2interface_handle(sc->sc_udev, 1, &sc->sc_iface1); 456 if (err) { 457 aprint_error_dev(self, 458 "Could not get interface 1 handle %s (%d)\n", 459 usbd_errstr(err), err); 460 461 return; 462 } 463 464 cd = usbd_get_config_descriptor(sc->sc_udev); 465 if (cd == NULL) { 466 aprint_error_dev(self, "could not get config descriptor\n"); 467 468 return; 469 } 470 471 sc->sc_alt_config = usbd_get_no_alts(cd, 1); 472 473 /* set initial config */ 474 err = ubt_set_isoc_config(sc); 475 if (err) { 476 aprint_error_dev(self, "ISOC config failed\n"); 477 478 return; 479 } 480 481 /* Attach HCI */ 482 sc->sc_unit = hci_attach(&ubt_hci, sc->sc_dev, 0); 483 484 usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, sc->sc_udev, 485 sc->sc_dev); 486 487 /* sysctl set-up for alternate configs */ 488 sysctl_createv(&sc->sc_log, 0, NULL, NULL, 489 CTLFLAG_PERMANENT, 490 CTLTYPE_NODE, "hw", 491 NULL, 492 NULL, 0, 493 NULL, 0, 494 CTL_HW, CTL_EOL); 495 496 sysctl_createv(&sc->sc_log, 0, NULL, &node, 497 0, 498 CTLTYPE_NODE, device_xname(sc->sc_dev), 499 SYSCTL_DESCR("ubt driver information"), 500 NULL, 0, 501 NULL, 0, 502 CTL_HW, 503 CTL_CREATE, CTL_EOL); 504 505 if (node != NULL) { 506 sysctl_createv(&sc->sc_log, 0, NULL, NULL, 507 CTLFLAG_READWRITE, 508 CTLTYPE_INT, "config", 509 SYSCTL_DESCR("configuration number"), 510 ubt_sysctl_config, 0, 511 (void *)sc, 0, 512 CTL_HW, node->sysctl_num, 513 CTL_CREATE, CTL_EOL); 514 515 sysctl_createv(&sc->sc_log, 0, NULL, NULL, 516 CTLFLAG_READONLY, 517 CTLTYPE_INT, "alt_config", 518 SYSCTL_DESCR("number of alternate configurations"), 519 NULL, 0, 520 &sc->sc_alt_config, sizeof(sc->sc_alt_config), 521 CTL_HW, node->sysctl_num, 522 CTL_CREATE, CTL_EOL); 523 524 sysctl_createv(&sc->sc_log, 0, NULL, NULL, 525 CTLFLAG_READONLY, 526 CTLTYPE_INT, "sco_rxsize", 527 SYSCTL_DESCR("max SCO receive size"), 528 NULL, 0, 529 &sc->sc_scord_size, sizeof(sc->sc_scord_size), 530 CTL_HW, node->sysctl_num, 531 CTL_CREATE, CTL_EOL); 532 533 sysctl_createv(&sc->sc_log, 0, NULL, NULL, 534 CTLFLAG_READONLY, 535 CTLTYPE_INT, "sco_txsize", 536 SYSCTL_DESCR("max SCO transmit size"), 537 NULL, 0, 538 &sc->sc_scowr_size, sizeof(sc->sc_scowr_size), 539 CTL_HW, node->sysctl_num, 540 CTL_CREATE, CTL_EOL); 541 } 542 543 sc->sc_ok = 1; 544 545 if (!pmf_device_register(self, NULL, NULL)) 546 aprint_error_dev(self, "couldn't establish power handler\n"); 547 548 return; 549 } 550 551 int 552 ubt_detach(device_t self, int flags) 553 { 554 struct ubt_softc *sc = device_private(self); 555 int s; 556 557 DPRINTF("sc=%p flags=%d\n", sc, flags); 558 559 pmf_device_deregister(self); 560 561 sc->sc_dying = 1; 562 563 if (!sc->sc_ok) 564 return 0; 565 566 /* delete sysctl nodes */ 567 sysctl_teardown(&sc->sc_log); 568 569 /* Detach HCI interface */ 570 if (sc->sc_unit) { 571 hci_detach(sc->sc_unit); 572 sc->sc_unit = NULL; 573 } 574 575 /* 576 * Abort all pipes. Causes processes waiting for transfer to wake. 577 * 578 * Actually, hci_detach() above will call ubt_disable() which may 579 * call ubt_abortdealloc(), but lets be sure since doing it twice 580 * wont cause an error. 581 */ 582 ubt_abortdealloc(sc); 583 584 /* wait for all processes to finish */ 585 s = splusb(); 586 if (sc->sc_refcnt-- > 0) 587 usb_detach_waitold(sc->sc_dev); 588 589 splx(s); 590 591 usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev, 592 sc->sc_dev); 593 594 DPRINTFN(1, "driver detached\n"); 595 596 return 0; 597 } 598 599 int 600 ubt_activate(device_t self, enum devact act) 601 { 602 struct ubt_softc *sc = device_private(self); 603 604 DPRINTFN(1, "sc=%p, act=%d\n", sc, act); 605 606 switch (act) { 607 case DVACT_DEACTIVATE: 608 sc->sc_dying = 1; 609 return 0; 610 default: 611 return EOPNOTSUPP; 612 } 613 } 614 615 /* set ISOC configuration */ 616 static int 617 ubt_set_isoc_config(struct ubt_softc *sc) 618 { 619 usb_endpoint_descriptor_t *ed; 620 int rd_addr, wr_addr, rd_size, wr_size; 621 uint8_t count, i; 622 int err; 623 624 err = usbd_set_interface(sc->sc_iface1, sc->sc_config); 625 if (err != USBD_NORMAL_COMPLETION) { 626 aprint_error_dev(sc->sc_dev, 627 "Could not set config %d on ISOC interface. %s (%d)\n", 628 sc->sc_config, usbd_errstr(err), err); 629 630 return err == USBD_IN_USE ? EBUSY : EIO; 631 } 632 633 /* 634 * We wont get past the above if there are any pipes open, so no 635 * need to worry about buf/xfer/pipe deallocation. If we get an 636 * error after this, the frame quantities will be 0 and no SCO 637 * data will be possible. 638 */ 639 640 sc->sc_scord_size = rd_size = 0; 641 sc->sc_scord_addr = rd_addr = -1; 642 643 sc->sc_scowr_size = wr_size = 0; 644 sc->sc_scowr_addr = wr_addr = -1; 645 646 count = 0; 647 (void)usbd_endpoint_count(sc->sc_iface1, &count); 648 649 for (i = 0 ; i < count ; i++) { 650 ed = usbd_interface2endpoint_descriptor(sc->sc_iface1, i); 651 if (ed == NULL) { 652 aprint_error_dev(sc->sc_dev, 653 "could not read endpoint descriptor %d\n", i); 654 655 return EIO; 656 } 657 658 DPRINTFN(5, "%s: endpoint type %02x (%02x) addr %02x (%s)\n", 659 device_xname(sc->sc_dev), 660 UE_GET_XFERTYPE(ed->bmAttributes), 661 UE_GET_ISO_TYPE(ed->bmAttributes), 662 ed->bEndpointAddress, 663 UE_GET_DIR(ed->bEndpointAddress) ? "in" : "out"); 664 665 if (UE_GET_XFERTYPE(ed->bmAttributes) != UE_ISOCHRONOUS) 666 continue; 667 668 if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN) { 669 rd_addr = ed->bEndpointAddress; 670 rd_size = UGETW(ed->wMaxPacketSize); 671 } else { 672 wr_addr = ed->bEndpointAddress; 673 wr_size = UGETW(ed->wMaxPacketSize); 674 } 675 } 676 677 if (rd_addr == -1) { 678 aprint_error_dev(sc->sc_dev, 679 "missing ISOC IN endpoint on interface config %d\n", 680 sc->sc_config); 681 682 return ENOENT; 683 } 684 if (wr_addr == -1) { 685 aprint_error_dev(sc->sc_dev, 686 "missing ISOC OUT endpoint on interface config %d\n", 687 sc->sc_config); 688 689 return ENOENT; 690 } 691 692 if (rd_size > MLEN) { 693 aprint_error_dev(sc->sc_dev, "rd_size=%d exceeds MLEN\n", 694 rd_size); 695 696 return EOVERFLOW; 697 } 698 699 if (wr_size > MLEN) { 700 aprint_error_dev(sc->sc_dev, "wr_size=%d exceeds MLEN\n", 701 wr_size); 702 703 return EOVERFLOW; 704 } 705 706 sc->sc_scord_size = rd_size; 707 sc->sc_scord_addr = rd_addr; 708 709 sc->sc_scowr_size = wr_size; 710 sc->sc_scowr_addr = wr_addr; 711 712 return 0; 713 } 714 715 /* sysctl helper to set alternate configurations */ 716 static int 717 ubt_sysctl_config(SYSCTLFN_ARGS) 718 { 719 struct sysctlnode node; 720 struct ubt_softc *sc; 721 int t, error; 722 723 node = *rnode; 724 sc = node.sysctl_data; 725 726 t = sc->sc_config; 727 node.sysctl_data = &t; 728 error = sysctl_lookup(SYSCTLFN_CALL(&node)); 729 if (error || newp == NULL) 730 return error; 731 732 if (t < 0 || t >= sc->sc_alt_config) 733 return EINVAL; 734 735 /* This may not change when the unit is enabled */ 736 if (sc->sc_enabled) 737 return EBUSY; 738 739 KERNEL_LOCK(1, curlwp); 740 sc->sc_config = t; 741 error = ubt_set_isoc_config(sc); 742 KERNEL_UNLOCK_ONE(curlwp); 743 return error; 744 } 745 746 static void 747 ubt_abortdealloc(struct ubt_softc *sc) 748 { 749 int i; 750 751 DPRINTFN(1, "sc=%p\n", sc); 752 753 /* Abort all pipes */ 754 usbd_abort_default_pipe(sc->sc_udev); 755 756 if (sc->sc_evt_pipe != NULL) { 757 usbd_abort_pipe(sc->sc_evt_pipe); 758 usbd_close_pipe(sc->sc_evt_pipe); 759 sc->sc_evt_pipe = NULL; 760 } 761 762 if (sc->sc_aclrd_pipe != NULL) { 763 usbd_abort_pipe(sc->sc_aclrd_pipe); 764 usbd_close_pipe(sc->sc_aclrd_pipe); 765 sc->sc_aclrd_pipe = NULL; 766 } 767 768 if (sc->sc_aclwr_pipe != NULL) { 769 usbd_abort_pipe(sc->sc_aclwr_pipe); 770 usbd_close_pipe(sc->sc_aclwr_pipe); 771 sc->sc_aclwr_pipe = NULL; 772 } 773 774 if (sc->sc_scord_pipe != NULL) { 775 usbd_abort_pipe(sc->sc_scord_pipe); 776 usbd_close_pipe(sc->sc_scord_pipe); 777 sc->sc_scord_pipe = NULL; 778 } 779 780 if (sc->sc_scowr_pipe != NULL) { 781 usbd_abort_pipe(sc->sc_scowr_pipe); 782 usbd_close_pipe(sc->sc_scowr_pipe); 783 sc->sc_scowr_pipe = NULL; 784 } 785 786 /* Free event buffer */ 787 if (sc->sc_evt_buf != NULL) { 788 free(sc->sc_evt_buf, M_USBDEV); 789 sc->sc_evt_buf = NULL; 790 } 791 792 /* Free all xfers and xfer buffers (implicit) */ 793 if (sc->sc_cmd_xfer != NULL) { 794 usbd_free_xfer(sc->sc_cmd_xfer); 795 sc->sc_cmd_xfer = NULL; 796 sc->sc_cmd_buf = NULL; 797 } 798 799 if (sc->sc_aclrd_xfer != NULL) { 800 usbd_free_xfer(sc->sc_aclrd_xfer); 801 sc->sc_aclrd_xfer = NULL; 802 sc->sc_aclrd_buf = NULL; 803 } 804 805 if (sc->sc_aclwr_xfer != NULL) { 806 usbd_free_xfer(sc->sc_aclwr_xfer); 807 sc->sc_aclwr_xfer = NULL; 808 sc->sc_aclwr_buf = NULL; 809 } 810 811 for (i = 0 ; i < UBT_NXFERS ; i++) { 812 if (sc->sc_scord[i].xfer != NULL) { 813 usbd_free_xfer(sc->sc_scord[i].xfer); 814 sc->sc_scord[i].xfer = NULL; 815 sc->sc_scord[i].buf = NULL; 816 } 817 818 if (sc->sc_scowr[i].xfer != NULL) { 819 usbd_free_xfer(sc->sc_scowr[i].xfer); 820 sc->sc_scowr[i].xfer = NULL; 821 sc->sc_scowr[i].buf = NULL; 822 } 823 } 824 825 /* Free partial SCO packets */ 826 if (sc->sc_scord_mbuf != NULL) { 827 m_freem(sc->sc_scord_mbuf); 828 sc->sc_scord_mbuf = NULL; 829 } 830 831 if (sc->sc_scowr_mbuf != NULL) { 832 m_freem(sc->sc_scowr_mbuf); 833 sc->sc_scowr_mbuf = NULL; 834 } 835 836 /* Empty mbuf queues */ 837 MBUFQ_DRAIN(&sc->sc_cmd_queue); 838 MBUFQ_DRAIN(&sc->sc_aclwr_queue); 839 MBUFQ_DRAIN(&sc->sc_scowr_queue); 840 } 841 842 /******************************************************************************* 843 * 844 * Bluetooth Unit/USB callbacks 845 * 846 */ 847 static int 848 ubt_enable(device_t self) 849 { 850 struct ubt_softc *sc = device_private(self); 851 usbd_status err; 852 int s, i, error; 853 854 DPRINTFN(1, "sc=%p\n", sc); 855 856 if (sc->sc_enabled) 857 return 0; 858 859 s = splusb(); 860 861 /* Events */ 862 sc->sc_evt_buf = malloc(UBT_BUFSIZ_EVENT, M_USBDEV, M_NOWAIT); 863 if (sc->sc_evt_buf == NULL) { 864 error = ENOMEM; 865 goto bad; 866 } 867 err = usbd_open_pipe_intr(sc->sc_iface0, 868 sc->sc_evt_addr, 869 USBD_SHORT_XFER_OK, 870 &sc->sc_evt_pipe, 871 sc, 872 sc->sc_evt_buf, 873 UBT_BUFSIZ_EVENT, 874 ubt_recv_event, 875 USBD_DEFAULT_INTERVAL); 876 if (err != USBD_NORMAL_COMPLETION) { 877 error = EIO; 878 goto bad; 879 } 880 881 /* Commands */ 882 sc->sc_cmd_xfer = usbd_alloc_xfer(sc->sc_udev); 883 if (sc->sc_cmd_xfer == NULL) { 884 error = ENOMEM; 885 goto bad; 886 } 887 sc->sc_cmd_buf = usbd_alloc_buffer(sc->sc_cmd_xfer, UBT_BUFSIZ_CMD); 888 if (sc->sc_cmd_buf == NULL) { 889 error = ENOMEM; 890 goto bad; 891 } 892 sc->sc_cmd_busy = 0; 893 894 /* ACL read */ 895 err = usbd_open_pipe(sc->sc_iface0, sc->sc_aclrd_addr, 896 USBD_EXCLUSIVE_USE, &sc->sc_aclrd_pipe); 897 if (err != USBD_NORMAL_COMPLETION) { 898 error = EIO; 899 goto bad; 900 } 901 sc->sc_aclrd_xfer = usbd_alloc_xfer(sc->sc_udev); 902 if (sc->sc_aclrd_xfer == NULL) { 903 error = ENOMEM; 904 goto bad; 905 } 906 sc->sc_aclrd_buf = usbd_alloc_buffer(sc->sc_aclrd_xfer, UBT_BUFSIZ_ACL); 907 if (sc->sc_aclrd_buf == NULL) { 908 error = ENOMEM; 909 goto bad; 910 } 911 sc->sc_aclrd_busy = 0; 912 ubt_recv_acl_start(sc); 913 914 /* ACL write */ 915 err = usbd_open_pipe(sc->sc_iface0, sc->sc_aclwr_addr, 916 USBD_EXCLUSIVE_USE, &sc->sc_aclwr_pipe); 917 if (err != USBD_NORMAL_COMPLETION) { 918 error = EIO; 919 goto bad; 920 } 921 sc->sc_aclwr_xfer = usbd_alloc_xfer(sc->sc_udev); 922 if (sc->sc_aclwr_xfer == NULL) { 923 error = ENOMEM; 924 goto bad; 925 } 926 sc->sc_aclwr_buf = usbd_alloc_buffer(sc->sc_aclwr_xfer, UBT_BUFSIZ_ACL); 927 if (sc->sc_aclwr_buf == NULL) { 928 error = ENOMEM; 929 goto bad; 930 } 931 sc->sc_aclwr_busy = 0; 932 933 /* SCO read */ 934 if (sc->sc_scord_size > 0) { 935 err = usbd_open_pipe(sc->sc_iface1, sc->sc_scord_addr, 936 USBD_EXCLUSIVE_USE, &sc->sc_scord_pipe); 937 if (err != USBD_NORMAL_COMPLETION) { 938 error = EIO; 939 goto bad; 940 } 941 942 for (i = 0 ; i < UBT_NXFERS ; i++) { 943 sc->sc_scord[i].xfer = usbd_alloc_xfer(sc->sc_udev); 944 if (sc->sc_scord[i].xfer == NULL) { 945 error = ENOMEM; 946 goto bad; 947 } 948 sc->sc_scord[i].buf = usbd_alloc_buffer(sc->sc_scord[i].xfer, 949 sc->sc_scord_size * UBT_NFRAMES); 950 if (sc->sc_scord[i].buf == NULL) { 951 error = ENOMEM; 952 goto bad; 953 } 954 sc->sc_scord[i].softc = sc; 955 sc->sc_scord[i].busy = 0; 956 ubt_recv_sco_start1(sc, &sc->sc_scord[i]); 957 } 958 } 959 960 /* SCO write */ 961 if (sc->sc_scowr_size > 0) { 962 err = usbd_open_pipe(sc->sc_iface1, sc->sc_scowr_addr, 963 USBD_EXCLUSIVE_USE, &sc->sc_scowr_pipe); 964 if (err != USBD_NORMAL_COMPLETION) { 965 error = EIO; 966 goto bad; 967 } 968 969 for (i = 0 ; i < UBT_NXFERS ; i++) { 970 sc->sc_scowr[i].xfer = usbd_alloc_xfer(sc->sc_udev); 971 if (sc->sc_scowr[i].xfer == NULL) { 972 error = ENOMEM; 973 goto bad; 974 } 975 sc->sc_scowr[i].buf = usbd_alloc_buffer(sc->sc_scowr[i].xfer, 976 sc->sc_scowr_size * UBT_NFRAMES); 977 if (sc->sc_scowr[i].buf == NULL) { 978 error = ENOMEM; 979 goto bad; 980 } 981 sc->sc_scowr[i].softc = sc; 982 sc->sc_scowr[i].busy = 0; 983 } 984 985 sc->sc_scowr_busy = 0; 986 } 987 988 sc->sc_enabled = 1; 989 splx(s); 990 return 0; 991 992 bad: 993 ubt_abortdealloc(sc); 994 splx(s); 995 return error; 996 } 997 998 static void 999 ubt_disable(device_t self) 1000 { 1001 struct ubt_softc *sc = device_private(self); 1002 int s; 1003 1004 DPRINTFN(1, "sc=%p\n", sc); 1005 1006 if (sc->sc_enabled == 0) 1007 return; 1008 1009 s = splusb(); 1010 ubt_abortdealloc(sc); 1011 1012 sc->sc_enabled = 0; 1013 splx(s); 1014 } 1015 1016 static void 1017 ubt_xmit_cmd(device_t self, struct mbuf *m) 1018 { 1019 struct ubt_softc *sc = device_private(self); 1020 int s; 1021 1022 KASSERT(sc->sc_enabled); 1023 1024 s = splusb(); 1025 MBUFQ_ENQUEUE(&sc->sc_cmd_queue, m); 1026 1027 if (sc->sc_cmd_busy == 0) 1028 ubt_xmit_cmd_start(sc); 1029 1030 splx(s); 1031 } 1032 1033 static void 1034 ubt_xmit_cmd_start(struct ubt_softc *sc) 1035 { 1036 usb_device_request_t req; 1037 usbd_status status; 1038 struct mbuf *m; 1039 int len; 1040 1041 if (sc->sc_dying) 1042 return; 1043 1044 if (MBUFQ_FIRST(&sc->sc_cmd_queue) == NULL) 1045 return; 1046 1047 MBUFQ_DEQUEUE(&sc->sc_cmd_queue, m); 1048 KASSERT(m != NULL); 1049 1050 DPRINTFN(15, "%s: xmit CMD packet (%d bytes)\n", 1051 device_xname(sc->sc_dev), m->m_pkthdr.len); 1052 1053 sc->sc_refcnt++; 1054 sc->sc_cmd_busy = 1; 1055 1056 len = m->m_pkthdr.len - 1; 1057 m_copydata(m, 1, len, sc->sc_cmd_buf); 1058 m_freem(m); 1059 1060 memset(&req, 0, sizeof(req)); 1061 req.bmRequestType = UT_WRITE_CLASS_DEVICE; 1062 USETW(req.wLength, len); 1063 1064 usbd_setup_default_xfer(sc->sc_cmd_xfer, 1065 sc->sc_udev, 1066 sc, 1067 UBT_CMD_TIMEOUT, 1068 &req, 1069 sc->sc_cmd_buf, 1070 len, 1071 USBD_NO_COPY | USBD_FORCE_SHORT_XFER, 1072 ubt_xmit_cmd_complete); 1073 1074 status = usbd_transfer(sc->sc_cmd_xfer); 1075 1076 KASSERT(status != USBD_NORMAL_COMPLETION); 1077 1078 if (status != USBD_IN_PROGRESS) { 1079 DPRINTF("usbd_transfer status=%s (%d)\n", 1080 usbd_errstr(status), status); 1081 1082 sc->sc_refcnt--; 1083 sc->sc_cmd_busy = 0; 1084 } 1085 } 1086 1087 static void 1088 ubt_xmit_cmd_complete(usbd_xfer_handle xfer, 1089 usbd_private_handle h, usbd_status status) 1090 { 1091 struct ubt_softc *sc = h; 1092 uint32_t count; 1093 1094 DPRINTFN(15, "%s: CMD complete status=%s (%d)\n", 1095 device_xname(sc->sc_dev), usbd_errstr(status), status); 1096 1097 sc->sc_cmd_busy = 0; 1098 1099 if (--sc->sc_refcnt < 0) { 1100 DPRINTF("sc_refcnt=%d\n", sc->sc_refcnt); 1101 usb_detach_wakeupold(sc->sc_dev); 1102 return; 1103 } 1104 1105 if (sc->sc_dying) { 1106 DPRINTF("sc_dying\n"); 1107 return; 1108 } 1109 1110 if (status != USBD_NORMAL_COMPLETION) { 1111 DPRINTF("status=%s (%d)\n", 1112 usbd_errstr(status), status); 1113 1114 sc->sc_stats.err_tx++; 1115 return; 1116 } 1117 1118 usbd_get_xfer_status(xfer, NULL, NULL, &count, NULL); 1119 sc->sc_stats.cmd_tx++; 1120 sc->sc_stats.byte_tx += count; 1121 1122 ubt_xmit_cmd_start(sc); 1123 } 1124 1125 static void 1126 ubt_xmit_acl(device_t self, struct mbuf *m) 1127 { 1128 struct ubt_softc *sc = device_private(self); 1129 int s; 1130 1131 KASSERT(sc->sc_enabled); 1132 1133 s = splusb(); 1134 MBUFQ_ENQUEUE(&sc->sc_aclwr_queue, m); 1135 1136 if (sc->sc_aclwr_busy == 0) 1137 ubt_xmit_acl_start(sc); 1138 1139 splx(s); 1140 } 1141 1142 static void 1143 ubt_xmit_acl_start(struct ubt_softc *sc) 1144 { 1145 struct mbuf *m; 1146 usbd_status status; 1147 int len; 1148 1149 if (sc->sc_dying) 1150 return; 1151 1152 if (MBUFQ_FIRST(&sc->sc_aclwr_queue) == NULL) 1153 return; 1154 1155 sc->sc_refcnt++; 1156 sc->sc_aclwr_busy = 1; 1157 1158 MBUFQ_DEQUEUE(&sc->sc_aclwr_queue, m); 1159 KASSERT(m != NULL); 1160 1161 DPRINTFN(15, "%s: xmit ACL packet (%d bytes)\n", 1162 device_xname(sc->sc_dev), m->m_pkthdr.len); 1163 1164 len = m->m_pkthdr.len - 1; 1165 if (len > UBT_BUFSIZ_ACL) { 1166 DPRINTF("%s: truncating ACL packet (%d => %d)!\n", 1167 device_xname(sc->sc_dev), len, UBT_BUFSIZ_ACL); 1168 1169 len = UBT_BUFSIZ_ACL; 1170 } 1171 1172 m_copydata(m, 1, len, sc->sc_aclwr_buf); 1173 m_freem(m); 1174 1175 sc->sc_stats.acl_tx++; 1176 sc->sc_stats.byte_tx += len; 1177 1178 usbd_setup_xfer(sc->sc_aclwr_xfer, 1179 sc->sc_aclwr_pipe, 1180 sc, 1181 sc->sc_aclwr_buf, 1182 len, 1183 USBD_NO_COPY | USBD_FORCE_SHORT_XFER, 1184 UBT_ACL_TIMEOUT, 1185 ubt_xmit_acl_complete); 1186 1187 status = usbd_transfer(sc->sc_aclwr_xfer); 1188 1189 KASSERT(status != USBD_NORMAL_COMPLETION); 1190 1191 if (status != USBD_IN_PROGRESS) { 1192 DPRINTF("usbd_transfer status=%s (%d)\n", 1193 usbd_errstr(status), status); 1194 1195 sc->sc_refcnt--; 1196 sc->sc_aclwr_busy = 0; 1197 } 1198 } 1199 1200 static void 1201 ubt_xmit_acl_complete(usbd_xfer_handle xfer, 1202 usbd_private_handle h, usbd_status status) 1203 { 1204 struct ubt_softc *sc = h; 1205 1206 DPRINTFN(15, "%s: ACL complete status=%s (%d)\n", 1207 device_xname(sc->sc_dev), usbd_errstr(status), status); 1208 1209 sc->sc_aclwr_busy = 0; 1210 1211 if (--sc->sc_refcnt < 0) { 1212 usb_detach_wakeupold(sc->sc_dev); 1213 return; 1214 } 1215 1216 if (sc->sc_dying) 1217 return; 1218 1219 if (status != USBD_NORMAL_COMPLETION) { 1220 DPRINTF("status=%s (%d)\n", 1221 usbd_errstr(status), status); 1222 1223 sc->sc_stats.err_tx++; 1224 1225 if (status == USBD_STALLED) 1226 usbd_clear_endpoint_stall_async(sc->sc_aclwr_pipe); 1227 else 1228 return; 1229 } 1230 1231 ubt_xmit_acl_start(sc); 1232 } 1233 1234 static void 1235 ubt_xmit_sco(device_t self, struct mbuf *m) 1236 { 1237 struct ubt_softc *sc = device_private(self); 1238 int s; 1239 1240 KASSERT(sc->sc_enabled); 1241 1242 s = splusb(); 1243 MBUFQ_ENQUEUE(&sc->sc_scowr_queue, m); 1244 1245 if (sc->sc_scowr_busy == 0) 1246 ubt_xmit_sco_start(sc); 1247 1248 splx(s); 1249 } 1250 1251 static void 1252 ubt_xmit_sco_start(struct ubt_softc *sc) 1253 { 1254 int i; 1255 1256 if (sc->sc_dying || sc->sc_scowr_size == 0) 1257 return; 1258 1259 for (i = 0 ; i < UBT_NXFERS ; i++) { 1260 if (sc->sc_scowr[i].busy) 1261 continue; 1262 1263 ubt_xmit_sco_start1(sc, &sc->sc_scowr[i]); 1264 } 1265 } 1266 1267 static void 1268 ubt_xmit_sco_start1(struct ubt_softc *sc, struct ubt_isoc_xfer *isoc) 1269 { 1270 struct mbuf *m; 1271 uint8_t *buf; 1272 int num, len, size, space; 1273 1274 space = sc->sc_scowr_size * UBT_NFRAMES; 1275 buf = isoc->buf; 1276 len = 0; 1277 1278 /* 1279 * Fill the request buffer with data from the queue, 1280 * keeping any leftover packet on our private hook. 1281 * 1282 * Complete packets are passed back up to the stack 1283 * for disposal, since we can't rely on the controller 1284 * to tell us when it has finished with them. 1285 */ 1286 1287 m = sc->sc_scowr_mbuf; 1288 while (space > 0) { 1289 if (m == NULL) { 1290 MBUFQ_DEQUEUE(&sc->sc_scowr_queue, m); 1291 if (m == NULL) 1292 break; 1293 1294 m_adj(m, 1); /* packet type */ 1295 } 1296 1297 if (m->m_pkthdr.len > 0) { 1298 size = MIN(m->m_pkthdr.len, space); 1299 1300 m_copydata(m, 0, size, buf); 1301 m_adj(m, size); 1302 1303 buf += size; 1304 len += size; 1305 space -= size; 1306 } 1307 1308 if (m->m_pkthdr.len == 0) { 1309 sc->sc_stats.sco_tx++; 1310 if (!hci_complete_sco(sc->sc_unit, m)) 1311 sc->sc_stats.err_tx++; 1312 1313 m = NULL; 1314 } 1315 } 1316 sc->sc_scowr_mbuf = m; 1317 1318 DPRINTFN(15, "isoc=%p, len=%d, space=%d\n", isoc, len, space); 1319 1320 if (len == 0) /* nothing to send */ 1321 return; 1322 1323 sc->sc_refcnt++; 1324 sc->sc_scowr_busy = 1; 1325 sc->sc_stats.byte_tx += len; 1326 isoc->busy = 1; 1327 1328 /* 1329 * calculate number of isoc frames and sizes 1330 */ 1331 1332 for (num = 0 ; len > 0 ; num++) { 1333 size = MIN(sc->sc_scowr_size, len); 1334 1335 isoc->size[num] = size; 1336 len -= size; 1337 } 1338 1339 usbd_setup_isoc_xfer(isoc->xfer, 1340 sc->sc_scowr_pipe, 1341 isoc, 1342 isoc->size, 1343 num, 1344 USBD_NO_COPY | USBD_FORCE_SHORT_XFER, 1345 ubt_xmit_sco_complete); 1346 1347 usbd_transfer(isoc->xfer); 1348 } 1349 1350 static void 1351 ubt_xmit_sco_complete(usbd_xfer_handle xfer, 1352 usbd_private_handle h, usbd_status status) 1353 { 1354 struct ubt_isoc_xfer *isoc = h; 1355 struct ubt_softc *sc; 1356 int i; 1357 1358 KASSERT(xfer == isoc->xfer); 1359 sc = isoc->softc; 1360 1361 DPRINTFN(15, "isoc=%p, status=%s (%d)\n", 1362 isoc, usbd_errstr(status), status); 1363 1364 isoc->busy = 0; 1365 1366 for (i = 0 ; ; i++) { 1367 if (i == UBT_NXFERS) { 1368 sc->sc_scowr_busy = 0; 1369 break; 1370 } 1371 1372 if (sc->sc_scowr[i].busy) 1373 break; 1374 } 1375 1376 if (--sc->sc_refcnt < 0) { 1377 usb_detach_wakeupold(sc->sc_dev); 1378 return; 1379 } 1380 1381 if (sc->sc_dying) 1382 return; 1383 1384 if (status != USBD_NORMAL_COMPLETION) { 1385 DPRINTF("status=%s (%d)\n", 1386 usbd_errstr(status), status); 1387 1388 sc->sc_stats.err_tx++; 1389 1390 if (status == USBD_STALLED) 1391 usbd_clear_endpoint_stall_async(sc->sc_scowr_pipe); 1392 else 1393 return; 1394 } 1395 1396 ubt_xmit_sco_start(sc); 1397 } 1398 1399 /* 1400 * load incoming data into an mbuf with 1401 * leading type byte 1402 */ 1403 static struct mbuf * 1404 ubt_mbufload(uint8_t *buf, int count, uint8_t type) 1405 { 1406 struct mbuf *m; 1407 1408 MGETHDR(m, M_DONTWAIT, MT_DATA); 1409 if (m == NULL) 1410 return NULL; 1411 1412 *mtod(m, uint8_t *) = type; 1413 m->m_pkthdr.len = m->m_len = MHLEN; 1414 m_copyback(m, 1, count, buf); // (extends if necessary) 1415 if (m->m_pkthdr.len != MAX(MHLEN, count + 1)) { 1416 m_free(m); 1417 return NULL; 1418 } 1419 1420 m->m_pkthdr.len = count + 1; 1421 m->m_len = MIN(MHLEN, m->m_pkthdr.len); 1422 1423 return m; 1424 } 1425 1426 static void 1427 ubt_recv_event(usbd_xfer_handle xfer, usbd_private_handle h, usbd_status status) 1428 { 1429 struct ubt_softc *sc = h; 1430 struct mbuf *m; 1431 uint32_t count; 1432 void *buf; 1433 1434 DPRINTFN(15, "sc=%p status=%s (%d)\n", 1435 sc, usbd_errstr(status), status); 1436 1437 if (status != USBD_NORMAL_COMPLETION || sc->sc_dying) 1438 return; 1439 1440 usbd_get_xfer_status(xfer, NULL, &buf, &count, NULL); 1441 1442 if (count < sizeof(hci_event_hdr_t) - 1) { 1443 DPRINTF("dumped undersized event (count = %d)\n", count); 1444 sc->sc_stats.err_rx++; 1445 return; 1446 } 1447 1448 sc->sc_stats.evt_rx++; 1449 sc->sc_stats.byte_rx += count; 1450 1451 m = ubt_mbufload(buf, count, HCI_EVENT_PKT); 1452 if (m == NULL || !hci_input_event(sc->sc_unit, m)) 1453 sc->sc_stats.err_rx++; 1454 } 1455 1456 static void 1457 ubt_recv_acl_start(struct ubt_softc *sc) 1458 { 1459 usbd_status status; 1460 1461 DPRINTFN(15, "sc=%p\n", sc); 1462 1463 if (sc->sc_aclrd_busy || sc->sc_dying) { 1464 DPRINTF("sc_aclrd_busy=%d, sc_dying=%d\n", 1465 sc->sc_aclrd_busy, 1466 sc->sc_dying); 1467 1468 return; 1469 } 1470 1471 sc->sc_refcnt++; 1472 sc->sc_aclrd_busy = 1; 1473 1474 usbd_setup_xfer(sc->sc_aclrd_xfer, 1475 sc->sc_aclrd_pipe, 1476 sc, 1477 sc->sc_aclrd_buf, 1478 UBT_BUFSIZ_ACL, 1479 USBD_NO_COPY | USBD_SHORT_XFER_OK, 1480 USBD_NO_TIMEOUT, 1481 ubt_recv_acl_complete); 1482 1483 status = usbd_transfer(sc->sc_aclrd_xfer); 1484 1485 KASSERT(status != USBD_NORMAL_COMPLETION); 1486 1487 if (status != USBD_IN_PROGRESS) { 1488 DPRINTF("usbd_transfer status=%s (%d)\n", 1489 usbd_errstr(status), status); 1490 1491 sc->sc_refcnt--; 1492 sc->sc_aclrd_busy = 0; 1493 } 1494 } 1495 1496 static void 1497 ubt_recv_acl_complete(usbd_xfer_handle xfer, 1498 usbd_private_handle h, usbd_status status) 1499 { 1500 struct ubt_softc *sc = h; 1501 struct mbuf *m; 1502 uint32_t count; 1503 void *buf; 1504 1505 DPRINTFN(15, "sc=%p status=%s (%d)\n", 1506 sc, usbd_errstr(status), status); 1507 1508 sc->sc_aclrd_busy = 0; 1509 1510 if (--sc->sc_refcnt < 0) { 1511 DPRINTF("refcnt = %d\n", sc->sc_refcnt); 1512 usb_detach_wakeupold(sc->sc_dev); 1513 return; 1514 } 1515 1516 if (sc->sc_dying) { 1517 DPRINTF("sc_dying\n"); 1518 return; 1519 } 1520 1521 if (status != USBD_NORMAL_COMPLETION) { 1522 DPRINTF("status=%s (%d)\n", 1523 usbd_errstr(status), status); 1524 1525 sc->sc_stats.err_rx++; 1526 1527 if (status == USBD_STALLED) 1528 usbd_clear_endpoint_stall_async(sc->sc_aclrd_pipe); 1529 else 1530 return; 1531 } else { 1532 usbd_get_xfer_status(xfer, NULL, &buf, &count, NULL); 1533 1534 if (count < sizeof(hci_acldata_hdr_t) - 1) { 1535 DPRINTF("dumped undersized packet (%d)\n", count); 1536 sc->sc_stats.err_rx++; 1537 } else { 1538 sc->sc_stats.acl_rx++; 1539 sc->sc_stats.byte_rx += count; 1540 1541 m = ubt_mbufload(buf, count, HCI_ACL_DATA_PKT); 1542 if (m == NULL || !hci_input_acl(sc->sc_unit, m)) 1543 sc->sc_stats.err_rx++; 1544 } 1545 } 1546 1547 /* and restart */ 1548 ubt_recv_acl_start(sc); 1549 } 1550 1551 static void 1552 ubt_recv_sco_start1(struct ubt_softc *sc, struct ubt_isoc_xfer *isoc) 1553 { 1554 int i; 1555 1556 DPRINTFN(15, "sc=%p, isoc=%p\n", sc, isoc); 1557 1558 if (isoc->busy || sc->sc_dying || sc->sc_scord_size == 0) { 1559 DPRINTF("%s%s%s\n", 1560 isoc->busy ? " busy" : "", 1561 sc->sc_dying ? " dying" : "", 1562 sc->sc_scord_size == 0 ? " size=0" : ""); 1563 1564 return; 1565 } 1566 1567 sc->sc_refcnt++; 1568 isoc->busy = 1; 1569 1570 for (i = 0 ; i < UBT_NFRAMES ; i++) 1571 isoc->size[i] = sc->sc_scord_size; 1572 1573 usbd_setup_isoc_xfer(isoc->xfer, 1574 sc->sc_scord_pipe, 1575 isoc, 1576 isoc->size, 1577 UBT_NFRAMES, 1578 USBD_NO_COPY | USBD_SHORT_XFER_OK, 1579 ubt_recv_sco_complete); 1580 1581 usbd_transfer(isoc->xfer); 1582 } 1583 1584 static void 1585 ubt_recv_sco_complete(usbd_xfer_handle xfer, 1586 usbd_private_handle h, usbd_status status) 1587 { 1588 struct ubt_isoc_xfer *isoc = h; 1589 struct ubt_softc *sc; 1590 struct mbuf *m; 1591 uint32_t count; 1592 uint8_t *ptr, *frame; 1593 int i, size, got, want; 1594 1595 KASSERT(isoc != NULL); 1596 KASSERT(isoc->xfer == xfer); 1597 1598 sc = isoc->softc; 1599 isoc->busy = 0; 1600 1601 if (--sc->sc_refcnt < 0) { 1602 DPRINTF("refcnt=%d\n", sc->sc_refcnt); 1603 usb_detach_wakeupold(sc->sc_dev); 1604 return; 1605 } 1606 1607 if (sc->sc_dying) { 1608 DPRINTF("sc_dying\n"); 1609 return; 1610 } 1611 1612 if (status != USBD_NORMAL_COMPLETION) { 1613 DPRINTF("status=%s (%d)\n", 1614 usbd_errstr(status), status); 1615 1616 sc->sc_stats.err_rx++; 1617 1618 if (status == USBD_STALLED) { 1619 usbd_clear_endpoint_stall_async(sc->sc_scord_pipe); 1620 goto restart; 1621 } 1622 1623 return; 1624 } 1625 1626 usbd_get_xfer_status(xfer, NULL, NULL, &count, NULL); 1627 if (count == 0) 1628 goto restart; 1629 1630 DPRINTFN(15, "sc=%p, isoc=%p, count=%u\n", 1631 sc, isoc, count); 1632 1633 sc->sc_stats.byte_rx += count; 1634 1635 /* 1636 * Extract SCO packets from ISOC frames. The way we have it, 1637 * no SCO packet can be bigger than MHLEN. This is unlikely 1638 * to actually happen, but if we ran out of mbufs and lost 1639 * sync then we may get spurious data that makes it seem that 1640 * way, so we discard data that wont fit. This doesnt really 1641 * help with the lost sync situation alas. 1642 */ 1643 1644 m = sc->sc_scord_mbuf; 1645 if (m != NULL) { 1646 sc->sc_scord_mbuf = NULL; 1647 ptr = mtod(m, uint8_t *) + m->m_pkthdr.len; 1648 got = m->m_pkthdr.len; 1649 want = sizeof(hci_scodata_hdr_t); 1650 if (got >= want) 1651 want += mtod(m, hci_scodata_hdr_t *)->length ; 1652 } else { 1653 ptr = NULL; 1654 got = 0; 1655 want = 0; 1656 } 1657 1658 for (i = 0 ; i < UBT_NFRAMES ; i++) { 1659 frame = isoc->buf + (i * sc->sc_scord_size); 1660 1661 while (isoc->size[i] > 0) { 1662 size = isoc->size[i]; 1663 1664 if (m == NULL) { 1665 MGETHDR(m, M_DONTWAIT, MT_DATA); 1666 if (m == NULL) { 1667 aprint_error_dev(sc->sc_dev, 1668 "out of memory (xfer halted)\n"); 1669 1670 sc->sc_stats.err_rx++; 1671 return; /* lost sync */ 1672 } 1673 1674 ptr = mtod(m, uint8_t *); 1675 *ptr++ = HCI_SCO_DATA_PKT; 1676 got = 1; 1677 want = sizeof(hci_scodata_hdr_t); 1678 } 1679 1680 if (got + size > want) 1681 size = want - got; 1682 1683 memcpy(ptr, frame, size); 1684 1685 ptr += size; 1686 got += size; 1687 frame += size; 1688 1689 if (got == want) { 1690 /* 1691 * If we only got a header, add the packet 1692 * length to our want count. Send complete 1693 * packets up to protocol stack. 1694 */ 1695 if (want == sizeof(hci_scodata_hdr_t)) { 1696 uint32_t len = 1697 mtod(m, hci_scodata_hdr_t *)->length; 1698 want += len; 1699 if (len == 0 || want > MHLEN) { 1700 aprint_error_dev(sc->sc_dev, 1701 "packet too large %u " 1702 "(lost sync)\n", len); 1703 sc->sc_stats.err_rx++; 1704 return; 1705 } 1706 } 1707 1708 if (got == want) { 1709 m->m_pkthdr.len = m->m_len = got; 1710 sc->sc_stats.sco_rx++; 1711 if (!hci_input_sco(sc->sc_unit, m)) 1712 sc->sc_stats.err_rx++; 1713 1714 m = NULL; 1715 } 1716 } 1717 1718 isoc->size[i] -= size; 1719 } 1720 } 1721 1722 if (m != NULL) { 1723 m->m_pkthdr.len = m->m_len = got; 1724 sc->sc_scord_mbuf = m; 1725 } 1726 1727 restart: /* and restart */ 1728 ubt_recv_sco_start1(sc, isoc); 1729 } 1730 1731 void 1732 ubt_stats(device_t self, struct bt_stats *dest, int flush) 1733 { 1734 struct ubt_softc *sc = device_private(self); 1735 int s; 1736 1737 s = splusb(); 1738 memcpy(dest, &sc->sc_stats, sizeof(struct bt_stats)); 1739 1740 if (flush) 1741 memset(&sc->sc_stats, 0, sizeof(struct bt_stats)); 1742 1743 splx(s); 1744 } 1745