usb: wusbcore: fix device disconnect on rekey timeout
authorThomas Pugliese <thomas.pugliese@gmail.com>
Tue, 16 Sep 2014 21:40:15 +0000 (16:40 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 24 Sep 2014 05:06:59 +0000 (22:06 -0700)
commit275e517c30ab23d6da332419b6da5e2d5a234891
treea666464f83ff70b5cac837aca401913b9d45ca26
parentb94be0db5b17fe5616ecfc4c064264625f92afb2
usb: wusbcore: fix device disconnect on rekey timeout

If three or more wireless devices are connected and two of them
disconnect between 1-3 seconds apart, it can cause the HWA to disconnect
the remaining devices due to failing to see a DN_Alive message from
them.  This happens because when the HWA detects that the first device
is gone, it will attempt to rekey the remaining devices.  If one of the
devices is not responding because it has also been disconnected but not
yet timed out, the synchronous rekey operation running on the wusbd
workqueue can block for up to 5 seconds.  This will prevent the
KEEPALIVE timer from running and DN_Alive messages from being processed
because they are processed by the same workqueue.  This patch moves the
rekey operation to a separate workqueue since it is the only wusb work
item that needs to communicate directly with wireless devices.  The rest
of the WUSB work items either perform no device IO or communicate
directly with the host controller and should not be blocked out by a
non-responding wireless device.

Signed-off-by: Thomas Pugliese <thomas.pugliese@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/wusbcore/security.c
drivers/usb/wusbcore/wusbhc.h