Re: [PATCH] HID: multitouch: Add MT_QUIRK_FORCE_GET_FEATURE to MT_CLS_WIN_8 quirks

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, May 13, 2020 at 10:00:30AM +0200, Benjamin Tissoires wrote:
> Hi Hans,
> 
> [sorry for the delay, I am knee deep in fdo admin stuffs]
> 
> On Mon, May 4, 2020 at 11:31 AM Hans de Goede <hdegoede@xxxxxxxxxx> wrote:
> >
> > Hi,
> >
> > On 5/4/20 9:39 AM, Benjamin Tissoires wrote:
> > > Hi Hans,
> > >
> > > On Sat, May 2, 2020 at 2:59 PM Hans de Goede <hdegoede@xxxxxxxxxx> wrote:
> > >>
> > >> Hi,
> > >>
> > >> On 5/1/20 8:20 PM, Hans de Goede wrote:
> > >>> Hi,
> > >>>
> > >>> On 5/1/20 11:56 AM, Hans de Goede wrote:
> > >>>> The touchpad on the Dell Venue 11 Pro 7130's keyboard-dock is multi-touch
> > >>>> capable, using HID_GROUP_MULTITOUCH_WIN_8 and the hid-multitouch driver
> > >>>> correctly binds to it.
> > >>>>
> > >>>> But instead of getting multi-touch HID input reports we still get mouse
> > >>>> input reports and corresponding linux input (evdev) node events.
> > >>>>
> > >>>> Unloading and reloading the hid-multitouch driver works around this.
> > >>>>
> > >>>> Adding the MT_QUIRK_FORCE_GET_FEATURE quirk to the MT_CLS_WIN_8 quirks
> > >>>> makes the driver work correctly the first time it is loaded.
> > >>>>
> > >>>> I've chosen to add this quirk to the generic MT_CLS_WIN_8 quirks
> > >>>> because it seems unlikely that this quirk will causes problems for
> > >>>> other MT_CLS_WIN_8 devices and if this device needs it other Win 8
> > >>>> compatible devices might need it too.
> > >>>>
> > >>>> Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx>
> > >>>
> > >>> Self nack for now, there are more issues with this detachable keyboard,
> > >>> it sometimes does not work after being unplugged and replugged again
> > >>> USB_QUIRK_DELAY_INIT seems to help a bit, but is not a total solution...
> > >>>
> > >>> Dell has some firmware updates for the kbd. So I'll install Windows and
> > >>> then update the firmware and we'll see from there.
> > >>
> > >> So after installing Windows it turns out that the kbd-dock firmware was
> > >> already fully up2date, what fun.
> > >>
> > >> So it took me quite a long time to get to the bottom of this.
> > >>
> > >> The problem is that the Dell K12A kbd-dock needs a HID_QUIRK_NO_INIT_REPORTS
> > >> quirk; or maybe both of HID_QUIRK_NO_INIT_REPORTS|HID_QUIRK_NOGET I've tested
> > >
> > > I think this is a regression introduced by the high res scrolling
> > > patch. I have been notified that the new code actually does fetch all
> > > features on connect, which many devices do not support.
> > >
> > > I don't think I received the patch related to that, but basically the
> > > problematic code is at
> > > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/hid/hid-input.c#n1558
> > >
> > > The issue is that we should only fetch the current report if the
> > > HID_GD_RESOLUTION_MULTIPLIER is present. Or we break things.
> >
> > I don't think that this is related to the high-res scrolling stuff.
> 
> Well, it is in the way that the high-res scrolling changed the way we talked to HID device. Before that, I carefully ensured that hid-generic would never issue a get_feature or get_input, and after, it does.
> 
> >
> > The errors I'm seeing on a bad hotplug are coming from
> > drivers/hid/hid-multitouch.c: mt_get_feature()
> 
> It might be that the device doesn't like to be polled too often on one feature and gets in a stuck mode.
> 
> >
> > Also quite a few other multi-touch devices have a HID_QUIRK_NO_INIT_REPORTS
> > quirk, at least a bunch of surface keyboards do; and if I'm reading the
> > git log correctly then at one point in time we used to have a
> > HID_QUIRK_NO_INIT_REPORTS for at least some of the multi-touch classes
> > inside hid-multitouch.c. At least there is a commit titled:
> >
> > "HID: multitouch: do not set HID_QUIRK_NO_INIT_REPORTS"
> >
> > Which suggests that one point we did set it inside the multi-touch
> > driver; and I'm wondering since a bunch of surface keyboards need this
> > if setting this inside the multi-touch driver would not get us closer
> > to windows behavior.
> 
> This quirk is legacy, and should have stayed that way (well, it doesn't
> hurt anyway). As mentioned, in the past, the hid core stack used to fetch
> all input and feature reports on plug in. This was known to break many
> devices, and we had to use the no-init-report quirk for them. Then, we
> realized that it was not correct to do that way, and I removed this
> behavior. However, I couldn't remove the quirk entirely because of hiddev
> IIRC. In the hiddev case, userspace expects the device to have known values
> for the features, but that is not 100% working. So to not break userspace,
> I had to keep that quirk around for this use case.
> 
> >
> > Anyways if you have an alternative fix you want me to test, let me know.
> 
> Peter has a patch, we were waiting for the reporter to test it, but it's
> been crickets since last week.

sorry, my fault. I have the tested-by from the reporter but I haven't yet
been able to find the time to verify it doesn't break the resolution
multiplier. so it lack's my own test.

Cheers,
   Peter

> 
> Here it is:
> 
> ---
> Subject: [DRAFT PATCH] HID: input: do not run GET_REPORT unless there's a Resolution Multiplier
> 
> From: Peter Hutterer <peter.hutterer@xxxxxxxxx>
> 
> Some devices take GET_REPORT as an instruction to change the mode, or
> toggle some other value, or possibly do unspeakable things to kittens.
> So we must not execute GET_REPORT against a device unless we're sure
> that there's a Resolution Multiplier in that report that makes it all
> worth it.
> 
> Signed-off-by: Peter Hutterer <peter.hutterer@xxxxxxxxx>
> ---
>  drivers/hid/hid-input.c | 22 ++++++++++++----------
>  1 file changed, 12 insertions(+), 10 deletions(-)
> 
> diff --git drivers/hid/hid-input.c drivers/hid/hid-input.c
> index dea9cc65bf80..a54824d451bf 100644
> --- drivers/hid/hid-input.c
> +++ drivers/hid/hid-input.c
> @@ -1560,21 +1560,12 @@ static bool __hidinput_change_resolution_multipliers(struct hid_device *hid,
>  {
>  	struct hid_usage *usage;
>  	bool update_needed = false;
> +	bool get_report_completed = false;
>  	int i, j;
>  
>  	if (report->maxfield == 0)
>  		return false;
>  
> -	/*
> -	 * If we have more than one feature within this report we
> -	 * need to fill in the bits from the others before we can
> -	 * overwrite the ones for the Resolution Multiplier.
> -	 */
> -	if (report->maxfield > 1) {
> -		hid_hw_request(hid, report, HID_REQ_GET_REPORT);
> -		hid_hw_wait(hid);
> -	}
> -
>  	for (i = 0; i < report->maxfield; i++) {
>  		__s32 value = use_logical_max ?
>  			      report->field[i]->logical_maximum :
> @@ -1593,6 +1584,17 @@ static bool __hidinput_change_resolution_multipliers(struct hid_device *hid,
>  			if (usage->hid != HID_GD_RESOLUTION_MULTIPLIER)
>  				continue;
>  
> +			/*
> +			 * If we have more than one feature within this report we
> +			 * need to fill in the bits from the others before we can
> +			 * overwrite the ones for the Resolution Multiplier.
> +			 */
> +			if (!get_report_completed && report->maxfield > 1) {
> +				hid_hw_request(hid, report, HID_REQ_GET_REPORT);
> +				hid_hw_wait(hid);
> +				get_report_completed = true;
> +			}
> +
>  			report->field[i]->value[j] = value;
>  			update_needed = true;
>  		}
> -- 
> 2.26.0
> 
> Cheers,
> Benjamin
> 
> >
> > Regards,
> >
> > Hans
> >
> >
> >
> >
> > >
> > > Cheers,
> > > Benjamin
> > >
> > >> with the later version and that fixes both the touchpad initially being
> > >> stuck in mouse emulation and the dock misbehaving after a hot unplug + replug.
> > >>
> > >> I suspect I really only need HID_QUIRK_NO_INIT_REPORTS, I will retest with
> > >> that and submit a new patch replacing this one.
> > >>
> > >> Somewhat related: to make space for the Windows install I nuked the old
> > >> Fedora 27 install which was on the machine and after installing Windows
> > >> I did a fresh Fedora 32 install in the space which I left free when
> > >> installing Windows.
> > >>
> > >> This causes an interesting new problem. The touchpad worked fine
> > >> (with the quirk) in gdm, but it would stop working when I logged into
> > >> a user GNOME-session.  It took me a while to get to the bottom of
> > >> this. The problem is that the usersession ends up dbus activating
> > >> fwupd (probably through gnome-software) and fwupd does some probe
> > >> of the touchpad which puts it in a mode where it no longer generates
> > >> any events.
> > >>
> > >> sudo rpm -e fwupd gnome-software
> > >>
> > >> Works around this, so not a HID bug, but definitely something to keep
> > >> an eye out for if we get similar bug reports on other devices.
> > >>
> > >> I will mail the fwupd maintainer about this with you in the Cc.
> > >> Note this is an unrelated issue really, but I thought you
> > >> should be aware of this.
> > >>
> > >> Regards,
> > >>
> > >> Hans
> > >>
> > >>
> > >>
> > >>>> ---
> > >>>>    drivers/hid/hid-multitouch.c | 1 +
> > >>>>    1 file changed, 1 insertion(+)
> > >>>>
> > >>>> diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
> > >>>> index 362805ddf377..f9c0429e7348 100644
> > >>>> --- a/drivers/hid/hid-multitouch.c
> > >>>> +++ b/drivers/hid/hid-multitouch.c
> > >>>> @@ -265,6 +265,7 @@ static const struct mt_class mt_classes[] = {
> > >>>>                MT_QUIRK_IGNORE_DUPLICATES |
> > >>>>                MT_QUIRK_HOVERING |
> > >>>>                MT_QUIRK_CONTACT_CNT_ACCURATE |
> > >>>> +            MT_QUIRK_FORCE_GET_FEATURE |
> > >>>>                MT_QUIRK_STICKY_FINGERS |
> > >>>>                MT_QUIRK_WIN8_PTP_BUTTONS,
> > >>>>            .export_all_inputs = true },
> > >>>>
> > >>
> > >
> >
> 



[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux