diff options
author | Anton Lindqvist <anton@cvs.openbsd.org> | 2021-11-11 07:04:46 +0000 |
---|---|---|
committer | Anton Lindqvist <anton@cvs.openbsd.org> | 2021-11-11 07:04:46 +0000 |
commit | d2d4b581940a96e3816bfced32ea21d9a49798d8 (patch) | |
tree | afe3b8a486678dfca2e9e91e53aa73def8908e4b /sys | |
parent | 28e13cda2467d55cb5860c82c6eba49ac4ef365c (diff) |
Here we go again, revert the second attempt to resolve the
UHIDEV_CLAIM_MULTIPLE_REPORTID conflict.
Breaks fido(4) as reported by gnezdo@
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/usb/uhidev.c | 41 | ||||
-rw-r--r-- | sys/dev/usb/uhidev.h | 6 |
2 files changed, 20 insertions, 27 deletions
diff --git a/sys/dev/usb/uhidev.c b/sys/dev/usb/uhidev.c index 59e8949abd5..3ce1684893b 100644 --- a/sys/dev/usb/uhidev.c +++ b/sys/dev/usb/uhidev.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uhidev.c,v 1.98 2021/11/10 06:33:30 anton Exp $ */ +/* $OpenBSD: uhidev.c,v 1.99 2021/11/11 07:04:45 anton Exp $ */ /* $NetBSD: uhidev.c,v 1.14 2003/03/11 16:44:00 augustss Exp $ */ /* @@ -246,37 +246,30 @@ uhidev_attach(struct device *parent, struct device *self, void *aux) sc->sc_isize += (nrepid != 1); /* one byte for the report ID */ DPRINTF(("uhidev_attach: isize=%d\n", sc->sc_isize)); - memset(&uha, 0, sizeof(uha)); uha.uaa = uaa; uha.parent = sc; + uha.reportid = UHIDEV_CLAIM_MULTIPLE_REPORTID; + uha.nreports = nrepid; + uha.claimed = malloc(nrepid, M_TEMP, M_WAITOK|M_ZERO); /* Look for a driver claiming multiple report IDs first. */ - if (nrepid > 1) { - uha.reportid = UHIDEV_CLAIM_MULTIPLE_REPORTID; - uha.nreports = nrepid; - uha.claimed = malloc(nrepid, M_TEMP, M_WAITOK|M_ZERO); - - dev = config_found_sm(self, &uha, NULL, NULL); - if (dev != NULL) { - for (repid = 0; repid < nrepid; repid++) { - /* - * Could already be assigned by - * uhidev_set_report_dev(). - */ - if (sc->sc_subdevs[repid] != NULL) - continue; - - if (!uha.claimed[repid]) - continue; + dev = config_found_sm(self, &uha, NULL, NULL); + if (dev != NULL) { + for (repid = 0; repid < nrepid; repid++) { + /* + * Could already be assigned by uhidev_set_report_dev(). + */ + if (sc->sc_subdevs[repid] != NULL) + continue; + + if (uha.claimed[repid]) sc->sc_subdevs[repid] = (struct uhidev *)dev; - } } - - free(uha.claimed, M_TEMP, nrepid); - uha.nreports = 0; - uha.claimed = NULL; } + free(uha.claimed, M_TEMP, nrepid); + uha.claimed = NULL; + for (repid = 0; repid < nrepid; repid++) { DPRINTF(("%s: try repid=%d\n", __func__, repid)); if (hid_report_size(desc, size, hid_input, repid) == 0 && diff --git a/sys/dev/usb/uhidev.h b/sys/dev/usb/uhidev.h index d825a08f79e..b2b7608b083 100644 --- a/sys/dev/usb/uhidev.h +++ b/sys/dev/usb/uhidev.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uhidev.h,v 1.36 2021/11/10 06:33:30 anton Exp $ */ +/* $OpenBSD: uhidev.h,v 1.37 2021/11/11 07:04:45 anton Exp $ */ /* $NetBSD: uhidev.h,v 1.3 2002/10/08 09:56:17 dan Exp $ */ /* @@ -75,8 +75,8 @@ struct uhidev_attach_arg { struct usb_attach_arg *uaa; struct uhidev_softc *parent; uint8_t reportid; -#define UHIDEV_CLAIM_MULTIPLE_REPORTID 0 - u_int nreports; +#define UHIDEV_CLAIM_MULTIPLE_REPORTID 255 + uint8_t nreports; uint8_t *claimed; }; |