[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-input
Subject:    Re: [PATCH v3 01/12] HID: logitech-hidpp: Don't restart IO, instead defer hid_connect() only
From:       Hans de Goede <hdegoede () redhat ! com>
Date:       2023-10-25 19:02:38
Message-ID: eddd433b-6243-1479-7881-f33a6694783c () redhat ! com
[Download RAW message or body]

Hi,

On 10/25/23 18:43, Benjamin Tissoires wrote:
> On Oct 18 2023, Benjamin Tissoires wrote:
> > Hi Hans,
> > 
> > FWIW, your series looks good, but I came accross a small nitpick here:
> > 
> > On Oct 10 2023, Hans de Goede wrote:
> > > Restarting IO causes 2 problems:
> > > 
> > > 1. Some devices do not like IO being restarted this was addressed in
> > > commit 498ba2069035 ("HID: logitech-hidpp: Don't restart communication
> > > if not necessary"), but that change has issues of its own and needs to
> > > be reverted.
> > > 
> > > 2. Restarting IO and specifically calling hid_device_io_stop() causes
> > > received packets to be missed, which may cause connect-events to
> > > get missed.
> > > 
> > > Restarting IO was introduced in commit 91cf9a98ae41 ("HID: logitech-hidpp:
> > > make .probe usbhid capable") to allow to retrieve the device's name and
> > > serial number and store these in hdev->name and hdev->uniq before
> > > connecting any hid subdrivers (hid-input, hidraw) exporting this info
> > > to userspace.
> > > 
> > > But this does not require restarting IO, this merely requires deferring
> > > calling hid_connect(). Calling hid_hw_start() with a connect-mask of
> > > 0 makes it skip calling hid_connect(), so hidpp_probe() can simply call
> > > hid_connect() later without needing to restart IO.
> > > 
> > > Remove the stop + restart of IO and instead just call hid_connect() later
> > > to avoid the issues caused by restarting IO.
> > > 
> > > Now that IO is no longer stopped, hid_hw_close() must be called at the end
> > > of probe() to balance the hid_hw_open() done at the beginning probe().
> > > 
> > > This series has been tested on the following devices:
> > > Logitech Bluetooth Laser Travel Mouse (bluetooth, HID++ 1.0)
> > > Logitech M720 Triathlon (bluetooth, HID++ 4.5)
> > > Logitech M720 Triathlon (unifying, 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 LX501 keyboard (27 Mhz, HID++ builtin scroll-wheel, HID++ 1.0)
> > > Logitech M-RAZ105 mouse (27 Mhz, HID++ extra mouse buttons, HID++ 1.0)
> > > 
> > > Fixes: 498ba2069035 ("HID: logitech-hidpp: Don't restart communication if not \
> > >                 necessary")
> > > Suggested-by: Benjamin Tissoires <bentiss@kernel.org>
> > > Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> > > ---
> > > drivers/hid/hid-logitech-hidpp.c | 22 ++++++++++++----------
> > > 1 file changed, 12 insertions(+), 10 deletions(-)
> > > 
> > > diff --git a/drivers/hid/hid-logitech-hidpp.c \
> > > b/drivers/hid/hid-logitech-hidpp.c index a209d51bd247..aa4f232c4518 100644
> > > --- a/drivers/hid/hid-logitech-hidpp.c
> > > +++ b/drivers/hid/hid-logitech-hidpp.c
> > > @@ -4460,8 +4460,10 @@ static int hidpp_probe(struct hid_device *hdev, const \
> > > struct hid_device_id *id)  hdev->name);
> > > 
> > > 	/*
> > > -	 * Plain USB connections need to actually call start and open
> > > -	 * on the transport driver to allow incoming data.
> > > +	 * First call hid_hw_start(hdev, 0) to allow IO without connecting any
> > > +	 * hid subdrivers (hid-input, hidraw). This allows retrieving the dev's
> > > +	 * name and serial number and store these in hdev->name and hdev->uniq,
> > > +	 * before the hid-input and hidraw drivers expose these to userspace.
> > > 	 */
> > > 	ret = hid_hw_start(hdev, will_restart ? 0 : connect_mask);
> > > 	if (ret) {
> > > @@ -4519,19 +4521,14 @@ static int hidpp_probe(struct hid_device *hdev, const \
> > > struct hid_device_id *id)  flush_work(&hidpp->work);
> > > 
> > > 	if (will_restart) {
> > > -		/* Reset the HID node state */
> > > -		hid_device_io_stop(hdev);
> > > -		hid_hw_close(hdev);
> > > -		hid_hw_stop(hdev);
> > > -
> > > 		if (hidpp->quirks & HIDPP_QUIRK_DELAYED_INIT)
> > > 			connect_mask &= ~HID_CONNECT_HIDINPUT;
> > > 
> > > 		/* Now export the actual inputs and hidraw nodes to the world */
> > > -		ret = hid_hw_start(hdev, connect_mask);
> > > +		ret = hid_connect(hdev, connect_mask);
> > 
> > On plain USB devices, we get a new warning here "io already started".
> > 
> > This is because hid_connect() will call hid_pidff_init() from
> > drivers/hid/usbhid/hid-pidff.c if connect_mask has the `HID_CONNECT_FF`
> > bit set.
> > 
> > And hid_pidff_init() blindly calls hid_device_io_start() then
> > hid_device_io_stop().
> > 
> > It's not a big issue, but still it's a new warning we have to tackly on.
> > 
> > I see 3 possible solutions:
> > - teach hid_pidff_init() to only start/stop the IOs if it's not already
> > done so
> > - if a device is actually connected through USB, call
> > hid_device_io_stop() before hid_connect()
> > - unconditionally call hid_device_io_stop() before hid_connect()
> > 
> > The latter has my current preference as we won't get biten in the future
> > if something else decides to change the io state.
> > 
> > However, do you thing it'll be an issue to disable IOs there?

Not really an issue, but if we disable IOs then we may loose
incoming packets with a connect event in there.

> > And maybe we should re-enable them after?

If we disable IOs before hid_connect() (or at any point
after enabling them) then connect events may be lost
so we must re-enable IOs then and move the hidpp_connect_event()
work queuing, which polls for already connected devices to
after the re-enabling.

Also IOs need to be re-enabled for the g920_get_config()
call later during hidpp_probe().

I have just written a patch for this and submitted it upstream :)

> > If it's fine to simply disable the IOs, we can add an extra patch on top
> > of this series to fix that warning in the USB case.
> > 
> > As mentioned above, I have tested with the T650, T651 that were likely to
> > be a problem, and they are working just fine :)
> > 
> > So with that minor fix, we should be able to stage this series.
> 
> The merge window is coming very soon. So I'm taking this series as it is
> (I just added the few devices I made the tests), and we can work on an
> extra patch to remove that warning.

Extra patch submitted :)

Regards,

Hans


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic