diff options
-rw-r--r-- | sys/dev/usb/uhidpp.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/sys/dev/usb/uhidpp.c b/sys/dev/usb/uhidpp.c index 8d3de2914a0..f8a3680990a 100644 --- a/sys/dev/usb/uhidpp.c +++ b/sys/dev/usb/uhidpp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uhidpp.c,v 1.40 2023/01/03 15:50:52 anton Exp $ */ +/* $OpenBSD: uhidpp.c,v 1.41 2023/01/03 15:51:40 anton Exp $ */ /* * Copyright (c) 2021 Anton Lindqvist <anton@openbsd.org> @@ -108,8 +108,11 @@ int uhidpp_debug = 1; * The software ID is added to feature access reports (FAP) and used to * distinguish responses from notifications. Note, the software ID must be * greater than zero which is reserved for notifications. + * The effective software ID round robins within its allowed interval [1, 15] + * making it easier to correlate requests and responses. */ -#define HIDPP_SOFTWARE_ID 0x01 +#define HIDPP_SOFTWARE_ID_MIN 1 +#define HIDPP_SOFTWARE_ID_MAX 15 #define HIDPP_SOFTWARE_ID_LEN 4 #define HIDPP20_FEAT_ROOT_ID 0x0000 @@ -238,6 +241,7 @@ struct uhidpp_softc { struct uhidpp_report *sc_req; /* [m] synchronous request buffer */ struct uhidpp_report *sc_resp; /* [m] synchronous response buffer */ u_int sc_resp_state; /* [m] synchronous response state */ + u_int sc_swid; /* [m] request software id */ enum { UHIDPP_RECEIVER_UNIFYING, @@ -372,6 +376,7 @@ uhidpp_attach(struct device *parent, struct device *self, void *aux) sc->sc_resp = NULL; sc->sc_resp_state = UHIDPP_RESP_NONE; + sc->sc_swid = HIDPP_SOFTWARE_ID_MIN; error = uhidev_open(&sc->sc_hdev); if (error) { @@ -1268,8 +1273,10 @@ hidpp_send_fap_report(struct uhidpp_softc *sc, uint8_t report_id, memset(&req, 0, sizeof(req)); req.device_id = device_id; req.fap.feature_idx = feature_idx; + sc->sc_swid = sc->sc_swid == HIDPP_SOFTWARE_ID_MAX ? + HIDPP_SOFTWARE_ID_MIN : sc->sc_swid + 1; req.fap.funcidx_swid = - (funcidx_swid << HIDPP_SOFTWARE_ID_LEN) | HIDPP_SOFTWARE_ID; + (funcidx_swid << HIDPP_SOFTWARE_ID_LEN) | sc->sc_swid; memcpy(req.fap.params, params, nparams); return hidpp_send_report(sc, report_id, &req, resp); } |