]> git.itanic.dy.fi Git - linux-stable/commitdiff
HID: logitech-hidpp: Stop IO before calling hid_connect()
authorHans de Goede <hdegoede@redhat.com>
Wed, 25 Oct 2023 19:01:51 +0000 (21:01 +0200)
committerBenjamin Tissoires <bentiss@kernel.org>
Thu, 26 Oct 2023 08:06:34 +0000 (10:06 +0200)
hid_connect() will call hid_pidff_init() which does
hid_device_io_start() leading to an "io already started" warning.

To fix this call hid_device_io_stop() before calling hid_connect(),
stopping IO means that connect events may be lost while hid_connect()
runs, re-enable IO and move the hidpp_connect_event() work queuing
after the hid_connect().

Note re-enabling IO is also necessary for the g920_get_config()
call later during hidpp_probe().

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20231025190151.302376-1-hdegoede@redhat.com
Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
drivers/hid/hid-logitech-hidpp.c

index c1bc895606121cfbd687707f5d19b560331e5b43..fd6d8f1d9b8f61992a69ce651dd379d121c2da49 100644 (file)
@@ -4461,19 +4461,22 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
        else
                hidpp_non_unifying_init(hidpp);
 
-       schedule_work(&hidpp->work);
-       flush_work(&hidpp->work);
-
        if (hidpp->quirks & HIDPP_QUIRK_DELAYED_INIT)
                connect_mask &= ~HID_CONNECT_HIDINPUT;
 
        /* Now export the actual inputs and hidraw nodes to the world */
+       hid_device_io_stop(hdev);
        ret = hid_connect(hdev, connect_mask);
        if (ret) {
                hid_err(hdev, "%s:hid_connect returned error %d\n", __func__, ret);
                goto hid_hw_init_fail;
        }
 
+       /* Check for connected devices now that incoming packets will not be disabled again */
+       hid_device_io_start(hdev);
+       schedule_work(&hidpp->work);
+       flush_work(&hidpp->work);
+
        if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) {
                struct hidpp_ff_private_data data;