Input: HIDDEV - make HIDIOCSREPORT wait IO completion
authorStefan Nickl <Stefan.Nickl@kontron.com>
Mon, 5 Sep 2005 06:57:46 +0000 (01:57 -0500)
committerDmitry Torokhov <dtor_core@ameritech.net>
Mon, 5 Sep 2005 06:57:46 +0000 (01:57 -0500)
When trying to make the hiddev driver issue several Set_Report control
transfers to a custom device with 2.6.13-rc6, only the first transfer in a
row is carried out, while others immediately following it are silently
dropped.

This happens where hid_submit_report() (in hid-core.c) tests for
HID_CTRL_RUNNING, which seems to be still set because the first transfer is
not finished yet.

As a workaround, inserting a delay between the two calls to
ioctl(HIDIOCSREPORT) in userspace "solves" the problem.  The
straightforward fix is to add a call to hid_wait_io() to the implementation
of HIDIOCSREPORT (in hiddev.c), just like for HIDIOCGREPORT.  Works fine
for me.

Apparently, this issue has some history:
http://marc.theaimsgroup.com/?l=linux-usb-users&m=111100670105558&w=2

Signed-off-by: Stefan Nickl <Stefan.Nickl@kontron.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Vojtech Pavlik <vojtech@suse.cz>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
drivers/usb/input/hiddev.c

index 4c13331b5f41d0694f3e44356e92af540de2192d..d32427818af78d590f547e5bcd24efbadef2036a 100644 (file)
@@ -507,6 +507,7 @@ static int hiddev_ioctl(struct inode *inode, struct file *file, unsigned int cmd
                        return -EINVAL;
 
                hid_submit_report(hid, report, USB_DIR_OUT);
+               hid_wait_io(hid);
 
                return 0;