[SRU][B/C/D/OEM-OSP1-B/E][PATCH 1/1] Input: alps - don't handle ALPS cs19 trackpoint-only device

Hui Wang hui.wang at canonical.com
Fri Jul 19 02:48:53 UTC 2019


On 2019/7/19 上午5:01, Andy Whitcroft wrote:
> On Tue, Jul 16, 2019 at 10:12:57PM +0800, Hui Wang wrote:
>> BugLink: https://bugs.launchpad.net/bugs/1836752
>>
>> On a latest Lenovo laptop, the trackpoint and 3 buttons below it
>> don't work at all, when we move the trackpoint or press those 3
>> buttons, the kernel will print out:
>> "Rejected trackstick packet from non DualPoint device"
>>
>> This device is identified as an alps touchpad but the packet has
>> trackpoint format, so the alps.c drops the packet and prints out
>> the message above.
>>
>> According to XiaoXiao's explanation, this device is named cs19 and
>> is trackpoint-only device, its firmware is only for trackpoint, it
>> is independent of touchpad and is a device completely different from
>> DualPoint ones.
>>
>> To drive this device with mininal changes to the existing driver, we
>> just let the alps driver not handle this device, then the trackpoint.c
>> will be the driver of this device if the trackpoint driver is enabled.
>> (if not, this device will fallback to a bare PS/2 device)
>>
>> With the trackpoint.c, this trackpoint and 3 buttons all work well,
>> they have all features that the trackpoint should have, like
>> scrolling-screen, drag-and-drop and frame-selection.
>>
>> Signed-off-by: XiaoXiao Liu <sliuuxiaonxiao at gmail.com>
>> Signed-off-by: Hui Wang <hui.wang at canonical.com>
>> Reviewed-by: Pali Rohár <pali.rohar at gmail.com>
>> Cc: stable at vger.kernel.org
>> Signed-off-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>
>> (cherry picked from commit 7e4935ccc3236751e5fe4bd6846f86e46bb2e427
>> git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git)
>> Signed-off-by: Hui Wang <hui.wang at canonical.com>
>> ---
>>   drivers/input/mouse/alps.c | 32 ++++++++++++++++++++++++++++++++
>>   1 file changed, 32 insertions(+)
>>
>> diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
>> index 0a6f7ca883e7..11a4363c3b60 100644
>> --- a/drivers/input/mouse/alps.c
>> +++ b/drivers/input/mouse/alps.c
>> @@ -24,6 +24,7 @@
>>   
>>   #include "psmouse.h"
>>   #include "alps.h"
>> +#include "trackpoint.h"
>>   
>>   /*
>>    * Definitions for ALPS version 3 and 4 command mode protocol
>> @@ -2864,6 +2865,23 @@ static const struct alps_protocol_info *alps_match_table(unsigned char *e7,
>>   	return NULL;
>>   }
>>   
>> +static bool alps_is_cs19_trackpoint(struct psmouse *psmouse)
>> +{
>> +	u8 param[2] = { 0 };
>> +
>> +	if (ps2_command(&psmouse->ps2dev,
>> +			param, MAKE_PS2_CMD(0, 2, TP_READ_ID)))
>> +		return false;
>> +
>> +	/*
>> +	 * param[0] contains the trackpoint device variant_id while
>> +	 * param[1] contains the firmware_id. So far all alps
>> +	 * trackpoint-only devices have their variant_ids equal
>> +	 * TP_VARIANT_ALPS and their firmware_ids are in 0x20~0x2f range.
>> +	 */
>> +	return param[0] == TP_VARIANT_ALPS && (param[1] & 0x20);
> I don't think the comment is consistent with the code.  I think the last
> conditional should be something like the below to match the comment:
>
>      ((param[1] | 0x0f) == 0x2f)
>
> I have no idea if the comment is right, or the code is right.

You are right,  if param[1] is 0x30, 0x60..., the condition will be true 
unexpectedly. This is an issue, and I will send an incremental patch to 
fix it.

And in practice, it will not introduce any issue since the alps told me 
the param[1]  only has 0x0~0x1f in the old devices, and in the 
trackpoint-only device, it has 0x20~0x2f, the value higher than 0x2f has 
not been used yet. so it is safe to merge this patch temporarily. And I 
will submit an incremental SRU after the incremental patch is upstreamed.


Thanks.



>
>> +}
>> +
>>   static int alps_identify(struct psmouse *psmouse, struct alps_data *priv)
>>   {
>>   	const struct alps_protocol_info *protocol;
>> @@ -3164,6 +3182,20 @@ int alps_detect(struct psmouse *psmouse, bool set_properties)
>>   	if (error)
>>   		return error;
>>   
>> +	/*
>> +	 * ALPS cs19 is a trackpoint-only device, and uses different
>> +	 * protocol than DualPoint ones, so we return -EINVAL here and let
>> +	 * trackpoint.c drive this device. If the trackpoint driver is not
>> +	 * enabled, the device will fall back to a bare PS/2 mouse.
>> +	 * If ps2_command() fails here, we depend on the immediately
>> +	 * followed psmouse_reset() to reset the device to normal state.
>> +	 */
>> +	if (alps_is_cs19_trackpoint(psmouse)) {
>> +		psmouse_dbg(psmouse,
>> +			    "ALPS CS19 trackpoint-only device detected, ignoring\n");
>> +		return -EINVAL;
>> +	}
>> +
>>   	/*
>>   	 * Reset the device to make sure it is fully operational:
>>   	 * on some laptops, like certain Dell Latitudes, we may
>> -- 
>> 2.17.1
>>
>>
>> -- 
>> kernel-team mailing list
>> kernel-team at lists.ubuntu.com
>> https://lists.ubuntu.com/mailman/listinfo/kernel-team



More information about the kernel-team mailing list