xhci: Check if slot is already in default state before moving it there

This commit is contained in:
Justin M. Forbes 2015-01-19 09:32:25 -06:00
parent 91d3be5380
commit aa7180f4aa
2 changed files with 55 additions and 1 deletions

View File

@ -651,6 +651,7 @@ Patch30001: mpssd-x86-only.patch
# Patches from 3.18.4 stable queue (should fix i915 issues)
Patch30002: stable-3.18.4-queue.patch
Patch30003: xhci-check-if-slot-is-already-in-default-state.patch
# END OF PATCH DEFINITIONS
@ -1407,7 +1408,8 @@ ApplyPatch acpi-video-Add-disable_native_backlight-quirk-for-Sa.patch
ApplyPatch mpssd-x86-only.patch
# Patches from 3.18.4 stable queue (should fix i915 issues)
# ApplyPatch stable-3.18.4-queue.patch
ApplyPatch stable-3.18.4-queue.patch
ApplyPatch xhci-check-if-slot-is-already-in-default-state.patch
%if 0%{?aarch64patches}
ApplyPatch kernel-arm64.patch
@ -2281,6 +2283,7 @@ fi
%changelog
* Mon Jan 19 2015 Justin M. Forbes <jforbes@fedoraproject.org> - 3.18.3-201
- Add fixes from 3.18.4 queue to fix i915 issues (rhbz 1183232)
- xhci: Check if slot is already in default state before moving it there (rhbz 1183289)
* Fri Jan 16 2015 Justin M. Forbes <jforbes@fedoraproject.org> - 3.18.3-200
- Linux v3.18.3

View File

@ -0,0 +1,51 @@
commit f161ead70fa6a62e432dff6e9dab8e3cfbeabea6
Author: Mathias Nyman <mathias.nyman@linux.intel.com>
Date: Fri Jan 9 17:18:28 2015 +0200
xhci: Check if slot is already in default state before moving it there
Solves xhci error cases with debug messages:
xhci_hcd 0000:00:14.0: Setup ERROR: setup context command for slot 1.
usb 1-6: hub failed to enable device, error -22
xhci will give a context state error if we try to set a slot in default
state to the same default state with a special address device command.
Turns out this happends in several cases:
- retry reading the device rescriptor in hub_port_init()
- usb_reset_device() is called for a slot in default state
- in resume path, usb_port_resume() calls hub_port_init()
The default state is usually reached from most states with a reset device
command without any context state errors, but using the address device
command with BSA bit set (block set address) only works from the enabled
state and will otherwise cause context error.
solve this by checking if we are already in the default state before issuing
a address device BSA=1 command.
Fixes: 48fc7dbd52c0 ("usb: xhci: change enumeration scheme to 'new scheme'")
Cc: <stable@vger.kernel.org> # v3.14+
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index 01fcbb5..c50d8d2 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -3803,6 +3803,15 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,
return -EINVAL;
}
+ if (setup == SETUP_CONTEXT_ONLY) {
+ slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->out_ctx);
+ if (GET_SLOT_STATE(le32_to_cpu(slot_ctx->dev_state)) ==
+ SLOT_STATE_DEFAULT) {
+ xhci_dbg(xhci, "Slot already in default state\n");
+ return 0;
+ }
+ }
+
command = xhci_alloc_command(xhci, false, false, GFP_KERNEL);
if (!command)
return -ENOMEM;