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(-) >