Commit f4042c06 authored by Thomas Pugliese's avatar Thomas Pugliese Committed by Greg Kroah-Hartman

usb: wusbcore: send keepalives to unauthenticated devices

This patch modifies the WUSB device disconnect timer code to send
keepalives to all connected devices even if they are not authenticated.
This fixes a problem where unauthenticated devices that lose their
connection before they are authenticated will stay in the device tree
forever.  More importantly, devices in this situation will never
relinquish their port on the root hub so eventually all root ports will
be taken up and no other devices can connect.

A comment in the existing code states that there are some devices that
may not respond to keepalives if they have not been authenticated.  That
comment is about 5 years old and I don't know of any WUSB devices that
act that way.  Either way, any buggy devices that may still be around
will continue to work as long as they can transition to the
authenticated state within the WUSB LOA timeout of 4s, which is not
unreasonable to expect.
Signed-off-by: default avatarThomas Pugliese <thomas.pugliese@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 2bf308d7
...@@ -411,9 +411,6 @@ static void __wusbhc_dev_disconnect(struct wusbhc *wusbhc, ...@@ -411,9 +411,6 @@ static void __wusbhc_dev_disconnect(struct wusbhc *wusbhc,
/* /*
* Refresh the list of keep alives to emit in the MMC * Refresh the list of keep alives to emit in the MMC
* *
* Some devices don't respond to keep alives unless they've been
* authenticated, so skip unauthenticated devices.
*
* We only publish the first four devices that have a coming timeout * We only publish the first four devices that have a coming timeout
* condition. Then when we are done processing those, we go for the * condition. Then when we are done processing those, we go for the
* next ones. We ignore the ones that have timed out already (they'll * next ones. We ignore the ones that have timed out already (they'll
...@@ -448,7 +445,7 @@ static void __wusbhc_keep_alive(struct wusbhc *wusbhc) ...@@ -448,7 +445,7 @@ static void __wusbhc_keep_alive(struct wusbhc *wusbhc)
if (wusb_dev == NULL) if (wusb_dev == NULL)
continue; continue;
if (wusb_dev->usb_dev == NULL || !wusb_dev->usb_dev->authenticated) if (wusb_dev->usb_dev == NULL)
continue; continue;
if (time_after(jiffies, wusb_dev->entry_ts + tt)) { if (time_after(jiffies, wusb_dev->entry_ts + tt)) {
......
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