svn commit: r358895 - head/sys/dev/usb/input
Vladimir Kondratyev
wulf at FreeBSD.org
Wed Mar 11 20:05:50 UTC 2020
Author: wulf
Date: Wed Mar 11 20:05:49 2020
New Revision: 358895
URL: https://svnweb.freebsd.org/changeset/base/358895
Log:
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 at ohdata.se>, wulf
MFC after: 3 days
Discussed with: hselasky
Modified:
head/sys/dev/usb/input/wmt.c
Modified: head/sys/dev/usb/input/wmt.c
==============================================================================
--- head/sys/dev/usb/input/wmt.c Wed Mar 11 20:05:06 2020 (r358894)
+++ head/sys/dev/usb/input/wmt.c Wed Mar 11 20:05:49 2020 (r358895)
@@ -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 e
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 e
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,
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)
More information about the svn-src-head
mailing list