git: f2f52fbfdb28 - stable/13 - psm(4): Probe Synaptics touchpad with active multiplexing mode enabled

Vladimir Kondratyev wulf at FreeBSD.org
Mon Aug 16 00:49:50 UTC 2021


The branch stable/13 has been updated by wulf:

URL: https://cgit.FreeBSD.org/src/commit/?id=f2f52fbfdb282d740c02a92a47737c2c3f975791

commit f2f52fbfdb282d740c02a92a47737c2c3f975791
Author:     Vladimir Kondratyev <wulf at FreeBSD.org>
AuthorDate: 2021-07-14 10:30:26 +0000
Commit:     Vladimir Kondratyev <wulf at FreeBSD.org>
CommitDate: 2021-08-16 00:47:18 +0000

    psm(4): Probe Synaptics touchpad with active multiplexing mode enabled
    
    if it is only multiplexed device. Also enable syncbit checks for them.
    This fixes touchpad recognition on Panasonic Toughbook CF-MX4 laptop.
    
    Reported by:    Tomasz "CeDeROM" CEDRO <tomek_AT_cedro_DOT_info>
    PR:             253279
    Differential revision:  https://reviews.freebsd.org/D28502
    
    (cherry picked from commit f5998d20ed80fdc1cb3ba0c245cae5f179e22fe2)
---
 sys/dev/atkbdc/psm.c | 42 ++++++++++++++++++++++++++++--------------
 1 file changed, 28 insertions(+), 14 deletions(-)

diff --git a/sys/dev/atkbdc/psm.c b/sys/dev/atkbdc/psm.c
index 43d19b5174d3..f6276ae847aa 100644
--- a/sys/dev/atkbdc/psm.c
+++ b/sys/dev/atkbdc/psm.c
@@ -466,6 +466,7 @@ struct psm_softc {		/* Driver status information */
 	int		muxtpbuttons;	/* Touchpad button state */
 	int		muxmsbuttons;	/* Mouse (trackpoint) button state */
 	struct timeval	muxmidtimeout;	/* middle button supression timeout */
+	int		muxsinglesyna;	/* Probe result of single Synaptics */
 #ifdef EVDEV_SUPPORT
 	struct evdev_dev *evdev_a;	/* Absolute reporting device */
 	struct evdev_dev *evdev_r;	/* Relative reporting device */
@@ -666,6 +667,7 @@ static probefunc_t	enable_4dplus;
 static probefunc_t	enable_mmanplus;
 static probefunc_t	enable_synaptics;
 static probefunc_t	enable_synaptics_mux;
+static probefunc_t	enable_single_synaptics_mux;
 static probefunc_t	enable_trackpoint;
 static probefunc_t	enable_versapad;
 static probefunc_t	enable_elantech;
@@ -686,8 +688,10 @@ static struct {
 	 * WARNING: the order of probe is very important.  Don't mess it
 	 * unless you know what you are doing.
 	 */
-	{ MOUSE_MODEL_SYNAPTICS,	/* Synaptics Touchpad on Active Mux */
+	{ MOUSE_MODEL_SYNAPTICS,	/* Synaptics + mouse on Active Mux */
 	  0x00, MOUSE_PS2_PACKETSIZE, enable_synaptics_mux },
+	{ MOUSE_MODEL_SYNAPTICS,	/* Single Synaptics on Active Mux */
+	  0xc0, MOUSE_SYNAPTICS_PACKETSIZE, enable_single_synaptics_mux },
 	{ MOUSE_MODEL_NET,		/* Genius NetMouse */
 	  0x08, MOUSE_PS2INTELLI_PACKETSIZE, enable_gmouse },
 	{ MOUSE_MODEL_NETSCROLL,	/* Genius NetScroll */
@@ -6292,6 +6296,8 @@ enable_synaptics_mux(struct psm_softc *sc, enum probearg arg)
 	int active_ports_count = 0;
 	int active_ports_mask = 0;
 
+	sc->muxsinglesyna = FALSE;
+
 	if (mux_disabled == 1 || (mux_disabled == -1 &&
 	    (kbdc->quirks & KBDC_QUIRK_DISABLE_MUX_PROBE) != 0))
 		return (FALSE);
@@ -6315,18 +6321,16 @@ enable_synaptics_mux(struct psm_softc *sc, enum probearg arg)
 		    active_ports_count);
 
 	/* psm has a special support for GenMouse + SynTouchpad combination */
-	if (active_ports_count >= 2) {
-		for (port = 0; port < KBDC_AUX_MUX_NUM_PORTS; port++) {
-			if ((active_ports_mask & 1 << port) == 0)
-				continue;
-			VLOG(3, (LOG_DEBUG, "aux_mux: probe port %d\n", port));
-			set_active_aux_mux_port(kbdc, port);
-			probe = enable_synaptics(sc, arg);
-			if (probe) {
-				if (arg == PROBE)
-					sc->muxport = port;
-				break;
-			}
+	for (port = 0; port < KBDC_AUX_MUX_NUM_PORTS; port++) {
+		if ((active_ports_mask & 1 << port) == 0)
+			continue;
+		VLOG(3, (LOG_DEBUG, "aux_mux: probe port %d\n", port));
+		set_active_aux_mux_port(kbdc, port);
+		probe = enable_synaptics(sc, arg);
+		if (probe) {
+			if (arg == PROBE)
+				sc->muxport = port;
+			break;
 		}
 	}
 
@@ -6348,7 +6352,17 @@ enable_synaptics_mux(struct psm_softc *sc, enum probearg arg)
 	}
 	empty_both_buffers(kbdc, 10);	/* remove stray data if any */
 
-	return (probe);
+	/* Don't disable syncbit checks if Synaptics is only device on MUX */
+	if (active_ports_count == 1)
+		sc->muxsinglesyna = probe;
+	return (active_ports_count != 1 ? probe : FALSE);
+}
+
+static int
+enable_single_synaptics_mux(struct psm_softc *sc, enum probearg arg)
+{
+	/* Synaptics device is already initialized in enable_synaptics_mux */
+	return (sc->muxsinglesyna);
 }
 
 static int


More information about the dev-commits-src-all mailing list