hid: Add HQ_NO_READAHEAD quirk and implement it in usbhid(4)
It disables interrupt emulation on poll-driven buses like USB and forces aquiring of only one USB frame per read(2) operation. This avoids an FIDO/U2F issue where IN endpoint data received from the device right before the file handle is closed, gets lost. PR: 263995 Reviewed by: aokblast Differential revision: https://reviews.freebsd.org/D51605
This commit is contained in:
@@ -50,6 +50,7 @@
|
||||
HQ(IS_XBOX360GP), /* device is XBox 360 GamePad */ \
|
||||
HQ(NOWRITE), /* device does not support writes */ \
|
||||
HQ(IICHID_SAMPLING), /* IIC backend runs in sampling mode */ \
|
||||
HQ(NO_READAHEAD), /* Disable interrupt after one report */\
|
||||
\
|
||||
/* Various quirks */ \
|
||||
HQ(HID_IGNORE), /* device should be ignored by hid class */ \
|
||||
|
||||
@@ -114,6 +114,7 @@ struct usbhid_xfer_ctx {
|
||||
void *cb_ctx;
|
||||
int waiters;
|
||||
bool influx;
|
||||
bool no_readahead;
|
||||
};
|
||||
|
||||
struct usbhid_softc {
|
||||
@@ -272,7 +273,7 @@ usbhid_intr_handler_cb(struct usbhid_xfer_ctx *xfer_ctx)
|
||||
sc->sc_intr_handler(sc->sc_intr_ctx, xfer_ctx->buf,
|
||||
xfer_ctx->req.intr.actlen);
|
||||
|
||||
return (0);
|
||||
return (xfer_ctx->no_readahead ? ECANCELED : 0);
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -430,6 +431,7 @@ usbhid_intr_start(device_t dev, device_t child __unused)
|
||||
.cb = usbhid_intr_handler_cb,
|
||||
.cb_ctx = sc,
|
||||
.buf = sc->sc_intr_buf,
|
||||
.no_readahead = hid_test_quirk(&sc->sc_hw, HQ_NO_READAHEAD),
|
||||
};
|
||||
sc->sc_xfer_ctx[POLL_XFER(USBHID_INTR_IN_DT)] = (struct usbhid_xfer_ctx) {
|
||||
.req.intr.maxlen =
|
||||
|
||||
Reference in New Issue
Block a user