Add a helper to take the 3 hid_hw_start() + hid_hw_open() + hid_device_io_start() steps which are necessary to be able to talk to the hw. This is a preparation patch for moving the connect check to after restarting IO, in case we miss a connect packet coming in while IO is disabled during the restart. Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> --- drivers/hid/hid-logitech-hidpp.c | 40 ++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c index bbb1c6d8ccc9..45b371e7b9ee 100644 --- a/drivers/hid/hid-logitech-hidpp.c +++ b/drivers/hid/hid-logitech-hidpp.c @@ -4391,6 +4391,29 @@ static bool hidpp_application_equals(struct hid_device *hdev, return report && report->application == application; } +static int hidpp_connect_and_start(struct hidpp_device *hidpp, unsigned int connect_mask) +{ + struct hid_device *hdev = hidpp->hid_dev; + int ret; + + ret = hid_hw_start(hdev, connect_mask); + if (ret) { + hid_err(hdev, "hw start failed: %d\n", ret); + return ret; + } + + ret = hid_hw_open(hdev); + if (ret) { + hid_err(hdev, "hw open failed: %d\n", ret); + hid_hw_stop(hdev); + return ret; + } + + /* Allow incoming packets */ + hid_device_io_start(hdev); + return 0; +} + static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id) { struct hidpp_device *hidpp; @@ -4462,21 +4485,9 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id) * Plain USB connections need to actually call start and open * on the transport driver to allow incoming data. */ - ret = hid_hw_start(hdev, 0); - if (ret) { - hid_err(hdev, "hw start failed\n"); + ret = hidpp_connect_and_start(hidpp, 0); + if (ret) goto hid_hw_start_fail; - } - - ret = hid_hw_open(hdev); - if (ret < 0) { - dev_err(&hdev->dev, "%s:hid_hw_open returned error:%d\n", - __func__, ret); - goto hid_hw_open_fail; - } - - /* Allow incoming packets */ - hid_device_io_start(hdev); /* Get name + serial, store in hdev->name + hdev->uniq */ if (hidpp->quirks & HIDPP_QUIRK_UNIFYING) @@ -4523,7 +4534,6 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id) hid_hw_init_fail: hid_hw_close(hdev); -hid_hw_open_fail: hid_hw_stop(hdev); hid_hw_start_fail: sysfs_remove_group(&hdev->dev.kobj, &ps_attribute_group); -- 2.41.0