diff options
author | Vladimir Kondratyev <wulf@FreeBSD.org> | 2020-03-11 20:05:49 +0000 |
---|---|---|
committer | Vladimir Kondratyev <wulf@FreeBSD.org> | 2020-03-11 20:05:49 +0000 |
commit | 54c050471cbc30e3f6e54e5dab89ed4df37f5e1d (patch) | |
tree | 6004b5a60d8557d30cb28fec781288c0fd10fcd2 /sys/dev/usb/input | |
parent | b1b09fb8cd545067bc7925cec7a9bfe30a4521df (diff) | |
download | src-54c050471cbc30e3f6e54e5dab89ed4df37f5e1d.tar.gz src-54c050471cbc30e3f6e54e5dab89ed4df37f5e1d.zip |
wmt(4): Reapply r358872 (by hselasky) modified to use
maximal input report size instead of wMaxPacketSize.
If the USB frame length is set to 1024 bytes, WMT_BSIZE, the EETI controller
will pack multiple touch events in the packet and the current code will only
process the first touch event.
As a result some important events are lost like releasing the finger from the
touchscreen.
Use the maximal input report size as buffer size instead.
PR: 244718
Tested by: Oskar Holmlund <oskar.holmlund@ohdata.se>, wulf
MFC after: 3 days
Discussed with: hselasky
Notes
Notes:
svn path=/head/; revision=358895
Diffstat (limited to 'sys/dev/usb/input')
-rw-r--r-- | sys/dev/usb/input/wmt.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/sys/dev/usb/input/wmt.c b/sys/dev/usb/input/wmt.c index 55b229225914..c9b10214d4e4 100644 --- a/sys/dev/usb/input/wmt.c +++ b/sys/dev/usb/input/wmt.c @@ -201,6 +201,7 @@ struct wmt_softc uint32_t caps; uint32_t isize; uint32_t nconts_max; + uint32_t report_len; uint8_t report_id; struct hid_location cont_max_loc; @@ -492,10 +493,11 @@ wmt_intr_callback(struct usb_xfer *xfer, usb_error_t error) DPRINTFN(6, "sc=%p actlen=%d\n", sc, len); - if (len >= (int)sc->isize || (len > 0 && sc->report_id != 0)) { + if (len >= (int)sc->report_len || + (len > 0 && sc->report_id != 0)) { /* Limit report length to the maximum */ - if (len > (int)sc->isize) - len = sc->isize; + if (len > (int)sc->report_len) + len = sc->report_len; usbd_copy_out(pc, 0, buf, len); @@ -504,8 +506,8 @@ wmt_intr_callback(struct usb_xfer *xfer, usb_error_t error) goto tr_ignore; /* Make sure we don't process old data */ - if (len < sc->isize) - bzero(buf + len, sc->isize - len); + if (len < sc->report_len) + bzero(buf + len, sc->report_len - len); /* Strip leading "report ID" byte */ if (sc->report_id) { @@ -521,7 +523,7 @@ tr_ignore: case USB_ST_SETUP: tr_setup: - usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer)); + usbd_xfer_set_frame_len(xfer, 0, sc->isize); usbd_transfer_submit(xfer); break; default: @@ -807,7 +809,9 @@ wmt_hid_parse(struct wmt_softc *sc, const void *d_ptr, uint16_t d_len) sc->ai[WMT_ORIENTATION].max = 1; } - sc->isize = wmt_hid_report_size(d_ptr, d_len, hid_input, report_id); + sc->isize = hid_report_size(d_ptr, d_len, hid_input, NULL); + sc->report_len = wmt_hid_report_size(d_ptr, d_len, hid_input, + report_id); sc->cont_max_rlen = wmt_hid_report_size(d_ptr, d_len, hid_feature, cont_max_rid); if (thqa_cert_rid > 0) |