[RESEND][PATCH 1/3] usb_kbd: succeed even if no interrupt is pending

Marek Vasut marex at denx.de
Tue Aug 18 19:20:21 CEST 2020


On 8/18/20 6:54 PM, Jason Wessel wrote:
> 
> 
> On 8/18/20 10:05 AM, Marek Vasut wrote:
>> On 8/18/20 4:34 PM, Jason Wessel wrote:
>>> After the initial configuration some USB keyboard+mouse devices never
>>> return any kind of event on the interrupt line.  In particular, the
>>> device identified by "Cypress Cypress USB Keyboard / PS2 Mouse as
>>> 3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/0003:04B4:0101.0001/input/input0"
>>> never returns a data packet until the first external input event.
>>>
>>> I found this was also true with some newer model Dell keyboards.
>>>
>>> When the device is plugged into a xhci controller there is also no
>>> point in waiting 5 seconds for a device that is never going to present
>>> data, so the call to the interrupt service was changed to a
>>> nonblocking operation for the controllers that support this.
>>>
>>> With the patch applied, the rpi3 and rpi4 work well with the more
>>> complex keyboard devices.
>>
>> Please extend the comment in the code, it is not clear from it or from
>> the commit message what the problem really is that this patch tries to fix.
>>
>> Also, the printf() below the return 1 is never reached.
>>
> 
> 
> The printf() is only reached in the case of the #ifdef above it being true. 

That's pretty awful and confusing code then. The original code wasn't
stellar either, but can this be somehow improved now ?

> The compiler in theory should optimize it away, but for clarity it can be moved 
> with in the #ifdef but that also requires fixing it in two places because 
> there are multiple levels to the #ifdef.

I think it's better to make it more readable if possible.

> Would the following be acceptable, which I can put in the next version.
> 
> 
> commit 319c75ee3d1fce8a3389d1de857751504b5110cb (HEAD -> master)
> Author: Jason Wessel <jason.wessel at windriver.com>
> Date:   Thu Jun 25 05:31:25 2020 -0700
> 
>     usb_kbd: succeed even if no interrupt is pending
>     
>     After the initial configuration some USB keyboard+mouse devices never
>     return any kind of event on the interrupt line.  In particular, the
>     device identified by "Cypress Cypress USB Keyboard / PS2 Mouse as
>     3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/0003:04B4:0101.0001/input/input0"
>     never returns a data packet until the first external input event.
>     
>     I found this was also true with some newer model Dell keyboards.
>     
>     Without the patch u-boot prints the following on one of keyboards and
>     leave it unable to accept input events.
>     
>     =====
>     scanning bus xhci_pci for devices...
>       Failed to get keyboard state from device 14dd:1009

So I have to wonder, if the keyboard never returns a data packet until
you press a key (that makes sense), how does Linux deal with this ?


More information about the U-Boot mailing list