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