Commit c8b25999 authored by Jim Keir's avatar Jim Keir Committed by Jiri Slaby

HID: pidff: Fix initialisation forMicrosoft Sidewinder FF Pro 2

commit afd700d9 upstream.

The FF2 driver (usbhid/hid-pidff.c) sends commands to the stick during ff_init.
However, this is called inside a block where driver_input_lock is locked, so
the results of these initial commands are discarded. This behavior is the
"killer", without this nothing else works.

ff_init issues commands using "hid_hw_request". This eventually goes to
hid_input_report, which returns -EBUSY because driver_input_lock is locked. The
change is to delay the ff_init call in hid-core.c until after this lock has
been released.

Calling hid_device_io_start() releases the lock so the device can be
configured.  We also need to call hid_device_io_stop() on exit for the lock to
remain locked while ending the init of the drivers.

[ benjamin.tissoires@redhat.com: imrpoved the changelog a lot ]
Signed-off-by: default avatarJim Keir <jimkeir@oracledbadirect.com>
Reviewed-by: default avatarBenjamin.tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
parent 0bea50e7
...@@ -1252,6 +1252,8 @@ int hid_pidff_init(struct hid_device *hid) ...@@ -1252,6 +1252,8 @@ int hid_pidff_init(struct hid_device *hid)
pidff->hid = hid; pidff->hid = hid;
hid_device_io_start(hid);
pidff_find_reports(hid, HID_OUTPUT_REPORT, pidff); pidff_find_reports(hid, HID_OUTPUT_REPORT, pidff);
pidff_find_reports(hid, HID_FEATURE_REPORT, pidff); pidff_find_reports(hid, HID_FEATURE_REPORT, pidff);
...@@ -1315,9 +1317,13 @@ int hid_pidff_init(struct hid_device *hid) ...@@ -1315,9 +1317,13 @@ int hid_pidff_init(struct hid_device *hid)
hid_info(dev, "Force feedback for USB HID PID devices by Anssi Hannula <anssi.hannula@gmail.com>\n"); hid_info(dev, "Force feedback for USB HID PID devices by Anssi Hannula <anssi.hannula@gmail.com>\n");
hid_device_io_stop(hid);
return 0; return 0;
fail: fail:
hid_device_io_stop(hid);
kfree(pidff); kfree(pidff);
return error; return error;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment