Re: USB: HID: random timeout failures fix proposal

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi everyone,

Inline commented.

On 4.2.2020 9.29, Lauri Jakku wrote:
> On 4.2.2020 9.20, Greg KH wrote:
>> On Tue, Feb 04, 2020 at 05:44:45AM +0200, Lauri Jakku wrote:
>>> Hi,
>>>
>>>
>>> I made a patch that does to tackle the USB HID device random behavior by
>>>
>>> re-trying to send command 400ms, 20ms sleep per try.
>> WHat random behavior are you referring to?
> for example Manjaro has issues (I got my self randomly working usb mouse)
>
>
> https://forum.manjaro.org/t/usb-devices-mice-stop-working-randomly/113154/18
>
>
>
>>> ---------------------------------------------------------------------------------------
>>>
>>> >From d4214685de329ebe07dfd2298bce46dfae5f80bf Mon Sep 17 00:00:00 2001
>>> From: Lauri Jakku <lja@xxxxxx>
>>> Date: Tue, 4 Feb 2020 04:52:01 +0200
>>> Subject: [PATCH] USB HID random timeout failures fixed by trying 20 times
>>>  send, 20ms apart, control messages, if error is timeout.
>> The subject line of the patch is a bit too big, and you have no
>> changelog text in the body of the message, making this patch not able to
>> be applied.
>>
>> Also, no need to insert it like this, just use git send-email to submit
>> it.
>>
>>
>>> Signed-off-by: Lauri Jakku <lja@xxxxxx>
>>> ---
>>>  drivers/usb/core/message.c | 30 +++++++++++++++++++++++++-----
>>>  1 file changed, 25 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
>>> index 5adf489428aa..5d615b2f92d8 100644
>>> --- a/drivers/usb/core/message.c
>>> +++ b/drivers/usb/core/message.c
>>> @@ -20,6 +20,7 @@
>>>  #include <linux/usb/hcd.h>     /* for usbcore internals */
>>>  #include <linux/usb/of.h>
>>>  #include <asm/byteorder.h>
>>> +#include <linux/errno.h>
>> Are you sure this is needed?
> The ETIMEDOUT definition is there, so yeah.
>>>  
>>>  #include "usb.h"
>>>  
>>> @@ -137,7 +138,10 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request,
>>>                     __u16 size, int timeout)
>>>  {
>>>         struct usb_ctrlrequest *dr;
>>> -       int ret;
>>> +       int ret = -ETIMEDOUT;
>>> +
>>> +       /* retry_cnt * 10ms, max retry time set to 400ms */
>>> +       int retry_cnt = 20;
>>>  
>>>         dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_NOIO);
>>>         if (!dr)
>>> @@ -149,11 +153,27 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request,
>>>         dr->wIndex = cpu_to_le16(index);
>>>         dr->wLength = cpu_to_le16(size);
>>>  
>>> -       ret = usb_internal_control_msg(dev, pipe, dr, data, size, timeout);
>>> +       do {
>>> +               ret = usb_internal_control_msg(dev,
>>> +                                       pipe,
>>> +                                       dr,
>>> +                                       data,
>>> +                                       size,
>>> +                                       timeout);
>>> +
>>> +               /*
>>> +                * Linger a bit, prior to the next control message
>>> +                * or if return value is timeout, but do try few
>>> +                * times (max 200ms) before quitting.
>>> +                */
>>> +               if (dev->quirks & USB_QUIRK_DELAY_CTRL_MSG)
>>> +                       msleep(200);
>>> +               else if (ret == -ETIMEDOUT)
>>> +                       msleep(20);
>>> +
>>> +               /* Loop while timeout, max retry_cnt times. */
>>> +       } while ((retry_cnt-- > 0) && (ret == -ETIMEDOUT));
>> Why are we looping always if something went wrong?
>>
>> And don't we already have a "timeout"?  Why not rely on that?
> I tried with 5 times setting, and my mouse works quite well now, i thing that
>
> the 20 times (Max sleep time of 400ms) is good. It does report timeout, when
>
> 20 times tried to communicate with HW, so if device is fine etc. there is no
>
> sleeping at all done.
>
>
>> thanks,
>>
>> greg k-h

-- 
Br,
Lauri J.




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux