summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorAnton Lindqvist <anton@cvs.openbsd.org>2021-11-11 07:04:46 +0000
committerAnton Lindqvist <anton@cvs.openbsd.org>2021-11-11 07:04:46 +0000
commitd2d4b581940a96e3816bfced32ea21d9a49798d8 (patch)
treeafe3b8a486678dfca2e9e91e53aa73def8908e4b /sys
parent28e13cda2467d55cb5860c82c6eba49ac4ef365c (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.c41
-rw-r--r--sys/dev/usb/uhidev.h6
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;
};