Thread (11 messages) 11 messages, 4 authors, 2014-08-25

Re: [PATCH 1/1] HID: usbhid: add usb_clear_halt determination for next hid_start_in

From: vichy <hidden>
Date: 2014-08-22 10:43:24

hi Jiri:

2014-08-22 15:45 GMT+08:00 Jiri Kosina [off-list ref]:
On Fri, 22 Aug 2014, CheChun Kuo wrote:
quoted
      HID IR device will not response to any command send from host when
it is finishing paring and tring to reset itself. During this period of
time, usb_cleaer_halt will be fail and if hid_start_in soon again, we
has the possibility trap in infinite loop.

Signed-off-by: CheChun Kuo <redacted>
---
 drivers/hid/usbhid/hid-core.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 79cf503..256b102 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -122,7 +122,8 @@ static void hid_reset(struct work_struct *work)
              dev_dbg(&usbhid->intf->dev, "clear halt\n");
              rc = usb_clear_halt(hid_to_usb_dev(hid), usbhid->urbin->pipe);
              clear_bit(HID_CLEAR_HALT, &usbhid->iofl);
-             hid_start_in(hid);
+             if (rc == 0)
+                     hid_start_in(hid);
      }
I'd need a more detailed explanation for this patch, as I don't understand
neither the text in the changelog nor the patch itself. Namely:

- which IR devices are showing this behavior?
The USB hid device that will transform IR signal to usb command when
user press "volume up/down", "voice recording", etc.
- where does the infinite loop come from? hid_reset() should error out
  properly if usb_clear_halt() fails and HID_IN_RUNNING flag is not set
Below I briefly draw the timing when this issue happen

i) hid_irq_in get URB status as -EPIPE
ii) set HID_CLEAR_HALT flag and schedule hid_reset work
iii) hid_reset call usb_clear_halt and hid_start_in again
iv) if device still doesn't response host command, it will go to i)
above and keep looping

thanks for your help,
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help