1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause 3 * 4 * Copyright (c) 2019-2020 Vladimir Kondratyev <wulf@FreeBSD.org> 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 28 #include <sys/param.h> 29 #include <sys/bus.h> 30 #include <sys/ck.h> 31 #include <sys/epoch.h> 32 #include <sys/kdb.h> 33 #include <sys/kernel.h> 34 #include <sys/libkern.h> 35 #include <sys/lock.h> 36 #include <sys/malloc.h> 37 #include <sys/module.h> 38 #include <sys/mutex.h> 39 #include <sys/proc.h> 40 #include <sys/sbuf.h> 41 #include <sys/sx.h> 42 #include <sys/systm.h> 43 44 #define HID_DEBUG_VAR hid_debug 45 #include <dev/hid/hid.h> 46 #include <dev/hid/hidbus.h> 47 #include <dev/hid/hidquirk.h> 48 49 #include "hid_if.h" 50 51 #define INPUT_EPOCH global_epoch_preempt 52 #define HID_RSIZE_MAX 1024 53 54 static hid_intr_t hidbus_intr; 55 56 static device_probe_t hidbus_probe; 57 static device_attach_t hidbus_attach; 58 static device_detach_t hidbus_detach; 59 60 struct hidbus_ivars { 61 int32_t usage; 62 uint8_t index; 63 uint32_t flags; 64 uintptr_t driver_info; /* for internal use */ 65 struct mtx *mtx; /* child intr mtx */ 66 hid_intr_t *intr_handler; /* executed under mtx*/ 67 void *intr_ctx; 68 unsigned int refcnt; /* protected by mtx */ 69 struct epoch_context epoch_ctx; 70 CK_STAILQ_ENTRY(hidbus_ivars) link; 71 }; 72 73 struct hidbus_softc { 74 device_t dev; 75 struct sx sx; 76 struct mtx mtx; 77 78 bool nowrite; 79 80 struct hid_rdesc_info rdesc; 81 bool overloaded; 82 int nest; /* Child attach nesting lvl */ 83 int nauto; /* Number of autochildren */ 84 85 CK_STAILQ_HEAD(, hidbus_ivars) tlcs; 86 }; 87 88 static int 89 hidbus_fill_rdesc_info(struct hid_rdesc_info *hri, const void *data, 90 hid_size_t len) 91 { 92 int error = 0; 93 94 hri->data = __DECONST(void *, data); 95 hri->len = len; 96 97 /* 98 * If report descriptor is not available yet, set maximal 99 * report sizes high enough to allow hidraw to work. 100 */ 101 hri->isize = len == 0 ? HID_RSIZE_MAX : 102 hid_report_size_max(data, len, hid_input, &hri->iid); 103 hri->osize = len == 0 ? HID_RSIZE_MAX : 104 hid_report_size_max(data, len, hid_output, &hri->oid); 105 hri->fsize = len == 0 ? HID_RSIZE_MAX : 106 hid_report_size_max(data, len, hid_feature, &hri->fid); 107 108 if (hri->isize > HID_RSIZE_MAX) { 109 DPRINTF("input size is too large, %u bytes (truncating)\n", 110 hri->isize); 111 hri->isize = HID_RSIZE_MAX; 112 error = EOVERFLOW; 113 } 114 if (hri->osize > HID_RSIZE_MAX) { 115 DPRINTF("output size is too large, %u bytes (truncating)\n", 116 hri->osize); 117 hri->osize = HID_RSIZE_MAX; 118 error = EOVERFLOW; 119 } 120 if (hri->fsize > HID_RSIZE_MAX) { 121 DPRINTF("feature size is too large, %u bytes (truncating)\n", 122 hri->fsize); 123 hri->fsize = HID_RSIZE_MAX; 124 error = EOVERFLOW; 125 } 126 127 return (error); 128 } 129 130 int 131 hidbus_locate(const void *desc, hid_size_t size, int32_t u, enum hid_kind k, 132 uint8_t tlc_index, uint8_t index, struct hid_location *loc, 133 uint32_t *flags, uint8_t *id, struct hid_absinfo *ai) 134 { 135 struct hid_data *d; 136 struct hid_item h; 137 int i; 138 139 d = hid_start_parse(desc, size, 1 << k); 140 HIDBUS_FOREACH_ITEM(d, &h, tlc_index) { 141 for (i = 0; i < h.nusages; i++) { 142 if (h.kind == k && h.usages[i] == u) { 143 if (index--) 144 break; 145 if (loc != NULL) 146 *loc = h.loc; 147 if (flags != NULL) 148 *flags = h.flags; 149 if (id != NULL) 150 *id = h.report_ID; 151 if (ai != NULL && (h.flags&HIO_RELATIVE) == 0) 152 *ai = (struct hid_absinfo) { 153 .max = h.logical_maximum, 154 .min = h.logical_minimum, 155 .res = hid_item_resolution(&h), 156 }; 157 hid_end_parse(d); 158 return (1); 159 } 160 } 161 } 162 if (loc != NULL) 163 loc->size = 0; 164 if (flags != NULL) 165 *flags = 0; 166 if (id != NULL) 167 *id = 0; 168 hid_end_parse(d); 169 return (0); 170 } 171 172 bool 173 hidbus_is_collection(const void *desc, hid_size_t size, int32_t usage, 174 uint8_t tlc_index) 175 { 176 struct hid_data *d; 177 struct hid_item h; 178 bool ret = false; 179 180 d = hid_start_parse(desc, size, 0); 181 HIDBUS_FOREACH_ITEM(d, &h, tlc_index) { 182 if (h.kind == hid_collection && h.usage == usage) { 183 ret = true; 184 break; 185 } 186 } 187 hid_end_parse(d); 188 return (ret); 189 } 190 191 static device_t 192 hidbus_add_child(device_t dev, u_int order, const char *name, int unit) 193 { 194 struct hidbus_softc *sc = device_get_softc(dev); 195 struct hidbus_ivars *tlc; 196 device_t child; 197 198 child = device_add_child_ordered(dev, order, name, unit); 199 if (child == NULL) 200 return (child); 201 202 tlc = malloc(sizeof(struct hidbus_ivars), M_DEVBUF, M_WAITOK | M_ZERO); 203 tlc->mtx = &sc->mtx; 204 device_set_ivars(child, tlc); 205 sx_xlock(&sc->sx); 206 CK_STAILQ_INSERT_TAIL(&sc->tlcs, tlc, link); 207 sx_unlock(&sc->sx); 208 209 return (child); 210 } 211 212 static int 213 hidbus_enumerate_children(device_t dev, const void* data, hid_size_t len) 214 { 215 struct hidbus_softc *sc = device_get_softc(dev); 216 struct hid_data *hd; 217 struct hid_item hi; 218 device_t child; 219 uint8_t index = 0; 220 221 if (data == NULL || len == 0) 222 return (ENXIO); 223 224 /* Add a child for each top level collection */ 225 hd = hid_start_parse(data, len, 1 << hid_input); 226 while (hid_get_item(hd, &hi)) { 227 if (hi.kind != hid_collection || hi.collevel != 1) 228 continue; 229 child = BUS_ADD_CHILD(dev, 0, NULL, DEVICE_UNIT_ANY); 230 if (child == NULL) { 231 device_printf(dev, "Could not add HID device\n"); 232 continue; 233 } 234 hidbus_set_index(child, index); 235 hidbus_set_usage(child, hi.usage); 236 hidbus_set_flags(child, HIDBUS_FLAG_AUTOCHILD); 237 index++; 238 DPRINTF("Add child TLC: 0x%04x:0x%04x\n", 239 HID_GET_USAGE_PAGE(hi.usage), HID_GET_USAGE(hi.usage)); 240 } 241 hid_end_parse(hd); 242 243 if (index == 0) 244 return (ENXIO); 245 246 sc->nauto = index; 247 248 return (0); 249 } 250 251 static int 252 hidbus_attach_children(device_t dev) 253 { 254 struct hidbus_softc *sc = device_get_softc(dev); 255 int error; 256 257 HID_INTR_SETUP(device_get_parent(dev), dev, hidbus_intr, sc, 258 &sc->rdesc); 259 260 error = hidbus_enumerate_children(dev, sc->rdesc.data, sc->rdesc.len); 261 if (error != 0) 262 DPRINTF("failed to enumerate children: error %d\n", error); 263 264 /* 265 * hidbus_attach_children() can recurse through device_identify-> 266 * hid_set_report_descr() call sequence. Do not perform children 267 * attach twice in that case. 268 */ 269 sc->nest++; 270 bus_identify_children(dev); 271 sc->nest--; 272 if (sc->nest != 0) 273 return (0); 274 275 if (hid_is_keyboard(sc->rdesc.data, sc->rdesc.len) != 0) 276 bus_attach_children(dev); 277 else 278 bus_delayed_attach_children(dev); 279 280 return (0); 281 } 282 283 static int 284 hidbus_detach_children(device_t dev) 285 { 286 device_t *children, bus; 287 bool is_bus; 288 int i, error; 289 290 error = 0; 291 292 is_bus = device_get_devclass(dev) == devclass_find("hidbus"); 293 bus = is_bus ? dev : device_get_parent(dev); 294 295 KASSERT(device_get_devclass(bus) == devclass_find("hidbus"), 296 ("Device is not hidbus or it's child")); 297 298 if (is_bus) { 299 /* If hidbus is passed, delete all children. */ 300 bus_generic_detach(bus); 301 device_delete_children(bus); 302 } else { 303 /* 304 * If hidbus child is passed, delete all hidbus children 305 * except caller. Deleting the caller may result in deadlock. 306 */ 307 error = device_get_children(bus, &children, &i); 308 if (error != 0) 309 return (error); 310 while (i-- > 0) { 311 if (children[i] == dev) 312 continue; 313 DPRINTF("Delete child. index=%d (%s)\n", 314 hidbus_get_index(children[i]), 315 device_get_nameunit(children[i])); 316 error = device_delete_child(bus, children[i]); 317 if (error) { 318 DPRINTF("Failed deleting %s\n", 319 device_get_nameunit(children[i])); 320 break; 321 } 322 } 323 free(children, M_TEMP); 324 } 325 326 HID_INTR_UNSETUP(device_get_parent(bus), bus); 327 328 return (error); 329 } 330 331 static int 332 hidbus_probe(device_t dev) 333 { 334 335 device_set_desc(dev, "HID bus"); 336 337 /* Allow other subclasses to override this driver. */ 338 return (BUS_PROBE_GENERIC); 339 } 340 341 static int 342 hidbus_attach(device_t dev) 343 { 344 struct hidbus_softc *sc = device_get_softc(dev); 345 struct hid_device_info *devinfo = device_get_ivars(dev); 346 void *d_ptr = NULL; 347 hid_size_t d_len; 348 int error; 349 350 sc->dev = dev; 351 CK_STAILQ_INIT(&sc->tlcs); 352 mtx_init(&sc->mtx, "hidbus ivar lock", NULL, MTX_DEF); 353 sx_init(&sc->sx, "hidbus ivar list lock"); 354 355 /* 356 * Ignore error. It is possible for non-HID device e.g. XBox360 gamepad 357 * to emulate HID through overloading of report descriptor. 358 */ 359 d_len = devinfo->rdescsize; 360 if (d_len != 0) { 361 d_ptr = malloc(d_len, M_DEVBUF, M_ZERO | M_WAITOK); 362 error = hid_get_rdesc(dev, d_ptr, d_len); 363 if (error != 0) { 364 free(d_ptr, M_DEVBUF); 365 d_len = 0; 366 d_ptr = NULL; 367 } 368 } 369 370 hidbus_fill_rdesc_info(&sc->rdesc, d_ptr, d_len); 371 372 sc->nowrite = hid_test_quirk(devinfo, HQ_NOWRITE); 373 374 error = hidbus_attach_children(dev); 375 if (error != 0) { 376 hidbus_detach(dev); 377 return (ENXIO); 378 } 379 380 return (0); 381 } 382 383 static int 384 hidbus_detach(device_t dev) 385 { 386 struct hidbus_softc *sc = device_get_softc(dev); 387 388 hidbus_detach_children(dev); 389 sx_destroy(&sc->sx); 390 mtx_destroy(&sc->mtx); 391 free(sc->rdesc.data, M_DEVBUF); 392 393 return (0); 394 } 395 396 static void 397 hidbus_child_detached(device_t bus, device_t child) 398 { 399 struct hidbus_softc *sc = device_get_softc(bus); 400 struct hidbus_ivars *tlc = device_get_ivars(child); 401 402 KASSERT(tlc->refcnt == 0, ("Child device is running")); 403 tlc->mtx = &sc->mtx; 404 tlc->intr_handler = NULL; 405 tlc->flags &= ~HIDBUS_FLAG_CAN_POLL; 406 } 407 408 /* 409 * Epoch callback indicating tlc is safe to destroy 410 */ 411 static void 412 hidbus_ivar_dtor(epoch_context_t ctx) 413 { 414 struct hidbus_ivars *tlc; 415 416 tlc = __containerof(ctx, struct hidbus_ivars, epoch_ctx); 417 free(tlc, M_DEVBUF); 418 } 419 420 static void 421 hidbus_child_deleted(device_t bus, device_t child) 422 { 423 struct hidbus_softc *sc = device_get_softc(bus); 424 struct hidbus_ivars *tlc = device_get_ivars(child); 425 426 sx_xlock(&sc->sx); 427 KASSERT(tlc->refcnt == 0, ("Child device is running")); 428 CK_STAILQ_REMOVE(&sc->tlcs, tlc, hidbus_ivars, link); 429 sx_unlock(&sc->sx); 430 epoch_call(INPUT_EPOCH, hidbus_ivar_dtor, &tlc->epoch_ctx); 431 } 432 433 static int 434 hidbus_read_ivar(device_t bus, device_t child, int which, uintptr_t *result) 435 { 436 struct hidbus_softc *sc = device_get_softc(bus); 437 struct hidbus_ivars *tlc = device_get_ivars(child); 438 439 switch (which) { 440 case HIDBUS_IVAR_INDEX: 441 *result = tlc->index; 442 break; 443 case HIDBUS_IVAR_USAGE: 444 *result = tlc->usage; 445 break; 446 case HIDBUS_IVAR_FLAGS: 447 *result = tlc->flags; 448 break; 449 case HIDBUS_IVAR_DRIVER_INFO: 450 *result = tlc->driver_info; 451 break; 452 case HIDBUS_IVAR_LOCK: 453 *result = (uintptr_t)(tlc->mtx == &sc->mtx ? NULL : tlc->mtx); 454 break; 455 default: 456 return (EINVAL); 457 } 458 return (0); 459 } 460 461 static int 462 hidbus_write_ivar(device_t bus, device_t child, int which, uintptr_t value) 463 { 464 struct hidbus_softc *sc = device_get_softc(bus); 465 struct hidbus_ivars *tlc = device_get_ivars(child); 466 467 switch (which) { 468 case HIDBUS_IVAR_INDEX: 469 tlc->index = value; 470 break; 471 case HIDBUS_IVAR_USAGE: 472 tlc->usage = value; 473 break; 474 case HIDBUS_IVAR_FLAGS: 475 tlc->flags = value; 476 if ((value & HIDBUS_FLAG_CAN_POLL) != 0) 477 HID_INTR_SETUP( 478 device_get_parent(bus), bus, NULL, NULL, NULL); 479 break; 480 case HIDBUS_IVAR_DRIVER_INFO: 481 tlc->driver_info = value; 482 break; 483 case HIDBUS_IVAR_LOCK: 484 tlc->mtx = (struct mtx *)value == NULL ? 485 &sc->mtx : (struct mtx *)value; 486 break; 487 default: 488 return (EINVAL); 489 } 490 return (0); 491 } 492 493 /* Location hint for devctl(8) */ 494 static int 495 hidbus_child_location(device_t bus, device_t child, struct sbuf *sb) 496 { 497 struct hidbus_ivars *tlc = device_get_ivars(child); 498 499 sbuf_printf(sb, "index=%hhu", tlc->index); 500 return (0); 501 } 502 503 /* PnP information for devctl(8) */ 504 static int 505 hidbus_child_pnpinfo(device_t bus, device_t child, struct sbuf *sb) 506 { 507 struct hidbus_ivars *tlc = device_get_ivars(child); 508 struct hid_device_info *devinfo = device_get_ivars(bus); 509 510 sbuf_printf(sb, "page=0x%04x usage=0x%04x bus=0x%02hx " 511 "vendor=0x%04hx product=0x%04hx version=0x%04hx%s%s", 512 HID_GET_USAGE_PAGE(tlc->usage), HID_GET_USAGE(tlc->usage), 513 devinfo->idBus, devinfo->idVendor, devinfo->idProduct, 514 devinfo->idVersion, devinfo->idPnP[0] == '\0' ? "" : " _HID=", 515 devinfo->idPnP[0] == '\0' ? "" : devinfo->idPnP); 516 return (0); 517 } 518 519 void 520 hidbus_set_desc(device_t child, const char *suffix) 521 { 522 device_t bus = device_get_parent(child); 523 struct hidbus_softc *sc = device_get_softc(bus); 524 struct hid_device_info *devinfo = device_get_ivars(bus); 525 struct hidbus_ivars *tlc = device_get_ivars(child); 526 527 /* Do not add NULL suffix or if device name already contains it. */ 528 if (suffix != NULL && strcasestr(devinfo->name, suffix) == NULL && 529 (sc->nauto > 1 || (tlc->flags & HIDBUS_FLAG_AUTOCHILD) == 0)) 530 device_set_descf(child, "%s %s", devinfo->name, suffix); 531 else 532 device_set_desc(child, devinfo->name); 533 } 534 535 device_t 536 hidbus_find_child(device_t bus, int32_t usage) 537 { 538 device_t *children, child; 539 int ccount, i; 540 541 bus_topo_assert(); 542 543 /* Get a list of all hidbus children */ 544 if (device_get_children(bus, &children, &ccount) != 0) 545 return (NULL); 546 547 /* Scan through to find required TLC */ 548 for (i = 0, child = NULL; i < ccount; i++) { 549 if (hidbus_get_usage(children[i]) == usage) { 550 child = children[i]; 551 break; 552 } 553 } 554 free(children, M_TEMP); 555 556 return (child); 557 } 558 559 void 560 hidbus_intr(void *context, void *buf, hid_size_t len) 561 { 562 struct hidbus_softc *sc = context; 563 struct hidbus_ivars *tlc; 564 struct epoch_tracker et; 565 566 /* 567 * Broadcast input report to all subscribers. 568 * TODO: Add check for input report ID. 569 * 570 * Relock mutex on every TLC item as we can't hold any locks over whole 571 * TLC list here due to LOR with open()/close() handlers. 572 */ 573 if (!HID_IN_POLLING_MODE()) 574 epoch_enter_preempt(INPUT_EPOCH, &et); 575 CK_STAILQ_FOREACH(tlc, &sc->tlcs, link) { 576 if (tlc->refcnt == 0 || tlc->intr_handler == NULL) 577 continue; 578 if (HID_IN_POLLING_MODE()) { 579 if ((tlc->flags & HIDBUS_FLAG_CAN_POLL) != 0) 580 tlc->intr_handler(tlc->intr_ctx, buf, len); 581 } else { 582 mtx_lock(tlc->mtx); 583 tlc->intr_handler(tlc->intr_ctx, buf, len); 584 mtx_unlock(tlc->mtx); 585 } 586 } 587 if (!HID_IN_POLLING_MODE()) 588 epoch_exit_preempt(INPUT_EPOCH, &et); 589 } 590 591 void 592 hidbus_set_intr(device_t child, hid_intr_t *handler, void *context) 593 { 594 struct hidbus_ivars *tlc = device_get_ivars(child); 595 596 tlc->intr_handler = handler; 597 tlc->intr_ctx = context; 598 } 599 600 static int 601 hidbus_intr_start(device_t bus, device_t child) 602 { 603 MPASS(bus == device_get_parent(child)); 604 struct hidbus_softc *sc = device_get_softc(bus); 605 struct hidbus_ivars *ivar = device_get_ivars(child); 606 struct hidbus_ivars *tlc; 607 bool refcnted = false; 608 int error; 609 610 if (sx_xlock_sig(&sc->sx) != 0) 611 return (EINTR); 612 CK_STAILQ_FOREACH(tlc, &sc->tlcs, link) { 613 refcnted |= (tlc->refcnt != 0); 614 if (tlc == ivar) { 615 mtx_lock(tlc->mtx); 616 ++tlc->refcnt; 617 mtx_unlock(tlc->mtx); 618 } 619 } 620 error = refcnted ? 0 : hid_intr_start(bus); 621 sx_unlock(&sc->sx); 622 623 return (error); 624 } 625 626 static int 627 hidbus_intr_stop(device_t bus, device_t child) 628 { 629 MPASS(bus == device_get_parent(child)); 630 struct hidbus_softc *sc = device_get_softc(bus); 631 struct hidbus_ivars *ivar = device_get_ivars(child); 632 struct hidbus_ivars *tlc; 633 bool refcnted = false; 634 int error; 635 636 if (sx_xlock_sig(&sc->sx) != 0) 637 return (EINTR); 638 CK_STAILQ_FOREACH(tlc, &sc->tlcs, link) { 639 if (tlc == ivar) { 640 mtx_lock(tlc->mtx); 641 MPASS(tlc->refcnt != 0); 642 --tlc->refcnt; 643 mtx_unlock(tlc->mtx); 644 } 645 refcnted |= (tlc->refcnt != 0); 646 } 647 error = refcnted ? 0 : hid_intr_stop(bus); 648 sx_unlock(&sc->sx); 649 650 return (error); 651 } 652 653 static void 654 hidbus_intr_poll(device_t bus, device_t child __unused) 655 { 656 hid_intr_poll(bus); 657 } 658 659 struct hid_rdesc_info * 660 hidbus_get_rdesc_info(device_t child) 661 { 662 device_t bus = device_get_parent(child); 663 struct hidbus_softc *sc = device_get_softc(bus); 664 665 return (&sc->rdesc); 666 } 667 668 /* 669 * HID interface. 670 * 671 * Hidbus as well as any hidbus child can be passed as first arg. 672 */ 673 674 /* Read cached report descriptor */ 675 int 676 hid_get_report_descr(device_t dev, void **data, hid_size_t *len) 677 { 678 device_t bus; 679 struct hidbus_softc *sc; 680 681 bus = device_get_devclass(dev) == devclass_find("hidbus") ? 682 dev : device_get_parent(dev); 683 sc = device_get_softc(bus); 684 685 /* 686 * Do not send request to a transport backend. 687 * Use cached report descriptor instead of it. 688 */ 689 if (sc->rdesc.data == NULL || sc->rdesc.len == 0) 690 return (ENXIO); 691 692 if (data != NULL) 693 *data = sc->rdesc.data; 694 if (len != NULL) 695 *len = sc->rdesc.len; 696 697 return (0); 698 } 699 700 /* 701 * Replace cached report descriptor with top level driver provided one. 702 * 703 * It deletes all hidbus children except caller and enumerates them again after 704 * new descriptor has been registered. Currently it can not be called from 705 * autoenumerated (by report's TLC) child device context as it results in child 706 * duplication. To overcome this limitation hid_set_report_descr() should be 707 * called from device_identify driver's handler with hidbus itself passed as 708 * 'device_t dev' parameter. 709 */ 710 int 711 hid_set_report_descr(device_t dev, const void *data, hid_size_t len) 712 { 713 struct hid_rdesc_info rdesc; 714 device_t bus; 715 struct hidbus_softc *sc; 716 bool is_bus; 717 int error; 718 719 bus_topo_assert(); 720 721 is_bus = device_get_devclass(dev) == devclass_find("hidbus"); 722 bus = is_bus ? dev : device_get_parent(dev); 723 sc = device_get_softc(bus); 724 725 /* 726 * Do not overload already overloaded report descriptor in 727 * device_identify handler. It causes infinite recursion loop. 728 */ 729 if (is_bus && sc->overloaded) 730 return(0); 731 732 DPRINTFN(5, "len=%d\n", len); 733 DPRINTFN(5, "data = %*D\n", len, data, " "); 734 735 error = hidbus_fill_rdesc_info(&rdesc, data, len); 736 if (error != 0) 737 return (error); 738 739 error = hidbus_detach_children(dev); 740 if (error != 0) 741 return(error); 742 743 /* Make private copy to handle a case of dynamicaly allocated data. */ 744 rdesc.data = malloc(len, M_DEVBUF, M_ZERO | M_WAITOK); 745 bcopy(data, rdesc.data, len); 746 sc->overloaded = true; 747 free(sc->rdesc.data, M_DEVBUF); 748 bcopy(&rdesc, &sc->rdesc, sizeof(struct hid_rdesc_info)); 749 750 error = hidbus_attach_children(bus); 751 752 return (error); 753 } 754 755 static int 756 hidbus_get_rdesc(device_t dev, device_t child __unused, void *data, 757 hid_size_t len) 758 { 759 return (hid_get_rdesc(dev, data, len)); 760 } 761 762 static int 763 hidbus_read(device_t dev, device_t child __unused, void *data, 764 hid_size_t maxlen, hid_size_t *actlen) 765 { 766 return (hid_read(dev, data, maxlen, actlen)); 767 } 768 769 static int 770 hidbus_write(device_t dev, device_t child __unused, const void *data, 771 hid_size_t len) 772 { 773 struct hidbus_softc *sc; 774 uint8_t id; 775 776 sc = device_get_softc(dev); 777 /* 778 * Output interrupt endpoint is often optional. If HID device 779 * does not provide it, send reports via control pipe. 780 */ 781 if (sc->nowrite) { 782 /* try to extract the ID byte */ 783 id = (sc->rdesc.oid & (len > 0)) ? *(const uint8_t*)data : 0; 784 return (hid_set_report(dev, data, len, HID_OUTPUT_REPORT, id)); 785 } 786 787 return (hid_write(dev, data, len)); 788 } 789 790 static int 791 hidbus_get_report(device_t dev, device_t child __unused, void *data, 792 hid_size_t maxlen, hid_size_t *actlen, uint8_t type, uint8_t id) 793 { 794 return (hid_get_report(dev, data, maxlen, actlen, type, id)); 795 } 796 797 static int 798 hidbus_set_report(device_t dev, device_t child __unused, const void *data, 799 hid_size_t len, uint8_t type, uint8_t id) 800 { 801 return (hid_set_report(dev, data, len, type, id)); 802 } 803 804 static int 805 hidbus_set_idle(device_t dev, device_t child __unused, uint16_t duration, 806 uint8_t id) 807 { 808 return (hid_set_idle(dev, duration, id)); 809 } 810 811 static int 812 hidbus_set_protocol(device_t dev, device_t child __unused, uint16_t protocol) 813 { 814 return (hid_set_protocol(dev, protocol)); 815 } 816 817 static int 818 hidbus_ioctl(device_t dev, device_t child __unused, unsigned long cmd, 819 uintptr_t data) 820 { 821 return (hid_ioctl(dev, cmd, data)); 822 } 823 824 /*------------------------------------------------------------------------* 825 * hidbus_lookup_id 826 * 827 * This functions takes an array of "struct hid_device_id" and tries 828 * to match the entries with the information in "struct hid_device_info". 829 * 830 * Return values: 831 * NULL: No match found. 832 * Else: Pointer to matching entry. 833 *------------------------------------------------------------------------*/ 834 const struct hid_device_id * 835 hidbus_lookup_id(device_t dev, const struct hid_device_id *id, int nitems_id) 836 { 837 const struct hid_device_id *id_end; 838 const struct hid_device_info *info; 839 int32_t usage; 840 bool is_child; 841 842 if (id == NULL) { 843 goto done; 844 } 845 846 id_end = id + nitems_id; 847 info = hid_get_device_info(dev); 848 is_child = device_get_devclass(dev) != devclass_find("hidbus"); 849 if (is_child) 850 usage = hidbus_get_usage(dev); 851 852 /* 853 * Keep on matching array entries until we find a match or 854 * until we reach the end of the matching array: 855 */ 856 for (; id != id_end; id++) { 857 858 if (is_child && (id->match_flag_page) && 859 (id->page != HID_GET_USAGE_PAGE(usage))) { 860 continue; 861 } 862 if (is_child && (id->match_flag_usage) && 863 (id->usage != HID_GET_USAGE(usage))) { 864 continue; 865 } 866 if ((id->match_flag_bus) && 867 (id->idBus != info->idBus)) { 868 continue; 869 } 870 if ((id->match_flag_vendor) && 871 (id->idVendor != info->idVendor)) { 872 continue; 873 } 874 if ((id->match_flag_product) && 875 (id->idProduct != info->idProduct)) { 876 continue; 877 } 878 if ((id->match_flag_ver_lo) && 879 (id->idVersion_lo > info->idVersion)) { 880 continue; 881 } 882 if ((id->match_flag_ver_hi) && 883 (id->idVersion_hi < info->idVersion)) { 884 continue; 885 } 886 if (id->match_flag_pnp && 887 strncmp(id->idPnP, info->idPnP, HID_PNP_ID_SIZE) != 0) { 888 continue; 889 } 890 /* We found a match! */ 891 return (id); 892 } 893 894 done: 895 return (NULL); 896 } 897 898 /*------------------------------------------------------------------------* 899 * hidbus_lookup_driver_info - factored out code 900 * 901 * Return values: 902 * 0: Success 903 * Else: Failure 904 *------------------------------------------------------------------------*/ 905 int 906 hidbus_lookup_driver_info(device_t child, const struct hid_device_id *id, 907 int nitems_id) 908 { 909 910 id = hidbus_lookup_id(child, id, nitems_id); 911 if (id) { 912 /* copy driver info */ 913 hidbus_set_driver_info(child, id->driver_info); 914 return (0); 915 } 916 return (ENXIO); 917 } 918 919 const struct hid_device_info * 920 hid_get_device_info(device_t dev) 921 { 922 device_t bus; 923 924 bus = device_get_devclass(dev) == devclass_find("hidbus") ? 925 dev : device_get_parent(dev); 926 927 return (device_get_ivars(bus)); 928 } 929 930 static device_method_t hidbus_methods[] = { 931 /* device interface */ 932 DEVMETHOD(device_probe, hidbus_probe), 933 DEVMETHOD(device_attach, hidbus_attach), 934 DEVMETHOD(device_detach, hidbus_detach), 935 DEVMETHOD(device_suspend, bus_generic_suspend), 936 DEVMETHOD(device_resume, bus_generic_resume), 937 938 /* bus interface */ 939 DEVMETHOD(bus_add_child, hidbus_add_child), 940 DEVMETHOD(bus_child_detached, hidbus_child_detached), 941 DEVMETHOD(bus_child_deleted, hidbus_child_deleted), 942 DEVMETHOD(bus_read_ivar, hidbus_read_ivar), 943 DEVMETHOD(bus_write_ivar, hidbus_write_ivar), 944 DEVMETHOD(bus_child_pnpinfo, hidbus_child_pnpinfo), 945 DEVMETHOD(bus_child_location, hidbus_child_location), 946 947 /* hid interface */ 948 DEVMETHOD(hid_intr_start, hidbus_intr_start), 949 DEVMETHOD(hid_intr_stop, hidbus_intr_stop), 950 DEVMETHOD(hid_intr_poll, hidbus_intr_poll), 951 DEVMETHOD(hid_get_rdesc, hidbus_get_rdesc), 952 DEVMETHOD(hid_read, hidbus_read), 953 DEVMETHOD(hid_write, hidbus_write), 954 DEVMETHOD(hid_get_report, hidbus_get_report), 955 DEVMETHOD(hid_set_report, hidbus_set_report), 956 DEVMETHOD(hid_set_idle, hidbus_set_idle), 957 DEVMETHOD(hid_set_protocol, hidbus_set_protocol), 958 DEVMETHOD(hid_ioctl, hidbus_ioctl), 959 960 DEVMETHOD_END 961 }; 962 963 driver_t hidbus_driver = { 964 "hidbus", 965 hidbus_methods, 966 sizeof(struct hidbus_softc), 967 }; 968 969 MODULE_DEPEND(hidbus, hid, 1, 1, 1); 970 MODULE_VERSION(hidbus, 1); 971 DRIVER_MODULE(hidbus, atopcase, hidbus_driver, 0, 0); 972 DRIVER_MODULE(hidbus, hvhid, hidbus_driver, 0, 0); 973 DRIVER_MODULE(hidbus, iichid, hidbus_driver, 0, 0); 974 DRIVER_MODULE(hidbus, usbhid, hidbus_driver, 0, 0); 975