diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2014-07-17 16:34:29 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-09-05 16:34:12 -0700 |
commit | 774710c90e906c0984b45f9591835a577f8e80f9 (patch) | |
tree | b672129712835df6afffe234518e98cd8f1d6325 /drivers/usb/core | |
parent | f9fd934da7adc03cb8d341a4ae4ffac038b5adff (diff) | |
download | lwn-774710c90e906c0984b45f9591835a577f8e80f9.tar.gz lwn-774710c90e906c0984b45f9591835a577f8e80f9.zip |
USB: OHCI: don't lose track of EDs when a controller dies
commit 977dcfdc60311e7aa571cabf6f39c36dde13339e upstream.
This patch fixes a bug in ohci-hcd. When an URB is unlinked, the
corresponding Endpoint Descriptor is added to the ed_rm_list and taken
off the hardware schedule. Once the ED is no longer visible to the
hardware, finish_unlinks() handles the URBs that were unlinked or have
completed. If any URBs remain attached to the ED, the ED is added
back to the hardware schedule -- but only if the controller is
running.
This fails when a controller dies. A non-empty ED does not get added
back to the hardware schedule and does not remain on the ed_rm_list;
ohci-hcd loses track of it. The remaining URBs cannot be unlinked,
which causes the USB stack to hang.
The patch changes finish_unlinks() so that non-empty EDs remain on
the ed_rm_list if the controller isn't running. This requires moving
some of the existing code around, to avoid modifying the ED's hardware
fields more than once.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/core')
0 files changed, 0 insertions, 0 deletions