Re: [PATCH v2 00/14] HID: logitech-hidpp: Avoid hidpp_connect_event() running while probe() restarts IO

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

 



Hi,

On 10/8/23 11:54, Hans de Goede wrote:
> Hi Benjamin,
> 
> Here is a v2 of my series to fix issues with hidpp_connect_event() running
> while restarting IO, which now also fixes the issues you mentioned with
> potentially missing connect events.
> 
> This series is best explained by a brief sketch of how probe()
> looks at the end of the series (1):
> 
> Prep work:
> 
> 1. All code depending on a device being in connected state is moved to
>    the hidpp_connect_event() workqueue item
> 
> 2. hidpp_connect_event() now checks the connected state itself by
>    checking that hidpp_root_get_protocol_version() succeeds, instead
>    of relying on possibly stale (racy) data in struct hidpp_device
> 
> With this in place the new probe() sequence looks like this:
> 
> 1. enable_connect_event flag starts at 0, this filters out / ignores any
>    connect-events in hidpp_raw_hidpp_event() avoiding
>    hidpp_connect_event() getting queued before the IO restart
> 
> 2. IO is started with connect-mask = 0
>    this avoids hid-input and hidraw connecting while probe() is setting
>    hdev->name and hdev->uniq
> 
> 3. Name and serialnr are retrieved and stored in hdev
> 
> 4. IO is fully restarted (including hw_open + io_start, not just hw_start)
>    with the actual connect-mask.
> 
> 5. enable_connect_event atomic_t is set to 1 to enable processing of
>    connect events.
> 
> 6. hidpp_connect_event() is queued + flushed to query the connected state
>    and do the connect work if the device is connected.
> 
> 7. probe() now ends with:
> 
>         /*
>          * This relies on logi_dj_ll_close() being a no-op so that
>          * DJ connection events will still be received.
>          */
>         hid_hw_close(hdev);
> 
>    Since on restarting IO it now is fully restarted so the hid_hw_open()
>    there needs to be balanced. 
> 
> This series now obviously is no longer 6.6 material, instead I hope we
> can get this rework (and IMHO nice cleanup) into 6.7 .
> 
> Regards,
> 
> Hans

I forgot to add info on the list of devices I tested this on:

Logitech Bluetooth Laser Travel Mouse (bluetooth, HID++ 1.0)
Logitech M720 Triathlon (bluetooth, HID++ 4.5)
Logitech K400 Pro (unifying, HID++ 4.1)
Logitech K270 (eQUAD nano Lite, HID++ 2.0)
Logitech M185 (eQUAD nano Lite, HID++ 4.5)
Logitech Keyboard LX501 (27 Mhz, HID++ builtin scroll-wheel, HID++ 1.0)
Logitech 27Mhz mouse (27 Mhz, HID++ extra mouse buttons, HID++ 1.0)

Regards,

Hans



> 1) For reviewing you may also want to apply the entire series and look
> at the end result to help you understand why various intermediate steps
> are taken.
> 
> 
> Hans de Goede (14):
>   HID: logitech-hidpp: Revert "Don't restart communication if not
>     necessary"
>   HID: logitech-hidpp: Move hidpp_overwrite_name() to before connect
>     check
>   HID: logitech-hidpp: Add hidpp_non_unifying_init() helper
>   HID: logitech-hidpp: Remove connected check for non-unifying devices
>   HID: logitech-hidpp: Move get_wireless_feature_index() check to
>     hidpp_connect_event()
>   HID: logitech-hidpp: Remove wtp_get_config() call from probe()
>   HID: logitech-hidpp: Remove connected check for g920_get_config() call
>   HID: logitech-hidpp: Add a hidpp_connect_and_start() helper
>   HID: logitech-hidpp: Move the connected check to after restarting IO
>   HID: logitech-hidpp: Move g920_get_config() to just before
>     hidpp_ff_init()
>   HID: logitech-hidpp: Remove unused connected param from *_connect()
>   HID: logitech-hidpp: Fix connect event race
>   HID: logitech-hidpp: Avoid hidpp_connect_event() running while probe()
>     restarts IO
>   HID: logitech-hidpp: Drop delayed_work_cb()
> 
>  drivers/hid/hid-logitech-hidpp.c | 211 +++++++++++++------------------
>  1 file changed, 91 insertions(+), 120 deletions(-)
> 




[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