Subject: Re: bug#35574: bcm5974 touchpad is not recognized as touchpad

From: Brice Waegeneire <[email-masked]>
Date: Tue, 28 Apr 2020 14:10:58 +0000

Hello Florian,

On 2020-04-28 09:45, pelzflorian (Florian Pelz) wrote:
> Danny, Brice, I’m putting you in Cc, maybe you have an opinion on
> this?  I suppose I should not change %default-extra-linux-options.

Keeping this module enabled in the kernel seems a good idea, it allows
support for mice solely speaking Human Interface Device Boot Protocol
(HIDBP); probably somebody somewhere is unwittingly relying on it being
present by default in Guix.

> From the Linux kernel docs
> <https://www.kernel.org/doc/html/latest/input/devices/bcm5974.html>:
>> 5.2. USB Race
>> 
>> The Apple multi-touch trackpads report both mouse and keyboard events
>> via different interfaces of the same usb device. This creates a race
>> condition with the HID driver, which, if not told otherwise, will find
>> the standard HID mouse and keyboard, and claim the whole device. To
>> remedy, the usb product id must be listed in the mouse_ignore list of
>> the hid driver.
> Indeed for me on good boots, the command `lsusb -t` prints
>     |__ Port 3: Dev 2, If 2, Class=Human Interface Device, 
> Driver=bcm5974, 12M
> while on bad boots it says Driver=usbmouse.
> 
> But why that happens I do not know, because the mouse_ignore list in
> the Linux-libre kernel’s drivers/hid/hid-quirks.c file does list my
> touchpad.  Strange.  I will investigate further if a change to the
> kernel config could help.

FWI the issue span from the driver 'usbmouse'
(drivers/hid/usbhid/usbmouse.c) which doesn't use 
drivers/hid/hid-quirks.c
contrary to 'usbhid' (drivers/hid/usbhid/hid-core.c) which is using it.
This is probably why you did not report having an issue with 'usbhid'
racing with 'bcm597'; 'usbhid' is effectively prevented to take over 
your
touchpad by the quirks while 'usbmouse' isn't aware of it.

Passing arguments to the kernel to blacklist a module is the correct way 
of
doing this currently FWIU; it's already used in gnu/system/install.scm.

Cheers,
- Brice